Recupero di un puntatore a un oggetto
Poiché COM non dispone di un modello di classe strict, esistono quattro modi in cui un client può creare un'istanza o ottenere un puntatore a un'interfaccia in un oggetto:
- Chiamare una funzione di libreria COM che crea un oggetto di un tipo predeterminato; ovvero, la funzione restituirà un puntatore a una sola interfaccia specifica per una classe oggetto specifica.
- Chiamare una funzione di libreria COM in grado di creare un oggetto basato su un identificatore di classe (CLSID) e che restituisce qualsiasi tipo di puntatore di interfaccia richiesto.
- Chiamare un metodo di un'interfaccia che crea un altro oggetto (o si connette a un oggetto esistente) e restituisce un puntatore di interfaccia su tale oggetto separato.
- Implementare un oggetto con un'interfaccia attraverso la quale altri oggetti passano direttamente il puntatore dell'interfaccia al client.
Per informazioni sul recupero di puntatori ad altre interfacce su un oggetto dopo la prima, vedere QueryInterface: Spostamento in un oggetto.
Creazione di un oggetto di un tipo predeterminato
Esistono numerose funzioni COM, ad esempio CoGetMalloc, che restituiscono puntatori a implementazioni di interfacce specifiche. CoGetMalloc recupera un puntatore all'allocatore di memoria COM standard. La maggior parte di queste sono funzioni helper e la maggior parte di queste funzioni sono descritte nelle sezioni di riferimento di questa documentazione, nell'area specifica a cui sono correlate, ad esempio l'archiviazione o il trasferimento dei dati.
Creazione di un oggetto basato su un CLSID
Esistono diverse funzioni che, date un CLSID, un client può chiamare per creare un'istanza di oggetto e ottenere un puntatore a esso. Tutte queste funzioni si basano sulla funzione CoGetClassObject, che crea un oggetto classe e fornisce un puntatore a un'interfaccia che consente di creare istanze di tale classe. Sebbene siano presenti informazioni che indichino il sistema in cui risiede il server, non è necessario che tali informazioni siano contenute nel client. Il client deve conoscere solo il CLSID e non deve mai essere il percorso assoluto del codice del server. Per altre informazioni, vedere Creazione di un oggetto tramite un oggetto classe.
Restituzione di un puntatore a un oggetto separato
Tra i molti metodi di interfaccia che restituiscono un puntatore a un oggetto separato sono diversi che creano e restituiscono un puntatore a un oggetto enumeratore, che consente di determinare il numero di elementi di un determinato tipo gestito da un oggetto. COM definisce le interfacce per l'enumerazione di un'ampia gamma di elementi, ad esempio stringhe, strutture importanti, moniker e puntatori di interfaccia IUnknown. Il modo tipico per creare un'istanza dell'enumeratore e ottenere un puntatore alla relativa interfaccia consiste nel chiamare un metodo da un'altra interfaccia. Ad esempio, l'interfaccia IDataObject definisce due metodi, EnumDAdvise e EnumFormatEtc, che restituiscono puntatori alle interfacce su due oggetti di enumerazione diversi. Esistono molti altri esempi in COM di metodi che restituiscono puntatori a oggetti, ad esempio l'interfaccia di documento composta OLE IOleObject::GetClientSite, che, quando viene chiamato sull'oggetto incorporato o collegato, restituisce un puntatore all'implementazione dell'oggetto contenitore di IOleClientSite.
Implementazione di un oggetto tramite cui passare un puntatore di interfaccia direttamente al client
Quando due oggetti, ad esempio un contenitore di documenti composti OLE e un server, richiedono una comunicazione bidirezionale, ognuno implementa un oggetto contenente un metodo di interfaccia tramite il quale può passare un puntatore di interfaccia all'altro oggetto. L'oggetto di implementazione, che è anche il client dell'oggetto creato, può quindi chiamare il metodo e ottenere il puntatore passato.
Argomenti correlati