如何使用HINSTANCE终止应用程序

时间:2011-05-19 20:20:48

标签: c++ handle terminate hinstance

我使用ShellExecute从c ++生成一个应用程序,所以我有应用程序的HINSTANCE。

如何使用该HINSTANCE关闭它?我可以使用WaitForSingleObject()等待应用程序完成吗?

2 个答案:

答案 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中几乎没用 - 但是你所拥有的并不是HINSTANCEShellExecute的回报实际上只是一个大于或小于32的值,分别表示成功或失败。

幸运的是,如果您使用ShellExecuteEx,您可以获得新流程的流程处理,可以使用它来控制流程。

@Remus链接的MSDN文章很不错,但是(IMO)如果目标应用程序是(或可能是)控制台应用程序,那么另一个步骤可能很有用。在这种情况下,它通常不会处理WM_CLOSE消息。但是,您可以将一个DLL注入进程,并从进程内部执行干净(ish)关闭(例如,如果它调用exit,并且目标程序是用C语言编写的,那么'在死亡之前,我将有机会刷新和关闭文件,运行注册atexit等的任何内容。)

如果失败,您可能希望使用GenerateConsoleCtrlEvent向其发送控制中断。

然后,如果所有这些都未能退出,请致电TerminateProcess