Запустить приложение Windows GUI в синхронизированном режиме? - PullRequest
0 голосов
/ 31 мая 2011

Я отлаживаю приложение с графическим интерфейсом для Windows и хочу выяснить, кто является отправителем какого-либо сообщения.В Linux я могу запустить приложение в синхронизированном режиме и найти отправителя в стеке вызовов.Есть ли в Windows аналогичный режим?

Ответы [ 2 ]

1 голос
/ 31 мая 2011

AFAIK, нет встроенной возможности сделать это.

Но давайте сначала исследуем проблему.Вы хотите знать, кто является отправителем сообщения .Однако вы должны знать, что обработка сообщений Windows может быть классифицирована по следующим критериям:

  1. Отправлено против Отправленных сообщений (PostMessage против SendMessage).
  2. Сообщения, отправленные в окнопринадлежность другому потоку против потока отправителя.
  3. Сообщения, опубликованные в потоке (не привязаны к конкретному окну, следовательно, не обрабатываются оконной процедурой).

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

В случае, если сообщение было отправлено из другого потока, вы не увидите его в стеке вызовов.Просто потому, что стек вызовов показывает цепочку вызовов, которая принадлежит только текущему потоку.Когда сообщение отправляется из другого потока, система выполняет следующее:

  1. Приостановляет поток вызывающего.
  2. Помещает это сообщение в очередь потока, которому принадлежит окно.
  3. Когда этот поток вызывает GetMessage (или аналогичный) - сообщение отправляется в окно.
  4. Наконец ОС возобновляет поток вызывающего.SendMessage возвращается с результатом, который был возвращен оконной процедурой.

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

Наконец, отправленные сообщения невозможно отследить вышеуказанным способом.Вы можете попытаться поставить условную точку останова на вызове PostMessage, но если вызывающий абонент принадлежит к другой проблеме - это будет более сложно.

0 голосов
/ 31 мая 2011

Вальдо правильно.Звонки в SendMessage вызывают ваши приложения напрямую через wndproc.Вызовы PostMessage отправляют сообщение в очередь сообщений, а затем ваше приложение получает сообщение через насос сообщений (цикл, getmessage, translatemessage, dispatchmessage).Таким образом, как он сказал, если сообщения были отправлены через SendMessage, то вызываемая функция будет отображаться в стеке вызовов.Если он был отправлен через PostMessage, он не будет.

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