2013-06-07 5 views
1

я сделать запрос WMI SELECT * FROM __InstanceCreationEvent ТЕЧЕНИЕ 1 WHERE TargetInstance ISA '' Win32_ProcessWMI IWbemClassObject :: GetNames статус полной

hres = this->m_IWbemServicesComPtr->ExecNotificationQueryAsync(
    _bstr_t("WQL"), 
    _bstr_t(query.c_str()), 
    WBEM_FLAG_SEND_STATUS, 
    0, 
    this->m_IWbemObjectStubSinkComPtr.GetInterfacePtr()); 

И всегда хорошо, прежде чем я называю метод GetNames на экземпляр COM-объекта IWbemClassObject (получен в моей реализации метода IWbemObjectSink :: Показать). Когда я вызываю IWbemClassObject :: GetNames, некоторые механизмы WMI называет мой IWbemObjectSink :: SetStatus с флагом WBEM_STATUS_COMPLETE и ничего нового не происходит !!! Я не называю отмененные асинхронные методы.

Что я делаю неправильно? Как предотвратить остановку событий WMI? Как безопасно вызвать GetNames? После вызова IWbemClassObject :: GetNames Я хочу подписаться на новые события.

UDPATE: Как позвонить GetNames:

HRESULT EnumInstPropNameWMI(IN IWbemClassObject* piappObj, 
          OUT LPSAFEARRAY* ppsarProp ) 
{ 
    if (0 == ppsarProp || 0 == piappObj) 
     return E_INVALIDARG;  

    HRESULT hres; 
    hres = piappObj->GetNames( 0, 
         0,//WBEM_FLAG_ALWAYS | WBEM_FLAG_NONSYSTEM_ONLY, 
         0, 
         ppsarProp); 
    return hres; 
} 

piappObj является объектом, который был схвачен так, как показано in this answer

+0

Код, который вы публикуете, не заполнен. Можете ли вы показать, как вы вызываете функцию «GetNames»? – RRUZ

+0

@RRUZ конечно :) Я обновил свой вопрос. – Edward83

ответ

1

Это датированный вопрос, так что это может быть слишком поздно , но попробуйте позвонить следующим образом:

HRESULT hres; 
long unsigned result; 

hres = piappObj->GetNames( 
        WBEM_INFINITE, 
        1, 
        & piappObj, 
        & result);