Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.13;
Скачать: CL | DM;

Вниз

Надо в CallBack API функции передать метод TObject   Найти похожие ветки 

 
Reindeer Moss Eater ©   (2005-09-15 13:07) [40]

>И чего, задача совсем не решаема ?

Решаема, если автор процедуры, которой передается адрес колбэка - тоже ты.


 
Reindeer Moss Eater ©   (2005-09-15 13:08) [41]

Если автор говорил, что ему нужен метод класса, это не означает, что в этом методе ему нужна была ссылка на экземпляр класса. Кстати, если речь идёт о методе класса, то ссылка на экземпляр класса в него не передаётся.

<Цитата>

Без ссылки на экземпляр класса метод ничем не отличается от простой процедуры.
У меня все на этом.


 
BiN ©   (2005-09-15 13:09) [42]

Как вариант могу предложить использование stub-функции, динамически размещенной в памяти для каждого экземпляра объекта. Примерно так:

DoHandlerProcAddr:=@TAbstractObject.DoHandlerProc;

function Callback(Param: DWORD): DWORD; stdcall;
{$O-}
asm
 push ebx
 push ecx

{A} mov eax, $ffffffff //(!!!)  При инициализации вместо $ffffffff кладем Self
 mov ecx, Param
 mov TAbstractObject(eax).Param, ecx
 mov ebx, DoHandlerProcAddr  //
 call ebx        

 pop ecx
 pop ebx  
{$O+}
end;


 
begin...end ©   (2005-09-15 13:09) [43]

> Reindeer Moss Eater ©   (15.09.05 13:08) [41]

> Без ссылки на экземпляр класса метод ничем не отличается
> от простой процедуры.

Это не делает нерешаемой задачу передачи метода в качестве callback-процедуры.

> У меня все на этом.

Ну всё, так всё.


 
Бурундук ©   (2005-09-15 13:24) [44]

У этой задачи есть два решения - одно частное и одно общее.

Частное решение - в колбэке первым аргументом является
указатель на пользовательские данные (как, например, в ThreadFunc).
В этом случае можно сделать метод без первого аргумента, а
в качестве пользовательских данных передать ссылку на объект.
(В Дельфях сделано немного не так).

Общее решение - создать в рантайме код функции, в которую зашит
указатель на объект + вызов метода. Так работает и TCallbackThunk,
и MakeObjectInstance.
Такая динамическая функция создаётся на каждый объект своя,
она фактически и является колбэк функцией.

TCallbackThunk достаёт из стэка адрес возврата,
ставит туда указатель на объект и после него ставит адрес возврата.
В таком виде стэк передаётся методу. Соответственно, не важно,
какие аргументы у колбэк-функции, все они в неизменном виде доходят
до метода (лишь бы соглашение о вызове было stdcall).

Всё просто, как валенок, и я не вижу, о чём тут можно спорить.


 
GuAV ©   (2005-09-15 20:10) [45]

http://www.kladovka.net.ru/index.cgi?pid=list&rid=49



Страницы: 1 2 вся ветка

Текущий архив: 2005.11.13;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.069 c
2-1129895544
Quattro
2005-10-21 15:52
2005.11.13
Добавление строкв СтрингГрид


2-1129313241
картограф
2005-10-14 22:07
2005.11.13
StringGrid


4-1126609187
Cherrex
2005-09-13 14:59
2005.11.13
Как использовать GetUserName


2-1129799690
Duffik
2005-10-20 13:14
2005.11.13
Проверка на наличие


14-1129987892
SPeller
2005-10-22 17:31
2005.11.13
Стрим-ТВ