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。
-
近期文章
近期评论
- coolker 发表在《打造最快的Hash表》
- struggle 发表在《提供C语言教学课件(适用于初学者)》
- zhanghaibo 发表在《提供C语言教学课件(适用于初学者)》
- zhanghaibo 发表在《提供C语言教学课件(适用于初学者)》
- diys 发表在《C语言编程宝典(王大刚) 1.1 C 语言的产生与发展》
文章归档
- 2022 年十月
- 2014 年一月
- 2013 年十二月
- 2012 年十一月
- 2012 年七月
- 2012 年六月
- 2012 年五月
- 2012 年四月
- 2012 年三月
- 2012 年二月
- 2011 年十二月
- 2011 年十月
- 2011 年九月
- 2011 年八月
- 2011 年七月
- 2011 年六月
- 2011 年五月
- 2011 年四月
- 2011 年三月
- 2011 年二月
- 2011 年一月
- 2010 年十二月
- 2010 年十一月
- 2010 年十月
- 2010 年九月
- 2010 年八月
- 2010 年七月
- 2010 年六月
- 2010 年五月
- 2010 年四月
- 2010 年三月
- 2010 年二月
- 2010 年一月
- 2009 年十二月
- 2009 年十一月
- 2009 年十月
- 2009 年九月
- 2009 年八月
- 2009 年七月
- 2009 年六月
- 2009 年五月
- 2009 年四月
- 2009 年三月
- 2009 年二月
- 2009 年一月
- 2008 年十二月
- 2008 年十一月
- 2008 年十月
- 2008 年九月
- 2008 年八月
- 2008 年七月
- 2008 年六月
- 2008 年五月
- 2008 年四月
- 2008 年三月
- 2008 年二月
- 2008 年一月
- 2007 年十二月
- 2007 年十一月
- 2007 年十月
- 2007 年九月
- 2007 年八月
- 2007 年七月
- 2007 年六月
- 2007 年三月
- 2007 年二月
- 2007 年一月
- 2006 年十二月
- 2006 年十一月
- 2006 年十月
- 2006 年九月
- 2006 年八月
- 2006 年七月
- 2006 年六月
- 2006 年五月
- 2006 年四月
- 2006 年三月
- 2006 年二月
- 2006 年一月
- 2005 年十二月
- 2005 年十一月
分类目录
功能