Подтвердить что ты не робот

Как получить собственный код модуля?

Возможный дубликат:
Как получить HMODULE для текущего исполняемого кода?

Я пытаюсь найти ресурс в своем собственном модуле. Если этот модуль является исполняемым, то тривиальный - GetModuleHandle(NULL) возвращает дескриптор основного модуля.

Моим модулем, однако, является DLL, загружаемая другим исполняемым файлом. Поэтому GetModuleHandle(NULL) вернет дескриптор модуля к этому исполняемому файлу, что явно не то, что я хочу.

Есть ли способ определить дескриптор модуля модуля, который содержит текущий код? Использование имени DLL в вызове GetModuleHandle() кажется мне взломанным (и не легко поддерживается в случае, если рассматриваемый код пересаживается в другую DLL).

4b9b3361

Ответ 1

Храните дескриптор модуля, когда он предоставляется вам в DllMain, а затем используйте его позже, когда вам это действительно нужно. Многие фреймворки (например, MFC) делают это автоматически.

Ответ 2

Если DLL связана с MFC, есть способ получить экземпляр DLL, в котором была вызвана какая-то функция:

void dll_function()
  {
  AFX_MANAGE_STATE(AfxGetStaticModuleState());
  HINSTANCE dll_instance = AfxGetInstanceHandle();
  }

Ответ 3

Как уже было сказано, это можно сделать, сохранив обработчик модуля, переданный в функцию DllMain.

Но есть и другие причины, по которым вы должны сохранить дескриптор.

Например, если вы решили связать ресурсы с DLL с помощью компоновщика ресурсов, вам понадобится этот дескриптор этого модуля, чтобы получить эти ресурсы с помощью API функций LoadResource.