Вверх ↑
Ответов: 4630
Рейтинг: 749
#1: 2013-07-30 16:24:45 ЛС | профиль | цитата
Самый простой вариант - делается глобальная переменная типа PList. Каждый экземпляр класса при создании добавляет себя в этот список, при уничтожении удаляет. Callback процедура перебирает объекты из этого списка и если поле "Хендл" объекта соответствует параметру процедуры - вызывает любой метод внутри этого объекта.
Когда-то ещё вроде пробовал так:


#pas
procedure THICallback._work_doCreateHook;
function WndHandleCallback(HWnd: THandle; Msg: Cardinal; WParam, LParam: Integer): Cardinal; stdcall;
begin
...........
end;
begin
begin
if FWndHandle = 0 then
begin
FWndHandle := ReadInteger(_Data,_data_Handle);
FEnabledCallbak := true;
SetWindowLong(FWndHandle, GWL_USERDATA,
SetWindowLong(FWndHandle, GWL_WNDPROC, LongInt(@WndHandleCallback)));
end
else exit;
end;
Кажеться, в Delphi работало (в FPC вложенная функция имеет ещё один неявный параметр; было бы любопытно переставлять параметры на ассемблере) И не забывай сохранять/восстанавливать оригинальные GWL_USERDATA и GWL_WNDPROC у окна.
карма: 26

1
Голосовали:andrestudio