aim*_*n09 5 c++ wmi events notifications
我想用WMI做一些事情(接收一些事件通知)所以我从MSDN网站的简单示例开始:
该程序通过WMI接收事件通知(进程创建),并在收到事件时调用函数EventSink :: Indicate.
我在上面的链接(复制/过去)中使用了相同的代码,只有一个更改:在类EventSink中,函数
HRESULT EventSink::Indicate(long lObjectCount, IWbemClassObject **apObjArray)
Run Code Online (Sandbox Code Playgroud)
我添加了几行来检索对象的属性(该对象在apObjArray中返回):
for (int i = 0; i < lObjectCount; i++)
{
VARIANT varName;
hres = apObjArray[i]->Get(_bstr_t(L"Name"),
0, &varName, 0, 0);
//...
}
Run Code Online (Sandbox Code Playgroud)
现在Get(...)函数返回WBEM_E_NOT_FOUND(找不到指定的属性),无论我寻找什么(从文档中确定属性存在...)
请让我知道我错过了什么?!任何帮助表示赞赏.
RRU*_*RUZ 11
该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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1523 次 |
| 最近记录: |