Форум: "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