Страница 1 из 2

dll-exe interaction

Добавлено: 16 май 2007, 12:16
i_van
Народ, помогите разрешить проблему, pls.

Есть a.exe и b.dll написанные на С++.
a.exe содержит функцию int a_func(void).

После загрузки a.exe и b.dll надо из модуля b.dll вызвать a_func(), которая в модуле a.exe.

Как надо описать a_func() в модуле b.dll, чтобы проинформировать модуль b.dll о существовании функции a_func() и скомпилировать b.dll правильно? Нужно ли модифицировать описание a_func() в a.exe?
И можно ли это сделать в принципе?

Заранее спасибо за отклики и ссылки.

Re: dll-exe interaction

Добавлено: 16 май 2007, 13:15
ajkj3em
сначала проверьте экспортирует ли а.еxе эту функцию

Код: Выделить всё

depends a.exe

Добавлено: 16 май 2007, 13:29
Ranger
Я на C++ не писал лет 5, если что... :)

Самое простое, IMHO, передать указатель на эту функцию в DLL в качестве параметра или через static переменную. Функцию нужно будет обьявить в DLL-ке как extern.

"По-моему, так" (с)

Добавлено: 16 май 2007, 13:57
i_van
Ranger писал(а):Я на C++ не писал лет 5, если что... :)

Самое простое, IMHO, передать указатель на эту функцию в DLL в качестве параметра или через static переменную. Функцию нужно будет обьявить в DLL-ке как extern.

"По-моему, так" (с)
Работать скорее всего будет, но неприемлемо по архитектурным соображениям: на самом деле a.exe - старый движок со множеством полезных функции (unmanaged code), и надо их все сделать доступными в dll, которая есть скомпилированное C# приложение.

Re: dll-exe interaction

Добавлено: 16 май 2007, 14:04
i_van
ajkj3em писал(а):сначала проверьте экспортирует ли а.еxе эту функцию

Код: Выделить всё

depends a.exe
depends - это программа, compiler suffix или еще чего?

Re: dll-exe interaction

Добавлено: 16 май 2007, 14:26
ajkj3em
i_van писал(а):depends - это программа, compiler suffix или еще чего?
depends.exe -- входит в состав visual studio. показывает exports,
imports и прочие радости бинарных файлов в юзер-френдли формате

Добавлено: 16 май 2007, 14:27
ura
A.EXE это что, процесс который запущен или подразумевается что он является тоже DLL по сути? Исходники его есть?

Добавлено: 16 май 2007, 14:45
i_van
ura писал(а):A.EXE это что, процесс который запущен или подразумевается что он является тоже DLL по сути? Исходники его есть?
Да это процесс. Исходники есть.

Я запускаю a.exe, он все инициализирует, готовит главное окно и вызывает dll.
А dll может быть разной в зависимости от приложения - это изменяемая часть.
Затем dll начинает таскать разные нужные и полезные штуки-функции из основного движка a.exe, который практически неизменен для всех приложений.

Добавлено: 16 май 2007, 14:53
dima
Наверное так(смотри MSDN на эту тему):

в dll пишешь:

void FuncInDll()
{
// get module handle
HMODULE hModule = GetModuleHandle(NULL);
if (hModule == NULL)
return;

// find function by name in the module
TFunc* pFunc = (TFunc*)GetProcAddress(hModule, "a_func");
if(pFunc == NULL)
{
// function not found
return;
}
// call it !
(*pFunc)();
}

Re: dll-exe interaction

Добавлено: 16 май 2007, 14:56
i_van
ajkj3em писал(а):сначала проверьте экспортирует ли а.еxе эту функцию

Код: Выделить всё

depends a.exe
I checked. No, it doesn't export. What is next step? :?
А бывает export из основного модуля? :?

Добавлено: 16 май 2007, 15:02
i_van
dima писал(а):Наверное так(смотри MSDN на эту тему):

в dll пишешь:

void FuncInDll()
{
// get module handle
HMODULE hModule = GetModuleHandle(NULL);
if (hModule == NULL)
return;

// find function by name in the module
TFunc* pFunc = (TFunc*)GetProcAddress(hModule, "a_func");
if(pFunc == NULL)
{
// function not found
return;
}
// call it !
(*pFunc)();
}
Как раз это я и пробую. Спасибо. Какой топик смотреть в MSDN? Чего-то я не натыкаюсь ни на что полезное.

Добавлено: 16 май 2007, 15:04
dima
i_van писал(а):
dima писал(а):Наверное так(смотри MSDN на эту тему):

в dll пишешь:

void FuncInDll()
{
// get module handle
HMODULE hModule = GetModuleHandle(NULL);
if (hModule == NULL)
return;

// find function by name in the module
TFunc* pFunc = (TFunc*)GetProcAddress(hModule, "a_func");
if(pFunc == NULL)
{
// function not found
return;
}
// call it !
(*pFunc)();
}
Как раз это я и пробую. Спасибо. Какой топик смотреть в MSDN? Чего-то я не натыкаюсь ни на что полезное.
смотри на MSDN на GetModuleHandle(), особенно про параматер NULL
потом смотри google для поиска примеров

Добавлено: 16 май 2007, 15:08
i_van
dima писал(а): смотри на MSDN на GetModuleHandle(), особенно про параматер NULL
потом смотри google для поиска примеров
thanx

Re: dll-exe interaction

Добавлено: 16 май 2007, 15:13
ajkj3em
i_van писал(а):
ajkj3em писал(а):сначала проверьте экспортирует ли а.еxе эту функцию

Код: Выделить всё

depends a.exe
I checked. No, it doesn't export. What is next step? :?
А бывает export из основного модуля? :?
there's no next step unless you consider disassembling .exe, locating
the function entry point, then dynamically loading it with LoadModule
and calling it by casting an absolute memory address into a function
pointer. то есть весьма через ж*пу. причем если там есть какие-
либо статические или глобальные переменные, то шансов, что все
это будет работать корректно - ноль

Добавлено: 16 май 2007, 15:19
ajkj3em
i_van писал(а):
ura писал(а):A.EXE это что, процесс который запущен или подразумевается что он является тоже DLL по сути? Исходники его есть?
Да это процесс. Исходники есть.
тогда все тривиально - добавьте __declspec(dllexport) перед нужной
функцией и дальше ее можно будет найти из других модулей через
LoadModule / GetProcAddress