Здравствуйте, Unsacrificed, Вы писали:
U> Необходимо выполнение неких операций в контексте других приложений, причем действия должны запускаться из "моего" приложения. Для GUI приложений это реализовано через hook типа WH_GETMESSAGE (к приложению цепляется dll обрабатывающая этот hook и обрабатывает посылаемые "моим" приложением сообщения). Для консольных приложений (а точнее приложений без очереди событий) такое не проходит, отсюда вопрос: как реализовать такое взаимодействие для приложений без очереди событий (консольных)?
Библиотеки из этого ключа подключаются к процессу в момент загрузки им user32.dll (user32 сам их загружает). Соответственно, если приложение не использует user32.dll, эти .dll'ки не загрузятся.
Здравствуйте, Unsacrificed, Вы писали:
U>К сожалению верю. Для себя провел какую-никакую классификацию: есть проги, обрабатывающие очередь сообщений и не обрабатывающие. Под первую группу попадают видимо если не все, то большинство прог с GUI и к ним я применил указанный выше метод с hook (вроде работает со всеми GUI, которые я пробовал, кроме Visual Studio). А вот с теми прогами, что не обрабатывают очередь сообщений (а это видимо все или большинство консольных приложений) что делать не знаю.
Надо пошарить эту ветку. Тут месяц или два назад обсуждалась ровно такая же тема, очень подробно(и я там есть). У человека висли хуки на консолях, не могли отцепиться. Наскоко помню, решили проверять окна на консольность (чё-то типа IsConsole) при отцеплении хука и посыл wm_null в окно для пропинывания очереди, потому что опытным путём было получено, что очередь у консоли иногда просто стоит колом
Re[10]: Взаимодействие с dll, внедренными в "чужие" консольн
Здравствуйте, alexey_ma, Вы писали:
_>Зкземпляр класса будет создаваться в каждом процессе куда загруженна хуковая длл. Если нужны одельный экземпляр для потока то можно попробовать поиграться с DllMain, типа на DLL_THREAD_ATTACH создавать зкземпляр класса по new, на DLL_THREAD_DETACH делать ему delete. _>Я с очередями не пробовал, возможно получится.
Ок, я могу выполнять некие действия при установке хука в контексте другого приложения, проходит на ура при этом даже на консольных приложениях (проверял MessageBox'ом. Но проблема в том, что хотя хук и вроде бы ставиться, он не срабатывает. Раньше я находил информацию, что если в консольном приложении вызвать Get/PeekMessage, то очередь сообщений будет создана. Я попробовал в инициализации класса вызвать
PeekMessage(&msg,NULL,0,0,PM_NOREMOVE);
, но хук так и не срабатывает. Вижу 1 вариант: все же очередь не создается таким методом, о чем свидетельствует отсутствие возможности в Spy++ поймать события. Могу ли все-таки создать очередь сообщений в консольном приложении без создания своего невидимого окна/потока?
Re[11]: Взаимодействие с dll, внедренными в "чужие" консольн
Здравствуйте, Unsacrificed, Вы писали:
U>Ок, я могу выполнять некие действия при установке хука в контексте другого приложения, проходит на ура при этом даже на консольных приложениях (проверял MessageBox'ом. Но проблема в том, что хотя хук и вроде бы ставиться, он не срабатывает. Раньше я находил информацию, что если в консольном приложении вызвать Get/PeekMessage, то очередь сообщений будет создана. Я попробовал в инициализации класса вызвать U>
U>PeekMessage(&msg,NULL,0,0,PM_NOREMOVE);
U>
U>, но хук так и не срабатывает. Вижу 1 вариант: все же очередь не создается таким методом, о чем свидетельствует отсутствие возможности в Spy++ поймать события. Могу ли все-таки создать очередь сообщений в консольном приложении без создания своего невидимого окна/потока?
А у меня вообще не работает хук в консоле. Я тут на досуге проверил, хук не устанавливается в консоль. То есть SetWindowsHookEx возврашает не нулевой хендл, LastError = 0, а хуковая длл в консольный процесс не грузится. Так-что возможно придется попробовать что либо другое, либо инжектиться в консольный процесс как-то по другому, либо снаружи работать через Console functions.
Re[12]: Взаимодействие с dll, внедренными в "чужие" консольн
Здравствуйте, alexey_ma, Вы писали:
_>А у меня вообще не работает хук в консоле. Я тут на досуге проверил, хук не устанавливается в консоль. То есть SetWindowsHookEx возврашает не нулевой хендл, LastError = 0, а хуковая длл в консольный процесс не грузится. Так-что возможно придется попробовать что либо другое, либо инжектиться в консольный процесс как-то по другому, либо снаружи работать через Console functions.
Не буду утверждать, что хук к консольному приложению корректно цепляется, но по крайней мере: установил хук глобально, прописав в конструкторе класса вызов MessageBox, так вот при запуске по крайней мере некоторых консольных прог этот messagebox появляется, хотя дальнейшую судьбу хука я не проверял.
Ладно, буду ковыряться дальше в т.ч. с Console function.
Re[13]: Взаимодействие с dll, внедренными в "чужие" консольн
Здравствуйте, Unsacrificed, Вы писали:
U>Здравствуйте, alexey_ma, Вы писали:
_>>А у меня вообще не работает хук в консоле. Я тут на досуге проверил, хук не устанавливается в консоль. То есть SetWindowsHookEx возврашает не нулевой хендл, LastError = 0, а хуковая длл в консольный процесс не грузится. Так-что возможно придется попробовать что либо другое, либо инжектиться в консольный процесс как-то по другому, либо снаружи работать через Console functions.
U>Не буду утверждать, что хук к консольному приложению корректно цепляется, но по крайней мере: установил хук глобально, прописав в конструкторе класса вызов MessageBox, так вот при запуске по крайней мере некоторых консольных прог этот messagebox появляется, хотя дальнейшую судьбу хука я не проверял. U>Ладно, буду ковыряться дальше в т.ч. с Console function.
Можно Process Explorer-ом посмотреть загружена ли хуковая длл в процесс. У меня на чистую консоль хук не ставится, ни локальный ни глобальный.
Re[14]: Взаимодействие с dll, внедренными в "чужие" консольн
Здравствуйте, alexey_ma, Вы писали:
_>Можно Process Explorer-ом посмотреть загружена ли хуковая длл в процесс. У меня на чистую консоль хук не ставится, ни локальный ни глобальный.
Действительно, не встает, но конструктор выполняется, что само по себе забавно. (поставил в конструктор messagebox и пробовал запускать консольные проги — появлялось сообщение, кроме того попробовал поставить хук на конкретную консольную прогу — тоже появился messagebox)