Главная страница
    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
6-1177047641
tytus
2007-04-20 09:40
2007.12.30
Indy 10 - Как узнать, что клиент отключился? (клиент - в dll)


15-1196498342
Valeo
2007-12-01 11:39
2007.12.30
Нужна Помощь


15-1196169956
de.
2007-11-27 16:25
2007.12.30
Компоненты


15-1196149095
Azize
2007-11-27 10:38
2007.12.30
Тестирование


2-1196447952
aspid03
2007-11-30 21:39
2007.12.30
как вытащить из Access базы Word document





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