![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Надо в CallBack API функции передать метод TObject [D7, WinXP]
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]
> Так что не выйдет.
Выйдет. Если соответствующим образом написать метод.