Форум: "Начинающим";
Текущий архив: 2007.12.30;
Скачать: [xml.tar.bz2];
ВнизCallBack из DLL Найти похожие ветки
← →
Dracula (2007-12-03 13:02) [0]Есть dll вот кусок кода...
procedure MyInfoCallback(pInfo: TInfoCallback);
begin
...
end;
procedure DLLStop; export;
begin
Stop;
end;
procedure DLLStart(Path: String); export;
begin
Start(Path, @MyInfoCallback);
end;
exports DLLStop, DLLStart;
как мне экспортировать callback
procedure MyInfoCallback(pInfo: TInfoCallback);
begin
...
end;
мне надо чтоб dll возвращала необходимые параметры в программу при изменениях на которые она реагирует. уже 7 дней бьюсь над этой проблемой, кроме вызова самой dll экспортируемой функции из exe ничего больше не придумал. Знающие люди подскажите пожалуйста, заранее огромное спасибо.
← →
tesseract © (2007-12-03 13:03) [1]Передай в DDLStart ссылку на неё. И вызывай сколько приспичит.
← →
Dracula (2007-12-03 13:16) [2]т.е. Start(Path, ссылка на нужную процедуру?); - это я и так знаю, а вот часть которая должна быть в exe"шнике которая ждёт от dll информацию как она должна выглядеть?
← →
tesseract © (2007-12-03 13:17) [3]
> это я и так знаю, а вот часть которая должна быть в exe"шнике
> которая ждёт от dll информацию как она должна выглядеть?
>
У тебя процедура с параметрами же будет. Вот их и заполняй.
← →
Dracula (2007-12-03 13:18) [4]ок спасибо, сейчас попробую
← →
Юрий Зотов © (2007-12-03 13:42) [5]> Dracula (03.12.07 13:02)
Стандартная схема такая:
Общий юнит для EXE и DLL:type
TCallbackProc = procedure(...); stdcall;
В DLL:procedure DLLProcedure(..., CallbackProc: TCallbackProc); stdcall; exports;
begin
...
CallbackProc(...);
...
end;
В EXE:procedure RealCallbackProc(...); stdcall;
begin
...
end;
procedure CallDLLProcedure(...);
begin
...
DLLProcedure(..., RealCallbackProc);
...
end;
И пара примечаний:
1. Если DLL предназначена для вызова НЕ только из паскалевского кода, то для передачи параметров туда-обратно используйте соглашение stdcall и НЕ используйте тип String (вместо него используйте PChar).
2. Если DLL предназначена для вызова ТОЛЬКО из паскалевского кода, то для передачи параметров туда-обратно можно использовать любое соглашение о вызове и тип String (но тогда и к EXE, и к DLL нужно подключить модуль ShareMem - см. его описание в справке).
← →
Dracula (2007-12-03 13:44) [6]Юрий Зотов огромное спасибо за подробный ответ, всё заработало, респект Мастерам!
← →
Dracula (2007-12-03 14:05) [7]Кстати вот как сделал, может кому поадобится пример:
В DLL:
procedure DLLStartWatch(Path: string; SubTree: bool; process : pointer); export;
var callback : procedure (pInfo: TInfoCallback);
begin
callback := process;
StartWatch(Path, FILE_NOTIFY_CHANGE_FILE_NAME, SubTree, @callback);
end;
В EXE:
так обрабатываю
procedure DLLMyInfoCallback(pInfo: TInfoCallback);
begin
...
end;
так вызываю
DLLStartWatch("c:\", true, addr(DLLMyInfoCallback));
может конечно не совсем грамотно, но работает однако.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.12.30;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c