2012-09-30 17 views
5

chcę zrobić coś z WMI (odbieranie jakieś powiadomienie o zdarzeniu), więc zacznę prosty przykład z witryny MSDN:Nie można pobrać właściwości obiektu w WMI (C++)

Receiving Event Notifications Through WMI

ten program odbiera zdarzenie powiadomienie (tworzenie procesu) poprzez WMI i wywołuje funkcję EventSink :: Wskaż po otrzymaniu zdarzenia.

użyłem tego samego kodu w linku powyżej (kopii/przeszłości) z jedną zmianą: w EventSink klasy, funkcji

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

dodałem kilka wierszy do pobrania właściwości obiektu (obiekt jest zwracany w apObjArray):

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

teraz ... funkcje get() zwraca WBEM_E_NOT_FOUND (określony obiekt nie zostanie znaleziony) bez względu na to, czego szukam (jestem pewien, że z dokumentacji, że właściwości są tam ...)

proszę dać mi znać, co przegapiłem?! każda pomoc jest doceniana.

Odpowiedz

10

Właściwość jest częścią obiektu TargetInstance, więc należy pobrać wartość obiektu TargetInstance, a następnie pobrać wartość właściwości Name.

Spróbuj tej próbki

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

Brilliant !!! Kocham Cię !!!!!!!!: D – Edward83

+0

jeśli zarejestrowałem się na więcej niż jeden typ zdarzenia, czy wiesz, jak znaleźć typ w wywołaniu zwrotnym? –

+0

@RRUZ: Możesz mi pomóc tutaj: http://stackoverflow.com/questions/28897897/c-monitor-process-creation-and-termination-in-windows/28921442 – Jackzz

Powiązane problemy