Utilizzo di funzioni VDMDBG in Windows NT, Windows 2000 e Windows XP

Traduzione articoli Traduzione articoli
Identificativo articolo: 182559 - Visualizza i prodotti a cui si riferisce l?articolo.
Questo articolo č stato archiviato. L?articolo, quindi, viene offerto ?cosė come č? e non verrā pių aggiornato.
Espandi tutto | Chiudi tutto

In questa pagina

Sommario

Anche se la programmazione in un ambiente a 32 bit, esistono casi quando č necessario lavorare con le applicazioni a 16 bit in. In Windows NT, le applicazioni a 16 bit vengono eseguite all'interno di una Virtual DOS Machine (VDM). VDMDBG.dll contiene molte funzioni utili per l'utilizzo di applicazioni a 16 bit. Questa libreria fa parte di Microsoft Platform SDK.

VDMDBG funzioni consentono una buona per enumerare, creare e terminare i processi a 16 bit (attivitā) all'interno di una VDM. In questo articolo viene descritto come utilizzare queste funzioni in Microsoft Windows NT, Windows 2000 e Windows XP.

Informazioni

Quando si utilizza una delle funzioni VDMDBG, č necessario collegare VDMDBG.lib con il progetto.

Le funzioni VDMDBG riportate di seguito sono solo un sottoinsieme delle funzioni disponibili. Tuttavia, le funzioni menzionate non sono rilevanti solo a un debugger.

Enumerazione VDMs

La funzione VDMEnumProcessWOW() fornisce un modo semplice per enumerare tutti i VDMs esegue attivitā di Windows a 16 bit. Questi VDMs contenere l'attivitā WowExec.exe. DOS VDMs non vengono enumerati.

La dichiarazione di questa funzione č la seguente:
   INT WINAPI VDMEnumProcessWOW( PROCESSENUMPROC fp, LPARAM lparam );
				
il valore restituito per questa funzione č il numero di VDMs attualmente in esecuzione, o l'enumerazione enumerato prima numero č stato terminato. fp č un puntatore a una funzione di callback. La funzione viene chiamata per ogni VDM che viene enumerata. lParam č un valore definito dall'utente č passato alla funzione callback.

PROCESSENUMPROC č dichiarata nel modo seguente:
   typedef BOOL ( WINAPI *PROCESSENUMPROC )(
      DWORD dwProcessId,
      DWORD dwAttributes,
      LPARAM lpUserDefined
   );
				
la funzione deve restituire TRUE per l'enumerazione stop o FALSE per continuare dwProcessId enumerazione. č l'ID di processo del processo di NTVDM.exe. Questo ID č necessario quando si chiamano altre funzioni VDM riportati di seguito.

L'enumerazione delle attivitā di Windows a 16 bit

Č possibile utilizzare VDMEnumTaskWOW() e VDMEnumTaskWOWEx() per enumerare attivitā all'interno di una particolare VDM. La differenza tra i due č che VDMEnumTaskWOWEx() fornisce ulteriori informazioni per la funzione di callback. Č necessario utilizzare solo VDMs restituito da VDMEnumProcessWOW() con queste funzioni di enumerazione di attivitā. Utilizzando MS-DOS VDMs non ha senso poiché tutte le applicazioni MS-DOS viene eseguito nel proprio VDM.

Le dichiarazioni sono:
   INT WINAPI VDMEnumTaskWOW( DWORD dwProcessId, TASKENUMPROC fp,
                              LPARAM lparam );
				
   INT WINAPI VDMEnumTaskWOWEx( DWORD dwProcessId, TASKENUMPROCEX fp,
                                LPARAM lparam );
				
il valore restituito per ciascuna di queste funzioni č il numero di attivitā attualmente in esecuzione all'interno di VDM indicato, o l'enumerazione enumerato prima numero č stato terminato. dwProcessId č l'ID di processo di fp VDM. č un puntatore a una funzione di callback. La funzione viene chiamata per ogni attivitā che viene enumerata. lParam č un valore definito dall'utente č passato alla funzione callback.

TASKENUMPROC e TASKENUMPROCEX sono definiti come segue:
   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
   );
				
queste funzioni dovrebbe essere ripristinato TRUE enumerazione stop o FALSE per continuare l'enumerazione. Č possibile utilizzare hTask16 in una chiamata per terminare l'attivitā.

Esempio di enumerazione

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

Creazione di attivitā a 16 bit

VDMStartTaskInWOW() crea un'attivitā all'interno di una VDM. La dichiarazione č come segue:
   BOOL WINAPI VDMStartTaskInWOW( DWORD dwProcessId, LPSTR lpCommandLine,
                                  WORD wShow );
				
il valore restituito di questa funzione č TRUE se l'attivitā viene avviato correttamente, la in caso contrario č FALSE. dwProcessId č l'ID del processo VDM. lpCommandLine č una stringa che indica il nome del file dell'applicazione a 16 bit insieme con i parametri della riga di comando. wShow indica come visualizzare la finestra. wShow puō essere qualsiasi valore valido per la funzione di ShowWindow() 16 bit.

Attivitā di terminazione 16-bit

Per terminare un'attivitā all'interno di una chiamata VDM VDMTerminateTaskWOW(). La dichiarazione č come segue:
   BOOL WINAPI VDMTerminateTaskWOW( DWORD dwProcessId, WORD htask );
				
il valore restituito di questa funzione č TRUE se l'attivitā č completata, in caso contrario č FALSO. dwProcessId il hTask di ID. processo VDM č l'handle per l'attivitā. Č possibile ottenere l'handle di attivitā tramite VDMEnumTaskWOW() o VDMEnumTaskWOWEx().

Questo metodo č un equivalente approssimativo TerminateProcess() in Win32. Consigliabile evitare, se possibile. Non fornisce l'attivitā possibilitā di uscita correttamente, pertanto i dati potrebbero essere persi. A differenza di Win32, non č garantito il WowExec per pulire dopo un'operazione terminata. Questo puō lasciare il VDM danneggiata e inutilizzabile. Per terminare correttamente l'attivitā, inviare un WM_CLOSE alla finestra principale.

Nota su applicazioni DOS a 16 bit

Nessuna delle funzioni VDMDBG funziona con applicazioni DOS a 16 bit. Per enumerare VDMs MS-DOS, č necessario utilizzare un altro metodo. In primo luogo, č possibile utilizzare VDMEnumProcessWOW() per creare un elenco di tutti VDMs Win16 e quindi enumerare tutte le istanze di NTVDM.exe utilizzando alcuni altri schema (ad esempio PSAPI). Qualsiasi NTVDM.exe dall'enumerazione completo che non č nell'elenco Win16 č una VDM DOS. Creare e terminare le applicazioni MS-DOS a 16 bit con CreateProcess() e TerminateProcess().

Proprietā

Identificativo articolo: 182559 - Ultima modifica: sabato 22 febbraio 2014 - Revisione: 3.4
Le informazioni in questo articolo si applicano a:
  • Microsoft Win32 Application Programming Interface alle seguenti piattaforme
    • Microsoft Windows NT 4.0
    • the operating system: Microsoft Windows 2000
    • the operating system: Microsoft Windows XP
Chiavi: 
kbnosurvey kbarchive kbmt kbapi kbhowto kbkernbase kbthread KB182559 KbMtit
Traduzione automatica articoli
Il presente articolo č stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non č sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, pių o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non č la sua. Microsoft non č responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 182559
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

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