Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];

Вниз

Надо в 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.037 c
14-1129813837
Sandman29
2005-10-20 17:10
2005.11.13
Опрос - цвет фона и размер шрифта


2-1130174344
sam07
2005-10-24 21:19
2005.11.13
API функции


14-1129884103
TButton
2005-10-21 12:41
2005.11.13
глючит звук


2-1129620796
T10000
2005-10-18 11:33
2005.11.13
Работа с датой ?


2-1129785588
V-A-V
2005-10-20 09:19
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский