エラー コードの取得

すべてのアプリケーションと同様に、WMI は Windows オペレーティング システムからエラー コードを受け取ります。

エラー コードが表示される場合は、次のオプションがあります。

  • イベント ログを確認します。

    WMI はイベント ログ サービスにエラー メッセージを送信し、エラーの原因の特定に役立つイベント ログを確認します。 イベント ログ プロバイダーがサポートするクラスを使用して、イベント ログにプログラムでアクセスできます。

  • エラー コードを通常どおりに取得します。

    WMI では、プロバイダーがエラー情報を提供する場合、C++ の場合は COM エラーコード、プロバイダーがエラー情報を提供している場合は Err オブジェクト (VBScript)SWbemLastError などのネイティブ エラー オブジェクトを取得する標準的な手法がサポートされています。

詳細については、「クラスとインスタンスの情報の操作」を参照してください。

このトピックでは次のセクションを扱います。

VBScript を使用したエラーの処理

WMI 用スクリプト API を介した WMI の呼び出しでエラーが発生した場合、次のオプションを使用してエラー情報にアクセスできます。

  • たとえば、VBScript では Err Object (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) のプロパティを次の表に示します。

プロパティ Contains
説明
ローカライズされた、人間が判読できるエラーの説明。
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 エラー コードの構造に準拠しています。 IWbemContextIWbemClassObject、および IWbemQualifierSet インターフェイスを除くすべての WMI インターフェイスは、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))
    {
    
    }