如何使用 H实例终止应用程序

How to terminate an application using the HINSTANCE

本文关键字:终止 应用程序 实例 何使用      更新时间:2023-10-16

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

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

无法正常关闭进程。使用 TerminateProcess 有一种突然的非优雅方式,但这会阻止进程运行自己的清理代码,并可能使内容"处于不确定状态",请参阅进程如何在 Windows XP 上退出的快速概述。

长期以来,关于"终止进程"的普遍智慧是将WM_CLOSE发送到进程最顶层的无主窗口,期望应用程序通过优雅退出来响应。请参阅如何在 Win32 中"干净"地终止应用程序,以及有关查找正确窗口的相关主题的必读内容: 可以有多个(或零个): 将进程转换为窗口

您还应该阅读 我可以用 ShellExecute 函数返回的 HINSTANCE 做什么? 了解为什么您拥有的 HINSTANCE 不值得信赖,更不用说无用了......

首先,HINSTANCE在现代版本的Windows中用处不大 - 但无论如何,你所拥有的并不是真正的HINSTANCEShellExecute的回报实际上只是一个大于或小于 32 的值,分别表示成功或失败。

幸运的是,如果使用 ShellExecuteEx ,则可以获取新进程的进程句柄,并使用它来控制进程。

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

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

然后,如果所有这些都无法退出,则拨打TerminateProcess