检索错误代码

与所有应用程序一样,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) 的属性。

属性 Contains
描述
已本地化的用户可读错误说明。
数字
适用于 WMI 的脚本 API 返回的 HRESULT。
Source
标识引发错误的对象。

以下脚本演示如何使用 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 错误代码的结构。 除 IWbemContextIWbemClassObjectIWbemQualifierSet 接口外,其他所有 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))
    {
    
    }