Я хочу сделать что-то с WMI (получая некоторые уведомления о событиях), поэтому я начну с простого примера с веб-сайта MSDN:
Получение уведомлений о событиях через 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 (указанное свойство не найдено) независимо от того, что я ищу (я уверен из документации, что свойства есть …)
пожалуйста, дайте мне знать, что я пропустил ?! любая помощь приветствуется.
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;
}
Других решений пока нет …