2011-10-21 78 views
2

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

嘗試[這個類似的線程] [1],希望它有幫助。 [1]:http://stackoverflow.com/questions/1244441/accessviolation-when-using-c-dll-from-delphi – CloudyMarble

+2

您需要出示SetName'的'的聲明。我敢打賭你沒有宣佈一個調用約定,或者宣佈了錯誤的調用約定。你的C++方法很可能使用'cdecl'。 –

回答

7

聽起來SetName使用錯誤的調用約定,請嘗試使用cdecl;

事情是這樣的:

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

否則你的堆棧將被搞亂。

-1

取決於重你的工作,在編譯器選項,你可能需要設置:

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

這些設置都不影響這個問題。 Ther沒有枚舉,也沒有記錄。 –

0

編譯爲ANSI或Unicode的DLL的? LPCTSTR當定義UNICODE時映射到wchar_t*,否則映射到char*。這會影響您在Delphi中如何使用DLL,其中wchar_t*等同於PWideCharchar*等同於PAnsiChar在Delphi中。