Matikan Pengiriman Pesan dalam Handler

Saya sedang mengerjakan program Windows yang sepenuhnya berulir tunggal dan tidak memiliki perlindungan terhadap struktur data apa pun. Namun, program ini menggunakan DirectShow API yang membuka pengiriman pesan internalnya sendiri, misalnya IVideoWindow::put_Visible. Jadi fungsi penanganan peristiwa yang memanggil Metode IVideoWindow::put_Visible memberikan peluang fungsi penanganan peristiwa lainnya untuk merusak datanya.

Apakah ada cara untuk mencegah pengiriman pesan seperti itu dalam API?


person Middleware    schedule 10.05.2009    source sumber


Jawaban (1)


Pertanyaannya agak tidak jelas bagi saya. Apakah Anda berbicara tentang API yang memasukkan loop pesan modal secara internal? Apakah ini menimbulkan masalah masuk kembali bagi Anda? Jika itu masalahnya, mungkin ada cara yang lebih baik untuk menyelesaikan masalah Anda. Jika API memasuki loop modal, pasti ada alasan bagusnya, dan Anda harus mengizinkannya. (Dalam kasus Anda, saya kira DirectShow berkomunikasi dengan objek COM lain secara internal.) Jika ditulis dengan benar, modal loop akan tetap mengirimkan pesan ke jendela lain di thread yang sama.

Bagaimanapun, jika Anda benar-benar ingin melakukan ini, berikut caranya:

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

Langkah terakhir ini penting. Ketika perulangan modal keluar karena pesan WM_QUIT, ia harus memposting pesan keluarnya sendiri setelah keluar (sehingga aplikasi tahu untuk berhenti). Jika Anda tidak memakannya, aplikasi Anda akan keluar.

person Peter Ruderman    schedule 04.06.2009