Вызов функции главной программы из DLL

Lord Phoenix

Member
Joined
Mar 10, 2006
Messages
83
Reaction score
18
Location
Freenet
Есть 2 проэкта на дефли:
1.Стандартная программа
2. ДЛЛ-ка
Как организовать вызов функции главной программы из DLL???
Т.е. какой то процедуре в DLL-ке передать указатель на функцию в главной программе.
Все мои попытки ни к чему не привели...
 

ploki

Member
Joined
May 16, 2005
Messages
237
Reaction score
180
Location
Москва
Нужный механизм называется "функция обратного вызова (Callback Function)".

Отмечу, что в случае, если потом захочется переписать DLL или прогу на другом языке, лучше сразу озаботиться способом передачи параметров. В Windows API стандартной конвенцией является stdcall.

Объявляем тип функции обратного вызова:
Code:
type
  TCallbackFunc = function (...): LongBool; stdcall;
Функция с такой сигнатурой должна присутствовать в программе. Назовём её, к примеру, ProgFunc. Через указание её параметров DLL сможет запрашивать у программы любые сервисы.

Объявляем тип функции в DLL, которая будет принимать указатель на функцию обратного вызова:
Code:
TDLLFunc = function (ACallbackFunc: TCallbackFunc): LongBool; stdcall;
Эту функцию программа должна будет вызвать один раз из DLL, чтобы DLL узнала адрес функции обратного вызова. Поэтому её имя должно быть либо предопределено (например, MyCallbackInit), либо это имя должно быть где-то описано (например, в реестре при регистрации DLL). Тогда программа после загрузки DLL спокойно вызывает
Code:
type
  MyCallbackInit = function (ACallbackFunc: TCallbackFunc): LongBool; stdcall;
...

//Загрузка DLL c дескриптором DllHandle
...
//Передача функции обратного вызова
MyCallbackInit := GetProcAddress(DllHandle, 'MyCallbackInit');
MyCallbackInit(ProgFunc);
и вуаля - DLL может спокойно вызывать функцию ProgFunc главной программы, указатель на которую передался в параметре ACallbackFunc.
 
Last edited by a moderator:
Top