在此处使用Delphi 7。当我获取过程的地址(目的是将此方法的地址发送给外部C ++ DLL作为回调)时,Delphi 7编译器将报告Variable required
。为什么?如何获取带有或不带有参数列表的方法的地址?
这是我的简化代码,显示了编译器错误。
// ...
type
PTProcedureCallback = ^TProcedureCallback;
TProcedureCallback = procedure() of object;
// ...
TTestCallback = class
constructor Create();
procedure MyCallback();
end;
//...
implementation
constructor TTestCallback.Create();
var
pCallback: PTProcedureCallback;
begin
// Constructor
inherited;
// Test callback
pCallback := @MyCallback; // <- [Error] Variable required
end;
procedure TTestCallback.MyCallback();
begin
// Do something
end;
end;
答案 0 :(得分:3)
您根本不需要PTProcedureCallback
,因为TProcedureCallback
已经是指针类型。
constructor TTestCallback.Create();
var
pCallback: TProcedureCallback;
begin
// Constructor
inherited;
// Test callback
pCallback := MyCallback;
end;
话虽如此,您不能将procedure of object
用作C / C ++回调,除非C / C ++代码是专门用C ++ Builder编写的,并且实际上期望使用procedure of object
通过__closure
编译器扩展。否则,您将无法使用非静态类方法作为回调。但是,如果回调允许您传递用户定义的值,则可以使用该值传递对象的Self
指针,以便回调可以访问其非静态成员。
此外,您的TProcedureCallback
使用的是Delphi的默认register
调用约定(在C ++ Builder中为__fastcall
),在非C ++ Builder编译器中不存在。只有cdecl
和stdcall
是可移植的调用约定。