当C ++程序调用Delphi DLL函数时崩溃

时间:2010-12-12 04:16:13

标签: c++ delphi function dll crash

我在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;

它工作正常并且不会崩溃,但当然我不能这样离开它,我需要能够使用这个类。有人能告诉我我做错了吗?

3 个答案:

答案 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 ++并不容易......而且不合适。