2010-10-23 44 views
4

這是有點兒非常低級的類型的問題,但也許有人在這裏有一些見解被抓......有例外的問題被Win32消息調度

我有一個問題,未處理的SEH異常(如訪問衝突)似乎被捕獲在Win32消息發送級別上,而不是終止程序。我發現下面的參考博客,這也解釋了這個問題,但只在WM_TIMER消息的情況下:http://bugswar.blogspot.com/2010/07/why-its-not-crashing.html

我遇到與Win 2008 R2的問題,並在「正常」的消息(如:WM_COMMAND等) 。我懷疑它可能是Windows試圖通過屏蔽異常來「幫助」,但我希望它出錯;一般而言,「繼續和忽略」行爲導致應用程序出現問題。我意識到我可以嘗試在try/catch中封裝每個函數,並使用編譯器選項/ EHa將SEH異常轉換爲C++異常(本身非常令人沮喪並且很危險),但這顯然不是最優的。

根據引用的博客,TIB結構中的AppCompatFlags2中有一個標誌(http://en.wikipedia.org/wiki/Win32_Thread_Information_Block),它可能導致Win32處理程序無法捕捉/丟棄SEH異常,但我不知道如何設置/啓用它。任何人都有這方面的見解?是否有一個AppCompat設置可以使Windows無法捕捉並忽略異常?

回答

0

我不知道兼容性設置如何影響此特定方面,但您可以從資源管理器中的EXE的屬性頁(至少在W7和Vista上)選擇幾種兼容模式。我似乎還記得,您也可以從清單中請求特定的一個。

+0

你可以,但那不是我正在尋找的,因爲我非常想使用最新版本的Windows中的一些功能,而且我非常不希望將錯誤的版本信息發送給我應用。這裏的屬性是你可以用AppCompat指定的一個子集(據我所知),有些可以通過清單來設置;不過,我不知道如何設置我所關心的行爲。 – Nick 2010-10-23 01:35:16

1

我認爲這是通過設計,但顯然它沒有被認真考慮。也許不明智的嘗試讓一些遺留應用程序「行爲」。

您可以在Windows 7 SP1中覆蓋此行爲;我在這個in this stackoverflow answer上寫了更多。