2010-05-27 79 views
2

有誰知道MessageBox(...)如何可以默默地失敗?爲什麼MessageBox會默默失敗?

MessageBox(g_hMainhWnd, buffer, "Oops!", MB_OK | MB_ICONERROR); 

ShellExecute(0, "open", "http://intranet/crash_handler.php", NULL, "", SW_SHOWNORMAL); 

對於一個小範圍內,該代碼被稱爲我們自己的異常處理程序,它與SetUnhandledExceptionFilter()

大部分的時間,我看到的消息框,然後打開網頁註冊的內瀏覽器。

但是,我有一個exe文件,據我所知,它使用了這個確切的代碼,並且它成功地啓動了web瀏覽器,但是我沒有先看到消息框。

感謝


破解它。我試圖故意傳遞一個垃圾HWND並且消息框沒有出現。

謝謝Brian!

+0

當它失敗時,實際發生了什麼?該過程是否終止? MessageBox是否返回0?你不能GetLastError()來確定原因嗎? – 2010-05-27 14:23:24

+0

不幸的是,我不再能夠訪問構建這個exe的代碼,所以我無法確切地描述它。謝謝你的建議。 – 2010-05-27 14:34:39

回答

5

只是一個想法,但也許g_hMainhWnd是無效的?當你爲第一個參數設置NULL時,看看它是否有效。

我建議在調用之後調用GetLastError並將輸出寫入文件。這樣你可以看到Windows認爲錯誤是什麼。 MSDN MessageBox文檔提到它爲此API設置GetLastError,如果失敗,則返回零。

+0

是的,我認爲HWND是無效的 - 謝謝! – 2010-05-27 14:33:49

0

這是Windows Mobile中的一個常見問題,只要錯誤觸發關閉(我假設您的情況發生了什麼,給定了您將要訪問的URL)。即使在捕獲未處理的異常時,也可以在應用程序關閉之前可靠地執行一堆語句,但MessageBoxes可能會或可能不會顯示。它們幾乎總是在通過Visual Studio進行調試時運行應用程序時顯示的,但當應用程序作爲編譯後的EXE運行時,它們幾乎不會出現。奇怪的是,如果您在這種情況下調用MessageBox兩次,第二個調用通常會顯示一個框(即使在EXE中)。

我不知道常規Windows是否存在同樣的問題,但它聽起來像是描述了完全相同的情況。完整的猜測在這裏,但是Windows操作系統可能意識到請求消息框的應用程序正處於死亡狀態,並且明智地忽略了請求(在過去的日子裏,垂死的應用程序經常用來拋出「幫助我,我快死了「的消息框)。