Implementazione e attivazione di un gestore senza dati aggiuntivi del server

Per creare un'istanza del gestore, se si tratta di un'istanza che non ottiene dati aggiuntivi del server, il server deve implementare IStdMarshalInfo ma non IMarshal. IStdMarshalInfo dispone di un metodo, GetClassForHandler, che recupera il CLSID del gestore oggetti da usare nel processo di destinazione. COM chiama questo quando chiama per te CoMarshalInterface e attiva il gestore sul lato client.

Le implementazioni del server e del gestore devono successivamente chiamare la funzione CoGetStdMarshalEx. Questa funzione crea un gestore di marshaling standard su ciascuna parte (denominato gestore proxy sul lato client e gestore stub sul lato server).

Il server chiama CoGetStdMarshalEx, passando il flag SMEXF_SERVER. In questo modo viene creato un gestore di marshalling standard sul lato server (gestore stub). La struttura lato server è illustrata nella figura seguente:

Diagramma che mostra la struttura dal lato server.

Struttura Server-Side

Il gestore chiama CoGetStdMarshalEx, passando il flag SMEXF_HANDLER. In questo modo viene creato un marshaler standard sul lato client (gestore proxy) e viene aggregato al gestore sul lato client. La durata di entrambi gli oggetti viene gestita dall'oggetto Identity di controllo (implementando IUnknown) implementato dal sistema quando il gestore chiama la funzione CoGetStdMarshalEx. La struttura lato client è illustrata nella figura seguente.

Diagramma che mostra la struttura lato client.

Struttura Client-Side

Come illustrato nella figura precedente, il gestore viene effettivamente inserito tra il gestore proxy e l'identità/controllo sconosciuto. In questo modo, il sistema controlla la durata dell'oggetto, assegnando al gestore il controllo sulle interfacce esposte. La linea tratteggiata tra Identity e Proxy Manager indica che i due componenti condividono una stretta integrazione tramite interfacce private interne.

Quando COM chiama CoUnmarshalInterface per il client, crea l'istanza del gestore, aggregandola con Identity. Il gestore creerà il gestore di marshalling standard (tramite la chiamata a CoGetStdMarshalEx, passando il controllo sconosciuto ricevuto al momento della creazione. Il gestore non implementa IMarshal, ma si limita a restituire IMarshal dal marshaller standard. Anche se il gestore implementa IMarshal, non verrà chiamato durante un'operazione di disimballaggio.

Se due thread annullano contemporaneamente lo stesso oggetto per la prima volta, è possibile che due gestori vengano creati temporaneamente. Ne verrà successivamente rilasciato uno.

il gestore Client-Side leggero