Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.13;
Скачать: CL | DM;

Вниз

Надо в CallBack API функции передать метод TObject   Найти похожие ветки 

 
Still Swamp   (2005-09-14 14:27) [0]

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

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


 
Reindeer Moss Eater ©   (2005-09-14 14:31) [1]

Метод описан в соответствии с требованиями CallBack.

И каков прототип этой callback функции?


 
Still Swamp   (2005-09-14 14:39) [2]

Это заголовок из хелпа.

VOID CALLBACK TimerProc(

   HWND hwnd, // handle of window for timer messages
   UINT uMsg, // WM_TIMER message
   UINT idEvent, // timer identifier
   DWORD dwTime  // current system time
  );

это метод для объекта
procedure TMeshList.SingleThreadTimer(HWND:hwnd; uMsg:UINT; idEvent:UINT; dwTime:DWORD);

Это по идее вызов.
AddrMesh:=?????
IDDrawTimer:=SetTimer(0, 0, 1, AddrMesh);


 
Reindeer Moss Eater ©   (2005-09-14 14:42) [3]

Метод объекта имеет на один параметр больше.
Хотя он явно и не прописан.
Так что не выйдет.


 
Still Swamp   (2005-09-14 14:45) [4]

а метод борьбы?


 
Still Swamp   (2005-09-14 14:46) [5]

я в этот CallBack не могу даже поинтер никакой вернуть.


 
Reindeer Moss Eater ©   (2005-09-14 14:46) [6]

А почему не использовать обычную функцию, а не метод класса?


 
Still Swamp   (2005-09-14 14:54) [7]

а внутри охото с классом работать...
смысл этого забора именно в этом.


 
Still Swamp   (2005-09-14 14:56) [8]

не описывать же глобальную переменную


 
Reindeer Moss Eater ©   (2005-09-14 14:59) [9]

Метод класса нужно вызывать имея экземпляр.
А та процедура которой ты передаешь callback ничего же про это не знает.
Надо использовать прокладку.
Передавать в качестве callback ordinal procedure or function и уже внутри нее получать ссылку на экземпляр и вызывать метод класса.


 
Джо ©   (2005-09-14 15:00) [10]


>  [8] Still Swamp   (14.09.05 14:56)
> не описывать же глобальную переменную

Ну, переменную можно завести в секции implementation.


 
Игорь Шевченко ©   (2005-09-14 15:13) [11]

Still Swamp   (14.09.05 14:39) [2]

MakeObjectInstance не поможет ?


 
Still Swamp   (2005-09-14 15:20) [12]


> Передавать в качестве callback ordinal procedure or function
> и уже внутри нее получать ссылку на экземпляр и вызывать
> метод класса.


Ну правильно... :( так как нет параметра приходящего в CallBack - глобальная переменная.


 
ANB ©   (2005-09-14 15:22) [13]


> Игорь Шевченко ©   (14.09.05 15:13) [11]
- а чего она делает ? (Я в хелпере не нашел)


 
Игорь Шевченко ©   (2005-09-14 15:26) [14]

ANB ©   (14.09.05 15:22) [13]

Самый лучший Help - http://www.google.com

http://community.borland.com/article/0,1410,27295,00.html


 
ANB ©   (2005-09-14 15:32) [15]


> Игорь Шевченко ©   (14.09.05 15:26) [14]
- да нет у меня туда доступа :(((


 
Digitman ©   (2005-09-14 15:36) [16]


> нет у меня туда доступа


неужели и к тексту classes.pas нет доступа ?!


 
ANB ©   (2005-09-14 15:48) [17]


> Digitman ©   (14.09.05 15:36) [16]
- залез уже. Мне бы коротенько, для чего нужна, а как работает уж разберусь.


 
Digitman ©   (2005-09-14 16:05) [18]


> Мне бы коротенько


"коротенько" - для "легкого" сопряжения механизма вызова WinAPI-callback-ф-ций c механизмом вызовов соответствующих по логике методов объектов Делфи, предназначенных для обработки Win-сообщений

пусть у тебя имеется некий класс

TMyClass = class(..)
procedure MyHandler(var Message: TMessage);
end;

и ты хочешь , чтобы метод MyHandler некоего объекта MyObject класса TMyClass вызывался всякий раз, когда некоему окну адресовано некое сообщение

с использованием MakeObjectInstance() все это делается оч просто :

   SetWindowLong(хэндл_окна_адресата, GWL_WNDPROC, Longint(MakeObjectInstance(MyObject.MyHandler)));


 
ANB ©   (2005-09-14 16:12) [19]


> Digitman ©   (14.09.05 16:05) [18]
- спасибо. Положу в копилку. Как раз хотел написать компонент для работы с MS SQL через DB Lib и застрял на CallBack-ах.


 
Digitman ©   (2005-09-14 16:23) [20]


> Как раз хотел написать компонент для работы с MS SQL через
> DB Lib и застрял на CallBack-ах


вряд ли тебе MakeObjectInstance() подойдет для оной цели - это, мягко говоря, из другой оперы .. это к оконным функциям/сообщениям относится, а не к произвольным колбэкам, коих в Win32 - туча несметная всякоразных ..


 
Игорь Шевченко ©   (2005-09-14 16:23) [21]

ANB ©   (14.09.05 16:12) [19]

Тут только один момент - эта функция не для любого Callback"а работает. А только для типа TWndMethod


 
ANB ©   (2005-09-14 16:53) [22]


> Игорь Шевченко ©   (14.09.05 16:23) [21]
- тогда не поканает :(((


 
Lamer@fools.ua ©   (2005-09-14 17:04) [23]

>>ANB ©   (14.09.05 16:53) [22]

Думаю, никто не мешает сделать свой механизм для нужных колбеков по аналогии с MakeObjectInstance().


 
Бурундук ©   (2005-09-14 17:15) [24]

Не так давно наткнулся на такую конструкцию.
(Насколько я разобрался, работает для stdcall-колбэка с
произвольными аргументами).

type
 TCallbackThunk = packed record
   POPEDX: Byte;
   MOVEAX: Byte;
   SelfPtr: Pointer;
   PUSHEAX: Byte;
   PUSHEDX: Byte;
   JMP: Byte;
   JmpOffset: Integer;
 end;

procedure InitCallbackThunk(var Callback: TCallbackThunk; Method: TMethod);
begin
 Callback.POPEDX := $5A;
 Callback.MOVEAX := $B8;
 Callback.SelfPtr := Method.Data;
 Callback.PUSHEAX := $50;
 Callback.PUSHEDX := $52;
 Callback.JMP     := $E9;
 Callback.JmpOffset := Integer(Method.Code) - Integer(@Callback.JMP) - 5;
end;

var
 thunk: TCallBackThunk;
// Время жизни этой структуры должно совпасть с
// временем жизни колбэк-функции. Ведь она и есть тело функции.
// Можно сделать полем объекта, чей метод используется
// в качестве колбэка.
// Для большей надёжности её надо бы было разместить в памяти,
// выделенной с PAGE_EXECUTE_XXX, но что-то я не припомню систем,
// на которых это ограничение реально бы действовало.

procedure TForm1.Button1Click(Sender: TObject);
var m: function(a, b: Integer): Integer of object; stdcall;
begin
 m := SomeMethod;
 InitCallbackThunk(thunk, TMethod(m));
 CallBackTest(@thunk, 8, 9);
end;


 
ANB ©   (2005-09-15 10:12) [25]

Кстати, я как то умудрился запихать метод в качестве CallBack (уже не помню как), но потерял в ней доступ к своему объекту.


 
begin...end ©   (2005-09-15 12:19) [26]

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

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


 
Reindeer Moss Eater ©   (2005-09-15 12:24) [27]

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


 
begin...end ©   (2005-09-15 12:25) [28]

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

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

Да.

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

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


 
Reindeer Moss Eater ©   (2005-09-15 12:32) [29]

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

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


 
begin...end ©   (2005-09-15 12:36) [30]

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

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


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

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


 
begin...end ©   (2005-09-15 12:47) [32]

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

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


 
Reindeer Moss Eater ©   (2005-09-15 12:52) [33]

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

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


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

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

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

Почему?


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

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


 
begin...end ©   (2005-09-15 13:01) [36]

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

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

И что?

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

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


 
ANB ©   (2005-09-15 13:04) [37]


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

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


 
Reindeer Moss Eater ©   (2005-09-15 13:04) [38]

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


 
begin...end ©   (2005-09-15 13:06) [39]

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

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

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


 
Reindeer Moss Eater ©   (2005-09-15 13:07) [40]

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

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



Страницы: 1 2 вся ветка

Текущий архив: 2005.11.13;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.054 c
14-1129797523
старый маразматик(с)
2005-10-20 12:38
2005.11.13
Алаплант Мулдашева


14-1129577841
Nic
2005-10-17 23:37
2005.11.13
Сдача сессии.


9-1120024771
cyborg
2005-06-29 09:59
2005.11.13
Как узнать имена текстур из X Mesh?


14-1129840864
LordOfRock
2005-10-21 00:41
2005.11.13
Вот, диалог в поезде услыхал...


9-1120030753
Зм1й
2005-06-29 11:39
2005.11.13
Морфинг