2012-06-20 61 views
4

我有一個C++ DLL,我寫了一個具有單個暴露函數的函數,它將函數指針(回調函數)作爲參數。在C++ DLL中調用Delphi中的回調函數

#define DllExport extern "C" __declspec(dllexport) 

DllExport bool RegisterCallbackGetProperty(bool (*GetProperty)(UINT object_type, UINT object_instnace, UINT property_identifer, UINT device_identifier, float * value)) { 
    // Do something. 
} 

我希望能夠在Delphi應用程序中調用此公開的C++ DLL函數,並註冊將來使用的回調函數。但我不確定如何在Delphi中創建一個函數指針,這個指針可以與暴露的C++ DLL函數一起工作。我有Delphi application calling a simple exposed c++ DLL functions從這個問題得到的幫助。

我正在構建C++ DLL,如果需要,我可以更改其參數。

我的問題是:

  • 如何我在Delphi中創建一個函數指針
  • 如何以正確調用暴露的C++ DLL函數從Delphi應用程序內,使得C++ DLL函數可以使用函數指針。

回答

11

通過聲明函數類型在Delphi中聲明函數指針。例如,對於您的回調函數類型,可以這樣定義:

type 
    TGetProperty = function(object_type, object_instnace, property_identifier, device_identifier: UInt; value: PSingle): Boolean; cdecl; 

注意調用約定爲cdecl,因爲你的C++代碼指定的調用約定,並CDECL是通常默認調用約定C++編譯器。

然後你就可以使用該類型來定義DLL函數:

function RegisterCallbackGetProperty(GetProperty: TGetProperty): Boolean; cdecl; external 'dllname'; 

替換'dllname'與您的DLL的名稱。

要調用DLL函數,您應該首先使用一個匹配回調類型的簽名的Delphi函數。例如:

function Callback(object_type, object_instnace, property_identifier, device_identifier: UInt; value: PSingle): Boolean cdecl; 
begin 
    Result := False; 
end; 

然後就可以調用DLL函數,並通過回調就像你任何其他變量:

RegisterCallbackGetProperty(Callback);