2012-09-30 56 views
5

我想做與WMI的東西(接收一些事件通知)來檢索對象的屬性,所以我開始了從MSDN網站簡單的例子:失敗的WMI(C++)

Receiving Event Notifications Through WMI

這個節目接收事件通過WMI通知(進程創建),並在接收到事件時調用函數EventSink :: Indicate。

我以前在上述(複製/過去)的鏈接相同的代碼與一個變化: 在類EventSink的,功能

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

我添加幾行檢索的對象的屬性(在對象是在apObjArray返回):

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

現在獲取(...)函數返回WBEM_E_NOT_FOUND(指定的屬性未找到),不管是什麼我找(我從該屬性的文件肯定有...)

請讓我知道我錯過了什麼?!任何幫助表示讚賞。

回答

10

Name屬性是TargetInstance對象的一部分,因此您必須獲取TargetInstance對象的值,然後檢索Name屬性的值。

試試這個樣本

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

輝煌!!!我愛你!!!!!!!!:D – Edward83

+0

如果我註冊了多個類型的事件,你知道如何找出回調中的類型嗎? –

+0

@RRUZ:你能幫助我嗎:http://stackoverflow.com/questions/28897897/c-monitor-process-creation-and-termination-in-windows/28921442 – Jackzz