如何“干净地”终止 Win32 中的应用程序

类别:编程语言 点击:0 评论:0 推荐:
如何“干净地”终止 Win32 中的应用程序察看这篇文章对应的产品文章 ID:178893最后更新日期:2004年11月25日版本:2.2本页内容概要更多信息 32 位进程(和 Windows 95 下的 16 位进程) 16 位问题(在 Windows NT 下) 示例代码这篇文章中的信息适用于:概要在理想环境中,某一进程可能会通过某种形式的进程间通信要求另一进程关闭。不过,如果您对希望其关闭的应用程序没有源代码级控制权,可能就无法选择这样做。尽管没有哪种方法保证可以“干净地”关闭 Win32 中的应用程序,但您可以采取一些步骤以确保应用程序使用最佳方法来清除资源。 返回页首更多信息32 位进程(和 Windows 95 下的 16 位进程)在 Win32 下,操作系统可保证在进程关闭时清除进程所拥有的资源。但是,这并不意味着进程本身将有机会对磁盘执行任何最后的信息刷新或通过远程连接执行任何最后的通信,也不意味着进程的 DLL 将有机会执行其 PROCESS_DETACH 代码。这就是通常最好避免在 Windows 95 和 Windows NT 下终止应用程序的原因。

如果您必须关闭进程,请按照下列步骤操作: 1.向您要关闭的进程所拥有的所有顶级窗口发送一条 WM_CLOSE 消息。许多 Windows 应用程序会通过关闭它自身来响应此消息。

注意:控制台应用程序对 WM_CLOSE 的响应取决于它是否安装了控制处理程序。

使用 EnumWindows() 找到目标窗口的句柄。在回调函数中,检查该窗口的进程 ID 是否与要关闭的进程相匹配。您可以通过调用 GetWindowThreadProcessId() 来执行此操作。确定匹配项后,使用 PostMessage() 或 SendMessageTimeout() 向该窗口发送 WM_CLOSE 消息。2.使用 WaitForSingleObject() 等待进程的句柄。确保您使用超时值等待,因为在很多情况下 WM_CLOSE 不会关闭应用程序。记住,应使超时值足够长(通过 WaitForSingleObject() 或 SendMessageTimeout()),以便用户可以响应为了响应 WM_CLOSE 消息而创建的任何对话框。3.如果返回值为 WAIT_OBJECT_0,则应用程序已干净地将它自身关闭。如果返回值为 WAIT_TIMEOUT,则必须使用 TerminateProcess() 关闭应用程序。

注意:如果您从 WaitForSingleObject() 得到的返回值不是 WAIT_OBJECT_0 或 WAIT_TIMEOUT,则应使用 GetLastError() 找出原因。 通过执行上述这些步骤,您就为应用程序提供了干净(无需 IPC 或用户干预)关闭的最佳机会。 16 位问题(在 Windows NT 下)上述步骤适用于 Windows 95 下的 16 位应用程序,而 Windows NT 下的 16 位应用程序与 Windows 95 下的 16 位应用程序的工作方式差别非常大。

在 Windows NT 下,所有 16 位应用程序都在虚拟 DOS 机 (VDM) 中运行。此 VDM 是作为 Windows NT 下的一个 Win32 进程 (NTVDM) 运行的。NTVDM 进程具有进程 ID。您可以通过 OpenProcess() 获取该进程的句柄,就像处理其他任何 Win32 进程一样。不过,在 VDM 中运行的 16 位应用程序都没有进程 ID,因此您无法从 OpenProcess() 获取进程句柄。VDM 中的每个 16 位应用程序都有一个 16 位任务句柄和一个 32 位执行线程。可通过调用函数 VDMEnumTaskWOWEx() 找到该任务句柄和线程 ID。有关其他信息,请参见以下 Microsoft 知识库文章: 175030

本文地址:http://com.8s8s.com/it/it21940.htm