0

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

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

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

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

该接口在 dll 中实现,我可以在 C++ 中毫无问题地使用它(我还定义了该.def文件以确保一切正常)。但是,在帕斯卡中使用它时,我遇到了问题。
这是我尝试使用Interfacein pascal 的方式:

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 调用不在任何类内的函数,但不能调用类/接口内的函数。
难道我做错了什么?我怎样才能做到这一点?
有没有一种方法可以在不更改 C++ 源代码的情况下在 delphi 中使用 C++ dll?

4

1 回答 1

4

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

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

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

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

于 2013-02-06T14:46:32.037 回答