У меня есть несколько скомпилированных MSVC ++ DLL, для которых я создал COM-подобные (lite) интерфейсы (абстрактные классы Delphi). Некоторые из этих классов имеют методы, которые нуждаются в указателях на объекты. Эти методы C ++ объявляются с __ thiscall соглашением о вызовах (которое я не могу изменить ), которое аналогично __stdcall, за исключением того, что указатель this передается в ECX регистр.
Я создаю экземпляр класса в Delphi, а затем передаю его в метод C ++. Я могу установить точки останова в Delphi и увидеть, как он воздействует на открытые методы __stdcall в моем классе Delphi, но вскоре я получаю STATUS_STACK_BUFFER_OVERRUN, и приложение должно завершиться. Можно ли эмулировать / иметь дело с __thiscall на стороне Delphi? Если я передаю объект, созданный системой C ++, то все хорошо, и методы этого объекта вызываются (как и следовало ожидать), но это бесполезно - мне нужно передать объекты Delphi.
Редактировать 2010-04-19 18: 12 Вот что происходит более подробно: первый
вызываемый метод (setLabel) завершается без
ошибка (хотя это метод заглушки).
второй метод называется (init), входит
затем умирает, когда он пытается прочитать
том параметр.
C ++ Side
#define SHAPES_EXPORT __declspec(dllexport) // just to show the value
class SHAPES_EXPORT CBox
{
public:
virtual ~CBox() {}
virtual void init(double volume) = 0;
virtual void grow(double amount) = 0;
virtual void shrink(double amount) = 0;
virtual void setID(int ID = 0) = 0;
virtual void setLabel(const char* text) = 0;
};
Delphi Side
IBox = class
public
procedure destroyBox; virtual; stdcall; abstract;
procedure init(vol: Double); virtual; stdcall; abstract;
procedure grow(amount: Double); virtual; stdcall; abstract;
procedure shrink(amount: Double); virtual; stdcall; abstract;
procedure setID(val: Integer); virtual; stdcall; abstract;
procedure setLabel(text: PChar); virtual; stdcall; abstract;
end;
TMyBox = class(IBox)
protected
FVolume: Double;
FID: Integer;
FLabel: String; //
public
constructor Create;
destructor Destroy; override;
// BEGIN Virtual Method implementation
procedure destroyBox; override; stdcall; // empty - Dont need/want C++ to manage my Delphi objects, just call their methods
procedure init(vol: Double); override; stdcall; // FVolume := vol;
procedure grow(amount: Double); override; stdcall; // Inc(FVolume, amount);
procedure shrink(amount: Double); override; stdcall; // Dec(FVolume, amount);
procedure setID(val: Integer); override; stdcall; // FID := val;
procedure setLabel(text: PChar); override; stdcall; // Stub method; empty.
// END Virtual Method implementation
property Volume: Double read FVolume;
property ID: Integer read FID;
property Label: String read FLabel;
end;
Я бы наполовину ожидал, что будет работать только stdcall, но что-то не так, не уверен, что, возможно, что-то связанное с использованием регистра ECX? Помощь будет принята с благодарностью.
Редактировать 2010-04-19 17: 42 Может ли быть так, что регистр ECX должен быть
сохраняется при входе и восстанавливается один раз
функция выходит? это
указатель требуется C ++? Я наверное
просто достигнув в данный момент на основе
некоторые интенсивные поиски Google. я
нашел что-то связанное , но это
похоже имеет дело с обратным
этого номера.