我有一些 MSVC++ 编译的 DLL,为此我创建了类似 COM(lite)的接口(抽象 Delphi 类)。其中一些类具有需要指向对象的指针的方法。这些 C++ 方法使用__thiscall调用约定(我无法更改)声明,这就像 __stdcall 一样,除了this指针在 ECX 寄存器上传递。
我在 Delphi 中创建类实例,然后将其传递给 C++ 方法。我可以在 Delphi 中设置断点并看到它在我的 Delphi 类中遇到暴露的 __stdcall 方法,但很快我得到一个 STATUS_STACK_BUFFER_OVERRUN 并且应用程序必须退出。是否可以在 Delphi 方面模拟/处理 __thiscall?如果我传递一个由 C++ 系统实例化的对象,那么一切都很好,并且该对象的方法被调用(正如预期的那样),但这没用 - 我需要传递 Delphi 对象。
编辑 2010-04-19 18:12这是更详细的情况:第一个名为 (setLabel) 的方法退出时没有错误(尽管它是一个存根方法)。第二种方法称为 (init),当它尝试读取 vol参数时进入然后死掉。
C++ 端
#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;
};
德尔福侧
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++ 需要this指针吗?我现在可能只是根据一些激烈的谷歌搜索到达。我发现了一些相关的东西,但它似乎正在处理这个问题的反面。