Použití funkce VDMDBG v systému Windows NT, Windows 2000 a Windows XP

Překlady článku Překlady článku
ID článku: 182559 - Produkty, které se vztahují k tomuto článku.
Tento článek byl archivován. Je nabízen v takovém stavu, v jakém je, a nebude již nadále aktualizován.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

Souhrn

I v případě, že programování v prostředí 32bitové, jsou časy při práci 16bitové aplikace je nezbytné. V systému Windows NT, 16bitové aplikace Spusťte v rámci Virtual DOS Machine (VDM). VDMDBG.dll obsahuje mnoho funkcí které jsou užitečné pro práci s 16bitových aplikací. Tato knihovna je součástí Microsoft Platform SDK.

VDMDBG funkce poskytují vhodný způsob, jak vytvořit výčet, vytvořit a ukončit 16- bit zpracovává v rámci VDM (úkoly). Tento článek popisuje, jak používat tyto funkce v systému Microsoft Windows NT, Windows 2000 a Windows XP.

Další informace

Použijete-li některou z funkcí VDMDBG, je nutné propojit VDMDBG.lib s váš projekt.

Funkce VDMDBG uvedené níže jsou pouze podsadu dostupných funkce. Funkce, které nejsou uvedeny jsou však pouze relevantní ladicímu programu.

Výčet VDMs

Funkce VDMEnumProcessWOW() nabízí jednoduchý způsob, jak vytvořit výčet všech VDMs spuštění 16bitové úlohy systému Windows. Tyto VDMs obsahovat WowExec.exe úkolu. DOS VDMs není ve výčtu.

Prohlášení pro tuto funkci je takto:
   INT WINAPI VDMEnumProcessWOW( PROCESSENUMPROC fp, LPARAM lparam );
				
Vrácená hodnota pro tuto funkci je počet aktuálně spuštěné, VDMs nebo číslo ve výčtu před ukončením výčtu. FP je ukazatel Funkce zpětného volání. Tato funkce je volána pro každý VDM, který je ve výčtu. IParam je hodnota definovaná uživatelem, který je předán ke zpětnému volání funkce.

PROCESSENUMPROC je deklarován takto:
   typedef BOOL ( WINAPI *PROCESSENUMPROC )(
      DWORD dwProcessId,
      DWORD dwAttributes,
      LPARAM lpUserDefined
   );
				
Funkce zpět na hodnotu TRUE výčet stop nebo FALSE pokračovat výčet. dwProcessId je Identifikátor procesu NTVDM.exe. Jste bude nutné toto ID při volání jiných níže uvedených funkcí VDM.

Výčet 16bitové úlohy systému Windows

Výčet úkolů můžete použít VDMEnumTaskWOW() a VDMEnumTaskWOWEx() v rámci konkrétní VDM. Je rozdíl mezi těmito dvěma VDMEnumTaskWOWEx() poskytuje další informace o funkci zpětného volání. Jste Používejte pouze VDMs vrácené VDMEnumProcessWOW() s těchto úloh výčet funkcí. Pomocí DOS VDMs nemá smysl protože každý DOS aplikace bude spuštěna ve vlastním VDM.

Prohlášení jsou:
   INT WINAPI VDMEnumTaskWOW( DWORD dwProcessId, TASKENUMPROC fp,
                              LPARAM lparam );
				
   INT WINAPI VDMEnumTaskWOWEx( DWORD dwProcessId, TASKENUMPROCEX fp,
                                LPARAM lparam );
				
Vrácená hodnota pro každou z těchto funkcí je počet úkolů nyní spuštěn v rámci uvedena VDM nebo ve výčtu před číslo výčet byl ukončen. dwProcessId je Identifikátor procesu podsystému VDM. je FP ukazatel na funkci zpětného volání. Pro každý úkol, který je zavolána funkce výčet. IParam je hodnota definovaná uživatelem, který je předán Funkce zpětného volání.

TASKENUMPROC a TASKENUMPROCEX jsou definovány takto:
   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
   );
				
Tyto funkce zpět na hodnotu TRUE výčet stop nebo FALSE pokračovat výčet. HTask16 volání lze ukončit úlohu.

Příklad výčtu

   // 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;
   }
				

Vytváření 16bitové úlohy

VDMStartTaskInWOW() vytvoří úkol v rámci VDM. Prohlášení je jako takto:
   BOOL WINAPI VDMStartTaskInWOW( DWORD dwProcessId, LPSTR lpCommandLine,
                                  WORD wShow );
				
Vrácená hodnota této funkce je PRAVDA, pokud je úkol úspěšně spuštění, jinak je FALSE. dwProcessId je identifikátor procesu VDM lpCommandLine je řetězec označující název 16bitové aplikace. společně s parametry příkazového řádku. wShow Určuje, jak bude okno zobrazen. wShow lze libovolnou hodnotu platnou pro ShowWindow() 16 bitů funkce.

Ukončení 16bitové úlohy

Ukončit úlohu v rámci VDM volání VDMTerminateTaskWOW(). Na prohlášení je následující:
   BOOL WINAPI VDMTerminateTaskWOW( DWORD dwProcessId, WORD htask );
				
Vrácená hodnota této funkce je PRAVDA, pokud je úkol úspěšně ukončeno, jinak je FALSE. dwProcessId je identifikátor procesu VDM hTask je-li popisovač k úkolu. Tento popisovač úkolu lze získat prostřednictvím VDMEnumTaskWOW() nebo VDMEnumTaskWOWEx().

Tato metoda je hrubý ekvivalent k TerminateProcess() v systému Win32. By měl být vyhnout, pokud je to možné. Nedává úkol umožňující jednoznačné Ukončete, takže data mohou být ztracena. Na rozdíl od systému Win32 WowExec není zaručena Vyčistěte po ukončení úkolu. To můžete nechat VDM poškozen a nepoužitelný. Chcete-li ukončit úkol čistě, odešlete Funkce WM_CLOSE bude jeho nejvyšší úrovně okno.

Poznámky týkající se 16bitové aplikace systému DOS

Nefunguje žádný VDMDBG funkce s aplikacemi systému DOS 16 bitů. K výčet DOS VDMs, je třeba použít jinou metodu. První můžete použít VDMEnumProcessWOW() seznam všech VDMs Win16 a potom vytvořit výčet všechny výskyty NTVDM.exe pomocí jiného schématu (například PSAPI). Žádné NTVDM.exe z úplné výčtu, který nebyl v seznamu Win16 je systému DOS VDM. můžete vytvořit a ukončit 16bitové aplikace DOS s CreateProcess() a TerminateProcess().

Vlastnosti

ID článku: 182559 - Poslední aktualizace: 28. února 2014 - Revize: 5.0
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft Win32 Application Programming Interface
Klíčová slova: 
kbnosurvey kbarchive kbapi kbhowto kbkernbase kbthread kbmt KB182559 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:182559

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