...
HMODULE CurrHandle;
char FileName[0x200];
if(!GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, _x, &CurrHandle))
{
Cons->Write("Error while retreiving module handle from address, err: %i", GetLastError());
return 1;
}
if(!GetModuleFileName(CurrHandle, FileName, 0x200))
{
Cons->Write("Error while retreiving module name, err: %d", GetLastError());
return 1;
}
Получение handle module у DLL-ки...
HMODULE GetModuleHandle( LPCTSTR lpModuleName
// address of module name to return handle for
);
If this parameter (lpModuleName ) is NULL, GetModuleHandle returns a handle of the file used to create the calling process.
------------------------------------------------------------------
Ну так вот - я внутри DLL добавил функицю внутри которой ввызвается GetModuleHandle таким образом:
void some_func()
{
HMODULE hModule = GetModuleHandle(NULL);
//...
}
А мне GetModuleHandle упорно NULL возврашает, так как же тогда мне
HMODULE у этой DLL получить?
но я бы делал так:
HANDLE hInst;
BOOL APIENTRY DllMain( HANDLE hModule,DWORD ul_reason_for_call, LPVOID lpReserved)
{
if(ul_reason_for_call == DLL_PROCESS_ATTACH)
{
hInst = hModule;
}
return 0;
}
--------------------------------------------------
вообщем в отладке уже позырил как hModule меняется:
когда объявляю hModule = NULL;, тогда ессесно значение 0x00000000
если hModule получать во входяшей фунции - т. е. BOOL APIENTRY DllMain( HANDLE hModule, //...) брать значение из переданного аргумента,
то тогда hModule изменяется на заначение 0x01000000
Если получать с помощью GetModuleHandle то 0x00400000
-----------------------------------------------------------------
Главный облом в том, что я это значение получаю, чтобы передать
как аргумен в функцию GetModuleFileName
Поэтому делаю так:
if(hModule!=NULL) GetModuleFileName(.... );
else MessageBox(... );
И каким бы не было значение hModule всегда вылетает мессаге бокс...
----------------------------------------------------
Я уже даже пробовал без проверки сразу GetModuleFileName вызывать,
но тогда эта функция срабатывает не коректно...
char _x[4]; // объявить в функции не получится, стек пренадлижит главному модулю, а не длл.
Потом в функции длл, в том же файле
Код:
Ну так вот - я внутри DLL добавил функицю внутри которой ввызвается GetModuleHandle таким образом:
void some_func()
{
HMODULE hModule = GetModuleHandle(NULL);
//...
}
А мне GetModuleHandle упорно NULL возврашает, так как же тогда мне
HMODULE у этой DLL получить?[/QUOTE]
А мне на в2к3 упорно возвращался модуль ехе при таком способе :)
Вам ребята совсем плохо, да? Может хоть кто-нибудь заглянет в МСДН и увидит там ЧТО ОЗНАЧАЕТ ЕДИНСТВЕННЫЙ ПАРАМЕТР GetModuleHandle()?
Перелайте туда ИМЯ ВАШЕЙ ДЛЛ-КИ И ПОЛУЧИТЕ ЕЁ ХЭНДЛ МОДУЛЯ! Если вы травите туда NULL - она возвращает ТОТ МОДУЛЬ КОТОРЫЙ ЕЁ ВЫЗВАЛ! ТО ЕСТЬ ЕКЗЕШКУ! А вот ежели вы ей имя модуля СВОЕГО скормите - его и получите. GetModuleHandle("mydll.dll"); Ясно?
Если уж вы не знаете как имя текущего модуля получить, и найти сами не сможете - WinAPI не для вас.
так как же тогда мне HMODULE у этой DLL получить?[/QUOTE]
Код:
HMODULE GetCurrentModuleHandle()
{
MEMORY_BASIC_INFORMATION info;
VirtualQuery(GetCurrentModuleHandle, &info, sizeof info);
return (HMODULE)info.BaseAddress;
}
{
MEMORY_BASIC_INFORMATION info;
VirtualQuery(GetCurrentModuleHandle, &info, sizeof info);
return (HMODULE)info.BaseAddress;
}
Только учти, что это работает только для Win32.
[/QUOTE]
Слушай, полудурок, научись читать.
[QUOTE=bave]
чтобы передать как аргумен в функцию GetModuleFileName
[/QUOTE]
Если твой скудный мозг не знает назначение этой ф-ции, то хоть сиди и молчи, а не высовывайся с тупыми каментами.
[QUOTE=Ireul]
Если уж вы не знаете как имя текущего модуля получить, и найти сами не сможете - WinAPI не для вас
[/QUOTE]
Вот еще расскажи нам про откровения в последней инстанции от Ireul.