2012-09-30 9 views
5

Ich mag etwas tun mit WMI (Empfangen einig Ereignisbenachrichtigung), damit ich beginne mit einfachem Beispiel aus MSDN-Website abgerufen werden:Fehler bei Objekteigenschaft in WMI (C++)

Receiving Event Notifications Through WMI

dieses Programm erhält ein Ereignis Benachrichtigung (Prozess-Erstellung) durch WMI und ruft die Funktion EventSink :: Indicate beim Empfang des Ereignisses auf.

verwenden ich den gleichen Code in dem obigen Link (Kopieren/Vergangenheit) mit Änderung: in der Klasse EventSink, die Funktion

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

ich einige Zeilen hinzugefügt, um eine Eigenschaft des Objekts abzurufen (die Objekt wird in apObjArray) zurückgegeben:

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

jetzt die Get (...) Funktion liefert WBEM_E_NOT_FOUND (die angegebene Eigenschaft nicht gefunden), egal, was ich suche (ist sicher, von der Dokumentation, die die Eigenschaften sind ...)

Bitte lassen Sie mich wissen, was habe ich verpasst?! jede Hilfe wird geschätzt.

Antwort

10

Die Name-Eigenschaft ist Teil des Objekts TargetInstance, daher müssen Sie den Wert des TargetInstance-Objekts abrufen und dann den Wert der Name-Eigenschaft abrufen.

Versuchen Sie, diese Probe

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 !!! Ich liebe dich !!!!!!!!: D – Edward83

+0

Wenn ich mich für mehr als eine Art von Veranstaltung registriert habe, weißt du, wie man den Typ im Callback findet? –

+0

@RRUZ: Kannst du mir hier helfen: http://StackOverflow.com/Questions/28897897/c-monitor-Process-Creation-and-termination-in-windows/28921442 – Jackzz