我有一个使用Microsoft Visual Studio 2003用C++编写的ISAPI扩展DLL,它在XP Pro的IIS 5.1中运行。每当_ASSERTE触发时,我只会在标题栏和中止/重试/忽略按钮中得到一个带有“错误”的空消息框。我看不到_ASSERTE宏中的任何表达式文本。我已经跟踪到运行时库的源代码,最终在crtmbox.c的一行中看起来像它在调用动态加载的MessageBoxA()。 lpText(调试断言失败...)和lpCaption(Microsoft Visual C++调试库)有效。
return (*pfnMessageBoxA)(hWndParent, lpText, lpCaption, uType);
如果我正在调试IIS进程,则“重试”按钮将进入调试器。如果我从相同的源构建的Windows可执行文件中执行相同的代码,那么我会得到期望的断言消息框。
我敢肯定,我过去曾经看过这种方法。实际上,迁移到Visual Studio 2003最初是有帮助的,因为2003运行时库可以将MB_SERVICE_NOTIFICATION正确添加到MessageBox标志,以便在调试服务时至少在控制台上可以看到结果的消息框。
谁有想法?
JF
最佳答案
我没有为您提供解决方案,只是建议您进行调查。一旦重试了放入调试器,您是否查看了调用堆栈以查看断言所在的上下文?
哦,我仔细查看了_ASSERTE,它依靠_CRT_WIDE传递消息字符串。如果_ASSERTE的编译方式(使用宽字符串)与动态加载pfnMessageBoxA(看起来像是“窄”字符串类型)之间不匹配,则消息字符串看起来像是零长度的字符串。 DevStudio 2003将其项目默认为您知道的宽字符串。
关于c++ - ISAPI扩展中的_ASSERTE对话框为空,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/416755/