为什么调用dll之后,立即访问界面可视控件会出错?(100分)

  • 主题发起人 主题发起人 acdc
  • 开始时间 开始时间
A

acdc

Unregistered / Unconfirmed
GUEST, unregistred user!
用一份C代码编译了一个DLL在DELPHI下调用,但是调用之后,再访问界面控件就出错:

procedure TfrmMain.btnQueryClick(Sender: TObject);
var
tmpstr:string;
begin
tmpstr:= Encrypt('12345678', '1234567887654321');//调用DLL
Memo1.Lines.Add(tmpstr);//出错,但是如果注销此行,再从别的按钮事件里访问memo等控件却是正常的;
//如果不访问界面控件,反复调用DLL也正常。
end;
 
看一下调用DLL返回的内容,应该不会有这个问题
 
DLL返回的内容,可以用MessageBox打印出来,但是却不能赋给界面上的控件
 
DLL返回的是PChar类型的字符串,这样试试:
procedure TfrmMain.btnQueryClick(Sender: TObject);
var
tmpstr:PChar; <<-- 改为PChar
begin
tmpstr:= Encrypt('12345678', '1234567887654321');//调用DLL
Memo1.Lines.Add(strpas(tmpstr));//出错,但是如果注销此行,再从别的按钮事件里访问memo等控件却是正常的;
//如果不访问界面控件,反复调用DLL也正常。
end;
 
其实这个Encrypt还是delphi中的函数,由它来调用DLL,返回字符串,单步跟踪过了,返回值是有效的,而且此时,即使不用这个返回值,一行memo1.Lines.Add('abc');也会出错。是不是DLL调用方式有问题?在DELPHI中使用vc编译的dll需要注意什么?
 
应该是调用出了问题,C编译的一般是cdecl,而pascal用的是pascal或stdcall,把dll函数声明为cdecl应该可以解决问题
 
mzlsx说的对,我刚刚也查找到了相关资料。

dll中extern &quot;C&quot; __declspec (dllexport)导出函数,delphi应该使用cdecl,而不是stdcall.

多谢诸位的回答!
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
I
回复
0
查看
842
import
I
后退
顶部