我在C++程序中有一个抽象类,看起来像
class Interface {
virtual void blah() = 0;
virtual int asdf() = 0;
};
并且该C++程序允许您使用LoadLibrary加载DLL。当您加载DLL时,它将使用GetProcAddress调用DLL中名为Setup的函数,并将指针传递给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;
它工作正常并且不会崩溃,但是我当然不能只留下它,我需要能够使用该类。有人可以告诉我我在做什么错吗?
最佳答案
如果您的C++代码确实如您所说的那样,则需要确定其使用的调用约定。是否肯定使用C调用约定?它使用什么进行编译,以及调用约定的标志是什么?
您的Interface
类也需要包含调用约定,例如:
Interface = class abstract
procedure blah(); cdecl; virtual; abstract;
function asdf() : Integer; cdecl; virtual; abstract;
end;
如果C++使用的调用约定类似于MSVC的fastcall,则Delphi中没有直接等效的约定。在那种情况下,您可以做的是在MSVC中编写一个代理DLL,该DLL将接口(interface)从MSVC快速调用转换为cdecl或类似名称。
关于c++ - C++程序调用Delphi DLL函数时崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4420379/