Delen via


COM-klasseobjecten en CLSID's

Een COM-server wordt geïmplementeerd als com-klasse. Een COM-klasse is een implementatie van een groep interfaces in code die wordt uitgevoerd wanneer u met een bepaald object werkt. Er is een belangrijk onderscheid tussen een C++-klasse en een COM-klasse: In C++is een klasse een type, terwijl een COM-klasse gewoon een definitie is van het object en geen type heeft, hoewel een C++-programmeur het kan implementeren met behulp van een C++-klasse. COM is ontworpen om toe te staan dat een klasse kan worden gebruikt door verschillende toepassingen, met inbegrip van toepassingen die zijn geschreven zonder kennis van het bestaan van die specifieke klasse. Daarom bestaat klassecode voor een bepaald type object in een dynamische gekoppelde bibliotheek (DLL) of in een andere uitvoerbare toepassing (EXE).

Elke COM-klasse wordt geïdentificeerd door een CLSID-, een unieke 128-bits GUID, die de server moet registreren. COM gebruikt deze CLSID, op verzoek van een client, om specifieke gegevens te koppelen aan het DLL- of EXE-bestand dat de code bevat waarmee de klasse wordt geïmplementeerd, waardoor er een exemplaar van het object wordt gemaakt.

Voor clients en servers op dezelfde computer is de CLSID van de server alle benodigde client. Op elke computer onderhoudt COM een database (het maakt gebruik van het systeemregister op Microsoft Windows- en Macintosh-platforms) van alle CLSID's voor de servers die op het systeem zijn geïnstalleerd. Dit is een toewijzing tussen elke CLSID en de locatie van de DLL of EXE die de code voor die CLSID bevat. COM raadpleegt deze database wanneer een client een exemplaar van een COM-klasse wil maken en de bijbehorende services wil gebruiken, zodat de client nooit de absolute locatie van de code op de computer hoeft te kennen.

Voor gedistribueerde systemen biedt COM registervermeldingen waarmee een externe server zichzelf kan registreren voor gebruik door een client. Hoewel toepassingen alleen de CLSID van een server hoeven te kennen, omdat ze kunnen vertrouwen op het register om de server te vinden, kunnen clients registervermeldingen overschrijven en serverlocaties opgeven om optimaal te profiteren van het netwerk. (Zie een extern object zoeken.)

De basis manier om een exemplaar van een klasse te maken, is via een COM-klasseobject. Dit is gewoon een tussenliggend object dat functies ondersteunt die gebruikelijk zijn voor het maken van nieuwe exemplaren van een bepaalde klasse. De meeste klasseobjecten die worden gebruikt om objecten te maken op basis van een CLSID ondersteunen de interface IClassFactory, een interface die de belangrijke CreateInstance-methode bevat. U implementeert een IClassFactory--interface voor elke objectklasse die u aanbiedt om te worden geïnstantieerd. (Zie IClassFactory-implementeren voor meer informatie over het implementeren van IClassFactory-.)

Notitie

Servers die ondersteuning bieden voor een andere aangepaste class factory-interface zijn niet vereist om IClassFactory- specifiek te ondersteunen. Aanroepen naar andere activeringsfuncties dan CoGetClassObject (zoals CoCreateInstanceEx) vereisen echter dat de server ondersteuning biedt voor IClassFactory-.

 

Wanneer een client een exemplaar van het object van de server wil maken, wordt de CLSID van het gewenste object gebruikt in een aanroep van CoGetClassObject. (Deze aanroep kan direct of impliciet zijn via een van de helperfuncties voor het maken van objecten.) Deze functie zoekt de code die is gekoppeld aan de CLSID en maakt een klasseobject en levert een aanwijzer naar de aangevraagde interface. (CoGetClassObject een riid param gebruikt waarmee de gewenste interfaceaanwijzer van de client wordt opgegeven.)

Notitie

COM heeft slechts enkele functies waarop veel van de andere functies zijn gebouwd. Het belangrijkste hiervan is waarschijnlijk CoGetClassObject, dat alle functies voor het maken van exemplaren onderbouwt.

 

Met deze aanwijzer kan de aanroeper een exemplaar van het object maken en een aanwijzer ophalen naar een aangevraagde interface in het object. Dit is meestal een initialisatie-interface die wordt gebruikt om het object te activeren (in de actieve status geplaatst), zodat de client alles kan doen wat er met het object werkt dat het wil. Met de basisfuncties van COM moet de client ook alle objectpointers vrijgeven.

Een ander mechanisme voor het activeren van objectexemplaren is via de klasse moniker. Klasse monikers binden het klasseobject van de klasse waarvoor ze worden gemaakt. Zie Class Monikersvoor meer informatie.

COM biedt verschillende helperfuncties die het werk van het maken van objectexemplaren verminderen. Deze worden beschreven in Helper-functies voor het maken van exemplaren.

een object maken via een klasseobject