Hämtar en felkod
Precis som med alla program får WMI felkoder från Windows-operativsystemet.
När du får en felkod har du följande alternativ:
Titta på händelseloggen.
WMI skickar felmeddelanden till händelseloggtjänsten som kontrollerar händelseloggarna för att fastställa orsaken till ett fel. Du kan använda de klasser som händelseloggen-providern stöder för att komma åt händelseloggar programmatiskt.
Hämta felkoden normalt.
WMI stöder standardtekniker för att hämta felkoder, som är COM-felkoder för C++, och interna felobjekt, till exempel Felobjekt (VBScript)eller SWbemLastError om providern tillhandahåller felinformation.
Mer information finns i Manipulera klass- och instansinformation.
Följande avsnitt beskrivs i det här avsnittet:
Hantera ett fel med VBScript
Om ett anrop till WMI via skript-API:et för WMI orsakar ett fel har du följande alternativ för att komma åt felinformationen:
- Använd interna felmekanismer för skriptspråket, till exempel i VBScript, använd Err Object (VBScript) för att stödja felhantering.
- Skapa ett SWbemLastError- objekt för att hämta en felrapport.
Följande skript visar användningen av det interna Err-objektet (VBScript). När ett felaktigt värde för processhandtaget anges genereras ett fel.
On Error Resume Next
Set objProcess = GetObject( _
"winmgmts:root\cimv2:Win32_Process.Handle='one'")
Wscript.Echo Err.Number
Not
Egenskapen Description för Err Object (VBScript) är tom när du ansluter till WMI via monikern "winmgmts:". Men om du ansluter med SWbemLocatorär beskrivningen tillgänglig.
I följande tabell visas egenskaperna för Err Object (VBScript).
Egenskap | Innehåller |
---|---|
Beskrivning |
Lokaliserad, läsbar beskrivning av felet. |
Nummer |
HRESULT- som returneras av skript-API:et för WMI. |
Källa |
Identifierar det objekt som aktiverade felet. |
Följande skript visar användning av ett SWbemLastError- objekt för att få detaljerad felinformation. Observera att inte alla leverantörer tillhandahåller information till SWbemLastError. Mer information om felkoder i skript finns i 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
Hantera ett fel med hjälp av C++
Ett WMI-klientprogram kan ta emot antingen COM-specifika eller WMI-specifika fel. COM-felen överensstämmer med strukturen för COM-felkoder. Alla WMI-gränssnitt kan returnera ett COM-specifikt fel förutom IWbemContext, IWbemClassObjectoch IWbemQualifierSet-gränssnitt. Mer information om COM-felkoder finns i Felhantering. Referenssidorna i WMI-gränssnitten visar lämpliga WMI-felkoder i avsnittet Felkoder.
Ett klientprogram måste följa COM-standarderna för att kontrollera status och felreturkoder. Den största skillnaden du måste välja är om du vill hämta felkoden från ett synkront, semisynkront eller asynkront anrop.
Om du vill komma åt synkrona och semisynkrona felmeddelanden med C++
Hämta felinformationen med ett anrop till funktionen GetErrorInfo COM.
Se till att anropa GetErrorInfo omedelbart efter att en gränssnittsmetod anger ett fel. Detta inkluderar någon av de IWbemCallResult metoder som du anropar när du bearbetar en semisynkron process.
Granska det returnerade COM-felobjektet med ett anrop till metoden IErrorInterface::QueryInterface.
Ange IID_WbemClassObject för parametern riid i QueryInterface-anropet. Metoden QueryInterface returnerar en instans av en WMI-klass, vanligtvis __ExtendedStatus.
WMI levererar inte felobjektet via GetErrorInfo- för ett asynkront anrop eftersom det inte finns något sätt att veta när eller på vilken tråd det asynkrona anropet inträffade. Därför kan koden bara hantera specifika fel eller skicka anropsfelet via COM.
Not
Eftersom återanropet till mottagaren kanske inte returneras på samma autentiseringsnivå som klienten kräver rekommenderar vi att du använder semisynkron i stället för asynkron kommunikation. Mer information finns i Anropa en metod.
Om du vill komma åt asynkrona felmeddelanden med C++
Hämta COM-felobjektet från implementeringen av IWbemObjectSink::SetStatus.
Följande pseudokod visar en typisk implementering av felhantering för ett klientprogram.
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)) { }