4

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

Delphi 中出现错误:
variable required

在 Lazarus 中:
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;

谢谢!

4

3 回答 3

4

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

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

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

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

于 2012-05-05T08:39:04.553 回答
2
type
  TImportantFunc = function(AParameter: byte): integer of object;stdcall;

  ImportantPtr: TImportantFunc;

procedure TClassB.WorkerFunc;
begin
   ImportantPtr := ObjectA.ImportantFunc; //  <-- OK HERE
end;
于 2012-05-05T08:45:45.297 回答
1

ObjectA.ImportantFunc不是内存位置,因此地址运算符@不能应用于它 - 因此编译器错误。它是 2 个指针,@TClassA.ImportantFunc(方法代码)和ObjectA(Self 参数)。您的问题的答案取决于您真正需要什么 - 代码指针,Self,两者都有或没有。


如果您只需要限定函数名称的范围,请使用静态类方法

TClassA = class
public
 class function ImportantFunc(Instance: TClassA; AParameter: byte): integer;
                                                               stdcall; static;
end;
于 2012-05-05T09:24:13.517 回答