Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1196840983
Ekzot
2007-12-05 10:49
2007.12.30
Как Подсветать определённые слова в RichEdit


2-1196930572
LerMax
2007-12-06 11:42
2007.12.30
Вопрос про ссылку в классе


2-1197019950
Иван1
2007-12-07 12:32
2007.12.30
Динамический массив


15-1196160683
All More system
2007-11-27 13:51
2007.12.30
Логика работы проверок подлинности Windows


15-1196430171
alll_23
2007-11-30 16:42
2007.12.30
Способ задания алгоритма





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