如何使用 H实例终止应用程序
How to terminate an application using the HINSTANCE
我正在使用ShellExecute从c ++生成一个应用程序,所以我有该应用程序的HINSTANCE。
我现在如何使用该 HINSTANCE 关闭它?我可以使用 WaitForSingleObject() 等待应用程序完成吗?
无法正常关闭进程。使用 TerminateProcess
有一种突然的非优雅方式,但这会阻止进程运行自己的清理代码,并可能使内容"处于不确定状态",请参阅进程如何在 Windows XP 上退出的快速概述。
长期以来,关于"终止进程"的普遍智慧是将WM_CLOSE发送到进程最顶层的无主窗口,期望应用程序通过优雅退出来响应。请参阅如何在 Win32 中"干净"地终止应用程序,以及有关查找正确窗口的相关主题的必读内容: 可以有多个(或零个): 将进程转换为窗口
您还应该阅读 我可以用 ShellExecute 函数返回的 HINSTANCE 做什么? 了解为什么您拥有的 HINSTANCE 不值得信赖,更不用说无用了......
首先,HINSTANCE
在现代版本的Windows中用处不大 - 但无论如何,你所拥有的并不是真正的HINSTANCE
。ShellExecute
的回报实际上只是一个大于或小于 32 的值,分别表示成功或失败。
幸运的是,如果使用 ShellExecuteEx
,则可以获取新进程的进程句柄,并使用它来控制进程。
@Remus链接的 MSDN 文章不错,但 (IMO) 如果目标应用程序是(或可能是)控制台应用程序,则还有另一个步骤可能很有用。在这种情况下,它通常不会处理WM_CLOSE
消息。但是,您可以将 DLL 注入进程,并让它从进程内部执行干净(ish)关闭(例如,如果它调用 exit
,并且目标程序是用 C 编写的,它将有机会刷新和关闭文件,运行任何注册atexit
等,然后死亡)。
如果失败,您可能希望使用 GenerateConsoleCtrlEvent
向其发送控制中断。
然后,如果所有这些都无法退出,则拨打TerminateProcess
。
- C++应用程序 MySQL odbc 数据库连接错误:在引发"otl_tmpl_exception<>"实例后终止调用
- 初始化和终止Qt应用程序的正确方法?
- 我应该使用什么信号来终止/终止Windows上的应用程序
- 强制终止和重新生成 TCP 套接字应用程序时无法重用端口
- 使用 ASSERT_DEATH 时,有没有办法在应用程序终止后自动继续执行所有测试
- 运行在DLL中的工作线程在应用程序关闭时被终止,然后才能正常关闭它们
- 我该如何验证给定类的每个实例都被应用程序终止所破坏
- 此应用程序已请求运行时以异常方式终止它 QT C++
- 正确关闭应用程序:终止程序的替代方案
- 关闭Qt控制台应用程序会终止exec()调用中的进程,并且无法从main()扩展到范围
- 绑定错误 98 "Address in use"应用程序终止后仍然存在
- C++应用程序不会终止
- linux上的c++应用程序,在终止之前挂起
- WIN 32 用于检测已启动和终止的应用程序/进程的 API
- 使应用程序/服务,以便在任务管理器中尝试结束/终止其进程将导致"Unable to Terminate Process"
- 如何从 Http 请求处理程序正确终止 POCO 服务器应用程序
- 如何在不终止应用程序的情况下关闭GLUT窗口
- 当远程桌面会话注销时,如何阻止DLL终止应用程序服务器
- 如何使用 H实例终止应用程序
- 终止应用程序并调用局部对象的析构函数