Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Надо в CallBack API функции передать метод TObject [D7, WinXP]


Страницы:   1 2 3

Still Swamp ©   (2005-09-14 14:27:00) 

Надо в CallBack API функции передать метод TObject. Как это сделать. Метод описан в соответствии с требованиями CallBack.

Теперь надо по идее передать указатель на эту процедуру. Как это сделать?


GuAV   (2005-09-15 20:10:00) [1]

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


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

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

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

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

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

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


begin...end   (2005-09-15 13:09:00) [3]

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

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

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

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

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


BiN   (2005-09-15 13:09:00) [4]

Как вариант могу предложить использование 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;


Reindeer Moss Eater   (2005-09-15 13:08:00) [5]

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

<Цитата>

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


Reindeer Moss Eater   (2005-09-15 13:07:00) [6]

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

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


begin...end   (2005-09-15 13:06:00) [7]

> Reindeer Moss Eater ©   (15.09.05 13:04) [38]

> Автор говорил, что ему метод класса нужен и не хочет он
> простую процедуру юзать.

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


Reindeer Moss Eater   (2005-09-15 13:04:00) [8]

Да ёпрст!
Авторговорил, что ему метод класса нужени не хочет он простую процедуру юзать.


ANB   (2005-09-15 13:04:00) [9]


> begin...end ©   (15.09.05 13:01) [36]
- а зачем тогда еще такой изгал нужен.

> Still Swamp   (14.09.05 14:54) [7]
> а внутри охото с классом работать...
> смысл этого забора именно в этом.
- это желание автора.
И чего, задача совсем не решаема ?


begin...end   (2005-09-15 13:01:00) [10]

> Reindeer Moss Eater ©   (15.09.05 13:00) [35]

> Потому что у него не будет валидной ссылки на экземпляр
> класса внутри метода используемого в качестве callback'а.

И что?

> А без этого метод не имеет никаких преимуществ перед обычной
> процедурой.

Никто не говорил, что эти преимущества требуются.


Reindeer Moss Eater   (2005-09-15 13:00:00) [11]

Потому что у него не будет валидной ссылки на экземпляр класса внутри метода используемого в качестве callback'а.
А без этого метод не имеет никаких преимуществ перед обычной процедурой.
А обычную процедуру автор не хочет.


begin...end   (2005-09-15 12:58:00) [12]

> Reindeer Moss Eater ©   (15.09.05 12:52) [33]

> Автор хотел пользоваться callback'ом как методом класса
> и не хотел пользоваться callback'ом как ordinal procedure.
> У него это не выйдет.

Почему?


Reindeer Moss Eater   (2005-09-15 12:52:00) [13]

Автор хотел пользоваться callback'ом как методом класса и не хотел пользоваться callback'ом как ordinal procedure.
У него это не выйдет.
Утверждение [3] верно.

Кстати, какова должна быть декларация того метода, что бы Delphi считала, что неявный параметр передается последним?


begin...end   (2005-09-15 12:47:00) [14]

> Reindeer Moss Eater ©   (15.09.05 12:41) [31]

Задача: "Надо в CallBack API функции передать метод TObject". Эта задача решается. Значит, выйдет.


Reindeer Moss Eater   (2005-09-15 12:41:00) [15]

Спокойно!
Утверждения в [3] верно.
Потому что факт безаварийного вызова колбэка не означает, что у автора вопроса выйдет то, что он хотел.


begin...end   (2005-09-15 12:36:00) [16]

> Reindeer Moss Eater ©   (15.09.05 12:32) [29]

Нафига -- это уже другой вопрос. Утверждение в [3] неверно.


Reindeer Moss Eater   (2005-09-15 12:32:00) [17]

Даже если такое возможно, то чем это будет отличаться от использования простой процедуры в качестве callback?

Валидной ссылки на экземпляр внутри метода у нас не будет.
К другим полям и метода класса мы не достучимся.
И нафига было такой огород городить?


begin...end   (2005-09-15 12:25:00) [18]

> Reindeer Moss Eater ©   (15.09.05 12:24) [27]

> Даже если процедура, которая вызывает твой колбэк написана
> три года назад Билли Гейтсом?

Да.

> Каким там по по порядку параметром передается неявная ссылка
> на экземпляр методу класса OP?

Зависит от соглашения вызова метода.


Reindeer Moss Eater   (2005-09-15 12:24:00) [19]

Даже если процедура, которая вызывает твой колбэк написана три года назад Билли Гейтсом?
Каким там по по порядку параметром передается неявная ссылка на экземпляр методу класса OP?


begin...end   (2005-09-15 12:19:00) [20]

> Reindeer Moss Eater ©   (14.09.05 14:42) [3]
> Так что не выйдет.

Выйдет. Если соответствующим образом написать метод.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо