1

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

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

4

2 回答 2

3

没有办法优雅地关闭进程。使用 有一种突然的不优雅的方式TerminateProcess,但这会阻止进程运行自己的清理代码,并且可能会留下一些“in-limbo”的东西,请参阅Windows XP 上进程如何退出的快速概述

很长一段时间以来,关于“终止进程”的普遍看法是将 WM_CLOSE 发送到进程最顶层的无主窗口,以期望应用程序通过优雅退出来做出响应。请参阅如何在 Win32 中“干净地”终止应用程序,以及有关查找正确窗口的相关主题的强制阅读:可以有多个(或零个):将进程转换为窗口

你还应该阅读ShellExecute 函数返回的 HINSTANCE 可以做什么?明白为什么你拥有的 HINSTANCE 不值得信赖,不要说没用...

于 2011-05-19T20:43:25.843 回答
1

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

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

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

如果失败了,你可能想用GenerateConsoleCtrlEvent它来发送一个控制中断。

然后,如果所有这些都无法退出,则调用TerminateProcess.

于 2011-05-19T21:46:57.400 回答