在Delphi app中调用C++ DLL

jue*_*n d 2 c++ delphi dll

我想在我的Delphi应用程序中调用C++ DLL的函数.
问题是我遇到了访问冲突.但不是在调用我的C++ DLL时,而是当我离开Delphi函数时,我会这样做.

错误消息(缩短):
0x7445c9f1处的访问冲突:从地址0x00000000读取.

我的C++方法是这样的:

extern "C" __stdcall void SetName(LPCTSTR name) {strcpy_s(nameInDll,512,name);};
Run Code Online (Sandbox Code Playgroud)

我的Delphi调用如下所示:

begin   
   ...
   hDll := LoadLibrary('myCpp.dll');
   SetName := getprocaddress(hDll, 'SetName');
   SetName(pchar(myControl.text));  //  <--- exception NOT here
   ...
end;  // <--- exception here
Run Code Online (Sandbox Code Playgroud)

有趣的是,如果我使用硬编码文本作为DLL调用的输入,它是有效的,如下所示:

SetName(pchar('myName'));
Run Code Online (Sandbox Code Playgroud)

编辑:
我错过了我的C++ DLL中的 __stdcall定义.它是在一个宏中定义的.我更正了上面的C++方法定义.

看到这个和你的提示后,我想出了一个有效的解决方案:

procedure SetName(s: PChar); stdcall; external 'myCpp.dll';

begin   
   ...
   SetName(pchar(myControl.text));
   ...
end;
Run Code Online (Sandbox Code Playgroud)

Hei*_*cht 7

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

像这样的东西:

var
  SetName : procedure(nameArg: PChar); cdecl;
Run Code Online (Sandbox Code Playgroud)

否则你的筹码将被搞砸.