Implementowanie konsumenta fizycznego
Użytkownik fizyczny to obiekt COM, który implementuje interfejs IWbemUnboundObjectSink. Usługa WMI ładuje użytkownika fizycznego i przekazuje zdarzenia za pośrednictwem IWbemUnboundObjectSink w odpowiedzi na co najmniej jedno zdarzenie zdefiniowane przez skojarzonego użytkownika logicznego. Stali konsumenci mają specjalne wymagania dotyczące zabezpieczeń. Aby uzyskać więcej informacji, zobacz Zabezpieczanie zdarzeń WMI.
W poniższej procedurze opisano sposób implementowania konsumenta fizycznego dla stałego konsumenta zdarzeń.
Aby zaimplementować fizycznego konsumenta dla permanentnego konsumenta zdarzeń
Utwórz obiekt COM.
Należy zaimplementować użytkownika fizycznego jako lokalnego lub zdalnego serwera przy użyciu protokołu COM.
Określ, czy chcesz obsługiwać powiadomienia o zdarzeniach synchronicznych lub asynchronicznych.
W przypadku powiadomienia o zdarzeniach asynchronicznych wątek wysyłający nie jest związany z wątkiem odbieranym. W związku z tym ani usługa WMI, ani dostawca zdarzeń nie są blokowane, gdy usługa WMI dostarcza powiadomienie do każdego konsumenta zarejestrowanego do odbioru zdarzenia. Wadą asynchronicznego dostarczania jest to, że przełączanie kontekstu występuje między czasem, w jakim dostawca generuje zdarzenie, a czasem, w jakim odbiorca odbiera zdarzenie. Aby uzyskać więcej informacji na temat pracy asynchronicznej, zobacz temat COM Fundamentals w sekcji COM zestawu Microsoft Windows Software Development Kit (SDK). Aby uzyskać więcej informacji na temat przełączników kontekstowych, zobacz temat Przełączniki kontekstowe w sekcji Biblioteki DLL, procesy i wątki zestawu Windows SDK.
Notatka
Ponieważ wywołanie zwrotne do ujścia może nie być zwracane na tym samym poziomie uwierzytelniania, jakiego wymaga klient, zaleca się użycie komunikacji semisynchronicznej zamiast komunikacji asynchronicznej. Aby uzyskać więcej informacji, zobacz Wywoływanie metody.
Dzięki synchronicznemu powiadomieniu usługa WMI dostarcza powiadomienie w tym samym wątku, którego dostawca zdarzeń użył do dostarczenia zdarzenia do usługi WMI. W takim przypadku, gdy dostawca zdarzeń wysyła powiadomienie, dostawca zdarzeń jest blokowany przez usługę WMI do momentu wysłania powiadomienia przez usługę WMI. Tylko wtedy, gdy użytkownik jest bardzo szybki i może przetworzyć zdarzenie w 100 mikrosekundach lub mniej, należy rozważyć obsługę powiadomienia synchronicznego. Synchroniczni konsumenci, którzy zbyt długo przetwarzają zdarzenia, mogą poważnie spowolnić dostarczanie zdarzeń wszystkim innym konsumentom. Ponadto mogą przypadkowo zablokować dostawcę. Aby uzyskać więcej informacji, zobacz , jak wiązać filtr zdarzeń z odbiorcą logicznym.
Zaimplementuj funkcję IWbemUnboundObjectSink::IndicateToConsumer.
Usługa WMI używa funkcji IndicateToConsumer w celu przekazania niezbędnych wskaźników i zdarzeń do użytkownika fizycznego w przypadku komunikacji synchronicznej i asynchronicznej. Implementacja IndicateToConsumer powinna zawierać cały kod niezbędny do reagowania na zdarzenie.
W przeciwieństwie do tymczasowego odbiorcy zdarzeń nie trzeba wywoływać interfejsu IWbemLocator, aby skontaktować się z WMI. Zamiast tego usługa WMI lokalizuje wskaźnik dla konsumenta za pośrednictwem dostawcy odbiorcy zdarzeń. Aby uzyskać więcej informacji, zobacz Pisanie dostawcy konsumenta zdarzeń.
Jeśli jednak chcesz wrócić do usługi WMI, użyj interfejsów IWbemLocator i IWbemServices. Tradycyjną metodą nawiązywania połączenia z usługą WMI jest proces inicjowania obiektu COM. Aby uzyskać więcej informacji, zobacz Tworzenie aplikacji WMI lub skryptu.
Jeśli zaimplementujesz użytkownika fizycznego jako serwer COM w procesie i połączysz się z usługą WMI niezależnie od procesu inicjowania, musisz użyć identyfikatora klasy CLSID_WbemAdministrativeLocator, aby uzyskać dostęp do interfejsuIWbemLocator w wywołaniu w celu CoCreateInstance.
W poniższym przykładzie pokazano, jak za pomocą identyfikatora klasy CLSID_WbemAdministrativeLocator uzyskać dostęp do interfejsu IWbemLocator.
IWbemLocator *pLoc = 0; DWORD dwRes = CoCreateInstance(CLSID_WbemAdministrativeLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLoc);
Interfejs IWbemLocator uzyskuje początkowy wskaźnik przestrzeni nazw do WMI na określonym komputerze hosta. Niezastosowanie identyfikatora CLSID_WbemAdministrativeLocator w wywołaniu CoCreateInstance skutkuje błędem "odmowa dostępu".
W zwykłych okolicznościach usługa WMI dostarcza zdarzenia asynchroniczne klientowi pojedynczo. Jeśli jednak klient nie może odbierać powiadomień o zdarzeniach asynchronicznych tak szybko, jak docierają zdarzenia, usługa WMI zacznie automatycznie zbierać zdarzenia w jedną partię w jednym wywołaniu. Automatyczne przetwarzanie wsadowe pomaga, jeśli czasy przesyłu stanowią problem, co często ma miejsce w przypadku scenariuszy o wysokiej przepustowości. Jednak przetwarzanie wsadowe nie poprawia wydajności systemu, jeśli winę ponosi klient lub przepustowość sieci.