dll-exe interaction
Правила форума
Пожалуйста, ознакомьтесь с правилами данного форума
Пожалуйста, ознакомьтесь с правилами данного форума
-
- Завсегдатай
- Сообщения: 251
- Зарегистрирован: 09 сен 2004, 23:58
dll-exe interaction
Народ, помогите разрешить проблему, 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?
И можно ли это сделать в принципе?
Заранее спасибо за отклики и ссылки.
Есть 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
сначала проверьте экспортирует ли а.еxе эту функцию
Код: Выделить всё
depends a.exe
- Ranger
- Маньяк
- Сообщения: 1199
- Зарегистрирован: 22 окт 2003, 18:28
- Откуда: 2:5025 -> Burnaby
-
- Завсегдатай
- Сообщения: 251
- Зарегистрирован: 09 сен 2004, 23:58
Работать скорее всего будет, но неприемлемо по архитектурным соображениям: на самом деле a.exe - старый движок со множеством полезных функции (unmanaged code), и надо их все сделать доступными в dll, которая есть скомпилированное C# приложение.Ranger писал(а):Я на C++ не писал лет 5, если что...
Самое простое, IMHO, передать указатель на эту функцию в DLL в качестве параметра или через static переменную. Функцию нужно будет обьявить в DLL-ке как extern.
"По-моему, так" (с)
-
- Завсегдатай
- Сообщения: 251
- Зарегистрирован: 09 сен 2004, 23:58
Re: dll-exe interaction
depends - это программа, compiler suffix или еще чего?ajkj3em писал(а):сначала проверьте экспортирует ли а.еxе эту функцию
Код: Выделить всё
depends a.exe
- ajkj3em
- Маньяк
- Сообщения: 2063
- Зарегистрирован: 12 ноя 2006, 06:53
Re: dll-exe interaction
depends.exe -- входит в состав visual studio. показывает exports,i_van писал(а):depends - это программа, compiler suffix или еще чего?
imports и прочие радости бинарных файлов в юзер-френдли формате
-
- Житель
- Сообщения: 915
- Зарегистрирован: 09 мар 2003, 22:46
-
- Завсегдатай
- Сообщения: 251
- Зарегистрирован: 09 сен 2004, 23:58
Да это процесс. Исходники есть.ura писал(а):A.EXE это что, процесс который запущен или подразумевается что он является тоже DLL по сути? Исходники его есть?
Я запускаю a.exe, он все инициализирует, готовит главное окно и вызывает dll.
А dll может быть разной в зависимости от приложения - это изменяемая часть.
Затем dll начинает таскать разные нужные и полезные штуки-функции из основного движка a.exe, который практически неизменен для всех приложений.
- dima
- Житель
- Сообщения: 690
- Зарегистрирован: 19 фев 2003, 19:26
- Откуда: Хабаровск->Toronto
Наверное так(смотри 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)();
}
в 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)();
}
-
- Завсегдатай
- Сообщения: 251
- Зарегистрирован: 09 сен 2004, 23:58
Re: dll-exe interaction
I checked. No, it doesn't export. What is next step?ajkj3em писал(а):сначала проверьте экспортирует ли а.еxе эту функциюКод: Выделить всё
depends a.exe

А бывает export из основного модуля?

-
- Завсегдатай
- Сообщения: 251
- Зарегистрирован: 09 сен 2004, 23:58
Как раз это я и пробую. Спасибо. Какой топик смотреть в MSDN? Чего-то я не натыкаюсь ни на что полезное.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)();
}
- dima
- Житель
- Сообщения: 690
- Зарегистрирован: 19 фев 2003, 19:26
- Откуда: Хабаровск->Toronto
смотри на MSDN на GetModuleHandle(), особенно про параматер NULLi_van писал(а):Как раз это я и пробую. Спасибо. Какой топик смотреть в MSDN? Чего-то я не натыкаюсь ни на что полезное.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)();
}
потом смотри google для поиска примеров
-
- Завсегдатай
- Сообщения: 251
- Зарегистрирован: 09 сен 2004, 23:58
- ajkj3em
- Маньяк
- Сообщения: 2063
- Зарегистрирован: 12 ноя 2006, 06:53
Re: dll-exe interaction
there's no next step unless you consider disassembling .exe, locatingi_van писал(а):I checked. No, it doesn't export. What is next step? :?ajkj3em писал(а):сначала проверьте экспортирует ли а.еxе эту функциюКод: Выделить всё
depends a.exe
А бывает export из основного модуля? :?
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
тогда все тривиально - добавьте __declspec(dllexport) перед нужнойi_van писал(а):Да это процесс. Исходники есть.ura писал(а):A.EXE это что, процесс который запущен или подразумевается что он является тоже DLL по сути? Исходники его есть?
функцией и дальше ее можно будет найти из других модулей через
LoadModule / GetProcAddress