Recupero di un codice di errore

Come per tutte le applicazioni, WMI riceve i 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 del registro eventi per accedere ai registri eventi a livello di codice.

  • Recuperare normalmente il codice di errore.

    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 sugli errori.

Per altre informazioni, vedere Modifica delle informazioni sulla classe e sull'istanza.

In questo argomento vengono illustrate le sezioni seguenti:

Gestione di un errore con VBScript

Se una chiamata a WMI tramite l'API di scripting per WMI causa 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 oggetto SWbemLastError per ottenere una segnalazione errori.

Lo script seguente illustra l'uso dell'oggetto Err nativo (VBScript). Quando viene specificato un valore non corretto per l'handle del 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.
Number
HRESULT restituito dall'API di scripting per 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 a 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 specifici di 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 delle interfacce IWbemContext, IWbemClassObject e 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 restituiti 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 semisynchrono con C++

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

    Assicurarsi di chiamare GetErrorInfo immediatamente dopo che un metodo di interfaccia indica un errore. Sono inclusi tutti i metodi IWbemCallResult chiamati durante l'elaborazione di un processo semisynchronous.

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

    Assicurarsi 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 semiincrona anziché la comunicazione asincrona. Per altre informazioni, vedere Chiamata di un metodo.

Per accedere ai messaggi di errore asincroni con C++

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

    Lo pseudocodice seguente illustra un'implementazione tipica di 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))
    {
    
    }