【问题标题】:Failed to retrieve object property in WMI (c++)无法在 WMI (c++) 中检索对象属性
【发布时间】:2012-09-30 13:36:09
【问题描述】:

我想用 WMI 做一些事情(接收一些事件通知),所以我从 MSDN 网站上的简单示例开始:

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);
//...
    }

现在 Get(...) 函数返回 WBEM_E_NOT_FOUND(未找到指定的属性),无论我在寻找什么(从文档中确定属性在那里...)

请告诉我我错过了什么?!任何帮助表示赞赏。

【问题讨论】:

    标签: c++ events notifications wmi


    【解决方案1】:

    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;
    }
    

    【讨论】:

    【解决方案2】:

    上面的例子好像有内存泄漏。

    IUnknown* str = vtProp;
    

    此赋值使用 _variant_t 类的运算符 IUnknown*,它隐式调用对象上的 AddRef()。所以 str->Release() 需要在使用后调用,因为

    VariantClear(&vtProp);
    

    不足以减少对象的引用计数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-09
      • 2017-07-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多