【问题标题】:How does Windows close a program when shutting down the computer?关闭计算机时Windows如何关闭程序?
【发布时间】:2015-09-09 00:46:23
【问题描述】:

如果您在我的应用程序运行时关闭计算机,我的应用程序会引发一些奇怪的错误。

有时消息是(地址)内存不能“读”,有时不能“写”

以正常方式关闭应用程序不会生成此类消息。

如何模拟“Windows 关闭”以便调试我的应用程序?我如何才能找出应用程序正在尝试执行的操作而无法执行的操作?

【问题讨论】:

  • 如果您的应用程序没有响应关闭和终止信号和事件,那么您的程序将被终止,无论它当前在做什么。如果系统以任何一种方式出现故障,那么它对内存的作用真的很重要吗?反正也不会保存。
  • Windows 在关闭时会发送WM_QUIT 消息,因此您可以测试将其发送到应用程序时会发生什么。

标签: c++ windows wxwidgets


【解决方案1】:

当 Windows 想要关机时,它会向应用程序发送一系列事件;例如WM_ENDSESSIONWM_QUIT。您可以在您正在使用的消息处理程序中处理这些;通常,应用程序需要对这些消息做出适当且快速的响应,否则操作系统无论如何都会终止应用程序。我不确定 wxwidgets 在这方面提供了什么默认处理。挂钩这些将有助于诊断应用程序错误本身。

您可以尝试做一些事情;

  • 关机序列不容易模拟(如果有的话) - 关机期间会发生很多事情;确切的状态和情况很难完全模拟。
  • 就在关闭前诊断应用程序的状态而言,您可以尝试处理 WM_QUERYENDSESSION 并回复 FALSE 以防止其关闭(对于较新版本的 Windows,您无法再阻止关闭,因此可能无法正常工作,具体取决于您所在的平台)。
  • 您还可以尝试测试应用程序对 WM_ENDSESSION 消息的即时响应,方法是向其发送 WM_ENDSESSION(例如通过 PostMessage)以及 MSDN 上详述的适当数据。

对于基于终端的应用程序; 如果需要,您还可以加入信号(我相信SIGKILL)。请参阅此 Microsoft reference for more detail。您也可以使用SetConsoleCtrlHandler 挂钩。但是由于您使用的是工具包,所以最好使用已经发送到应用程序的消息。

【讨论】:

  • 模拟关机并不是那么容易,特别是因为现代 Windows 版本如果应用程序没有足够快地返回就会杀死它。对此进行测试的最佳方法是在 VM 中运行您的应用程序并真正将其关闭。
  • @VZ。我同意,没有办法完全“模拟”关机,这些都只是暗示 OP 可以做些什么来尝试诊断问题。我将对其进行编辑以使其更清晰。
  • @VZ,好的,我明白了。但是错误消息来自我的应用程序,当它试图对内存做一些不适当的事情时。因此,此时它不会被操作系统杀死。它刚刚收到来自操作系统的关闭信号
  • 在现代版本的 Windows 中,从 WM_QUERYENDSESSION 返回 FALSE 不再阻止系统关闭。
  • 这敲响了@AdrianMcCarthy,忘记了,谢谢。为帖子添加了一些清晰度。
猜你喜欢
  • 2021-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-06
  • 2023-02-14
  • 1970-01-01
相关资源
最近更新 更多