为什么MessageBox会无声地失败?

时间:2010-05-27 14:12:07

标签: c++ windows winapi

有人知道MessageBox(...)如何无声地失败吗?

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

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

对于一个小上下文,此代码在我们自己的异常处理程序中调用,该处理程序使用SetUnhandledExceptionFilter()注册

大多数情况下,我会看到消息框,然后启动Web浏览器。

但是,我有一个exe,据我所知,使用这个确切的代码,它成功启动了Web浏览器,但我没有先看到消息框。

由于


破解了。我试图故意传入垃圾HWND并且没有出现消息框。

谢谢Brian!

2 个答案:

答案 0 :(得分:5)

只是一个想法,但可能g_hMainhWnd无效?当您为第一个参数添加NULL时,查看它是否有效。

我建议在调用后调用GetLastError并将输出写入文件。这样你就可以看到Windows认为错误是什么。 MSDN MessageBox文档提到它为此API设置了GetLastError,如果失败则返回零。

答案 1 :(得分:0)

这是Windows Mobile中的一个常见问题,每当错误触发关闭时(我假设在你的情况下会发生什么,给定你要去的URL)。即使捕获未处理的异常,也可以在应用程序关闭之前可靠地执行一堆语句,但可能会显示或不显示MessageBoxes。它们几乎总是在通过Visual Studio在调试中运行应用程序时显示,但当应用程序作为已编译的EXE运行时,它们几乎不会出现。

奇怪的是,如果你在这种情况下两次调用MessageBox,第二个调用通常会显示一个框(即使在EXE中)。

我不知道常规Windows是否存在同样的问题,但听起来你正在描述完全相同的情况。在这里完全猜测,但是Windows操作系统可能知道请求消息框的应用程序处于死亡状态,并明智地忽略了请求(在过去,死亡的应用程序经常被用来引发一连串的“帮助我” ,我正在死“消息框”。