Вызов функций-членов C ++ с соглашением thiscall - PullRequest
2 голосов
/ 14 декабря 2010

У меня есть приложение, написанное на C ++, которое загружает мою DLL, написанную на Delphi.Приложение вызывает экспортированную функцию DLL и передает ей указатель на объект класса, который имеет несколько функций-членов, которые я хочу вызывать из моей Delphi DLL.Я написал Delphi класс, эквивалентный классу C ++:

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 Ответ

1 голос
/ 15 декабря 2010

Asm выглядит хорошо, так мы называем интерфейс thiscall. Но это класс. Я не думаю, что есть основания предполагать, что CClass.A на самом деле вызывает void A (int). Вы должны выяснить правильное смещение. Думаю, наличие класса Delphi не поможет: вы должны выяснить смещения в C ++, добавить это смещение в ptr и вызвать этот адрес.

...