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

Возможный дубликат:
Как мне получить 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.

Другие вопросы по тегам