Realización de llamadas a WMI

Los proveedores pueden llamar a los métodos implementados por WMI desde sus implementaciones de los métodos. Sin embargo, es preciso realizar varias consideraciones especiales cuando un proveedor llama a la implementación de WMI de un método IWbemServices desde su propia implementación del mismo método. Estas consideraciones son importantes independientemente de si el proveedor llama a la versión sincrónica o asincrónica del método.

Cada método IWbemServices que un proveedor puede implementar tiene un parámetro pCtx, un puntero a una implementación de la interfaz de IWbemContext. Cuando WMI llama al proveedor, pasa un puntero válido en este parámetro. Un proveedor siempre debe pasar este mismo puntero en todas las llamadas a WMI que realice durante las solicitudes de mantenimiento. Si no se establece pCtx correctamente, WMI puede iniciar un bucle infinito.

En el siguiente código de ejemplo se muestra la manera correcta de llamar a la implementación WMI de GetObject desde una implementación de GetObjectAsync.

STDMETHODIMP CClassProv::GetObjectAsync (BSTR ObjectPath,
    long lFlags, IWbemContext *pCtx,
    IWbemObjectSink *pHandler)
{
  IWbemClassObject *pclObj = NULL;
  IWbemServices* m_pNamespace;
  HRESULT hr = m_pNamespace->GetObject(
      _bstr_t(L"AClass"), 0, pCtx, &pclObj, 
      NULL );
  pclObj->Release();
  return pHandler->SetStatus(0, hr, NULL, NULL);
}

El ejemplo de código en C++ de este tema requiere las siguientes referencias e instrucciones #include para compilarse correctamente.

#define _WIN32_DCOM
#include <iostream>
using namespace std;
#include <comdef.h>
#include <Wbemidl.h>
#pragma comment(lib, "wbemuuid.lib")

Los proveedores de instancias, clases y propiedades no deben emitir ninguna llamada a WMI que solicite la modificación de los datos mientras atienden una solicitud de lectura. La excepción a esta regla son los proveedores de inserción. Un proveedor de inserción es un proveedor de clases que almacena datos en el repositorio de WMI y usa WMI para controlar las solicitudes de los clientes. Mientras atiene una solicitud de lectura, un proveedor de inserción puede actualizar el repositorio de WMI, pero debe establecer el parámetro lFlags en WBEM_FLAG_OWNER_UPDATE en la llamada A IWbemServices adecuada.

Los proveedores de eventos no deben realizar ningún cambio de clase mientras se realiza una llamada. Tampoco pueden emitir llamadas relacionadas con eventos, como modificar un filtro de eventos.

Desarrollo de un proveedor WMI

Establecer descriptores de seguridad del espacio de nombres

Protección del proveedor