Как получить дескриптор модуля моего собственного кода?
Возможный дубликат:
Как мне получить HMODULE для исполняемого в данный момент кода?
Я пытаюсь найти ресурс в своем собственном модуле. Если этот модуль является исполняемым, это тривиально - GetModuleHandle(NULL)
возвращает дескриптор "основного" модуля.
Мой модуль, однако, является DLL, которая загружается другим исполняемым файлом. Так GetModuleHandle(NULL)
вернет дескриптор модуля этому исполняемому файлу, что явно не то, что я хочу.
Есть ли способ определить дескриптор модуля, который содержит текущий запущенный код? Использование имени DLL в вызове GetModuleHandle()
мне кажется хаком (и его нелегко обслуживать, если рассматриваемый код трансплантируется в другую DLL).
3 ответа
Сохраните дескриптор модуля, когда он будет передан вам в DllMain, а затем используйте его позже, когда он вам действительно понадобится. Многие платформы (например, MFC) делают это автоматически.
Если DLL связана с MFC, есть способ получить экземпляр DLL, в которой была вызвана какая-то функция:
void dll_function()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
HINSTANCE dll_instance = AfxGetInstanceHandle();
}
Как уже было сказано, это можно сделать, сохранив дескриптор модуля, переданный в функцию DllMain.
Но есть и другие причины, по которым вы должны сохранить ручку.
Например, если вы решили связать ресурсы с DLL с помощью компоновщика ресурсов, вам понадобится этот дескриптор модуля, чтобы получить доступ к этим ресурсам через API функции LoadResource.