С вызовом в приложении функций динамической библиотеки всё понятно. А что делать, если нужно решить обратную задачу, вызвать из динамической библиотеки функцию приложения?
На форумах Codenet и Vingrad посоветовали два варианта решения этой задачи: экспорт функции из exe как из dll и передача в динамическую библиотеку ссылки на функцию exe-приложения.
По сути и exe, и dll (а также ocx, sys, и многие другие) — абсолютно одинаковые форматы файлов, называемые Portable Executable, поэтому из exe-приложения можно экспортировать функции точно также, как это деается и с динамическими библиотеками.
Для этого нужно сделать всего три действия:
1. Объявить экспортируемые функции с помощью директивы dllexport:
__declspec(dllexport) void WINAPI exported_func();
void WINAPI exported_func(){
printf("hello world");
}
2. Добавить к приложению новый def-файл и указать в нем имена экспортируемых функций:
EXPORTS
exported_func @1
3. Импортировать функцию в подключаемой динамической библиотеке:
imported_func func; func =(imported_func)GetProcAddress( GetModuleHandle( 0 ), "exported_func" ); func();
Пример можно скачать в конце статьи.
Этот вариант имеет ряд преимуществ по отношению к предыдущему:
1. Создать указатель на функцию и указать им на интересующую функцию exe-приложения:
void ( *pointer )( void ); pointer = &exported_func;
2. Создать в динамической библиотеке экспортируемую функцию, которая будет принимать указатель на функцию приложения и производить с ней некоторые действия:
void WINAPI dllfunc(void (*pointer)(void)){
pointer();
}[/sourcecode[
3. Вызвать вышеуказанную функцию динамической библиотеки из приложения и передать ей в качестве параметра указатель на функцию:
[sourcecode language="cpp"]HMODULE hLib=LoadLibrary("dll.dll");
if (hLib==NULL)
{
return 0;
}
DLLFUNC dllfunc = (DLLFUNC)GetProcAddress(hLib, "dllfunc");
dllfunc(pointer);
|
|
Webmoney Z163628999150, R617151845974
|
Спасибо, очень полезно
Сделал в итоге программку, которая экспортирует для себя функцию и загружает сама себя.
23:38
Привет. Не нашел форму обратной связи, потому пишу тут.
Предлагаю обменяться постовыми. Мои сайты — и . Если интересно, связаться со мной можно с помощью e-mail.
Кстати, в опросе «Лучший дистрибутив Linux» я ответил «Другое». Потому что сижу под FreeBSD.