gpt4 book ai didi

c++ - 在 delphi/pascal 中使用 C++ 接口(interface)

转载 作者:行者123 更新时间:2023-11-27 23:18:55 24 4
gpt4 key购买 nike

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

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

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

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

该接口(interface)是在 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 接口(interface):

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 中调用不在任何类中的函数,但不能调用类/接口(interface)中的函数。
难道我做错了什么?我该怎么做?
有没有一种方法可以在不更改 C++ 源代码的情况下在 Delphi 中使用 C++ DLL?

最佳答案

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

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

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

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

关于c++ - 在 delphi/pascal 中使用 C++ 接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14731390/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com