Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Получение handle module у DLL-ки...

279
05 июля 2006 года
bave
456 / / 07.03.2004
В MSDN написано:
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 получить?
5.9K
05 июля 2006 года
Zushenskiy
161 / / 29.06.2006
Сегодня эту тему уже разжевали

но я бы делал так:

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;
}
279
05 июля 2006 года
bave
456 / / 07.03.2004
одна и таже фигня...
--------------------------------------------------
вообщем в отладке уже позырил как hModule меняется:

когда объявляю hModule = NULL;, тогда ессесно значение 0x00000000
если hModule получать во входяшей фунции - т. е. BOOL APIENTRY DllMain( HANDLE hModule, //...) брать значение из переданного аргумента,
то тогда hModule изменяется на заначение 0x01000000
Если получать с помощью GetModuleHandle то 0x00400000
-----------------------------------------------------------------
Главный облом в том, что я это значение получаю, чтобы передать
как аргумен в функцию GetModuleFileName
Поэтому делаю так:
if(hModule!=NULL) GetModuleFileName(.... );
else MessageBox(... );
И каким бы не было значение hModule всегда вылетает мессаге бокс...
----------------------------------------------------
Я уже даже пробовал без проверки сразу GetModuleFileName вызывать,
но тогда эта функция срабатывает не коректно...
398
06 июля 2006 года
Alexandoros
630 / / 21.10.2005
В одном из спп файлов длл (не в функции, а именно в области видимости файла)

char _x[4]; // объявить в функции не получится, стек пренадлижит главному модулю, а не длл.


Потом в функции длл, в том же файле

Код:
...
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;
    }
398
06 июля 2006 года
Alexandoros
630 / / 21.10.2005
[QUOTE=bave]
Ну так вот - я внутри DLL добавил функицю внутри которой ввызвается GetModuleHandle таким образом:
void some_func()
{
HMODULE hModule = GetModuleHandle(NULL);
//...

}
А мне GetModuleHandle упорно NULL возврашает, так как же тогда мне
HMODULE у этой DLL получить?[/QUOTE]

А мне на в2к3 упорно возвращался модуль ехе при таком способе :)
11K
06 июля 2006 года
Ireul
90 / / 15.06.2006
[QUOTE=Alexandoros]А мне на в2к3 упорно возвращался модуль ехе при таком способе :)[/QUOTE]

Вам ребята совсем плохо, да? Может хоть кто-нибудь заглянет в МСДН и увидит там ЧТО ОЗНАЧАЕТ ЕДИНСТВЕННЫЙ ПАРАМЕТР GetModuleHandle()?

Перелайте туда ИМЯ ВАШЕЙ ДЛЛ-КИ И ПОЛУЧИТЕ ЕЁ ХЭНДЛ МОДУЛЯ! Если вы травите туда NULL - она возвращает ТОТ МОДУЛЬ КОТОРЫЙ ЕЁ ВЫЗВАЛ! ТО ЕСТЬ ЕКЗЕШКУ! А вот ежели вы ей имя модуля СВОЕГО скормите - его и получите. GetModuleHandle("mydll.dll"); Ясно?

Если уж вы не знаете как имя текущего модуля получить, и найти сами не сможете - WinAPI не для вас.
3
06 июля 2006 года
Green
4.8K / / 20.01.2000
[QUOTE=bave]
так как же тогда мне HMODULE у этой DLL получить?[/QUOTE]
 
Код:
HMODULE GetCurrentModuleHandle()
{
    MEMORY_BASIC_INFORMATION info;
    VirtualQuery(GetCurrentModuleHandle, &info, sizeof info);
    return (HMODULE)info.BaseAddress;
}

Только учти, что это работает только для Win32.
398
07 июля 2006 года
Alexandoros
630 / / 21.10.2005
[QUOTE=Ireul]Перелайте туда ИМЯ ВАШЕЙ ДЛЛ-КИ И ПОЛУЧИТЕ ЕЁ ХЭНДЛ МОДУЛЯ! Если вы травите туда NULL - она возвращает ТОТ МОДУЛЬ КОТОРЫЙ ЕЁ ВЫЗВАЛ! ТО ЕСТЬ ЕКЗЕШКУ! А вот ежели вы ей имя модуля СВОЕГО скормите - его и получите. GetModuleHandle("mydll.dll"); Ясно?
[/QUOTE]

Слушай, полудурок, научись читать.

[QUOTE=bave]
чтобы передать как аргумен в функцию GetModuleFileName
[/QUOTE]

Если твой скудный мозг не знает назначение этой ф-ции, то хоть сиди и молчи, а не высовывайся с тупыми каментами.

[QUOTE=Ireul]
Если уж вы не знаете как имя текущего модуля получить, и найти сами не сможете - WinAPI не для вас
[/QUOTE]

Вот еще расскажи нам про откровения в последней инстанции от Ireul.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог