我想在我的Delphi应用程序中调用C ++ DLL的函数 问题是我遇到了访问冲突。但不是在调用我的C ++ DLL时,而是在我离开Delphi函数的时候。
错误消息(缩短):
0x7445c9f1处的访问冲突:从地址0x00000000读取。
我的C ++方法是这样的:
extern "C" __stdcall void SetName(LPCTSTR name) {strcpy_s(nameInDll,512,name);};
我的Delphi调用如下所示:
begin
...
hDll := LoadLibrary('myCpp.dll');
SetName := getprocaddress(hDll, 'SetName');
SetName(pchar(myControl.text)); // <--- exception NOT here
...
end; // <--- exception here
有趣的是,如果我使用硬编码文本作为DLL调用的输入,它会起作用:
SetName(pchar('myName'));
修改
我错过了我的C ++ DLL中的 __ stdcall 定义。它是在一个宏中定义的。我更正了上面的C ++方法定义。
在看到这些和你的提示后,我想出了一个有效的解决方案:
procedure SetName(s: PChar); stdcall; external 'myCpp.dll';
begin
...
SetName(pchar(myControl.text));
...
end;
答案 0 :(得分:7)
听起来SetName
使用了错误的调用约定,请尝试使用cdecl;
这样的事情:
var
SetName : procedure(nameArg: PChar); cdecl;
否则你的筹码会混乱。
答案 1 :(得分:0)
DLL是为Ansi还是Unicode编译的? LPCTSTR
wchar_t*
定义UNICODE
时映射到char*
,否则映射到wchar_t*
。这会影响您在Delphi中使用DLL的方式,其中PWideChar
与char*
等效,PAnsiChar
与{{1}}在Delphi中等效。
答案 2 :(得分:-1)
取决于你的工作量很大,在编译器选项中你可能需要设置:
minimum enum size: double word
record field alignment: quad word