Dll的调用(100分)

  • 主题发起人 主题发起人 Beyond2002
  • 开始时间 开始时间
B

Beyond2002

Unregistered / Unconfirmed
GUEST, unregistred user!
用Delphi写得动态库,其中有函数f_Demo(Out p1, p2, p3 : pChar) : Integer
StdCall;
为什么在调用时返回得自付乱码?(跟踪Dll时p1,p2,p3均正常,跟踪应用程序时
出现乱码,而且每次情况都不一样,到底应该如何调用?
)
 
看看是不是字符串结尾没加#0?
 
把代码,引用部分和dll里面的都拿出来看看
 
To zw84611:
你是说在Dll中,返回参数得结尾加#0,
即 p1 := pChar('Hello' + #0)
?
 
Function f_Demo(Out p1 : pChar) : Integer
Exports f_Demo;
Var
sTmp : String;
Begin
sTmp := '...'
//用于测试的字符
p1 := pChar(sTmp);
Result := 0;
End;
 
把Out去掉
因为PChar传的是地址
 
你没有为Pchar分配空间
p1 := pChar(sTmp);是错误的
StrPCopy(p1,sTmp)
这样
 
sTmp := '...'
//用于测试的字符
sTmp := sTmp+#0
//attention
p1 := pChar(sTmp);
 
function f_Demo(p1, p2, p3 : pChar) : Integer
StdCall;
var
s:string;
i:integer;
begin
s:='123456';
for i:=1 to length(s) do p1[i-1]:=s;
p1[length(s)]:=#0;
Result:=0;
end;
 
完颜康说得对。
注意,你的sTmp是局部变量,调用后就被释放了,所以p1指针指向空值,所以为乱码。

可以这样:
Function f_Demo(Out p1 : pChar) : Integer
Exports f_Demo;
Var
sTmp : String;
p2: pchar;
Begin
sTmp := '...'
//用于测试的字符
p2 := pChar(sTmp);
CopyMemory(p1,p2,length(sTmp));
Result := 0;
End;

调用时先getmem(p1,1024)
然后f_Demo(p1)
最后记得FreeMemory(p1)
 
zw84611说的对,而且还要注意,在Dll中对函数的声明用Stdcall的话,在调用程序中,
对函数的声明也要用stdcall,否则,调用出错。
你可以用far.
 
把PChar换成WideString就OK,或者用字符数组。
 
Pchar最好是从函数体外分配空间,然后再传进来,这是个好习惯。
 
[red]观[/red][blue]注[/blue]
 
完颜康说得对。
注意,你的sTmp是局部变量,调用后就被释放了,所以p1指针指向空值,所以为乱码。

 
多人接受答案了。
 
后退
顶部