Страница 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е эту функцию
Добавлено: 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 - это программа, 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е эту функцию
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е эту функцию
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