Вызов функции exe из dll

Категория: Новости Комментариев: 2

С вызовом в приложении функций динамической библиотеки всё понятно. А что делать, если нужно решить обратную задачу, вызвать из динамической библиотеки функцию приложения?

На форумах Codenet и Vingrad посоветовали два варианта решения этой задачи: экспорт функции из exe как из dll и передача в динамическую библиотеку ссылки на функцию exe-приложения.

Экспорт функции из exe как из dll

По сути и 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. Библиотеке не нужно ничего знать о вызвавшем ее приложении;
  2. Можно передавать в библиотеку разные функции в зависимости от ситуации;
  3. Нет необходимости в таблице экспорта у приложения;
  4. Намного удобней по объему.

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);

Скачать примеры к статье

Автор: Кто-то   @   14 февраля 2010 Комментариев: 2
Метки :

Поблагодарить автора

Webmoney Z163628999150, R617151845974

Комментариев: 2

Комментарии
Фев 16, 2010
23:38

Привет. Не нашел форму обратной связи, потому пишу тут.

Предлагаю обменяться постовыми. Мои сайты — web20.su и eax.me. Если интересно, связаться со мной можно с помощью e-mail.

Кстати, в опросе «Лучший дистрибутив Linux» я ответил «Другое». Потому что сижу под FreeBSD.

Апр 10, 2011
18:15
#2 huma :

Спасибо, очень полезно :) Сделал в итоге программку, которая экспортирует для себя функцию и загружает сама себя.

оставить комментарий

Предыдущая запись
«
Следующая запись
»