как было сказано выше, для API функций, которые используют callback, обычно разрешается передать UserData (данные которые будут переданы программисту при вызове этой callback функции.
например есть такая API "условная" функция
- Код: Выделить всё
- TCallbackProc = procedure (SomeData: Integer; UserData:Pointer); stdcall;
 
 procedure SuperPupperAPIFunction( param1, param2: Integer; CallBackProc: TCallbackProc; UserData: Pointer); stdcall; external;
 
эта в эту функции, передаются входные параметры (param1, param2 - не важно что они значат - чисто условные). При работе этой функции будет вызываться CallBackProc, в который будет передана переменная UserData, та же сама, что и была передана при вызове SuperPupperAPIFunction.
как можно этим воспользоваться.
- Код: Выделить всё
- type
 TMyObject = class(Tobject)
 procedure Callback(SomeData: Integer);
 end;
 
 // это обработчик
 procedure TMyObject.CallBack(SomeData: Integer);
 begin
 writeln('SomeData = ', SomeData);
 end;
 
 procedure CallBackProc(SomeData: integer; UserData: Pointer); stdcall;
 begin
 // UserData это объект TMyObject, но нужно привести тип!
 TMyObject(UserData).CallBack(SomeData); // передача из функции Callback методу объекта.
 end;
 
 
 ...
 var
 m : TMyObject;
 ...
 m := TMyObject.Create; // создали объект, иначе будет плохо!
 ...
 SuperPupperAPIFunction( x, y, @CallBackProc, m); // в качестве UserData передали объект
 ...
 end.
 
.хз как яснее написать... яснее будет на живом примере!
это использование типично для различный обёрток 

 и не только Delphi/FPC но и C++ и других объектно-оринетрованных языков, где в качестве UserData передаётся объект, и уже CallBack-процедура решает какой метод объекта нужно вызвать.
и ещё. Если писать класс обёртку, то следует "скрывать" (инкапсулировать - о как!) такое использование API, с помощью дополнительного метода объекта:
- Код: Выделить всё
- interface
 ...
 TMyObject = class(Tobject)
 protected
 procedure Callback(SomeData: Integer); virtual;
 public
 // обёртка вокруг API функции
 procedure SuperPupper(param1, param2: Integer);
 end;
 ...
 
 implementation
 
 procedure CallBackProc(SomeData: integer; UserData: Pointer); stdcall;
 begin
 // UserData это объект TMyObject, но нужно привести тип!
 TMyObject(UserData).CallBack(SomeData); // передача из функции Callback методу объекта.
 end;
 
 // это обработчик
 procedure TMyObject.CallBack(SomeData: Integer);
 begin
 writeln('SomeData = ', SomeData);
 end;
 
 // этот метод - обёртка для вызова функции SuperPupperAPIFunction
 procedure TMyObject.SuperPupper(param1, param2: Integer);
 begin
 SuperPupperAPIFunction(param1, param2, @CallBackProc, Self);
 end;
 
отличие этого когда, от перыдущего в том, что использование SuperPupperAPIFunction скрыто, что позволяет добится больше структурированности кода.
и ещё раз: "хз как яснее написать... яснее будет на живом примере"!
ЗЫ: искать хаки, для того чтобы передавать метод объекта, как процедуру - не стоит:
1-х эти решения не будут кроссплатформенными (увы и ах ВСЕГДА придёться лезть в ассемблер и основываться на convention call)
2-х они покажут, что ты программист-индус (в хучшем смысле этого слова).
3-х ненужное усложнение кода.