因为知道在dll中不能直接返回string型所以我已把二维数组转为pchar型了,但取出来的二维数组值含有乱码,请问怎样解决?
解决方案 »
- 一个用DBImage1读取图片出Stream read error错的问题
- 请问: Delphi 中如何设置﹐使每次打开delphi时﹐开启的总是我的project ….
- dll高手请教
- 我这样的在西安月薪能拿多少??
- 放假了,找了一份工作,用D做个消息管理系统,以前根本没学过这方面知识,第一次来这里,各位给些关于设计意见吧,up有分,在线等ing.....
- 我被Foroux病毒折磨死啦~~哪位救救我啊~~200分送上~up有分
- 关于在delphi中使用ADO连接MySQL数据库的问题
- 救命,在DELPHI5中,怎么得到当前日期和时间?
- 请问高手,冰盾的端口扫描是怎么原理?用delphi能实现吗?
- 如何在delphi中能否嵌入用vc编的exe程序啊?比如说播放视频的程序
- 高手请进!!关于ClientSocket的问题~~~~
- 一个就在于edit的简单的问题,新手求教
所以你应该借鉴这种方法这样定义:
function Test(Value: PChar; Size: integer): boolean;使用的时候,先分配内存
var
a:array[0..100] of char;
begin
Test(Pchar(a), 100);
end;
这个函数以及实现是在DLL中,该函数不负责分配Value的空间
在你的程序中使用时要分配Value的空间:下面就是使用时候的例子
var
a:array[0..100] of char;
begin
Test(Pchar(a), 100);
end;
返回乱码可能是返回的是16进制,或者其他原因,你可以把代码贴出来看看
procedure TForm1.Button1Click(Sender: TObject);
var
a:array[0..100] of char;
begin
Test(pchar(a),100);
end;dll:
function Test(Value: PChar; Size: integer): boolean;
begin
value[0]:=char(pchar('aaa'));
result:=true;
end;没有运行通过在这里:Test(Pchar(a), 100);
你是怎么转的!贴出来看看!
type
arr2=array[0..100,0..21] of pchar;function getwhilearymany(conn:TADOConnection;sqlstr:pchar;get1:pchar;get2:pchar;get3:pchar;get4:pchar;get5:pchar;get6:pchar;get7:pchar;get8:pchar;get9:pchar;get0:pchar):arr2;stdcall;
var
ado: TADOQuery;
bbc:arr2;
j:integer;
begin
try
try
j:=0;
CoInitialize(nil);
ado := tadoquery.Create(nil);
ado.Connection :=conn;
ado.Close();
ado.SQL.Clear;
ado.SQL.add(String(sqlstr));
ado.Open;
while not ado.Eof do
begin
if j>100 then
break;
///
bbc[j,0]:=pchar(ado.fieldbyname(string(get1)).AsString); bbc[j,1]:=pchar(ado.fieldbyname(string(get2)).AsString); bbc[j,2]:=pchar(ado.fieldbyname(string(get3)).AsString); bbc[j,3]:=pchar(ado.fieldbyname(string(get4)).AsString); bbc[j,4]:=pchar(ado.fieldbyname(string(get5)).AsString); bbc[j,5]:=pchar(ado.fieldbyname(string(get6)).AsString); bbc[j,6]:=pchar(ado.fieldbyname(string(get7)).AsString); bbc[j,7]:=pchar(ado.fieldbyname(string(get8)).AsString); bbc[j,8]:=pchar(ado.fieldbyname(string(get9)).AsString); bbc[j,9]:=pchar(ado.fieldbyname(string(get0)).AsString); // j:=j+1;
ado.Next;
end; except
end;
finally
result:=bbc;
Ado.Close();
ado.Free;
ado:=nil;
CoUninitialize;
inputtrack(pchar('getwhilearymany结束:结果:完成'));
end;
end;在程序中:type
arr2=array[0..100,0..21] of pchar;
function puttzf():string;
var
f,k,m:integer;
sql:string;
yuyuesms:arr2;
begin
try
for k:=0 to 200 do
begin
zu[k].ph:='';
end;
sql:='select top 99 nodeid,content from 机床号 order by id';
yuyuesms:=getwhilearymany(form1.conndll,pchar(sql),pchar('nodeid'),pchar('content'),pchar('nodeid'),pchar('content'),pchar('content'),pchar('nodeid'),pchar('content'),pchar('content'),pchar('nodeid'),pchar('nodeid'));
m:=0;
while m<=100 do
begin
if string(yuyuesms[m,0])='' then
break;
zu[m].ph:=string(yuyuesms[m,0]);
zu[m].name:=string(yuyuesms[m,1]);
m:=m+1;
end;exceptend;
end;返回来的数据存在乱码
function Test(Value: PChar; Size: integer): boolean;
begin
result:=true;
end;我这里没Delphi,无法帮你测试
你把代码贴出来看,Test的dll以及Test的测试代码
var
a:array[0..100] of char;
begin
Test(Pchar(@a[0]), 100)
end;dll:
dll:
function Test(Value: PChar; Size: integer): boolean;
begin
value[0]:=char(pchar('aaa'));
result:=true;
end;
是否使用了stdcall?
可以试试这个procedure TForm1.Button1Click(Sender: TObject);
var
a:array[0..100] of char;
s:integer;
bdata,idata:string;
begin
Test(Pchar(@a[0]), s)
bdata:=string(a);
idata:=copy(bdata,1,s);//只复制有效数据
end;function Test(Value: PChar; Size: integer): boolean;
var
s1:string;
begin
s1:='aaa';
Move(s1[1],value,length(s1));//复制数据到输出缓冲
size:=length(s1)
result:=true;
end;