Как проверить, не поврежден ли процесс окна при вызове CallwindowProc? - PullRequest
0 голосов
/ 07 января 2010

Мне нужно вызвать API

CallWindowProc((WNDPROC)lpfnOldProc, hWnd, Message, wParam, lParam);

Теперь, как я могу убедиться, что lpfnOldProc все еще действует?

По сути, lpfnOldProc - это процедура в другой dll, и если эта dll выгружена, то lpfnOldProc все равно будет указывать на что-то, но не на действительную память?

Существуют ли какие-либо API памяти, с помощью которых я могу проверить правильность lpfnOldProc?

Ответы [ 3 ]

4 голосов
/ 07 января 2010

Не волнуйся. Вы в зацепке явно. Теперь даже в ваше отсутствие программа зависнет, если исходный оконный процесс был выгружен и вызван. Неважно, что вы теперь звоните, а не Windows.

Window Proc должен оставаться в памяти, пока существуют существующие окна, использующие его. Ответственность за эту проверку лежит полностью с кодом, учитывающим выгрузку, а не с вызывающими программами Window Proc (т.е. вы). Эта ответственность может быть изложена в одной строке: «Не выгружайте ничего, что еще используется».

1 голос
/ 07 января 2010

Вы не можете проверить. Вы можете настроить обработку структурированных исключений, чтобы отследить ошибку, которая приведет к тому, что рассматриваемая DLL исчезла или была заменена копией Британской энциклопедии, отображенной в памяти.

0 голосов
/ 07 января 2010

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

Если у вас есть доступ к исходному коду, лучшее, что вы можете сделать, - это иметь только одну dll, ответственную за перехват оконного процесса, а затем остальные могут реализовать своего рода делегат, поэтому при развертывании его можно установить в null, и перехватывающая dll может проверить, и если она пуста, пропустить вызов.

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

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