在Delphi app中调用C ++ DLL

时间:2011-10-21 09:29:12

标签: c++ delphi dll

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

3 个答案:

答案 0 :(得分:7)

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

这样的事情:

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

否则你的筹码会混乱。

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

取决于你的工作量很大,在编译器选项中你可能需要设置:

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