2009-01-06 51 views
2

我有一個ISAPI擴展DLL,它使用在XP Pro上運行的IIS 5.1中的Microsoft Visual Studio 2003以C++編寫。每當_ASSERTE觸發時,我只會在標題欄和中止/重試/忽略按鈕中得到一個空的消息框,並顯示'錯誤'。我沒有看到的是_ASSERTE宏中的任何表達式文本。我已經追蹤到運行時庫源代碼,並最終在crtmbox.c中看起來像是在調用一個動態加載的MessageBoxA()。 lpText(調試斷言失敗...)和lpCaption(Microsoft Visual C++調試庫)是有效的。ISAPI擴展中的空_ASSERTE對話框

return (*pfnMessageBoxA)(hWndParent, lpText, lpCaption, uType); 

如果我在調試IIS進程,那麼重試按鈕就會進入調試器。如果我從一個由相同源構建的Windows可執行文件執行相同的代碼,那麼我會得到我期望的Assert消息框。

我確信我已經看到過這個工作。事實上,移動到Visual Studio 2003最初是因爲2003運行時庫正確地將MB_SERVICE_NOTIFICATION添加到MessageBox標誌,以便在調試服務時至少在控制檯上顯示結果消息框。

任何人有任何想法?

JF

回答

1

我對你沒有任何解決方法,只是一個調查建議。一旦你把Retry放入調試器,你是否看過調用堆棧來查看斷言發生的上下文?

哦,我仔細查看_ASSERTE,它依靠_CRT_WIDE傳遞消息字符串。如果在編譯_ASSERTE(使用寬字符串)和動態載入pfnMessageBoxA(看起來像'narrow'字符串類型)之間存在不匹配的情況,那麼消息字符串看起來像一個零長度字符串。 DevStudio 2003將其項目默認爲寬字符串,你知道。