Вы можете вызывать GetModuleHandle () сколько хотите. Насколько я помню, если вы проверяете значение, обычно это один и тот же дескриптор, возвращаемый каждый раз в вашем процессе (он может отличаться в другом процессе). Это не вызывает утечки памяти.
Вы можете вызвать FreeLibrary () для дескриптора, чтобы выгрузить dll, если вас беспокоит эта память, но на практике это часто бывает сложно, и большинство процессов просто ждут выхода из процесса, чтобы выгрузить динамически загруженные модули.
Хорошо, я только что проверил это с помощью следующего кода:
HANDLE h1 = GetModuleHandle(L"user32.dll");
HANDLE h2 = GetModuleHandle(L"user32.dll");
HANDLE h3 = GetModuleHandle(L"user32.dll");
Каждый дескриптор один и тот же, и это просто базовый адрес DLL (вы можете проверить это с помощью окна Модули в Visual Studio).
Обычно библиотеки DLL не перемещаются после загрузки, поэтому вы должны иметь возможность кэшировать значение, возвращаемое при первом вызове, поэтому вы экономите накладные расходы на вызов дополнительной функции каждый раз, когда хотите загрузить строку.