dll-exe interaction

Все, что вы хотели знать о программизме, но боялись спросить.
i_van
Завсегдатай
Сообщения: 251
Зарегистрирован: 09 сен 2004, 23:58

dll-exe interaction

Сообщение 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?
И можно ли это сделать в принципе?

Заранее спасибо за отклики и ссылки.
Аватара пользователя
ajkj3em
Маньяк
Сообщения: 2063
Зарегистрирован: 12 ноя 2006, 06:53

Re: dll-exe interaction

Сообщение ajkj3em »

сначала проверьте экспортирует ли а.еxе эту функцию

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

depends a.exe
Аватара пользователя
Ranger
Маньяк
Сообщения: 1199
Зарегистрирован: 22 окт 2003, 18:28
Откуда: 2:5025 -> Burnaby

Сообщение Ranger »

Я на C++ не писал лет 5, если что... :)

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

"По-моему, так" (с)
i_van
Завсегдатай
Сообщения: 251
Зарегистрирован: 09 сен 2004, 23:58

Сообщение i_van »

Ranger писал(а):Я на C++ не писал лет 5, если что... :)

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

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

Re: dll-exe interaction

Сообщение i_van »

ajkj3em писал(а):сначала проверьте экспортирует ли а.еxе эту функцию

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

depends a.exe
depends - это программа, compiler suffix или еще чего?
Аватара пользователя
ajkj3em
Маньяк
Сообщения: 2063
Зарегистрирован: 12 ноя 2006, 06:53

Re: dll-exe interaction

Сообщение ajkj3em »

i_van писал(а):depends - это программа, compiler suffix или еще чего?
depends.exe -- входит в состав visual studio. показывает exports,
imports и прочие радости бинарных файлов в юзер-френдли формате
ura
Житель
Сообщения: 915
Зарегистрирован: 09 мар 2003, 22:46

Сообщение ura »

A.EXE это что, процесс который запущен или подразумевается что он является тоже DLL по сути? Исходники его есть?
i_van
Завсегдатай
Сообщения: 251
Зарегистрирован: 09 сен 2004, 23:58

Сообщение i_van »

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

Я запускаю a.exe, он все инициализирует, готовит главное окно и вызывает dll.
А dll может быть разной в зависимости от приложения - это изменяемая часть.
Затем dll начинает таскать разные нужные и полезные штуки-функции из основного движка a.exe, который практически неизменен для всех приложений.
Аватара пользователя
dima
Житель
Сообщения: 690
Зарегистрирован: 19 фев 2003, 19:26
Откуда: Хабаровск->Toronto

Сообщение 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)();
}
i_van
Завсегдатай
Сообщения: 251
Зарегистрирован: 09 сен 2004, 23:58

Re: dll-exe interaction

Сообщение i_van »

ajkj3em писал(а):сначала проверьте экспортирует ли а.еxе эту функцию

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

depends a.exe
I checked. No, it doesn't export. What is next step? :?
А бывает export из основного модуля? :?
i_van
Завсегдатай
Сообщения: 251
Зарегистрирован: 09 сен 2004, 23:58

Сообщение 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? Чего-то я не натыкаюсь ни на что полезное.
Аватара пользователя
dima
Житель
Сообщения: 690
Зарегистрирован: 19 фев 2003, 19:26
Откуда: Хабаровск->Toronto

Сообщение 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 для поиска примеров
i_van
Завсегдатай
Сообщения: 251
Зарегистрирован: 09 сен 2004, 23:58

Сообщение i_van »

dima писал(а): смотри на MSDN на GetModuleHandle(), особенно про параматер NULL
потом смотри google для поиска примеров
thanx
Аватара пользователя
ajkj3em
Маньяк
Сообщения: 2063
Зарегистрирован: 12 ноя 2006, 06:53

Re: dll-exe interaction

Сообщение 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. то есть весьма через ж*пу. причем если там есть какие-
либо статические или глобальные переменные, то шансов, что все
это будет работать корректно - ноль
Аватара пользователя
ajkj3em
Маньяк
Сообщения: 2063
Зарегистрирован: 12 ноя 2006, 06:53

Сообщение ajkj3em »

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