首页 > C/C++开发工具专区 > VC技术 > Windows NT 系统中如何启动和终止 16 位 Windows 应用程序?
2005
12-07

Windows NT 系统中如何启动和终止 16 位 Windows 应用程序?

Windows NT 环境中,基于 16 位的 Windows 应用程序是作为一个线程在虚拟 DOS 机(VDM)中运行的。这些线程的调度是非抢先式的。16 位 Windows 程序与运行在相同 VDM 中其它 16 位 Windows 程序共享一个地址空间和输入队列。线程(应用程序)拥有其创建的对象。这个环境被称为 WOW(Windows on Win32)。
  Windows NT 3.5 引入了对多 WOWs 的支持,所以单个 16 位 Windows 程序或程序组可以在其自己的地址空间里运行。
  当 CreateProcess() 不用 CREATE_SEPARATE_WOW_VDM 标志启动一个 16 位 Windows 程序后,线程句柄是没有意义的,通常为 NULL,进程为一个特殊事件的句柄,仅用于象 WaitForSingleObject() 或 WaitForInputIdle() 这样的等待 APIs,以侦测程序终止或侦测程序的启动并在没有未决输入的情况下完全运行。
  注意:当你以 CREATE_SEPARATE_WOW_VDM 标志调用 CreateProcess()时,在 PROCESS_INFORMATION 结构的 hProcess 和 hThread 域中返回的句柄是有效的句柄。hProcess 句柄新 WOW 进程的句柄,但 hThread 是 WOWEXEC 线程的句柄,而不是应用程序的线程句柄。你可以等待任何一个这样的句柄,并在基于 Windows 的应用程序终止时的到释放,因为当最后一个应用程序终止时,单独的 VDM 就不复存在了,要知道,如果你的 Windows 应用程序启动另外一个 Windows 程序并将其终止,VDM 依然故我,因为此应用程序与它所启动的应用程序运行在相同的 VDM 中。
  类似地,当你使用  CREATE_SEPARATE_WOW_VDM 标志启动 16 位应用程序时,PROCESS_INFORMATION.dwProcessId 和 PROCESS_INFORMATION.dwThreadId 变量也是有效的 IDs,就像使用句柄一样,然而,它们并不直接关联到 16 位应用程序,而是关联到 VDM 进程和 WOWEXEC 线程。
  警告:你创建的每个单独的 VDM 要消耗到大约 2.5MB的私有内存。所以用创建单独的 VDM 来获得应用程序句柄和/或 IDs 的方法被认为是拙劣的编程习惯。
  上述讨论暗示了一个常见的问题:“如何从 32 位程序中终止 16 位进程?” PROCESS_INFORMATION.hProcess 不能被用于 TerminateProcess(),同时,PROCESS_INFORMATION.dwThreadId也不能被用于 PostThreadMessage()。
  终止单个 16 位 Windows 程序的方法是用 EnumWindows() 枚举桌面窗口,确定哪个是要终止的窗口,用GetWindowThreadProcessId() 获得线程 ID,然后通过 PostThreadMessage() 发送 WM_QUIT 消息来终止应用程序。
   另一个终止单个 16 位 Windows 程序的方法是用 TOOLHELP APIs。用 TaskFirst() 和 TaskNext()枚举任务,确定哪个是要终止的任务,然后调用 TerminateApp() 来杀掉应用程序。参考代码见 Windows SDK 例子程序 THSAMPLE。


留下一个回复