1

我进行 WMI 查询SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'

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

在我对 COM 对象IWbemClassObject的实例调用方法GetNames之前总是可以的(在我的方法IWbemObjectSink::Indicate的实现中检索)。当我调用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是通过此答案中显示的方式抓取的对象

4

1 回答 1

1

这是一个过时的问题,所以可能为时已晚,但尝试像这样拨打电话:

HRESULT hres;
long unsigned result;

hres = piappObj->GetNames(   
                     WBEM_INFINITE,
                     1,
                     & piappObj,
                     & result);
于 2015-08-05T21:00:32.030 回答