2

我有一个用 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;
};

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

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

但是当应用程序调用此函数时出现分段错误。如何正确调用成员函数?

4

1 回答 1

1

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

于 2010-12-14T21:16:01.657 回答