Главная страница
    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.039 c
8-1118270419
ДЫМ
2005-06-09 02:40
2005.11.13
Нужна быстрая графическая библиотека, чтобы рисовать примитивы


2-1130222516
Шурик Ш
2005-10-25 10:41
2005.11.13
Есть перемнная типа TForm


2-1130124489
Vitaliy
2005-10-24 07:28
2005.11.13
Наследование классов


14-1129711807
CCCP
2005-10-19 12:50
2005.11.13
dxDBGrud


14-1129731129
oldman
2005-10-19 18:12
2005.11.13
Вот такая вот задачка по физике :)))





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский