Comment faire pour utiliser les fonctions VDMDBG sur Windows NT, Windows 2000 et Windows XP

Traductions disponibles Traductions disponibles
Numéro d'article: 182559 - Voir les produits auxquels s'applique cet article
Cet article a été archivé. Il est proposé « en l'état » et ne sera plus mis à jour.
Agrandir tout | Réduire tout

Sommaire

Résumé

Même lorsque vous programmez dans un environnement 32 bits, il est parfois travailler avec des applications 16 bits nécessaire. Dans Windows NT, les applications 16 bits s'exécutent au sein d'une machine virtuelle DOS (VDM). VDMDBG.dll contient des nombreuses fonctions qui sont utiles pour travailler avec des applications 16 bits. Cette bibliothèque fait partie du Kit de développement.

Fonctions VDMDBG permettent une bonne pour énumérer, créer et mettre fin aux processus 16 bits (tâches) au sein d'un VDM. Cet article décrit comment utiliser ces fonctions sur Microsoft Windows NT, Windows 2000 et Windows XP.

Plus d'informations

Lorsque vous utilisez une des fonctions VDMDBG, vous devez créer un lien VDMDBG.lib avec votre projet.

Les fonctions VDMDBG mentionnées ci-dessous ne sont qu'un sous-ensemble des fonctions disponibles. Toutefois, les fonctions qui ne sont pas mentionnées concernent uniquement un débogueur.

L'énumération des VDM

La fonction VDMEnumProcessWOW() offre un moyen simple pour énumérer tous les VDM 16 bits Windows tâches en cours d'exécution. Ces VDM contient la tâche WowExec.exe. Les VDM DOS ne sont pas énumérés.

La déclaration pour cette fonction est la suivante :
   INT WINAPI VDMEnumProcessWOW( PROCESSENUMPROC fp, LPARAM lparam );
				
la valeur renvoyée pour cette fonction est le nombre de VDM en cours d'exécution ou l'énumération énumérée avant le numérique a été interrompue. fp est un pointeur vers une fonction de rappel. La fonction est appelée pour chaque VDM est énuméré. lParam est une valeur définie par l'utilisateur qui est passée à la fonction de rappel.

PROCESSENUMPROC est déclarée comme suit :
   typedef BOOL ( WINAPI *PROCESSENUMPROC )(
      DWORD dwProcessId,
      DWORD dwAttributes,
      LPARAM lpUserDefined
   );
				
la fonction doit retourner TRUE pour énumération stop ou FALSE pour continuer l'énumération. dwProcessId est l'ID du processus du processus NTVDM.exe. Vous aurez besoin ce code lors de l'appel des fonctions VDM mentionnées ci-dessous.

L'énumération des tâches de Windows 16 bits

Vous pouvez utiliser VDMEnumTaskWOW() et VDMEnumTaskWOWEx() pour énumérer les tâches au sein d'un VDM donné. La différence entre les deux est que VDMEnumTaskWOWEx() fournit des informations supplémentaires à la fonction de rappel. Vous ne devez utiliser VDM retournées par VDMEnumProcessWOW() avec ces fonctions d'énumération de tâche. À l'aide de VDM DOS n'a pas de sens car chaque application DOS s'exécute dans son propre VDM.

Les déclarations sont :
   INT WINAPI VDMEnumTaskWOW( DWORD dwProcessId, TASKENUMPROC fp,
                              LPARAM lparam );
				
   INT WINAPI VDMEnumTaskWOWEx( DWORD dwProcessId, TASKENUMPROCEX fp,
                                LPARAM lparam );
				
la valeur renvoyée pour chacune de ces fonctions est le nombre de tâches en cours d'exécution au sein de VDM indiquée ou de l'énumération énumérée avant le numérique a été interrompue. dwProcessId est l'ID de processus du fp VDM est un pointeur vers une fonction de rappel. La fonction est appelée pour chaque tâche est énuméré. lParam est une valeur définie par l'utilisateur qui est passée à la fonction de rappel.

TASKENUMPROC et TASKENUMPROCEX sont définis comme suit :
   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
   );
				
ces fonctions doivent rétablir vrai énumération stop ou FALSE pour continuer l'énumération. Vous pouvez utiliser hTask16 dans un appel pour terminer la tâche.

Exemple d'énumération

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

Création de tâches de 16 bits

VDMStartTaskInWOW() crée une tâche dans un VDM. La déclaration est la suivante :
   BOOL WINAPI VDMStartTaskInWOW( DWORD dwProcessId, LPSTR lpCommandLine,
                                  WORD wShow );
				
la valeur de retour de cette fonction est TRUE si la tâche est démarrée avec succès, sinon c'est faux. dwProcessId est l'ID du processus VDM. lpCommandLine est une chaîne qui indique le nom de fichier de l'application 16 bits avec les paramètres de la ligne de commande. wShow indique comment la fenêtre est affichée. wShow peut être n'importe quelle valeur valide pour la fonction ShowWindow() 16 bits.

Arrêt de tâches de 16 bits

Pour terminer une tâche au sein d'un appel VDM VDMTerminateTaskWOW(). La déclaration est la suivante :
   BOOL WINAPI VDMTerminateTaskWOW( DWORD dwProcessId, WORD htask );
				
la valeur de retour de cette fonction est TRUE si la tâche est terminée avec succès, sinon c'est faux. dwProcessId est le hTask ID. de processus VDM constitue le handle de la tâche. Ce handle de tâche peut être obtenu via VDMEnumTaskWOW() ou VDMEnumTaskWOWEx().

Cette méthode est équivalent à TerminateProcess() dans Win32. Il convient d'éviter, si possible. Il ne fournit pas la tâche une chance de sortie correctement, données peuvent être perdues. Contrairement à Win32, le WowExec n'est pas garanti de nettoyer après une tâche arrêtée. Cela peut laisser le VDM endommagée et inutilisable. Pour terminer la tâche proprement, envoyez un message WM_CLOSE à sa fenêtre de niveau supérieur.

Remarque concernant les applications de DOS 16 bits

Aucune des fonctions VDMDBG de manipuler les applications de DOS 16 bits. Pour énumérer les VDM DOS, vous devez utiliser une autre méthode. Tout d'abord, vous pouvez également utiliser VDMEnumProcessWOW() pour créer une liste de tous les VDM Win16 et puis énumérer toutes les instances de NTVDM.exe à l'aide de certains autre schéma (tel que PSAPI). Tout NTVDM.exe à partir de l'énumération complète qui n'était pas dans la liste de Win16 est un VDM DOS. Vous pouvez créer et terminer des applications de DOS 16 bits avec CreateProcess() et TerminateProcess().

Propriétés

Numéro d'article: 182559 - Dernière mise à jour: samedi 22 février 2014 - Version: 3.4
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Win32 Application Programming Interface sur le système suivant
    • Microsoft Windows NT 4.0
    • the operating system: Microsoft Windows 2000
    • the operating system: Microsoft Windows XP
Mots-clés : 
kbnosurvey kbarchive kbmt kbapi kbhowto kbkernbase kbthread KB182559 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 182559
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

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