Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Method pointers > Function pointers

01.01.2007
{
 
Converting method pointers into function pointers
 
 
Often you need a function pointer for a callback function. But what,
 
if you want to specify a method as an callback? Converting a method
 pointer to a
function pointer is not a trivial task; both types are
 incomatible
with each other. Although you have the possibility to
 convert like
this "@TClass.SomeMethod", this is more a hack than a
 solution
, because it restricts the use of this method to some kind
 of a
class function, where you cannot access instance variables.
 
If you fail to do so, you'll get a wonderful gpf. But there is
 a better solution: run time code generation! Just allocate an
 executeable memory block, and write 4 machine code instructions into
 it: 2 instructions loads the two pointers of the method pointer
 (code & data) into the registers, one calls the method via the code
 pointer, and the last is just a return Now you can use this pointer
 to the allocated memory as a plain funtion pointer, but in fact you are
 calling a method for a specific instance of a Class.
 
}
type TMyMethod = procedure of object;
 
 
function MakeProcInstance(M: TMethod): Pointer;
begin
  // allocate memory
  GetMem(Result, 15);
  asm
    // MOV ECX,
    MOV BYTE PTR [EAX], $B9
    MOV ECX, M.Data
    MOV DWORD PTR [EAX+$1], ECX
    // POP EDX
    MOV BYTE PTR [EAX+$5], $5A
    // PUSH ECX
    MOV BYTE PTR [EAX+$6], $51
    // PUSH EDX
    MOV BYTE PTR [EAX+$7], $52
    // MOV ECX,
    MOV BYTE PTR [EAX+$8], $B9
    MOV ECX, M.Code
    MOV DWORD PTR [EAX+$9], ECX
    // JMP ECX
    MOV BYTE PTR [EAX+$D], $FF
    MOV BYTE PTR [EAX+$E], $E1
  end;
end;
 
 
procedure FreeProcInstance(ProcInstance: Pointer);
begin
  // free memory
  FreeMem(ProcInstance, 15);
end;
 
{
 After all, you should not forget to release the allocated memory.
 "TMyMethod" can be modified according your specific needs, e.g.
 add some parameters for a WindowProc. N.B.: Yes, I know, Delphi
 has those "MakeProcInstance" function in its forms unit. But this
 works a little bit different, has much more overhead, and most
 important, you have to use the forms unit, which increases the
 size of your exe drastically, if all other code doesn'
t use the
 VCL
(e.g. in a fullscreen DirectX/OpenGl app).
 
// Wer noch Fragen hat / if you have questions: Florian.Benz@t-online.de
}

Взято с сайта https://www.swissdelphicenter.ch/en/tipsindex.php