2009-05-10 2 views
1

Я работаю над программой Windows, которая полностью однопоточная и не имеет защиты от какой-либо структуры данных. Тем не менее, программа использует DirectShow API, который открывает свою собственную внутреннюю диспетчеризацию сообщений, например, IVideoWindow :: put_Visible. Таким образом, функция обработки событий, которая вызывает метод IVideoWindow :: put_Visible, дает возможность другим функциям обработки событий разрушать свои данные.Отключение отправки сообщений в обработчике

Есть ли в любом случае предотвратить такую ​​отправку сообщений в API?

ответ

0

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

В любом случае, если вы действительно хотите сделать это, вот как:

PostQuitMessage(0); // Signal quit to force the upcoming loop to exit 
APIFunc(); // Enters modal loop internally 
MSG msg; 
PeekMessage(&msg, NULL, WM_QUIT, WM_QUIT, PM_REMOVE); // Eat the next WM_QUIT 

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

Смежные вопросы