events — Не удалось получить свойство объекта в WMI (c ++)

Я хочу сделать что-то с 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 (указанное свойство не найдено) независимо от того, что я ищу (я уверен из документации, что свойства есть …)

пожалуйста, дайте мне знать, что я пропустил ?! любая помощь приветствуется.

5

Решение

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]