【问题标题】:Why would MessageBox fail silently?为什么 MessageBox 会默默地失败?
【发布时间】:2010-05-27 14:12:07
【问题描述】:

有谁知道 MessageBox(...) 会如何静默失败?

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

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

对于一点上下文,这段代码是在我们自己的异常处理程序中调用的,它是用 SetUnhandledExceptionFilter() 注册的

大多数时候,我会看到消息框,然后它会启动 Web 浏览器。

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

谢谢

提姆


破解它。我试过故意传入一个垃圾HWND,消息框没有出现。

谢谢布赖恩!

【问题讨论】:

  • 当它失败时,实际发生了什么?进程是否终止? MessageBox 是否返回 0?是否可以通过 GetLastError() 来确定原因?
  • 不幸的是,我无法再访问构建 exe 的代码,因此无法准确追踪。不过感谢您的建议。

标签: c++ windows winapi


【解决方案1】:

只是一个想法,但 g_hMainhWnd 可能无效?当你把NULL作为第一个参数时,看看它是否有效。

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

【讨论】:

    【解决方案2】:

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

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

    我不知道常规 Windows 是否存在相同的问题,但听起来您描述的情况完全相同。在这里完全猜测,但可能是 Windows 操作系统知道请求消息框的应用程序正处于垂死挣扎中,并且明智地忽略了该请求(在过去,垂死的应用程序通常用来抛出“帮助我”的弹幕,我快死了”消息框)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多