Я работаю над проектом, который фиксирует все взаимодействия с пользователем. MSDN подсказывает (this)
SetWindowsHookEx можно использовать для внедрения DLL в другой процесс. A 32-битная DLL не может быть внедрена в 64-битный процесс, а 64-битная DLL не может быть внедрена в 32-битный процесс. Если приложение требует использования крючков в других процессах, необходимо, чтобы 32-битное приложение вызывало SetWindowsHookEx для внедрения 32-битной DLL в 32-битный процессах, а 64-битное приложение вызывало SetWindowsHookEx для внедрения 64-битной DLL в 64-битные процессы.
Мой вопрос в том, что произойдет, если приложение было собрано на любом процессоре
. Нужно ли мне вызывать SetWindowsHookEx
из DLL, собранной на Any CPU
.
Я написал HookLogger_32.exe, загружающий HookFunctions_32.dll (оба x86) и HookLogger_64.exe, загружающий HookFunctions_64.dll (оба x64), устанавливающий WH_CBT
и WH_MOUSE
глобально (не для конкретного потока).
HookLogger_32.exe, HookLogger_64.exe, HookFunctions_32.dll и HookFunctions_64.dll написаны на C++.
Когда я нажимаю на приложение .NET, собранное на Any CPU
, эти DLL внедряются (через SetWindowHookEx
). ОС Windows зависает, и мне приходится принудительно перезагружать машину.
Когда одно и то же .NET-приложение собирается на x86 или x64, и когда я нажимаю на приложение после запуска HookLoggers (как 32, так и 64-битных), все работает нормально.
Любые причины такого неопределенного поведения.
Платформа, на которой я работаю - 64-битная машина.