我使用ShellExecute从c ++生成一个应用程序,所以我有应用程序的HINSTANCE。
如何使用该HINSTANCE关闭它?我可以使用WaitForSingleObject()等待应用程序完成吗?
答案 0 :(得分:3)
无法正常关闭进程。使用TerminateProcess
有一种突然的非优雅方式,但这会阻止进程运行自己的清理代码,并且可能会让内容“陷入困境”,请参阅Quick overview of how processes exit on Windows XP。
很长一段时间以来,关于“终止进程”的常识是将WM_CLOSE发送到进程最顶层的无主窗口,期望应用程序将通过优雅地退出来响应。请参阅How To Terminate an Application "Cleanly" in Win32,以及有关找到正确窗口的相关主题的强制性阅读:There can be more than one (or zero): Converting a process to a window
你还应该阅读What can I do with the HINSTANCE returned by the ShellExecute function?来理解为什么你所拥有的HINSTANCE不值得信赖,更不用说无用......
答案 1 :(得分:1)
首先,HINSTANCE
在现代版本的Windows中几乎没用 - 但是你所拥有的并不是HINSTANCE
。 ShellExecute
的回报实际上只是一个大于或小于32的值,分别表示成功或失败。
幸运的是,如果您使用ShellExecuteEx
,您可以获得新流程的流程处理,可以使用它来控制流程。
@Remus链接的MSDN文章很不错,但是(IMO)如果目标应用程序是(或可能是)控制台应用程序,那么另一个步骤可能很有用。在这种情况下,它通常不会处理WM_CLOSE
消息。但是,您可以将一个DLL注入进程,并从进程内部执行干净(ish)关闭(例如,如果它调用exit
,并且目标程序是用C语言编写的,那么'在死亡之前,我将有机会刷新和关闭文件,运行注册atexit
等的任何内容。)
如果失败,您可能希望使用GenerateConsoleCtrlEvent
向其发送控制中断。
然后,如果所有这些都未能退出,请致电TerminateProcess
。