获取成员函数delphi的指针

时间:2012-05-05 08:29:48

标签: delphi function pointers lazarus

是否有一些技巧如何在Lazarus / delphi中获取成员函数的指针? 我有这个代码不能编译....

错误是 在德尔福:
variable required

在拉撒路:
Error: Incompatible types: got "<procedure variable type of function(Byte):LongInt of object;StdCall>" expected "Pointer"


代码:

  TClassA = class
  public
      function ImportantFunc(AParameter: byte): integer; stdcall;
  end;

  TClassB = class
  public
     ObjectA: TClassA;
     ImportantPtr: pointer;
     procedure WorkerFunc;
  end;

  function TClassA.ImportantFunc(AParameter: byte): integer; stdcall;
  begin
     // some important stuff
  end;

  procedure TClassB.WorkerFunc;
  begin
     ImportantPtr := @ObjectA.ImportantFunc; //  <-- ERROR HERE
  end;

谢谢!

3 个答案:

答案 0 :(得分:4)

成员函数不能由单个指针表示。它需要两个指针,一个用于实例,一个用于代码。但这是实现细节,您只需要使用方法类型:

type
  TImportantFunc = function(AParameter: byte): integer of object; stdcall;

然后,您可以将ImportantFunc分配给此类型的变量。

由于您正在使用stdcall,我怀疑您正在尝试将其用作Windows回调。这对成员函数来说是不可能的。您需要具有全局范围的函数或静态函数。

答案 1 :(得分:2)

type
  TImportantFunc = function(AParameter: byte): integer of object;stdcall;

  ImportantPtr: TImportantFunc;

procedure TClassB.WorkerFunc;
begin
   ImportantPtr := ObjectA.ImportantFunc; //  <-- OK HERE
end;

答案 2 :(得分:1)

ObjectA.ImportantFunc不是内存位置,因此地址运算符@无法应用于它 - 因此编译错误。它是2个指针,@TClassA.ImportantFunc(方法代码)和ObjectA(自变量)。你的问题的答案取决于你真正需要的东西 - 代码指针,自我,两者或没有。


如果只需要定义函数名称,请使用静态类方法

TClassA = class
public
 class function ImportantFunc(Instance: TClassA; AParameter: byte): integer;
                                                               stdcall; static;
end;