我在C ++程序中有一个类似于
的抽象类class Interface {
virtual void blah() = 0;
virtual int asdf() = 0;
};
并且C ++程序允许您使用LoadLibrary加载DLL。当您加载DLL时,它调用DLL中的一个名为Setup with GetProcAddress的函数,并将指针作为参数传递给Interface的子类。
我有一个Delphi DLL模仿该类并公开Setup函数,如下所示:
type
Interface = class abstract
procedure blah(); virtual; abstract;
function asdf() : Integer; virtual; abstract;
end;
function Setup(I : Interface) : Integer; export; cdecl;
begin
Result := 0;
end
exports Setup;
但是当程序调用该函数时,它会崩溃。如果我将功能设置更改为:
function Setup(I : Pointer) : Integer; export; cdecl;
它工作正常并且不会崩溃,但当然我不能这样离开它,我需要能够使用这个类。有人能告诉我我做错了吗?
答案 0 :(得分:2)
<击> 我不知道C ++,但是Delphi接口会自动引用计数(通过IUnknown)。看起来你的界面在你尝试使用它时已经被破坏了。
编辑: 对不起,我很困惑:你没有使用接口。
Delphi和C ++类不兼容,所以我认为这不会起作用。您必须将类更改为COM接口或函数指针的记录。如果你对C ++方面没有控制权,那我就很害怕。
答案 1 :(得分:1)
如果您的C ++代码确实如您所说,那么您需要确定它正在使用的调用约定。它肯定是使用C调用约定吗?它是用什么编译的,以及用于调用约定的标志?
您的Interface
类也需要包含调用约定,例如:
Interface = class abstract
procedure blah(); cdecl; virtual; abstract;
function asdf() : Integer; cdecl; virtual; abstract;
end;
如果C ++使用的调用约定类似于MSVC的fastcall,那么在Delphi中没有直接的等价物。在这种情况下你可以做的是在MSVC中编写一个代理DLL,将接口从MSVC fastcall转换为cdecl或类似的。
答案 2 :(得分:0)
您可以看到http://rvelthuis.de/articles/articles-cppobjs.html
但是,是的,在Delphi中使用C ++并不容易......而且不合适。