如何在 Windows NT、 Windows 2000 與 Windows XP 上使用 VDMDBG 函式

文章翻譯 文章翻譯
文章編號: 182559 - 檢視此文章適用的產品。
本文已封存。本文係以「現狀」提供且不會再更新。
全部展開 | 全部摺疊

在此頁中

結論

甚至在程式設計在 32 位元環境中時, 有 16 位元應用程式的工作時必要的時間。在 Windows NT 16 位元應用程式執行中虛擬 DOS 機器 (VDM)。VDMDBG.dll 包含適用於使用 16 位元應用程式的許多功能。此程式庫是 Microsoft 平台 SDK 的一部分。

VDMDBG 函式提供很好的方法來列舉、 建立,並結束一個 VDM 內的 16 位元處理序 (工作)。本文將告訴您,如何使用 Microsoft Windows NT、 Windows 2000 和 Windows XP 上這些函式。

其他相關資訊

使用任何 VDMDBG 函式時您需要使用您的專案連結 VDMDBG.lib。

以下提及的 VDMDBG 函式是只可用的函式的子集。但是,尚未提及的函式是只與偵錯工具相關。

正在列舉 VDM

VDMEnumProcessWOW() 函式提供簡單的方法來列舉所有 VDM 執行 16 位元 Windows 工作。這些 VDM 包含 WowExec.exe 工作。 不列舉 DOS VDM。

這個函式宣告,如下所示是:
   INT WINAPI VDMEnumProcessWOW( PROCESSENUMPROC fp, LPARAM lparam );
				
這個函式的傳回值是 VDM 目前執行的數字或數字之前,先列舉的列舉型別已終止 fp 是回呼函式的指標。呼叫此函式列舉每個 VDM 的。lParam 是使用者定義的值傳遞至回呼函式。

PROCESSENUMPROC 宣告如下:
   typedef BOOL ( WINAPI *PROCESSENUMPROC )(
      DWORD dwProcessId,
      DWORD dwAttributes,
      LPARAM lpUserDefined
   );
				
的函式應該返回 TRUE 停止列舉型別或 FALSE 繼續 dwProcessId 是 NTVDM.exe 程序的處理序 ID。 列舉型別。呼叫其他以下提及的 VDM 函數時,您將需要這個識別碼。

正在列舉 16 位元 Windows 工作

您可以使用 VDMEnumTaskWOW() 和 VDMEnumTaskWOWEx() 列舉特定 VDM 內的任務。這兩個不同的是 VDMEnumTaskWOWEx() 提供回呼函式的詳細資訊。您應該只使用 VDM VDMEnumProcessWOW() 所傳回與這些工作的列舉型別函式。使用 DOS VDM 沒有意義因為每個 DOS 應用程式是在它自己 VDM 中執行。

在宣告是:
   INT WINAPI VDMEnumTaskWOW( DWORD dwProcessId, TASKENUMPROC fp,
                              LPARAM lparam );
				
   INT WINAPI VDMEnumTaskWOWEx( DWORD dwProcessId, TASKENUMPROCEX fp,
                                LPARAM lparam );
				
每個這些函式的傳回值是指示 VDM,內目前執行的工作數目或數字之前,先列舉的列舉型別已終止 dwProcessId 是 VDM fp 處理序 ID 是回呼函式的指標。呼叫此函式列舉每個任務。lparam 是使用者定義的值傳遞至回呼函式。

TASKENUMPROC 和 TASKENUMPROCEX 定義如下:
   typedef BOOL ( WINAPI *TASKENUMPROC )(
      DWORD dwThreadId,
      WORD hMod16,
      WORD hTask16,
      LPARAM lpUserDefined
   );
				
   typedef BOOL ( WINAPI *TASKENUMPROCEX )(
      DWORD dwThreadId,
      WORD hMod16,
      WORD hTask16,
      PSZ pszModName,
      PSZ pszFileName,
      LPARAM lpUserDefined
   );
				
這些函式應該返回 TRUE 停止列舉型別或 FALSE 繼續列舉型別。您可以使用在呼叫中的 hTask16 終止工作。

列舉的範例

   // Enumerate all 16-bit tasks on the system.
   #include <windows.h>
   #include <stdio.h>
   #include <vdmdbg.h>

   BOOL WINAPI ProcessEnumProc( DWORD, DWORD, LPARAM );
   BOOL WINAPI TaskEnumProcEx( DWORD, WORD, WORD, PSZ, PSZ, LPARAM );

   void main()
   {
      // Enumerate VDMs.
      VDMEnumProcessWOW(
         (PROCESSENUMPROC)ProcessEnumProc,
         (LPARAM)NULL
      );

   }

   BOOL WINAPI ProcessEnumProc( DWORD dwProcessId, DWORD dwAttrib,
      LPARAM t )
   {
      printf("\nProcess ID: %d\n", dwProcessId);

      // Use process ID of VDM to enumerate through its tasks.
      VDMEnumTaskWOWEx(
         dwProcessId,
         (TASKENUMPROCEX)TaskEnumProcEx,
         (LPARAM)NULL
      );

      // Keep enumerating.
      return FALSE;
   }

   BOOL WINAPI TaskEnumProcEx( DWORD dwThreadId, WORD hMod16, WORD hTask16,
      PSZ pszModName, PSZ pszFileName, LPARAM lParam )
   {
      //print task's information
      printf("Thread ID: %d\n", dwThreadId);
      printf("Module handle: %d\n", hMod16);
      printf("Task handle: %d\n", hTask16);
      printf("Module Name: %s\n", pszModName);
      printf("File Name: %s\n", pszFileName);

      // Keep enumerating.
      return FALSE;
   }
				

建立 16 位元工作

VDMStartTaskInWOW() 會建立一個 VDM 內工作。宣告,如下所示是:
   BOOL WINAPI VDMStartTaskInWOW( DWORD dwProcessId, LPSTR lpCommandLine,
                                  WORD wShow );
				
之這個函式的傳回值是 TRUE,如果工作已順利啟動,否則它是 FALSE dwProcessId 為 VDM 處理序的 ID。 lpCommandLine 是指出連同任何命令列參數的 16 位元應用程式的檔案名稱的字串。wShow 指示如何顯示視窗。wShow 可以是任何有效的 16 位元 ShowWindow() 函式的值。

正在終止的 16 位元工作

若要終止 VDM 呼叫 VDMTerminateTaskWOW() 中的工作。宣告,如下所示是:
   BOOL WINAPI VDMTerminateTaskWOW( DWORD dwProcessId, WORD htask );
				
之這個函式的傳回值,如果該工作已順利終止為 TRUE,否則它是 FALSE dwProcessId 是 VDM 處理序 ID。 hTask 是控點來工作。透過 VDMEnumTaskWOW() 或 VDMEnumTaskWOWEx(),可取得這個工作控制代碼。

約略等於 TerminateProcess() 在 Win32 中,這個方法會。它應該是,儘可能避免。它並不會提供工作完全結束的機率因此資料可能會遺失。不像 Win32,[WowExec 不保證清除後已經終止工作。這可以讓 [VDM 損毀且無法使用。俐落地終止工作,將傳送至其最上層視窗的一個 WM_CLOSE。

請注意有關 16 位元 DOS 應用程式

沒有任何 VDMDBG 函式會使用 16 位元 DOS 應用程式。若要列舉 DOS VDM,您需要使用另一個方法。先,也可以讓所有的 Win16 VDM 清單使用 VDMEnumProcessWOW(),並列舉 NTVDM.exe 使用一些其他配置 (例如 PSAPI) 的所有執行個體。從完整列舉型別不是 Win16 清單中任何 NTVDM.exe 是 DOS VDM。您可以建立和終止 TerminateProcess() CreateProcess() 與 16 位元 DOS 應用程式。

屬性

文章編號: 182559 - 上次校閱: 2014年2月22日 - 版次: 3.4
這篇文章中的資訊適用於:
  • Microsoft Win32 Application Programming Interface?應用於:
    • Microsoft Windows NT 4.0
    • the operating system: Microsoft Windows 2000
    • the operating system: Microsoft Windows XP
關鍵字:?
kbnosurvey kbarchive kbmt kbapi kbhowto kbkernbase kbthread KB182559 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:182559
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com