OGGETTI classe COM e CLSID

Un server COM viene implementato come classe COM. Una classe COM è un'implementazione di un gruppo di interfacce nel codice eseguito ogni volta che si interagisce con un determinato oggetto. Esiste una distinzione importante tra una classe C++ e una classe COM: in C++, una classe è un tipo, mentre una classe COM è semplicemente una definizione dell'oggetto e non contiene alcun tipo, anche se un programmatore C++ potrebbe implementarlo usando una classe C++. COM è progettato per consentire l'uso di una classe da parte di applicazioni diverse, incluse le applicazioni scritte senza conoscere l'esistenza di tale classe specifica. Pertanto, il codice di classe per un determinato tipo di oggetto esiste in una libreria collegata dinamica (DLL) o in un'altra applicazione eseguibile (EXE).

Ogni classe COM è identificata da un CLSID, un GUID a 128 bit univoco, che il server deve registrare. COM usa questo CLSID, alla richiesta di un client, per associare dati specifici alla DLL o al file EXE contenente il codice che implementa la classe, creando così un'istanza dell'oggetto .

Per i client e i server nello stesso computer, il CLSID del server è tutto il client necessario. In ogni computer, COM gestisce un database (usa il Registro di sistema nelle piattaforme Microsoft Windows e Macintosh) di tutti i CLSID per i server installati nel sistema. Si tratta di un mapping tra ogni CLSID e il percorso della DLL o exe che ospita il codice per tale CLSID. COM consulta questo database ogni volta che un client desidera creare un'istanza di una classe COM e usa i servizi, quindi il client non deve mai conoscere la posizione assoluta del codice nel computer.

Per i sistemi distribuiti, COM fornisce voci del Registro di sistema che consentono a un server remoto di registrarsi per l'uso da parte di un client. Anche se le applicazioni devono conoscere solo il CLSID di un server, perché possono basarsi sul Registro di sistema per individuare il server, COM consente ai client di eseguire l'override delle voci del Registro di sistema e di specificare i percorsi del server, per sfruttare appieno la rete. (Vedere Individuazione di un oggetto remoto.

Il modo di base per creare un'istanza di una classe consiste nell'usare un oggetto classe COM. Si tratta semplicemente di un oggetto intermedio che supporta funzioni comuni alla creazione di nuove istanze di una determinata classe. La maggior parte degli oggetti classe usati per creare oggetti da un CLSID supporta l'interfaccia IClassFactory, un'interfaccia che include il metodo CreateInstance importante. Si implementa un'interfaccia IClassFactory per ogni classe di oggetto che si offre di cui creare un'istanza. Per altre informazioni sull'implementazione IClassFactory, vedere Implementazione di IClassFactory.

Nota

I server che supportano un'altra interfaccia factory di classi personalizzata non sono necessari per supportare in modo specifico IClassFactory . Tuttavia, le chiamate alle funzioni di attivazione diverse da CoGetClassObject (ad esempio CoCreateInstanceEx) richiedono che il server supporti IClassFactory.

 

Quando un client vuole creare un'istanza dell'oggetto del server, usa il CLSID dell'oggetto desiderato in una chiamata a CoGetClassObject. Questa chiamata può essere diretta o implicita tramite una delle funzioni helper per la creazione di oggetti. Questa funzione individua il codice associato a CLSID e crea un oggetto classe e fornisce un puntatore all'interfaccia richiesta. CoGetClassObject accetta un parametro riid che specifica il puntatore dell'interfaccia desiderato del client.

Nota

COM ha solo alcune funzioni su cui vengono compilate molte altre. Il più importante di questi è probabilmente CoGetClassObject, che sottostante tutte le funzioni di creazione dell'istanza.

 

Con questo puntatore, il chiamante può creare un'istanza dell'oggetto e recuperare un puntatore a un'interfaccia richiesta nell'oggetto . Si tratta in genere di un'interfaccia di inizializzazione, usata per attivare l'oggetto (inserirlo nello stato di esecuzione) in modo che il client possa eseguire qualsiasi operazione con l'oggetto che vuole. Usando le funzioni di base di COM, il client deve anche occuparsi del rilascio di tutti i puntatori a oggetti.

Un altro meccanismo per l'attivazione delle istanze dell'oggetto consiste nell'usare il moniker della classe. I moniker di classe vengono associati all'oggetto classe della classe per cui vengono creati. Per altre informazioni, vedere Moniker di classe.

COM offre diverse funzioni helper che riducono il lavoro di creazione di istanze di oggetti. Questi sono descritti in Funzioni helper per la creazione di istanze.

Creazione di un oggetto tramite un oggetto classe