Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows关闭时应用程序正常关闭_Windows_Windows 7 - Fatal编程技术网

Windows关闭时应用程序正常关闭

Windows关闭时应用程序正常关闭,windows,windows-7,Windows,Windows 7,我有一个应用程序,我想在Windows关闭(或用户注销)时优雅地关闭它。这在xp中曾经奏效,但在去年的某个时候,它在没有人注意到的情况下崩溃了。它在Windows7下也坏了(但不同) 我们的产品有一个主进程(server.exe),它启动许多其他进程。正常关机时,server.exe会要求所有进程开始关机。然而,当我调试这段代码时,其他进程似乎已经终止。我们的主进程(server.exe)是处理WM_QUERYENDSESSION和WM_ENDSESSION消息的唯一进程。下面的代码(该代码以前

我有一个应用程序,我想在Windows关闭(或用户注销)时优雅地关闭它。这在xp中曾经奏效,但在去年的某个时候,它在没有人注意到的情况下崩溃了。它在Windows7下也坏了(但不同)

我们的产品有一个主进程(server.exe),它启动许多其他进程。正常关机时,server.exe会要求所有进程开始关机。然而,当我调试这段代码时,其他进程似乎已经终止。我们的主进程(server.exe)是处理WM_QUERYENDSESSION和WM_ENDSESSION消息的唯一进程。下面的代码(该代码以前在XP下工作,但现在不再工作):

似乎我们在去年做了一些改变,需要所有子进程来处理WM_QUERYENDSESSION消息(我真的希望避免这种情况)。我似乎找不到任何关于进程何时收到或未收到此消息的信息

我已经使用新的API使它在Windows7下工作,但是我想知道为什么它在XP下坏了,这样我就可以有一个同时适用于两个操作系统的解决方案


有什么帮助吗?

在Vista时代前后,情况发生了变化,不太确定这会对代码产生什么影响。最好不要让Windows来决定关闭顺序。只需让它在助手处理之前让您的服务器收到关闭通知:

   DWORD dwLevel, dwFlags;
   BOOL fOkay = GetProcessShutdownParameters(&dwLevel, &dwFlags);
   ASSERT(fOkay);
   if (fOkay && dwLevel > 0x100) {
       fOkay = SetProcessShutdownParameters(dwLevel + 1, SHUTDOWN_NORETRY);
       ASSERT(fOkay);
   }

可能是Windows出于某种原因以不同的顺序关闭进程吗?有什么东西可以保证你的
server.exe
是Windows关闭的第一件事?有没有可能在源代码管理中有这段代码?您至少可以看到它在去年是否发生了更改?不确定是什么原因导致server.exe在其他服务器关闭之前关闭…根据subversion日志,检查标志以查看用户是否正在注销或windows正在关闭的代码是在2010年2月10日添加的。从那时起它就没有改变过。在XP下这很好用。在Windows7下,行为仍然是一样的。我知道这在Win7上是有效的。很难猜到还有什么东西困扰着你。仔细检查了我的代码,事实上在Windows7下我没有调用它……修复了代码,是的,它工作正常。谢谢你的帮助。
   DWORD dwLevel, dwFlags;
   BOOL fOkay = GetProcessShutdownParameters(&dwLevel, &dwFlags);
   ASSERT(fOkay);
   if (fOkay && dwLevel > 0x100) {
       fOkay = SetProcessShutdownParameters(dwLevel + 1, SHUTDOWN_NORETRY);
       ASSERT(fOkay);
   }