2

Delphi で記述された DLL をロードする C++ で記述されたアプリケーションがあります。アプリケーションは、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 に答える