Recuperación de un código de error

Al igual que con todas las aplicaciones, WMI recibe códigos de error del sistema operativo Windows.

Cuando recibe un código de error, tiene estas opciones:

  • Examinar el registro de eventos.

    WMI envía mensajes de error al servicio Registro de eventos que comprueba los registros de eventos para ayudar a determinar la causa de un error. Puede usar las clases que admite el proveedor de Registro de eventos para acceder a los registros de eventos mediante programación.

  • Recuperar el código de error normalmente.

    WMI admite las técnicas estándar para recuperar códigos de error, que son códigos de error COM para C++, y objetos de error nativos, como Err Object (VBScript) o SWbemLastError si el proveedor proporciona información de error.

Para obtener más información, vea Manipulación de información de clase e instancia.

En este tema se describen las secciones siguientes:

Control de un error con VBScript

Si una llamada a WMI mediante la API de scripting para WMI produce un error, tiene estas opciones para acceder a la información de error:

  • Usar mecanismos de error nativos del lenguaje de scripting, por ejemplo, usar Err Object (VBScript) en VBScript para admitir el control de errores.
  • Crear un objeto SWbemLastError para obtener un informe de errores.

En el script siguiente se muestra el uso de Err Object (VBScript) nativo. Cuando se proporciona un valor incorrecto para el identificador de proceso, se genera un error.

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

Nota

La propiedad Descripción de Err Object (VBScript) está vacía al conectarse a WMI mediante el moniker "winmgmts:". Pero si se conecta mediante SWbemLocator, la descripción está disponible.

En esta tabla se enumeran las propiedades de Err Object (VBScript).

Propiedad Contains
Descripción
Una descripción legible y localizada del error.
Number
HRESULT devuelto por la API de scripting para WMI.
Origen
Identifica el objeto que provocó el error.

En el script siguiente se muestra el uso de un objeto SWbemLastError para obtener información detallada sobre errores. Tenga en cuenta que no todos los proveedores proporcionan información a SWbemLastError. Para obtener más información sobre los códigos de error en el script, vea 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

Control de un error con C++

Una aplicación cliente WMI puede recibir errores específicos de COM o específicos de WMI. Los errores COM cumplen con la estructura de códigos de error COM. Todas las interfaces WMI pueden devolver un error específico de COM excepto las interfaces IWbemContext, IWbemClassObject e IWbemQualifierSet. Para obtener más información sobre los códigos de error COM, vea Control de errores. Las páginas de referencia de las interfaces WMI enumeran los códigos de error WMI adecuados en la sección Códigos de error.

Una aplicación cliente debe seguir los estándares COM para comprobar el estado y los códigos de retorno de errores. La diferencia principal que debe elegir es si quiere recuperar el código de error de una llamada sincrónica, semisincrónica o asincrónica.

Procedimientos para acceder a mensajes de error sincrónicos y semisincrónicos mediante C++

  1. Recupere la información de error con una llamada a la función COM GetErrorInfo.

    Asegúrese de llamar a GetErrorInfo inmediatamente después de que un método de interfaz indique un error. Esto incluye cualquiera de los métodos IWbemCallResult a los que llama mientras procesa un proceso semisincrónico.

  2. Examine el objeto de error COM devuelto con una llamada al método IErrorInterface::QueryInterface.

    Asegúrese de especificar IID_WbemClassObject para el parámetro riid en la llamada a QueryInterface. El método QueryInterface devuelve una instancia de una clase WMI, normalmente __ExtendedStatus.

WMI no entrega el objeto de error mediante GetErrorInfo para una llamada asincrónica porque no hay ninguna manera de saber cuándo o en qué subproceso se produjo la llamada. Por lo tanto, el código solo puede controlar errores específicos o pasar el error de llamada por COM.

Nota

Dado que es posible que la devolución de llamada al receptor no se devuelva en el mismo nivel de autenticación que requiere el cliente, se recomienda usar la comunicación semisincrónica, en lugar de la asincrónica. Para obtener más información, vea Llamada a un método.

Procedimientos para acceder a mensajes de error asincrónicos mediante C++

  • Recupere el objeto de error COM de la implementación de IWbemObjectSink::SetStatus.

    Este pseudocódigo muestra una implementación típica de control de errores para una aplicación cliente.

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