Dela via


COM-klassobjekt och CLSID:er

En COM-server implementeras som en COM-klass. En COM-klass är en implementering av en grupp gränssnitt i kod som körs när du interagerar med ett visst objekt. Det finns en viktig skillnad mellan en C++-klass och en COM-klass: I C++är en klass en typ, medan en COM-klass helt enkelt är en definition av objektet och inte har någon typ, även om en C++-programmerare kan implementera den med hjälp av en C++-klass. COM är utformat för att tillåta att en klass används av olika program, inklusive program som skrivits utan kunskap om den specifika klassens existens. Därför finns klasskod för en viss typ av objekt antingen i ett dynamiskt länkat bibliotek (DLL) eller i ett annat körbart program (EXE).

Varje COM-klass identifieras av en CLSID-, ett unikt 128-bitars GUID som servern måste registrera. COM använder detta CLSID, på begäran av en klient, för att associera specifika data med DLL eller EXE som innehåller koden som implementerar klassen, vilket skapar en instans av objektet.

För klienter och servrar på samma dator är CLSID för servern allt som klienten någonsin behöver. På varje dator underhåller COM en databas (den använder systemregistret på Microsoft Windows- och Macintosh-plattformarna) för alla CLSID:er för de servrar som är installerade i systemet. Det här är en mappning mellan varje CLSID och platsen för den DLL eller EXE som innehåller koden för det CLSID:t. COM konsulterar den här databasen när en klient vill skapa en instans av en COM-klass och använda sina tjänster, så klienten behöver aldrig känna till den absoluta platsen för koden på datorn.

För distribuerade system tillhandahåller COM registerposter som gör att en fjärrserver kan registrera sig för användning av en klient. Även om program bara behöver känna till en servers CLSID, eftersom de kan förlita sig på registret för att hitta servern, tillåter COM att klienter åsidosätter registerposter och anger serverplatser för att dra full nytta av nätverket. (Se hitta ett fjärrobjekt.)

Det grundläggande sättet att skapa en instans av en klass är via ett COM--klassobjekt. Det här är helt enkelt ett mellanliggande objekt som stöder funktioner som är gemensamma för att skapa nya instanser av en viss klass. De flesta klassobjekt som används för att skapa objekt från ett CLSID stöder gränssnittet IClassFactory, ett gränssnitt som innehåller den viktiga metoden CreateInstance. Du implementerar ett IClassFactory--gränssnitt för varje objektklass som du erbjuder som instansieras. (Mer information om hur du implementerar IClassFactoryfinns i Implementering av IClassFactory.)

Not

Servrar som stöder vissa andra fabriksgränssnitt för anpassad klass krävs inte för att stödja IClassFactory- specifikt. Anrop till andra aktiveringsfunktioner än CoGetClassObject- (till exempel CoCreateInstanceEx) kräver dock att servern stöder IClassFactory.

 

När en klient vill skapa en instans av serverns objekt använder den det önskade objektets CLSID i ett anrop för att CoGetClassObject. (Det här anropet kan vara direkt eller implicit via någon av hjälpfunktionerna för att skapa objekt.) Den här funktionen letar upp koden som är associerad med CLSID och skapar ett klassobjekt och tillhandahåller en pekare till det begärda gränssnittet. (CoGetClassObject tar en riid param som anger klientens önskade gränssnittspekare.)

Not

COM har bara några funktioner som många av de andra är byggda på. Det viktigaste av dessa är förmodligen CoGetClassObject, som ligger till grund för alla funktioner för att skapa instanser.

 

Med den här pekaren kan anroparen skapa en instans av objektet och hämta en pekare till ett begärt gränssnitt på objektet. Detta är vanligtvis ett initieringsgränssnitt som används för att aktivera objektet (placera det i körningstillstånd) så att klienten kan göra vad som helst med det objekt som det vill. Med hjälp av COM:s grundläggande funktioner måste klienten också vara noga med att släppa alla objektpekare.

En annan mekanism för att aktivera objektinstanser är genom klassmonikern. Klassmonikers binder till klassobjektet för klassen som de skapas för. Mer information finns i Monikers för klass.

COM har flera hjälpfunktioner som minskar arbetet med att skapa objektinstanser. Dessa beskrivs i Hjälpfunktioner för att skapa instanser.

Skapa ett objekt via ett klassobjekt