Een fysieke consument implementeren
Een fysieke consument is een COM-object dat de IWbemUnboundObjectSink interface implementeert. WMI laadt uw fysieke consument en geeft gebeurtenissen door IWbemUnboundObjectSink als reactie op een of meer gebeurtenissen, zoals gedefinieerd door de bijbehorende logische consument. Permanente consumenten hebben speciale beveiligingsvereisten. Voor meer informatie, zie WMI-gebeurtenissen beveiligen.
In de volgende procedure wordt beschreven hoe u een fysieke consument implementeert voor een permanente gebeurtenisconsumer.
Een fysieke consument implementeren voor een permanente gebeurtenisconsumer
Een COM-object maken.
U moet een fysieke consument implementeren als een lokale of externe server met behulp van het COM-protocol.
Bepaal of u synchrone of asynchrone gebeurtenismeldingen wilt ondersteunen.
Met een asynchrone gebeurtenismelding is de verzendende thread niet gerelateerd aan de ontvangende thread. Daarom worden WMI en de gebeurtenisprovider niet geblokkeerd terwijl WMI een melding levert aan een consument die is geregistreerd om de gebeurtenis te ontvangen. Het nadeel van asynchrone levering is dat er een contextswitch plaatsvindt tussen het tijdstip waarop de provider de gebeurtenis produceert en de tijd waarop de consument de gebeurtenis ontvangt. Zie de COM Fundamentals onderwerp in de COM-sectie van de Microsoft Windows Software Development Kit (SDK) voor meer informatie over het asynchroon werken. Zie het onderwerp Contextswitches in de sectie DLL's, processen en threads van de Windows SDK voor meer informatie over contextswitches.
Notitie
Omdat de callback naar de sink mogelijk niet op hetzelfde verificatieniveau wordt geretourneerd als de client vereist, wordt u aangeraden semisynchroon te gebruiken in plaats van asynchrone communicatie. Zie Een methode aanroepenvoor meer informatie.
Met synchrone melding levert WMI de melding op dezelfde thread die de gebeurtenisprovider heeft gebruikt om de gebeurtenis aan WMI te leveren. Wanneer een gebeurtenisprovider in dit geval een melding verzendt, wordt de gebeurtenisprovider door WMI geblokkeerd totdat WMI de melding aflevert. Alleen als uw consument extreem snel is en een gebeurtenis in 100 microseconden of minder kan verwerken, moet u overwegen synchrone meldingen te ondersteunen. Synchrone consumenten die te lang de tijd nemen om gebeurtenissen te verwerken, kunnen de levering van gebeurtenissen aan alle andere consumenten aanzienlijk vertragen. Bovendien kunnen ze de provider per ongeluk blokkeren. Zie Een gebeurtenisfilter binden met een logische consumentvoor meer informatie.
Implementeer de functie IWbemUnboundObjectSink::IndicateToConsumer.
WMI gebruikt de functie IndicateToConsumer om de benodigde aanwijzers en gebeurtenissen door te geven aan uw fysieke consument voor zowel synchrone als asynchrone communicatie. Uw implementatie van IndicateToConsumer- moet alle benodigde code bevatten om te reageren op een gebeurtenis.
In tegenstelling tot een tijdelijke gebeurtenisconsumer hoeft u de IWbemLocator interface niet aan te roepen om contact op te maken met WMI. In plaats daarvan lokaliseert WMI een pointer naar uw consument via de event-consumerprovider. Zie Een gebeurtenisconsumentprovider schrijvenvoor meer informatie.
Als u echter opnieuw wilt inbellen bij WMI, gebruikt u de IWbemLocator- en IWbemServices interfaces. De traditionele methode voor het maken van verbinding met WMI is tijdens het initialisatieproces van uw COM-object. Zie Een WMI-toepassing of -script makenvoor meer informatie.
Als u uw fysieke consument implementeert als een in-process COM-server en los van het initialisatieproces verbinding maakt met WMI, moet u de CLSID_WbemAdministrativeLocator klasse-id gebruiken om toegang te krijgen tot de IWbemLocator-interface in de aanroep naar CoCreateInstance-.
In het volgende voorbeeld ziet u hoe u de CLSID_WbemAdministrativeLocator klasse-id gebruikt voor toegang tot de IWbemLocator interface.
IWbemLocator *pLoc = 0; DWORD dwRes = CoCreateInstance(CLSID_WbemAdministrativeLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLoc);
De IWbemLocator interface verkrijgt de initiële naamruimte aanwijzer naar WMI op een bepaalde hostcomputer. Het niet gebruiken van de CLSID_WbemAdministrativeLocator-id in de CoCreateInstance-aanroep resulteert in een "toegang geweigerd"-fout.
Onder gebruikelijke omstandigheden levert WMI asynchrone gebeurtenissen één voor één aan de client. Als een client echter geen asynchrone gebeurtenismeldingen kan ontvangen zo snel als de gebeurtenissen binnenkomen, begint WMI automatisch gebeurtenissen in één aanroep te batcheren. Automatische batchverwerking helpt als de retourtijden een probleem zijn, zoals vaak het geval is in scenario's met hoge doorvoer. Echter, batchverwerking verbetert de systeemprestaties niet als de client of de netwerkbandbreedte verantwoordelijk is.