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

Вниз

dll и callback   Найти похожие ветки 

 
All2000   (2005-09-01 17:04) [0]

Нужно написать Dll. Где можно посмотреть образец написания callback функиции?


 
Reindeer Moss Eater ©   (2005-09-01 17:06) [1]

Callback функция ничем не отличается от остальных функций.
Так что образцы повсюду.


 
Digitman ©   (2005-09-01 17:08) [2]

а если бы речь шла не о ДЛЛ, то вопроса бы не существовало ?


 
All2000   (2005-09-01 17:09) [3]

Это понятно. Котроллер и все такое... Где это посмотреть?


 
Digitman ©   (2005-09-01 17:09) [4]


> Котроллер и все такое


?


 
Reindeer Moss Eater ©   (2005-09-01 17:09) [5]

У мамы в сумке.


 
All2000   (2005-09-01 17:10) [6]

Удалено модератором


 
Reindeer Moss Eater ©   (2005-09-01 17:11) [7]

Любая функция найденная тобой в любом исходнике может выступать в качестве callback функции.


 
Игорь Шевченко ©   (2005-09-01 17:12) [8]

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


 
Reindeer Moss Eater ©   (2005-09-01 17:12) [9]

>Reindeer Moss Eater - ум из ушей прёт?

Мне отсюда не видно, прет он у тебя или нет.
Да это и не важно. Вопрос задай.


 
All2000   (2005-09-01 17:16) [10]

function MyFunc(a: integer): boolean
begin
// ....
end;

EnumTTT(@MyFunc); // EnumTT нах-ся в dll

Что надо написать в dll, чтобы вызывалась MyFunc?

Как мне вызвать из dll MyFunc и передать ей параметры?


 
Digitman ©   (2005-09-01 17:20) [11]


> All2000   (01.09.05 17:16) [10]


а причем здесь ДЛЛ ?

надо понимать, с организация колбэк-вызовов в контексте одного и того же ЕХЕ у тебя нет проблем ?


 
All2000   (2005-09-01 17:22) [12]

Что-то я совершенно отупел. Можно краткий примерчик, пожалуйста.


 
Джо ©   (2005-09-01 17:24) [13]


>  [12] All2000   (01.09.05 17:22)
> Можно краткий примерчик, пожалуйста.

Краткий примерчик чего?


 
begin...end ©   (2005-09-01 17:31) [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 и статически/динамически экспортирована в приложении.


 
Reindeer Moss Eater ©   (2005-09-01 17:33) [15]

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:35) [16]

> Reindeer Moss Eater ©   (01.09.05 17:33) [15]

> Для DLL явно указать соглашения о вызовах

Зачем?


 
Reindeer Moss Eater ©   (2005-09-01 17:39) [17]

Затем что они по умолчанию могут быть разные.


 
begin...end ©   (2005-09-01 17:43) [18]

> Reindeer Moss Eater ©   (01.09.05 17:39) [17]

Имеется в виду, что DLL может писаться не на Delphi?


 
PVOzerski ©   (2005-09-01 17:43) [19]

Не могу понять проблемы. Суть ведь какая: с помощью некой описанной тобой внутри dll и при этом доступной как external из твоего же exe процедуры ты передаешь как параметр адрес точки входа твоего callback"а (например, как указатель, полученный через адресный оператор). Внутри dll рассматриваешь этот адрес как обычую процедурную переменную. Головная боль у тебя должна быть вот где. 1) Точное соответствие типов (хотя бы с точки зрения количества передаваемых байт), способа (по ссылке/по значению), соглашений в отношении параметров, как они задекларированы для коллбэка в том exe, где он реализован, и в той dll, где для него описана процедурная переменная (естественно, для возвращаемого результата функции тоже всё уместное должно совпадать). 2) Помним, что таблицы виртуальных методов, а также обычно и менеджеры динамической памяти у dll и exe разные. Исходя из этого - а) не делаем коллбэками методы классов/объектов (по крайней мере, я бы очень остерегся и двадцать раз подумал, прежде чем пытаться такое реализовать); б) предельно осторожно работаем с длинными строками и динамическими массивами.


 
Zeqfreed ©   (2005-09-01 17:44) [20]

Файл 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. ух сколько сразу желающих-то появилось написать код :) ну лана, не зря же я старался =)


 
Reindeer Moss Eater ©   (2005-09-01 17:45) [21]

Имеется в виду, что DLL может писаться не на Delphi?

А хоть и на Delphi.
Мне помнится соглашения по умолчанию разные у dll и приложений написанных только на Delphi.


 
Digitman ©   (2005-09-01 17:48) [22]

да ДОХРЕНИЩА примеров можно привести !

автор же НЕ сподобился описать ситуацию !

ему это или, к.г., "влом" или он вообще не понимает что такое колбэк ...

ну а телепаты среди нас завсегда найдутся)


 
PVOzerski ©   (2005-09-01 17:49) [23]

>Мне помнится соглашения по умолчанию разные у dll и приложений написанных только на Delphi.
А ссылку на эти сведения нельзя привести?


 
Reindeer Moss Eater ©   (2005-09-01 17:53) [24]

>А ссылку на эти сведения нельзя привести?

Нет, я вместо этого лучше скажу, что программисту следует забыть вообще про соглашения о вызовах при написании DLL.

Буду прав?
:)


 
begin...end ©   (2005-09-01 17:55) [25]

> Reindeer Moss Eater ©   (01.09.05 17:45) [21]

> Мне помнится соглашения по умолчанию разные у dll и приложений
> написанных только на Delphi.

В первый раз слышу.


 
PVOzerski ©   (2005-09-01 17:58) [26]

2Reindeer Moss Eater ©   (01.09.05 17:53) [24]
А какое отношение одно к другому вообще имеет? Лучше, конечно, прописывать всё явно, но кто когда в последний раз использовал ключевое слово register в дельфийском коде? :)


 
Джо ©   (2005-09-01 18:31) [27]


> но кто когда в последний раз использовал ключевое слово
> register в дельфийском коде? :)

Гы. Я. Расковыриваю сейчас свою старую библиотеку (годов 1999-2000), почему-то с одним из методов стоит "register". Зачем оно там и как туда попало - хоть убейте - не помню :))



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2005.09.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.038 c
1-1125775015
xayam
2005-09-03 23:16
2005.09.25
Многострочная палитра


3-1123686062
Виталька2005
2005-08-10 19:01
2005.09.25
Фильтр и количество строк в табличке


5-1099854489
Vcoder
2004-11-07 22:08
2005.09.25
Быстрый вывод на экран


14-1125863274
Кэш третьего уровня
2005-09-04 23:47
2005.09.25
сетевое администрирование


3-1124113529
Bless
2005-08-15 17:45
2005.09.25
Профайлер для Firebird





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский