2009-01-06 71 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将其项目默认为宽字符串,你知道。

相关问题