2011-10-26 53 views
3

我想尋求一些幫助。 我知道,有很多地方,我可以在這裏獲得這些信息。但是,無論如何,我有一個連接Delphi DLL到我的C++ Builder項目的問題。連接並在C++ Builder中使用Delphi DLL

例如,我的德爾福DLL的樣子:

library f_dll; 

uses 
    SysUtils, 
    Classes, 
    Forms, 
    Windows; 

procedure HW(AForm : TForm); 
     begin 
       MessageBox(AForm.Handle, 'DLL message', 'you made it!',MB_OK); 
     end; 
exports 
     HW; 

{$R *.res} 

begin 

end. 

這是我怎麼連一個DLL和函數中:

//defining a function pointer type 
typedef void (*dll_func)(TForm* AForm); 

dll_func HLLWRLD = NULL; 

HMODULE hDLL = LoadLibrary("f_dll.dll"); 
if (!hDLL) ShowMessage("Unable to load the library!"); 

//getting adress of the function 
HLLWRD = (dll_func)GetProcAddress(hDLL, "_HW"); 

if (!pShowSum) ShowMessage("Unable to find the function"); 

HLLWRLD(Form1); 

FreeLibrary(hDLL); 

我從編譯器沒有錯誤的消息,只有我有我的消息框說,該DLL沒有連接。我已經把我的dll放在Debug文件夾中的項目文件夾中。但沒有聯繫。

請,我要求你幫助我。我的錯誤是什麼?

編輯:我已經貼有錯誤的C++代碼,所以這裏是正確的(這是對的人,那也有類似的問題):

//defining a function pointer type 
typedef void (*dll_func)(TForm* AForm); 

dll_func HLLWRLD = NULL; 

HMODULE hDLL = LoadLibrary("f_dll.dll"); 
if (!hDLL) ShowMessage("Unable to load the library!"); 

//getting adress of the function 
HLLWRD = (dll_func)GetProcAddress(hDLL, "HW"); //HW instead _HW 

if (!HLLWRLD) ShowMessage("Unable to find the function"); //HLLWRLD instead pShowSum 

HLLWRLD(Form1); 

FreeLibrary(hDLL); 

回答

3
  1. 如果DLL是在同一目錄作爲可執行文件將被發現。
  2. 由Delphi DLL導出的名稱是HW而不是_HW。
  3. 調用約定可能不匹配。它在Delphi中註冊,我懷疑C++中的cdecl。請注意,我不是100%確定C++ Builder默認使用cdecl,您可以檢查。

更嚴重的問題是,你根本無法像這樣通過一個DLL邊界傳遞TForm。當您在DLL中調用對象的方法時,您正在調用DLL中的代碼,而不是主機exe中的代碼。但它是exe中的代碼,因爲這是屬於該對象的代碼,所以需要調用它。

您需要切換到運行時軟件包或接口。

+0

大衛,謝謝你的回答。我再次檢查:是的,錯誤是我已經把dll錯誤的文件夾。現在一切正常。我已經檢查過一些東西 - 你可以將TForm傳遞給一個dll以及所有其他的VCL組件。 – an40us

+1

@user不,你不能通過這樣的'TForm'。像閱讀句柄屬性一樣簡單就可以工作。事實上,相當多的工作可能會發生。但很多都會失敗。 –

+0

好的,謝謝你,你幫了我很多:) – an40us