WEB开发网
开发学院软件开发VC 如何“干净地”终止 Win32 中的应用程序 阅读

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

 2008-09-19 19:27:25 来源:WEB开发网   
核心提示: 16 位问题(在 Windows NT 下)上述步骤适用于 Windows 95 下的 16 位应用程序,而 Windows NT 下的 16 位应用程序与 Windows 95 下的 16 位应用程序的工作方式差别非常大,如何“干净地”终止 Win32 中的应用程序(2),在 Windo

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。有关这方面的其它信息,请参见:“如何用 Win32 APIs 枚举应用程序窗口和进程”。

关闭 Windows NT 下的 16 位应用程序的首选和最直接的方法是关闭整个 NTVDM 进程。你可以通过执行前面所描述的步骤来完成此操作。你只需知道 NTVDM 的进程 ID 即可,参考“如何用 Win32 APIs 枚举应用程序窗口和进程”所讲的方法来查找 NTVDM 的进程 ID。此方法的缺点是它会关闭在该 VDM 中运行的所有 16 位应用程序。如果这不是你想要的结果,则需要采取其它方法。

如果你希望关闭 NTVDM 进程中的单个 16 位应用程序,需要按照下列步骤操作:

向该进程所拥有的以及与你要关闭的 16 位任务具有相同线程 ID 的所有顶级窗口发送一条 WM_CLOSE 消息。执行此操作最有效的方法是使用 EnumWindows()。在回调函数中,检查窗口的进程 ID 和线程 ID 是否与要关闭的 16 位任务相匹配。请记住,该进程 ID 将成为在其中运行 16 位应用程序的 NTVDM 的进程 ID。

Tags:如何 干净 终止

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接