Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

dll и callback


Страницы:   1 2

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]

И после такого народ еще удивляется, и почему это мастера такие грубые и неотзывчивые...


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо