![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
dll и callback
All2000 © (2005-09-01 17:04:00)Нужно написать Dll. Где можно посмотреть образец написания callback функиции?
Джо (2005-09-01 18:31:00) [1]
> но кто когда в последний раз использовал ключевое слово
> register в дельфийском коде? :)
Гы. Я. Расковыриваю сейчас свою старую библиотеку (годов 1999-2000), почему-то с одним из методов стоит "register". Зачем оно там и как туда попало - хоть убейте - не помню :))
PVOzerski (2005-09-01 17:58:00) [2]2Reindeer Moss Eater © (01.09.05 17:53) [24]
А какое отношение одно к другому вообще имеет? Лучше, конечно, прописывать всё явно, но кто когда в последний раз использовал ключевое слово register в дельфийском коде? :)
begin...end (2005-09-01 17:55:00) [3]> Reindeer Moss Eater © (01.09.05 17:45) [21]
> Мне помнится соглашения по умолчанию разные у dll и приложений
> написанных только на Delphi.
В первый раз слышу.
Reindeer Moss Eater (2005-09-01 17:53:00) [4]>А ссылку на эти сведения нельзя привести?
Нет, я вместо этого лучше скажу, что программисту следует забыть вообще про соглашения о вызовах при написании DLL.
Буду прав?
:)
PVOzerski (2005-09-01 17:49:00) [5]>Мне помнится соглашения по умолчанию разные у dll и приложений написанных только на Delphi.
А ссылку на эти сведения нельзя привести?
Digitman (2005-09-01 17:48:00) [6]да ДОХРЕНИЩА примеров можно привести !
автор же НЕ сподобился описать ситуацию !
ему это или, к.г., "влом" или он вообще не понимает что такое колбэк ...
ну а телепаты среди нас завсегда найдутся)
Reindeer Moss Eater (2005-09-01 17:45:00) [7]Имеется в виду, что DLL может писаться не на Delphi?
А хоть и на Delphi.
Мне помнится соглашения по умолчанию разные у dll и приложений написанных только на Delphi.
Zeqfreed (2005-09-01 17:44:00) [8]Файл demolib.dpr:
library demolib;
uses
Windows;
{$I type.inc}
procedure FunctionThatCallsCallback(CallbackFunction : TCallback); stdcall;
begin
Randomize();
CallbackFunction(Random(High(Integer)));
end;
exports
FunctionThatCallsCallback index 1;
begin
end.
Файл useit.dpr:
program useit;
{$APPTYPE CONSOLE}
uses
Windows;
{$I type.inc}
procedure FunctionThatCallsCallback(CallbackFunction : TCallback); stdcall; external 'demolib.dll';
procedure TheCallbackProc(a : Integer);
var
p : PChar;
n : String;
begin
Str(a, n);
p := PChar('Колбэка функция вызвана с параметром ' + n + ', однака!');
CharToOEM(p, p);
WriteLn(p);
end;
var
s : String;
begin
repeat
FunctionThatCallsCallback(@TheCallbackProc);
WriteLn('"exit" command exits application');
ReadLn(s);
until s = 'exit';
end.
Файл type.inc:
type
TCallback = procedure(a : integer);
p.s. ух сколько сразу желающих-то появилось написать код :) ну лана, не зря же я старался =)
PVOzerski (2005-09-01 17:43:00) [9]Не могу понять проблемы. Суть ведь какая: с помощью некой описанной тобой внутри dll и при этом доступной как external из твоего же exe процедуры ты передаешь как параметр адрес точки входа твоего callback'а (например, как указатель, полученный через адресный оператор). Внутри dll рассматриваешь этот адрес как обычую процедурную переменную. Головная боль у тебя должна быть вот где. 1) Точное соответствие типов (хотя бы с точки зрения количества передаваемых байт), способа (по ссылке/по значению), соглашений в отношении параметров, как они задекларированы для коллбэка в том exe, где он реализован, и в той dll, где для него описана процедурная переменная (естественно, для возвращаемого результата функции тоже всё уместное должно совпадать). 2) Помним, что таблицы виртуальных методов, а также обычно и менеджеры динамической памяти у dll и exe разные. Исходя из этого - а) не делаем коллбэками методы классов/объектов (по крайней мере, я бы очень остерегся и двадцать раз подумал, прежде чем пытаться такое реализовать); б) предельно осторожно работаем с длинными строками и динамическими массивами.
begin...end (2005-09-01 17:43:00) [10]> Reindeer Moss Eater © (01.09.05 17:39) [17]
Имеется в виду, что DLL может писаться не на Delphi?
Reindeer Moss Eater (2005-09-01 17:39:00) [11]Затем что они по умолчанию могут быть разные.
begin...end (2005-09-01 17:35:00) [12]> Reindeer Moss Eater © (01.09.05 17:33) [15]
> Для DLL явно указать соглашения о вызовах
Зачем?
Reindeer Moss Eater (2005-09-01 17:33:00) [13]type
TMyCallBack = function(a:integer) : boolean;
function CallbackFunction(a : integer) : boolean;
begin
ShowMEssage(IntToStr(a));
Result := a < 10;
end;
procedure ProcUsingCallback(cback : TMyCallBack);
var i:integer;
begin
for i:=0 to 100 do
if not cback(i) then Break;
end;
procedure Main;
begin
ProcUsingCallback(CallbackFunction);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Main;
end;
Для DLL явно указать соглашения о вызовах
begin...end (2005-09-01 17:31:00) [14]> All2000 (01.09.05 17:16) [10]
Описать в DLL и хост-приложении тип функции:
type
TMyFunc = function(a: Integer): Boolean;
подпрограмму EnumTT, находящуюся в DLL, описать с параметром типа TMyFunc, например:
procedure EnumTT(F: TMyFunc);
begin
...
if F(2) then Beep;
...
end.
Вызов EnumTT из хост-приложения будет выглядеть так:
EnumTT(@MyFunc),
где MyFunc -- функция, реализация которой описана в хост-приложении.
Конечно, подпрограмма EnumTT должна быть импортирована из DLL и статически/динамически экспортирована в приложении.
Джо (2005-09-01 17:24:00) [15]
> [12] All2000 (01.09.05 17:22)
> Можно краткий примерчик, пожалуйста.
Краткий примерчик чего?
All2000 (2005-09-01 17:22:00) [16]Что-то я совершенно отупел. Можно краткий примерчик, пожалуйста.
Digitman (2005-09-01 17:20:00) [17]
> All2000 (01.09.05 17:16) [10]
а причем здесь ДЛЛ ?
надо понимать, с организация колбэк-вызовов в контексте одного и того же ЕХЕ у тебя нет проблем ?
All2000 (2005-09-01 17:16:00) [18]function MyFunc(a: integer): boolean
begin
// ....
end;
EnumTTT(@MyFunc); // EnumTT нах-ся в dll
Что надо написать в dll, чтобы вызывалась MyFunc?
Как мне вызвать из dll MyFunc и передать ей параметры?
Reindeer Moss Eater (2005-09-01 17:12:00) [19]>Reindeer Moss Eater - ум из ушей прёт?
Мне отсюда не видно, прет он у тебя или нет.
Да это и не важно. Вопрос задай.
Игорь Шевченко (2005-09-01 17:12:00) [20]И после такого народ еще удивляется, и почему это мастера такие грубые и неотзывчивые...