C++ 无法在WMI(c+;+;)中检索对象属性
我想用WMI做些事情(接收一些事件通知),所以我从MSDN网站的简单示例开始: 此程序通过WMI接收事件通知(进程创建),并在收到事件时调用函数EventSink::Indicate 我在上面的链接(复制/过去)中使用了相同的代码,但有一个更改: 在类EventSink中,函数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形式
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);