首页 > 解决方案 > Variable required error (Delphi) - 如何获取程序的地址?

问题描述

在这里使用 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;

标签: delphipointers

解决方案


您根本不需要PTProcedureCallback,因为TProcedureCallback它已经是指针类型。

constructor TTestCallback.Create();
var
  pCallback: TProcedureCallback;
begin
  // Constructor
  inherited;
  // Test callback
  pCallback := MyCallback;
end;

话虽如此,您不能将 aprocedure of object用作 C/C++ 回调,除非 C/C++ 代码是专门用 C++Builder 编写的,并且实际上期望procedure of object通过__closure编译器扩展来实现 a。如果没有,您将无法使用非静态类方法作为回调。但是,如果回调允许您传入用户定义的值,则可以使用它来传入对象的Self指针,以便回调可以访问其非静态成员。

此外,您TProcedureCallback使用的是 Delphi 的默认register调用约定(__fastcall在 C++Builder 中),非 C++Builder 编译器中不存在该约定。只有cdeclstdcall是可移植的调用约定。


推荐阅读