Как безопасно подключиться к насосу сообщений из DLL? - PullRequest
2 голосов
/ 30 сентября 2011

Я пытаюсь получить сообщения от процесса, который загрузил мою DLL.

Я пробовал:

SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)WndProc, hInstance, 0);

, который выдает всплывающие сообщения об ошибках о том, что "Программа X не смоглабыть запущен, потому что Y.dll отсутствует в вашей системе ".Это причина, по которой я добавил «безопасно» в заголовок.

Я также пробовал:

SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)WndProc, hInstance, threadId);

Где threadId - результат GetCurrentThreadId() в моей DLLMain.Это работает, но я не получаю никаких сообщений для окна (просто куча 512 и 1025).

Ответы [ 2 ]

4 голосов
/ 30 сентября 2011

Сообщения относятся к потокам и окнам, ваша DLL может быть загружена процессами.Так что прямой переписки нет.

С другой стороны, хуки являются глобальными или для каждого потока.

Все вместе это означает, что вам нужно выбрать, хотите ли вы получать сообщения только из определенных потоков или глобально (все потоки во всех процессах на конкретном рабочем столе), где вы сами отфильтруете интересующий вас процесс.*

Ваш второй фрагмент кода представляет собой цепочку потоков.Первый - глобальный хук, в котором вы определенно делаете что-то не так, поскольку сам успешный хук не вызывает упомянутых вами сообщений об ошибках.

0 голосов
/ 01 октября 2011

Я предполагаю, что вы вызываете эти функции прямо из DLLMain.Существуют серьезные ограничения в отношении того, какие функции вы можете безопасно вызывать из DLLMain, см. Документацию MSDN для DLLMain .

Нет явного списка безопасных и небезопасных функций, но кажется вероятным, что вызов SetWindowsHookEx в вашем первом фрагменте кода делает что-то, что запрещено в функции DLLMain, следовательно, ошибка загрузки DLLдолжным образом.

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