Condividi tramite


Metodo IMarshal::GetUnmarshalClass (objidl.h)

Recupera il CLSID del codice di annullamento delmarshaling.

Sintassi

HRESULT GetUnmarshalClass(
  [in]  REFIID riid,
  [in]  void   *pv,
  [in]  DWORD  dwDestContext,
  [in]  void   *pvDestContext,
  [in]  DWORD  mshlflags,
  [out] CLSID  *pCid
);

Parametri

[in] riid

Riferimento all'identificatore dell'interfaccia da eseguire per il marshalling.

[in] pv

Puntatore all'interfaccia da eseguire il marshalling; può essere NULL se il chiamante non dispone di un puntatore all'interfaccia desiderata.

[in] dwDestContext

Contesto di destinazione in cui l'interfaccia specificata deve essere annullata. I valori possibili provengono dall'enumerazione MSHCTX. Unmarshaling può verificarsi in un altro appartamento del processo corrente (MSHCTX_INPROC) o in un altro processo nello stesso computer del processo corrente (MSHCTX_LOCAL).

[in] pvDestContext

Questo parametro è riservato e deve essere NULL.

[in] mshlflags

Indica se i dati da eseguire al marshalling devono essere trasmessi al processo client (il caso tipico) o scritti in una tabella globale, in cui può essere recuperato da più client. I valori possibili provengono dall'enumerazione MSHLFLAGS .

[out] pCid

Puntatore che riceve CLSID da usare per creare un proxy nel processo client.

Valore restituito

Se il metodo ha esito positivo, il valore restituito è S_OK. In caso contrario, è S_FALSE.

Commenti

Questo metodo viene chiamato indirettamente, in una chiamata a CoMarshalInterface, da qualsiasi codice nel processo del server sia responsabile del marshalling di un puntatore a un'interfaccia in un oggetto. Questo codice di marshalling è in genere uno stub generato da COM per una di diverse interfacce che possono eseguire il marshalling di un puntatore a un'interfaccia implementata in un oggetto completamente diverso. Gli esempi includono le interfacce IClassFactory e IOleItemContainer . A scopo di discussione, il codice responsabile del marshalling di un puntatore viene chiamato stub di marshalling.

Per creare un proxy per un oggetto, COM richiede due informazioni dall'oggetto originale: la quantità di dati da scrivere nel flusso di marshalling e nel CLSID del proxy.

Il marshalling stub ottiene queste due informazioni con chiamate successive a CoGetMarshalSizeMax e CoMarshalInterface.

Note ai chiamanti

Il marshalling stub chiama l'implementazione dell'oggetto di questo metodo per ottenere CLSID da usare per creare un'istanza del proxy. Il client, dopo aver ricevuto CLSID, carica la DLL elencata nel Registro di sistema.

Non si chiama in modo esplicito questo metodo se si implementano interfacce COM esistenti o si usa Microsoft Interface Definition Language (MIDL) per definire le proprie interfacce. In entrambi i casi, lo stub effettua automaticamente la chiamata. Vedere Definizione di interfacce COM.

Se non si usa MIDL per definire la propria interfaccia, lo stub deve chiamare questo metodo, direttamente o indirettamente, per ottenere clSID che la libreria COM lato client deve creare un proxy per l'oggetto che implementa l'interfaccia.

Se il chiamante ha un puntatore all'interfaccia da eseguire per il marshalling, deve, in base all'efficienza, usare il parametro pv per passare tale puntatore. In questo modo, un'implementazione che può usare tale puntatore per determinare il CLSID appropriato per il proxy non deve chiamare QueryInterface su se stesso. Se un chiamante non dispone di un puntatore all'interfaccia da eseguire per il marshalling, può passare NULL.

Note per gli implementatori

COM chiama GetUnmarshalClass per ottenere CLSID da usare per la creazione di un proxy nel processo client. ClSID da usare per un proxy non è normalmente quello dell'oggetto originale, ma quello generato (usando lo strumento di Guidgen.exe) in particolare per l'oggetto proxy.

Implementare questo metodo per ogni oggetto che fornisce il marshalling per una o più interfacce. Il codice responsabile del marshalling dell'oggetto scrive CLSID, insieme ai dati di marshalling, a un flusso; COM estrae il CLSID e i dati dal flusso sul lato ricevente.

Se l'implementazione del proxy consiste semplicemente nella copia dell'intero oggetto originale nel processo client, eliminando così la necessità di inoltrare chiamate all'oggetto originale, il CLSID restituito sarebbe uguale a quello dell'oggetto originale. Questa strategia, naturalmente, è consigliabile solo per gli oggetti che non sono previsti cambiamenti.

Se il parametro pv è NULL e l'implementazione richiede un puntatore dell'interfaccia, può chiamare QueryInterface nell'oggetto corrente per ottenerlo. Il parametro pv esiste semplicemente per migliorare l'efficienza.

Per assicurarsi che l'implementazione di GetUnmarshalClass continui a funzionare correttamente perché i nuovi contesti di destinazione sono supportati in futuro, delegare il marshalling all'implementazione predefinita COM per tutti i valori dwDestContext che l'implementazione non gestisce. Per delegare il marshalling all'implementazione predefinita COM, chiamare la funzione CoGetStandardMarshal .

Nota Il valore del Registro di sistema ThreadingModel deve essere Sia per un server in-process che implementa CLSID restituito dal metodo GetUnmarshalClass . Per altre informazioni, vedere InprocServer32.
 

Requisiti

Requisito Valore
Client minimo supportato Windows 2000 Professional [app desktop | App UWP]
Server minimo supportato Windows 2000 Server [app desktop | App UWP]
Piattaforma di destinazione Windows
Intestazione objidl.h

Vedi anche

CoMarshalInterface

IMarshal