2012-09-30 28 views
5

Tôi muốn làm điều gì đó với WMI (nhận một số thông báo sự kiện) vì vậy tôi bắt đầu với ví dụ đơn giản từ trang web MSDN:Không thể lấy tài sản đối tượng trong WMI (C++)

Receiving Event Notifications Through WMI

chương trình này nhận được một sự kiện thông báo (tạo quy trình) thông qua WMI và gọi hàm EventSink :: Cho biết khi nhận được sự kiện.

tôi đã sử dụng cùng mã trong liên kết ở trên (copy/quá khứ) với một sự thay đổi: trong EventSink lớp, hàm

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

tôi thêm vài dòng để lấy một tài sản của đối tượng (đối tượng được trả về trong apObjArray):

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

nay là Get (...) chức năng trả WBEM_E_NOT_FOUND (thuộc tính chỉ định không tìm thấy) không có vấn đề gì tôi tìm kiếm (chắc chắn từ tài liệu đi các thuộc tính đang có ...)

hãy cho tôi biết tôi đã bỏ lỡ điều gì?! bất kỳ trợ giúp nào được đánh giá cao.

Trả lời

10

Thuộc tính Name là một phần của đối tượng TargetInstance, vì vậy bạn phải nhận giá trị của đối tượng TargetInstance và sau đó truy xuất giá trị của thuộc tính Name.

Hãy thử mẫu này

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 !!! Tôi yêu bạn !!!!!!!!: D – Edward83

+0

nếu tôi đã đăng ký cho nhiều loại sự kiện, bạn có biết cách tìm loại trong cuộc gọi lại không? –

+0

@RRUZ: Bạn có thể giúp tôi ở đây không: http://stackoverflow.com/questions/28897897/c-monitor-process-creation-and-termination-in-windows/28921442 – Jackzz

Các vấn đề liên quan