Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.12.30;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.02 c
15-1196061931
Андрей
2007-11-26 10:25
2007.12.30
ms Office 2007


6-1176750778
dRake
2007-04-16 23:12
2007.12.30
Нужна документация по сокетам (+)


6-1176202407
Khabibulin
2007-04-10 14:53
2007.12.30
Как залогиниться у удаленного компьютера по локальной сети?


15-1196317116
vasIZmax
2007-11-29 09:18
2007.12.30
Сбор файлов локалке


15-1195868497
Duo
2007-11-24 04:41
2007.12.30
Как определить, что мышь над TToolButton.