2012-09-30 15 views
5

Quiero hacer algo con WMI (recibir alguna notificación de eventos), así que empezar con sencillo ejemplo desde el sitio web de MSDN:No se ha podido recuperar la propiedad del objeto en WMI (C++)

Receiving Event Notifications Through WMI

este programa recibe un evento notificación (creación de proceso) a través de WMI, y llama a la función EventSink :: Indicate al recibir el evento.

que utilizan el mismo código en el enlace de arriba (copiar/pasado) con un cambio: en el EventSink clase, la función

HRESULT EventSink::Indicate(long lObjectCount, IWbemClassObject **apObjArray) 

añadí unas líneas para recuperar una propiedad del objeto (el objeto se devuelve en apObjArray):

for (int i = 0; i < lObjectCount; i++) 
    { 
     VARIANT varName; 
     hres = apObjArray[i]->Get(_bstr_t(L"Name"), 
      0, &varName, 0, 0); 
//... 
    } 

ahora los (...) las funciones get devuelve WBEM_E_NOT_FOUND (la propiedad especificada no se encuentra) no importa lo que busco (estoy seguro de la documentación que las propiedades están ahí ...)

por favor, hágamelo saber lo que me he perdido?! cualquier ayuda es apreciada

Respuesta

10

La propiedad Name es parte del objeto TargetInstance, por lo que debe obtener el valor del objeto TargetInstance y luego recuperar el valor de la propiedad Name.

Pruebe esta muestra

HRESULT EventSink::Indicate(long lObjectCount, 
    IWbemClassObject **apObjArray) 
{ 
    HRESULT hr = S_OK; 
    _variant_t vtProp; 

    for (int i = 0; i < lObjectCount; i++) 
    { 

    hr = apObjArray[i]->Get(_bstr_t(L"TargetInstance"), 0, &vtProp, 0, 0); 
    if (!FAILED(hr)) 
    { 
     IUnknown* str = vtProp; 
     hr = str->QueryInterface(IID_IWbemClassObject, reinterpret_cast< void** >(&apObjArray[i])); 
     if (SUCCEEDED(hr)) 
     { 
      _variant_t cn; 
     hr = apObjArray[i]->Get(L"Name", 0, &cn, NULL, NULL); 
      if (SUCCEEDED(hr)) 
      { 
      if ((cn.vt==VT_NULL) || (cn.vt==VT_EMPTY)) 
      wcout << "Name : " << ((cn.vt==VT_NULL) ? "NULL" : "EMPTY") << endl; 
      else 
      wcout << "Name : " << cn.bstrVal << endl; 
      } 
      VariantClear(&cn); 


     } 
    } 
    VariantClear(&vtProp); 

    } 

    return WBEM_S_NO_ERROR; 
} 
+1

Brillante !!! ¡¡Te amo !!!!!!!!: D – Edward83

+0

si me he registrado para más de un tipo de evento, ¿sabes cómo encontrar el tipo en la devolución de llamada? –

+0

@RRUZ: ¿Pueden ayudarme aquí ?: http://stackoverflow.com/questions/28897897/c-monitor-process-creation-and-termination-in-windows/28921442 – Jackzz

Cuestiones relacionadas