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 (メソッドIWbemObjectSink::Indicateの実装内で取得) のインスタンスでメソッドGetNamesを呼び出す前に、常に問題ありません。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 に答える