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