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は、この回答に示されている方法で取得されたオブジェクトです