Wykonywanie wywołań do usługi WMI
Dostawcy mogą wywoływać metody implementowane przez WMI w swoich implementacjach metod. Istnieją jednak specjalne rozważania, gdy dostawca wywołuje implementację WMI metody IWbemServices w ramach własnej implementacji tej samej metody. Te zagadnienia są ważne niezależnie od tego, czy dostawca wywołuje synchroniczną, czy asynchroniczną wersję metody.
Każda metoda IWbemServices, którą dostawca może zaimplementować, zawiera parametr pCtx, będący wskaźnikiem do implementacji interfejsu IWbemContext. Gdy usługa WMI wywołuje dostawcę, usługa WMI przekazuje prawidłowy wskaźnik w tym parametrze. Dostawca musi zawsze przekazać ten sam wskaźnik we wszystkich wywołaniach usługi WMI, które są wykonywane podczas obsługi żądań. Zaniedbanie odpowiedniego ustawienia pCtx może spowodować, że WMI rozpocznie nieskończoną pętlę.
Poniższy przykład kodu pokazuje prawidłowy sposób wywoływania implementacji usługi WMI GetObject z poziomu implementacji GetObjectAsync.
STDMETHODIMP CClassProv::GetObjectAsync (BSTR ObjectPath,
long lFlags, IWbemContext *pCtx,
IWbemObjectSink *pHandler)
{
IWbemClassObject *pclObj = NULL;
IWbemServices* m_pNamespace;
HRESULT hr = m_pNamespace->GetObject(
_bstr_t(L"AClass"), 0, pCtx, &pclObj,
NULL );
pclObj->Release();
return pHandler->SetStatus(0, hr, NULL, NULL);
}
Przykładowy kod języka C++ w tym temacie wymaga następujących odwołań i instrukcji #include w celu poprawnego skompilowania.
#define _WIN32_DCOM
#include <iostream>
using namespace std;
#include <comdef.h>
#include <Wbemidl.h>
#pragma comment(lib, "wbemuuid.lib")
Dostawcy wystąpień, klas i właściwości nie mogą wysyłać żadnych wywołań usługi WMI żądających modyfikacji danych podczas obsługi żądania odczytu. Jedynymi dostawcami, które stanowią wyjątek od tej reguły, są dostawcy push. Dostawca typu push to dostawca klasowy, który przechowuje dane w repozytorium WMI i polega na systemie WMI do obsługi żądań od klientów. Podczas obsługi żądania odczytu dostawca push może zaktualizować repozytorium WMI, ale musi ustawić parametr lFlags na WBEM_FLAG_OWNER_UPDATE w odpowiednim wywołaniu IWbemServices.
Dostawcy zdarzeń nie mogą wprowadzać żadnych zmian klas podczas obsługi wywołania. Nie mogą również wystawiać żadnych wywołań związanych z zdarzeniami, takich jak modyfikowanie filtru zdarzeń.
Tematy pokrewne