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

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
Tento článek byl archivován. Je nabízen v takovém stavu, v jakém je, a nebude již nadále aktualizován.
Souhrn
I v případě, že programování v prostředí 32bitové, jsou časy při práci16bitové aplikace je nezbytné. V systému Windows NT, 16bitové aplikaceSpusť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 tytofunkce 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 sváš projekt.

Funkce VDMDBG uvedené níže jsou pouze podsadu dostupnýchfunkce. 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šechVDMs 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é, VDMsnebo číslo ve výčtu před ukončením výčtu. FP je ukazatelFunkce zpětného volání. Tato funkce je volána pro každý VDM, který jeve 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čovatvýčet. dwProcessId je Identifikátor procesu NTVDM.exe. Jstebude 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ěmaVDMEnumTaskWOWEx() poskytuje další informace o funkci zpětného volání. JstePoužívejte pouze VDMs vrácené VDMEnumProcessWOW() s těchto úlohvýčet funkcí. Pomocí DOS VDMs nemá smysl protože každý DOSaplikace 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 číslovýčet byl ukončen. dwProcessId je Identifikátor procesu podsystému VDM. je FPukazatel na funkci zpětného volání. Pro každý úkol, který je zavolána funkcevýčet. IParam je hodnota definovaná uživatelem, který je předánFunkce 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čovatvýč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 jakotakto:
   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 VDMlpCommandLine je řetězec označující název 16bitové aplikace.společně s parametry příkazového řádku. wShow Určuje, jak bude oknozobrazen. wShow lze libovolnou hodnotu platnou pro ShowWindow() 16 bitůfunkce.

Ukončení 16bitové úlohy

Ukončit úlohu v rámci VDM volání VDMTerminateTaskWOW(). Naprohláš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 hTaskje-li popisovač k úkolu. Tento popisovač úkolu lze získat prostřednictvímVDMEnumTaskWOW() nebo VDMEnumTaskWOWEx().

Tato metoda je hrubý ekvivalent k TerminateProcess() v systému Win32. By měl býtvyhnout, 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čenaVyčistěte po ukončení úkolu. To můžete nechat VDM poškozen anepouž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ů. Kvýčet DOS VDMs, je třeba použít jinou metodu. První můžete použítVDMEnumProcessWOW() seznam všech VDMs Win16 a potom vytvořit výčetvš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 DOSVDM. můžete vytvořit a ukončit 16bitové aplikace DOS sCreateProcess() a TerminateProcess().

Upozornění: Tento článek je přeložený automaticky

Vlastnosti

ID článku: 182559 - Poslední kontrola: 02/28/2014 22:11:22 - Revize: 5.0

Microsoft Win32 Application Programming Interface

  • kbnosurvey kbarchive kbapi kbhowto kbkernbase kbthread kbmt KB182559 KbMtcs
Váš názor