Форум: "WinAPI";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];
Вниз
Надо в 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 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.039 c