2013-02-06 70 views
0

我已經在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?

+0

您可能可以將其聲明爲記錄並使其工作。這不是一個界面。請記住,在C++中,類和結構本質上是一樣的。但是,您不應該從DLL中導出類。這與從Delphi DLL導出類沒有什麼不同。您迫使用戶使用與您相同的編譯器。 –

+0

@DavidHeffernan,我認爲類COM接口應該適用於所有語言。這不正確嗎? – atoMerz

+0

這不是一個COM接口。 –

回答

4

首先,你的Delphi代碼有一個派生自IInterface的對象,而你的C++沒有。

不過,我建議你閱讀這篇文章,魯迪Velthuis: -

http://rvelthuis.de/articles/articles-cppobjs.html

基本上,你要麼需要實現C++結束的COM對象,或 '扁平化' 你的C++對象轉換爲C可調用函數。