Udostępnij przez


Pobieranie kodu błędu

Podobnie jak we wszystkich aplikacjach usługa WMI odbiera kody błędów z systemu operacyjnego Windows.

Po otrzymaniu kodu błędu dostępne są następujące opcje:

  • Przyjrzyj się dziennikowi zdarzeń.

    Usługa WMI wysyła komunikaty o błędach do usługi dziennika zdarzeń, która sprawdza dzienniki zdarzeń, aby ułatwić określenie przyczyny błędu. Można użyć klas, które dostawca dziennika zdarzeń obsługuje programowo, aby uzyskać dostęp do dzienników zdarzeń.

  • Pobierz kod błędu w zwykły sposób.

    Usługa WMI obsługuje standardowe techniki pobierania kodów błędów, które są kodami błędów COM dla języka C++, oraz obiektów błędów natywnych, takich jak Err Object (VBScript)lub SWbemLastError, jeśli dostawca dostarcza informacje o błędzie.

Aby uzyskać więcej informacji, zobacz Manipulowanie klasą i informacjami o wystąpieniu.

W tym temacie omówiono następujące sekcje:

Obsługa błędu w języku VBScript

Jeśli wywołanie usługi WMI za pośrednictwem interfejsu API obsługi skryptów dla usługi WMI powoduje błąd, masz następujące opcje dostępu do informacji o błędzie:

  • Użyj natywnych mechanizmów błędów języka skryptów, na przykład w języku VBScript użyj Err Object (VBScript) do obsługi błędów.
  • Utwórz obiekt SWbemLastError, aby uzyskać raport o błędach.

Poniższy skrypt przedstawia użycie natywnego Err Object (VBScript). Gdy zostanie podana nieprawidłowa wartość uchwytu procesu, zostanie wygenerowany błąd.

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

Notatka

Właściwość Description obiektu Err Object (VBScript) jest pusta podczas nawiązywania połączenia z usługą WMI za pośrednictwem nazwy "winmgmts:". Jeśli jednak nawiążesz połączenie przy użyciu SWbemLocator, opis jest dostępny.

W poniższej tabeli wymieniono właściwości Err Object (VBScript).

Własność Zawiera
opis
Zlokalizowany, czytelny dla człowieka opis błędu.
liczba
HRESULT zwrócone przez interfejs API skryptów dla usługi WMI.
źródło
Identyfikuje obiekt, który zgłosił błąd.

Poniższy skrypt przedstawia użycie obiektu SWbemLastError w celu uzyskania szczegółowych informacji o błędzie. Warto zauważyć, że nie wszyscy dostawcy dostarczają informacje do SWbemLastError. Aby uzyskać więcej informacji na temat kodów błędów skryptu, zobacz 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

Obsługa błędu przy użyciu języka C++

Aplikacja kliencka usługi WMI może odbierać błędy specyficzne dla modelu COM lub specyficzne dla usługi WMI. Błędy COM są zgodne ze strukturą kodów błędów COM. Wszystkie interfejsy WMI mogą zwracać błąd specyficzny dla modelu COM, z wyjątkiem interfejsów IWbemContext, IWbemClassObjectoraz IWbemQualifierSet. Aby uzyskać więcej informacji na temat kodów błędów COM, zobacz Obsługa błędów. Strony referencyjne interfejsów usługi WMI zawierają listę odpowiednich kodów błędów usługi WMI w sekcji Kody błędów.

Aplikacja kliencka musi przestrzegać standardów COM dotyczących sprawdzania stanu i kodów zwracanych błędów. Główną różnicą, którą należy wybrać, jest to, czy chcesz pobrać kod błędu z wywołania synchronicznego, półsynchronicznego lub asynchronicznego.

Aby uzyskać dostęp do synchronicznych i semisynchronicznych komunikatów o błędach przy użyciu języka C++

  1. Pobierz informacje o błędzie z wywołaniem funkcji GetErrorInfo COM.

    Pamiętaj, aby wywołać GetErrorInfo natychmiast po wystąpieniu błędu metody interfejsu. Obejmuje to dowolną z metod IWbemCallResult wywoływanych podczas przetwarzania procesu semisynchronicznego.

  2. Sprawdź zwrócony obiekt błędu COM za pomocą wywołania metody IErrorInterface::QueryInterface.

    Upewnij się, że określono IID_WbemClassObject parametru w wywołaniu QueryInterface. Metoda QueryInterface zwraca wystąpienie klasy WMI, zazwyczaj __ExtendedStatus.

Usługa WMI nie dostarcza obiektu błędu za pośrednictwem GetErrorInfo dla wywołania asynchronicznego, ponieważ nie ma możliwości określenia, kiedy ani na którym wątku wystąpiło wywołanie asynchroniczne. W związku z tym twój kod może obsługiwać tylko określone błędy lub przekazać niepowodzenie wywołania za pośrednictwem COM.

Notatka

Ponieważ wywołanie zwrotne do ujścia może nie być zwracane na tym samym poziomie uwierzytelniania, co wymaga klienta, zaleca się użycie komunikacji semisynchronicznej zamiast komunikacji asynchronicznej. Aby uzyskać więcej informacji, zobacz Wywoływanie metody.

Aby uzyskać dostęp do komunikatów o błędach asynchronicznych przy użyciu języka C++

  • Pobierz obiekt błędu COM z implementacji IWbemObjectSink::SetStatus.

    Poniższy pseudokod przedstawia typową implementację obsługi błędów dla aplikacji klienckiej.

    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))
    {
    
    }