Как работает GetModuleHandle в Visual C ++ - PullRequest
3 голосов
/ 18 июля 2011

Я новичок в c ++, и этот код всегда возвращает NULL, хотя я знаю, что файл существует:

HMODULE hModule = GetModuleHandle(TEXT("C:\\Users\\Steve\\Desktop\\stub.exe"));

Интересно, что если я скопирую stub.exe в C: \ Windows \ system32, он найдетмодуль с таким кодом:

HMODULE hModule = GetModuleHandle(TEXT("stub.exe"));

Мне не хватает чего-то невероятно простого?

Ответы [ 3 ]

7 голосов
/ 18 июля 2011

Вы можете звонить GetModuleHandle(L"C:\\Users\\Steve\\Desktop\\stub.exe"); только тогда, когда вы работаете C:\Users\Steve\Desktop\stub.exe.

Но, как правило, вы не называете GetModuleHandle своим именем EXE. Поскольку для каждого процесса существует только один EXE-файл, вы просто вызываете GetModuleHandle(0).

3 голосов
/ 18 июля 2011

Во-первых, GetModuleHandle требует, чтобы вы загрузили dll в процесс перед раздачей.

В Windows есть определенные пути, которые используются для поиска модулей, а также некоторые переключатели для принудительной «безопасной» загрузки DLL, вы можете изучить SetDllDirectory и AddDllDirectory, если хотите расширитьместа поиска.См. this для объяснения того, как Windows ищет двоичные файлы.

0 голосов
/ 18 июля 2011

Вот цитата из MSDN :

Функция GetModuleHandle

Извлекает дескриптор модуля для указанного модуля.Модуль должен быть загружен вызывающим процессом.

Это означает, что вы должны сначала загрузить модуль с LoadLibrary .System32 может получить специальную обработку, но вам действительно не следует ничего копировать туда.Папка предназначена исключительно для использования операционной системой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...