WMI IWbemClassObject :: GetNames状态已完成

时间:2013-06-07 11:42:47

标签: visual-c++ wmi wmi-service

我进行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机制使用标志 WBEM_STATUS_COMPLETE 调用我的IWbemObjectSink :: SetStatus,并且没有任何新事件发生!我没有调用任何取消异步方法。

我做错了什么?如何防止停止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显示的方式抓取的对象

1 个答案:

答案 0 :(得分:1)

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

HRESULT hres;
long unsigned result;

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