DLL-библиотека Global WH_CBT загружается только в некоторые процессы - PullRequest
1 голос
/ 21 марта 2010

Основная программа вызывает функцию SetHook в wi.dll для установки глобального хука WH_CBT.

bool WI_API SetHook()
{
    if (!g_hHook)
    {
        g_hHook = SetWindowsHookEx(WH_CBT, (HOOKPROC) CBTProc, g_hInstDll, 0);
    }

    return g_hHook != NULL;
}

Полагаю, что после установки глобального хука wi.dll должен быть загружен в адресное пространство каждого процесса. Однако wi.dll загружается только в некоторые процессы. Например, если я запускаю Skype, MS Word, я вижу, что wi.dll также загружается в эти процессы (с помощью Process Explorer), однако, если я запускаю Firefox, uTorrent, Adobe Reader, то wi.dll не загружается в эти процессы. .

Я использую W7 64-bit, основная программа и wi.dll 32-битные, все программы, упомянутые здесь, также 32-битные.

Есть идеи, почему это происходит?

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 14 декабря 2011

Из MSDN:

SetWindowsHookEx может использоваться для внедрения DLL в другой процесс. 32-битная DLL не может быть внедрена в 64-битный процесс, а 64-битная DLL не может быть внедрена в 32-битный процесс. Если приложение требует использования хуков в других процессах, требуется, чтобы 32-разрядное приложение вызывало SetWindowsHookEx для внедрения 32-разрядной DLL в 32-разрядные процессы, а 64-разрядное приложение вызывало SetWindowsHookEx для внедрения 64-разрядного DLL в 64-битных процессах. 32-разрядные и 64-разрядные библиотеки DLL должны иметь разные имена.

Итак, вы должны создать 32-разрядное приложение для вызова SetWindowsHookEx из 32-разрядной библиотеки DLL, затем перенаправить сообщения в основное приложение, и ваше основное приложение в x64 вызовет SetWindowsHookEx из 64-разрядной библиотеки DLL для получения сообщений от Процессы x64 также.

0 голосов
/ 22 марта 2010

Механизм крюковой цепи не является пуленепробиваемым и зависит от всех участников, следуя правилам.Если приложение устанавливает свой собственный перехват WH_CBT для каждого потока и не вызывает CallNextHookEx в своей процедуре перехвата, более ранние перехватчики не будут вызваны.См. Документы MSDN для CallNextHookEx.

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