我想在我的Delphi應用程序中調用C++ DLL的函數。
問題是我得到訪問衝突。但不是在調用我的C++ DLL時,而是在離開我這樣做的Delphi函數時。在Delphi應用程序中調用C++ DLL
錯誤消息(縮短):
訪問衝突0x7445c9f1:從地址0x00000000讀取。
我的C++的方法是這樣的:
extern "C" __stdcall void SetName(LPCTSTR name) {strcpy_s(nameInDll,512,name);};
我的德爾福調用如下:
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;
嘗試[這個類似的線程] [1],希望它有幫助。 [1]:http://stackoverflow.com/questions/1244441/accessviolation-when-using-c-dll-from-delphi – CloudyMarble
您需要出示SetName'的'的聲明。我敢打賭你沒有宣佈一個調用約定,或者宣佈了錯誤的調用約定。你的C++方法很可能使用'cdecl'。 –