Страницы

Поиск по вопросам

понедельник, 24 февраля 2020 г.

Как получить HINSTANCE модуля в котором находится код?

#cpp #c #visual_cpp


Как в MS Visual C++ получить HINSTANCE модуля (exe или dll) в котором находится текущая
функция?
    


Ответы

Ответ 1



Я согласен, что вариант с __ImageBase можно использовать в определенных случаях, но хотел упомянуть о двух других стандартных методах. Чаще всего необходимо получить HINSTANCE основной программы (EXE). Для этого проще всего использовать GetModuleHandle(NULL). Другая типичная ситуация, что мы написали DLL с callback функцией и ее кто-то вызывает. В этом случае у нас обычно есть параменры переданные вазывающим нас модулем. С помощью GetModuleHandleEx с параметром GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS можно получит HMODULE по адесу переменной, а HINSTANCE DLL это и есть HMODULE. Есть конечно много других способов. Но решающим является в каком контексте мы находимся. Мне лично, в свое время, дало многое для общего поминания программка которую я включил в этот ответ. Она показывает, что огромное виртуальное пространства процесса зазбито на блоки и каждый блок принадлежит своему модулю. Имея начала модуля можно поличить о нем всю информацию. Я полагаю, что GetModuleHandleEx работает примерн так.

Ответ 2



HINSTANCE - это адрес, по которому модуль размещен в памяти. Visual C++, а точнее линкер link.exe объявляет специальный символ для заголовка исполняемого файла: extern "C" IMAGE_DOS_HEADER __ImageBase; Т.к. заголовок файла находится в начале файла, то адрес заголовка - это адрес модуля, т.е. HMODULE или HINSTANCE. Таким образом можно написать const HINSTANCE current_module = (HINSTANCE)&__ImageBase; По скольку __ImageBase определяет линкер (link.exe), то это решение можно использовать с любым компилятором, если он компилирует файлы в формат совместимый с link.exe (т.е. формат MS COFF).

Комментариев нет:

Отправить комментарий