![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Передача и вызов процедуры/функции. [D7, Win2k, WinXP]
Nick Denry © (2005-09-21 17:05:00)Есть такая проблема: моей программе передают указатель на процедуру или функцию (из другой программы) и как эту самую функцию, по этому указателю вызвать (своего рода callback).
т.е. надо что-то типа call из asm или можно как-то по-другому?
Zeqfreed (2005-09-21 20:23:00) [21]Nick Denry © (21.09.05 20:11) [4]
Ну тебе уже ответили в [2], что нужно описать прототип ф-ции.
Например:
type
TFooProc = function(arg1, arg2 : TSomeType) : TSomeOtherType;
Там где надо вызывать ф-цию:
procedure CallFooProc(proc : TFooProc);
begin
proc(arg1, arg2);
end;
Ну и, соответственно, в основном модуле:
function FooProc(arg1, arg2 : TSomeType) : TSomeOtherType;
begin
//place your code here ;)
end;
...
CallFooProc(FooProc);
Код не проверял, но все должно быть примерно так :)
Nick Denry (2005-09-21 20:11:00) [22]Извиняюсь за изначально криво поставленный вопрос, ибо что указатель на функцию из другого процесса недействителен в твоем процессемне известно, а так, как вопрос поставил то сам себе бы по ушам надавал..
Nick Denry (2005-09-21 20:08:00) [23]Если программы - это модули или DLL в одном процессе - то проблем нет.
Именно так. Т.е. один из них - мой экзешник (- он передает указатель), а библиотека, должна вызвать эту функцию (библиотека - это глобальный контрол, как Мйкрософтовские кнопки (класс 'BUTTON'), например).
Можно даже на asm не уходить
Вот это меня интересовало. И еще интересует, обязан ли я указывать формат вызова (например stdcall) или нет?
ANB (2005-09-21 17:14:00) [24]Точнее : указатель на функцию из другого процесса недействителен в твоем процессе. Если программы - это модули или DLL в одном процессе - то проблем нет. Можно даже на asm не уходить - описываешь указатель на функцию (нужен прототип) и вызываешь. Если процессы разные - то дело намного серьезнее, придется писать DLL и осуществлять внедрение в AP чужого процесса. А уже во внедренном коде производить вызов коллбэка.
begin...end (2005-09-21 17:08:00) [25]Указатель на функцию некоторой программы будет недействителен в другой программе.