У меня есть этот проект, где я подключаю некоторые функции Windows (GetOpenFileNameA, GetOpenFileNameW, GetSaveFileNameA, GetSaveFileNameW)
с библиотекой MHook. Это код, который я использую для установки крючков.Общесистемные крючки с MHook
for(size_t i = 0; i < FunctionsCount; ++i)
{
HMODULE hModule = GetModuleHandleA(Function[i].ModuleName);
//[1]
if(!hModule)
return FALSE;
*Function[i].Original = GetProcAddress(hModule, Function[i].Name);
if(*Function[i].Original == NULL)
return FALSE;
if(!Mhook_SetHook(Function[i].Original, Function[i].Hooked))
return FALSE;
}
Она вызывается из DllMain
по DLL_PROCESS_ATTACH
причине.
Теперь, когда я ввожу свою Dll с использованием подхода CreateRemoteThread
, он работает очень хорошо, но когда я хочу настроить общесистемные крючки с помощью механизма LoadAppInit_DLLs
, мои крючки не работают. После отладки часов я обнаружил, что причина в том, что моя Dll загружена ДО comdlg32.dll
(которая является модулем, где эти функции), а затем оператор [1]
возвращает false, тогда моя Dll не загружается.
Решение, которое я до сих пор должен назвать LoadLibrary
, если [1]
возвращает false.
HMODULE hModule = GetModuleHandleA(Function[i].ModuleName);
//[2]
if(!hModule)
{
LoadLibraryA(Function[i].ModuleName);
hModule = GetModuleHandleA(Function[i].ModuleName);
}
Я нашел много сайтов, на которых сказано, что это зло, и я согласен (даже когда работает отлично). Также, если процесс не использует общие диалоги вообще, я подключаю функции, которые никогда не будут вызваны.
Если кто-нибудь может помочь, может быть, обходной путь или объяснение другого способа установления глобальных крючков будет оценен. Заранее спасибо
Хороший ответ, я дам попытку в ближайшее время. Что вы имеете в виду: «Хорошая идея - привязать подключенные DLL, чтобы они больше не были выгружены» – omainegra
. Ваш алгоритм hook может не ожидать, что dll будет выгружена и снова загружена. Так что гораздо проще сделать dll unloadable. См. Http://msdn.microsoft.com/en-us/library/windows/desktop/ms683200(v=vs.85).aspx –
Дело в том, что я обнаружил, что dll выгружается из-за того, что операционная система загружает dll процесса (dll в 'LoadAppInit_DLLs' не является последним), поэтому в пространстве процессов' GetModuleHandle ("comdlg32.dll") 'возвращает' NULL'. Пожалуйста, поправьте меня, если я увижу это с неправильной точки зрения. – omainegra