오류 코드 검색

모든 애플리케이션과 마찬가지로 WMI는 Windows 운영 체제에서 오류 코드를 받습니다.

오류 코드가 표시되면 다음과 같은 옵션을 선택할 수 있습니다.

  • 이벤트 로그를 확인합니다.

    WMI는 오류의 원인을 확인하는 데 도움이 될만한 이벤트 로그를 확인하는 이벤트 로그 서비스로 오류 메시지를 보냅니다. 이벤트 로그 공급자가 지원하는 클래스를 사용하여 프로그래밍 방식으로 이벤트 로그에 액세스할 수 있습니다.

  • 오류 코드를 정상적으로 검색합니다.

    WMI는 C++에 대한 COM 오류 코드를 검색하고 공급자가 오류 정보를 제공하는 경우 Err 개체(VBScript) 또는 SWbemLastError와 같은 원시 오류 개체를 검색하기 위해 표준 기술을 지원합니다.

자세한 내용은 클래스 및 인스턴스 정보 조작을 참조하세요.

이 항목에서 다루는 섹션은 다음과 같습니다.

VBScript를 사용하여 오류 처리

WMI용 스크립팅 API를 통해 WMI를 호출하여 오류가 발생하는 경우 오류 정보에 액세스하기 위해 선택할 수 있는 옵션은 다음과 같습니다.

  • 예를 들어 VBScript에서는 Err 개체(VBScript)를 사용하여 오류 처리를 지원하는 등 스크립팅 언어의 원시 오류 메커니즘을 사용합니다.
  • SWbemLastError 개체를 만들어 오류 보고서를 가져옵니다.

다음 스크립트는 원시 Err 개체(VBScript)의 사용을 보여줍니다. 프로세스 핸들에 잘못된 값이 지정되면 오류가 발생합니다.

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

참고

‘winmgmts:’ 모니커를 통해 WMI에 연결할 때 Err 개체(VBScript)Description 속성이 비어 있습니다. 그러나 SWbemLocator를 사용하여 연결하면 설명을 사용할 수 있습니다.

다음 표에서는 Err 개체(VBScript)의 속성을 보여줍니다.

속성 포함
설명
사람이 읽을 수 있는 지역화된 오류 설명입니다.
Number
WMI용 스크립팅 API에서 반환된 HRESULT입니다.
원본
오류를 발생시킨 개체를 식별합니다.

다음 스크립트는 SWbemLastError 개체를 사용하여 자세한 오류 정보를 가져오는 방법을 보여줍니다. 모든 공급자가 SWbemLastError에 정보를 제공하는 것은 아닙니다. 스크립트의 오류 코드에 관한 자세한 내용은 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

C++를 사용하여 오류 처리

WMI 클라이언트 애플리케이션은 COM 관련 오류 또는 WMI 관련 오류를 수신할 수 있습니다. COM 오류는 COM 오류 코드의 구조를 따릅니다. 모든 WMI 인터페이스는 IWbemContext, IWbemClassObjectIWbemQualifierSet 인터페이스를 제외한 COM 관련 오류를 반환할 수 있습니다. COM 오류 코드에 관한 자세한 내용은 오류 처리를 참조하세요. WMI 인터페이스의 참조 페이지에는 오류 코드 섹션의 적절한 WMI 오류 코드가 나열됩니다.

클라이언트 애플리케이션은 상태 및 오류 반환 코드를 확인하기 위해 COM 표준을 따라야 합니다. 선택해야 하는 주요 차이점은 동기, 반동기 또는 비동기 호출에서 오류 코드를 검색할지 여부입니다.

C++를 사용하여 동기 및 반동기 오류 메시지에 액세스하려면

  1. GetErrorInfo COM 함수를 호출하여 오류 정보를 검색합니다.

    인터페이스 메서드가 오류를 표시한 직후 GetErrorInfo를 호출해야 합니다. 여기에는 반동기 프로세스를 처리하는 동안 호출하는 IWbemCallResult 메서드가 포함됩니다.

  2. IErrorInterface::QueryInterface 메서드를 호출하여 반환된 COM 오류 개체를 검사합니다.

    QueryInterface 호출에서 riid 매개 변수에 대한 IID_WbemClassObject를 지정해야 합니다. QueryInterface 메서드는 WMI 클래스의 인스턴스(일반적으로 __ExtendedStatus)를 반환합니다.

비동기 호출이 발생한 시기 또는 스레드를 알 수 있는 방법이 없으므로 WMI는 비동기 호출을 위해 GetErrorInfo를 통해 오류 개체를 제공하지 않습니다. 따라서 코드는 특정 오류만 처리하거나 COM을 통해 호출 실패를 전달할 수 있습니다.

참고

싱크에 대한 콜백은 클라이언트에서 요구하는 것과 동일한 인증 수준으로 반환되지 않을 수 있으므로 비동기 통신 대신 반동기를 사용하는 것이 좋습니다. 자세한 내용은 메서드 호출을 참조하세요.

C++를 사용하여 비동기 오류 메시지에 액세스하려면

  • IWbemObjectSink::SetStatus의 구현에서 COM 오류 개체를 검색합니다.

    다음 의사 코드는 클라이언트 애플리케이션에 대한 일반적인 오류 처리 구현을 보여줍니다.

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