我已經在DLL中定義如下界面:使用C++中的Delphi /帕斯卡爾接口
class TestInterface
{
public: int foo(int)=0;
};
而下面的功能讓我創建這個類型的對象:
extern "C" declspec(dllexport) TestInterface* __stdcall CreateInterface();
的接口實現在DLL中,我可以在沒有任何問題的情況下在C++中使用它(我還定義了.def
文件以確保一切正常)。但是,當涉及到在帕斯卡使用它,我有問題。
這裏是如何,我想在帕使用Interface
:
type
myinterface = interface(IInterface)
function foo(param1: Integer): Integer;
end;
TMyInterface = ^myinterface;
pCreateInterface = function: TMyInterface; stdcall;
var
CreateInterface: pCreateInterface;
帕斯卡使用接口:
function init()
begin
DllHandle := LoadLibrary(DLLPath);
if DllHandle <> 0 then
begin
@CreateInterface := GetProcAddress(DllHandle, 'CreateInterface');
if (@GetXYZ <> nil) then
begin
dllInitialized := true;
myXYZ := CreateInterface();
myXYZ.foo(1); // Access violation error here
end;
end;
end;
一切都顯得不錯。調試時,CreateInterface
執行成功,並且在myXYZ
中有一些值。但是當我嘗試撥打foo
時,出現訪問衝突錯誤。
我注意到我可以調用不在任何類中的函數,而不是那些在類/接口中的類。
我做錯了什麼?我怎樣才能做到這一點?
有沒有辦法可以在不使用C++源代碼的情況下在delphi中使用C++ dll?
您可能可以將其聲明爲記錄並使其工作。這不是一個界面。請記住,在C++中,類和結構本質上是一樣的。但是,您不應該從DLL中導出類。這與從Delphi DLL導出類沒有什麼不同。您迫使用戶使用與您相同的編譯器。 –
@DavidHeffernan,我認爲類COM接口應該適用於所有語言。這不正確嗎? – atoMerz
這不是一個COM接口。 –