Condividi tramite


Recupero di un codice di errore

Come per tutte le applicazioni, WMI riceve codici di errore dal sistema operativo Windows.

Quando viene visualizzato un codice di errore, sono disponibili le opzioni seguenti:

  • Esaminare il registro eventi.

    WMI invia messaggi di errore al servizio Registro eventi che controlla i registri eventi per determinare la causa di un errore. È possibile usare le classi supportate dal provider di registro eventi per accedere ai registri eventi a livello di codice.

  • Recuperare il codice di errore normalmente.

    WMI supporta le tecniche standard per recuperare i codici di errore, ovvero codici di errore COM per C++, e gli oggetti errore nativi, ad esempio Err Object (VBScript)o SWbemLastError se il provider fornisce informazioni sull'errore.

Per ulteriori informazioni, vedere Manipolazione delle informazioni su classi e istanze.

Le sezioni seguenti sono descritte in questo argomento:

Gestione di un errore con VBScript

Se una chiamata a WMI tramite l'API di scripting per WMI genera un errore, sono disponibili le opzioni seguenti per accedere alle informazioni sull'errore:

  • Usare meccanismi di errore nativi del linguaggio di scripting, ad esempio, in VBScript usare Err Object (VBScript) per supportare la gestione degli errori.
  • Creare un oggettoSWbemLastErrorper ottenere una segnalazione errori.

Lo script seguente illustra l'uso dell'oggetto Err Object (VBScript) nativo . Quando viene specificato un valore non corretto per l'handle di processo, viene generato un errore.

On Error Resume Next
Set objProcess = GetObject( _
    "winmgmts:root\cimv2:Win32_Process.Handle='one'")
Wscript.Echo Err.Number

Nota

La proprietà Description di Err Object (VBScript) è vuota quando ci si connette a WMI tramite il moniker "winmgmts:". Tuttavia, se ci si connette usando SWbemLocator, la descrizione è disponibile.

Nella tabella seguente sono elencate le proprietà di Err Object (VBScript).

Proprietà Contiene
Descrizione
Descrizione localizzata e leggibile dell'errore.
numero
HRESULT restituito dall'API di scripting per la WMI.
Origine
Identifica l'oggetto che ha generato l'errore.

Lo script seguente illustra l'uso di un oggetto SWbemLastError per ottenere informazioni dettagliate sull'errore. Si noti che non tutti i provider forniscono informazioni per SWbemLastError. Per altre informazioni sui codici di errore nello script, vedere WbemErrorEnum.

On Error Resume Next
Set obj = GetObject("winmgmts:root\cimv2:Win32_Process.Handle='one'")
Set LastError = createobject("wbemscripting.swbemlasterror")
Wscript.Echo "Operation = " & LastError.operation & VBCRLF & "ParameterInfo = " _
            & LastError.ParameterInfo & VBCRLF & "ProviderName = " & LastError.ProviderName

Gestione di un errore con C++

Un'applicazione client WMI può ricevere errori specifici di COM o WMI. Gli errori COM sono conformi alla struttura dei codici di errore COM. Tutte le interfacce WMI possono restituire un errore specifico di COM, ad eccezione del IWbemContext, IWbemClassObjecte interfacce IWbemQualifierSet. Per altre informazioni sui codici di errore COM, vedere gestione degli errori. Le pagine di riferimento delle interfacce WMI elencano i codici di errore WMI appropriati nella sezione Codici di errore.

Un'applicazione client deve rispettare gli standard COM per controllare lo stato e i codici di errore. La differenza principale che è necessario scegliere è se si desidera recuperare il codice di errore da una chiamata sincrona, semisynchrono o asincrona.

Per accedere ai messaggi di errore sincroni e semiincroni con C++

  1. Recuperare le informazioni sull'errore con una chiamata alla funzione GetErrorInfo COM.

    Assicurarsi di chiamare GetErrorInfo immediatamente dopo che un metodo di interfaccia indica un errore. Sono inclusi qualsiasi dei metodi IWbemCallResult chiamato durante l'elaborazione di un processo semisincorno.

  2. Esaminare l'oggetto errore COM restituito con una chiamata al metodo IErrorInterface::QueryInterface.

    Assicurati di specificare IID_WbemClassObject per il parametro riid nella chiamata QueryInterface. Il metodo QueryInterface restituisce un'istanza di una classe WMI, in genere __ExtendedStatus.

WMI non recapita l'oggetto errore tramite GetErrorInfo per una chiamata asincrona perché non è possibile sapere quando o su quale thread si è verificata la chiamata asincrona. Pertanto, il codice può gestire solo errori specifici o passare l'errore di chiamata tramite COM.

Nota

Poiché il callback al sink potrebbe non essere restituito allo stesso livello di autenticazione richiesto dal client, è consigliabile usare la comunicazione semisincrona anziché la comunicazione asincrona. Per altre informazioni, vedere Chiamare un metodo.

Per accedere ai messaggi di errore asincroni tramite C++

  • Recuperare l'oggetto errore COM dall'implementazione di IWbemObjectSink::SetStatus.

    Lo pseudocodice seguente illustra un'implementazione tipica della gestione degli errori per un'applicazione client.

    HRESULT hRes = SomeMethod;
    
    // Check for specific error and status codes.
    if (hRes == WBEM_E_NOT_FOUND)
    {
    // Processing to handle specific error code
    }
    else if hRes == WBEM_S_DUPLICATE_OBJECTS
    {
    // All other cases, including errors specific to COM
    }
    else if (FAILED(hRes))
    {
    
    }