所需的变量错误(Delphi)-如何获取过程的地址?

时间:2019-06-26 17:22:52

标签: delphi pointers

在此处使用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;

1 个答案:

答案 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编译器中不存在。只有cdeclstdcall是可移植的调用约定。