Search code examples
delphifunctionpointerslazarus

get pointer of member function delphi


Is there some trick how to get pointer of a member function in Lazarus / delphi? I have this code which won't compile....

Error is in Delphi:
variable required

in Lazarus:
Error: Incompatible types: got "<procedure variable type of function(Byte):LongInt of object;StdCall>" expected "Pointer"


The code:

  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;

Thanks!


Solution

  • A member function cannot be represented by a single pointer. It needs two pointers, one for the instance and one for the code. But that's implementation detail and you just need to use a method type:

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

    You can then assign ImportantFunc to a variable of this type.

    Since you are using stdcall I suspect you are trying to use this as a Windows callback. That's not possible for a member function. You need a function with global scope, or a static function.