在delphi / pascal中使用C ++接口

时间:2013-02-06 14:24:25

标签: c++ delphi interface delphi-7 pascal

我在dll中定义了以下接口:

class TestInterface
{
   public: int foo(int)=0;
};

以下函数让我创建这种类型的对象:

extern "C" declspec(dllexport) TestInterface* __stdcall CreateInterface();

接口在dll中实现,我可以在C ++中使用它而没有任何问题(我还定义了.def文件以确保一切正常)。然而,当它在pascal中使用时,我遇到了问题 以下是我在pascal中使用Interface的方法:

type
  myinterface = interface(IInterface)
    function foo(param1: Integer): Integer;
  end;

TMyInterface = ^myinterface;
pCreateInterface = function: TMyInterface; stdcall;

var
  CreateInterface: pCreateInterface;

在pascal中使用界面:

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时,我收到了访问冲突错误 我注意到我可以从dll中调用不在任何类中的函数,但不能调用类/接口内的函数 难道我做错了什么?我怎么能这样做?
有没有办法在delphi中使用C ++ dll而不改变C ++源代码?

1 个答案:

答案 0 :(得分:4)

首先,您的Delphi代码有一个派生自IInterface的对象,而您的C ++则没有。

但是,我建议你阅读Rudy Velthuis撰写的这篇文章: -

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

基本上,您需要将C ++端实现为COM对象,或者将C ++对象“压扁”为C可调用函数。