在Delphi应用程序中调用C++DLL

Call C++ DLL in Delphi app

本文关键字:调用 C++DLL 应用程序 Delphi      更新时间:2023-10-16

我想在我的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;

听起来SetName使用了错误的调用约定,请尝试使用cdecl;

类似这样的东西:

var
  SetName : procedure(nameArg: PChar); cdecl;

否则你的堆栈会被弄乱。

DLL是为Ansi还是Unicode编译的?当定义了UNICODE时,LPCTSTR映射到wchar_t*,否则映射到char*。这会影响在Delphi中使用DLL的方式,其中wchar_t*等同于PWideCharchar*等同于Delphi中的PAnsiChar

根据您的工作量,在编译器选项中您可能需要设置:

minimum enum size:  double word
record field alignment:  quad word