Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.058 c
1-1130309298
Goast
2005-10-26 10:48
2005.11.13
Добавления изменений...


4-1126694897
Донской
2005-09-14 14:48
2005.11.13
ЗАпуск приложения от имени...


3-1127815972
ANB
2005-09-27 14:12
2005.11.13
(Oracle) Как правильно написать триггер для автоприсвоения ID


2-1130226417
RainKm
2005-10-25 11:46
2005.11.13
Список папок


4-1126431827
Edelweis
2005-09-11 13:43
2005.11.13
Изменить права NTFS





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский