使用thiscall约定调用C ++成员函数

时间:2010-12-14 20:42:34

标签: c++ delphi segmentation-fault calling-convention member-functions

我有一个用C ++编写的应用程序加载我用Delphi编写的DLL。应用程序调用DLL的导出函数,并将指针传递给类的对象,该类具有我想从Delphi DLL调用的几个成员函数。我编写了一个相当于C ++类的Delphi类:

CClass = class
    procedure A(param : Integer); virtual; abstract;
    procedure B; virtual; abstract;
end

和C ++类看起来相同

class CClass {
public:
    virtual void A(int) = 0;
    virtual void B() = 0;
};

成员函数使用thiscall调用约定,该约定没有Delphi等价物。这可能意味着我需要使用汇编。我试过了:

function exported_procedure(ptr : CClass) : Integer; cdecl;
begin
    asm
        push ebx;
        push esi;
        mov ecx, ptr;
        push 4;
        call CClass.A;
        pop esi;
        pop ebx;
    end;

    Result := 0;
end

但是当应用程序调用此函数时,我遇到了分段错误。如何正确调用成员函数?

1 个答案:

答案 0 :(得分:1)

asm看起来很好,这就是我们称之为thiscall接口的方式。但这是一堂课。我认为没有理由假设CClass.A实际上调用void A(int)。你必须找出正确的偏移量。有一个Delphi类我不会想到:你应该在C ++中找到偏移量,将该偏移量添加到ptr并调用该地址。