Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.52 MB
Время: 0.026 c
5-1109235757
Павел
2005-02-24 12:02
2005.11.13
Поясните свойство ComponentState


9-1119938373
4ECHOK
2005-06-28 09:59
2005.11.13
[RagDoll] Синтез движений персонажа


2-1130054251
Yegorchic
2005-10-23 11:57
2005.11.13
Работа с памятью


3-1128082475
Top
2005-09-30 16:14
2005.11.13
(Оракля)Как организовать автоперемотку сиквенса в ADO


3-1127992040
guesst
2005-09-29 15:07
2005.11.13
Log файл




   Наверх