Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无法在WMI(c+;+;)中检索对象属性_C++_Events_Notifications_Wmi - Fatal编程技术网

C++ 无法在WMI(c+;+;)中检索对象属性

C++ 无法在WMI(c+;+;)中检索对象属性,c++,events,notifications,wmi,C++,Events,Notifications,Wmi,我想用WMI做些事情(接收一些事件通知),所以我从MSDN网站的简单示例开始: 此程序通过WMI接收事件通知(进程创建),并在收到事件时调用函数EventSink::Indicate 我在上面的链接(复制/过去)中使用了相同的代码,但有一个更改: 在类EventSink中,函数 HRESULT EventSink::Indicate(long lObjectCount, IWbemClassObject **apObjArray) 我添加了几行来检索对象的属性(对象以apObjArray形式

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

此程序通过WMI接收事件通知(进程创建),并在收到事件时调用函数EventSink::Indicate

我在上面的链接(复制/过去)中使用了相同的代码,但有一个更改: 在类EventSink中,函数

HRESULT EventSink::Indicate(long lObjectCount, IWbemClassObject **apObjArray)
我添加了几行来检索对象的属性(对象以apObjArray形式返回):

for(int i=0;iGet(_bstr_t(L“Name”),
0,&varName,0,0);
//...
}
现在,Get(…)函数返回WBEM_E_NOT_FOUND(未找到指定的属性),无论我查找什么(从文档中可以确定属性在那里…)


请让我知道我错过了什么?!非常感谢您的帮助。

属性
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;
}
HRESULT EventSink::指示(长lObjectCount,
IWbemClassObject**apObjArray)
{
HRESULT hr=S_正常;
_变体vtProp;
for(int i=0;iGet(_bstr_t(L“TargetInstance”),0,&vtProp,0,0);
如果(!失败(hr))
{
IUnknown*str=vtProp;
hr=str->QueryInterface(IID_IWbemClassObject,reinterpret_cast(&apObjArray[i]);
如果(成功(hr))
{
_变体cn;
hr=apObjArray[i]->Get(L“Name”,0,&cn,NULL,NULL);
如果(成功(hr))
{
if((cn.vt==vt_NULL)| |(cn.vt==vt_EMPTY))

wcout上面的示例似乎存在内存泄漏

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

VariantClear(&vtProp);

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

如果我注册了多种类型的事件,您知道如何在回调中找到类型吗?@RRUZ:您能在这里帮助我吗:
VariantClear(&vtProp);