Método IMarshal::GetUnmarshalClass (objidl.h)
Recupera el CLSID del código de desmarización.
Sintaxis
HRESULT GetUnmarshalClass(
[in] REFIID riid,
[in] void *pv,
[in] DWORD dwDestContext,
[in] void *pvDestContext,
[in] DWORD mshlflags,
[out] CLSID *pCid
);
Parámetros
[in] riid
Referencia al identificador de la interfaz que se va a serializar.
[in] pv
Puntero a la interfaz que se va a serializar; puede ser NULL si el autor de la llamada no tiene un puntero a la interfaz deseada.
[in] dwDestContext
Contexto de destino donde se va a desmarcar la interfaz especificada. Los valores posibles proceden de la enumeración MSHCTX. La anulación de la serialización puede producirse en otro apartamento del proceso actual (MSHCTX_INPROC) o en otro proceso que se encuentra en el mismo equipo que el proceso actual (MSHCTX_LOCAL).
[in] pvDestContext
Este parámetro está reservado y debe ser NULL.
[in] mshlflags
Indica si los datos que se van a serializar se devolverán al proceso de cliente (el caso típico) o se escribirán en una tabla global, donde varios clientes pueden recuperarlos. Los valores posibles proceden de la enumeración MSHLFLAGS .
[out] pCid
Puntero que recibe el CLSID que se va a usar para crear un proxy en el proceso de cliente.
Valor devuelto
Si el método se realiza correctamente, el valor devuelto se S_OK. De lo contrario, es S_FALSE.
Comentarios
Este método se denomina indirectamente, en una llamada a CoMarshalInterface, por cualquier código del proceso de servidor es responsable de serializar un puntero a una interfaz en un objeto. Este código de serialización suele ser un código auxiliar generado por COM para una de varias interfaces que pueden serializar un puntero a una interfaz implementada en un objeto completamente diferente. Entre los ejemplos se incluyen las interfaces IClassFactory e IOleItemContainer . Para fines de discusión, el código responsable de serializar un puntero se denomina código auxiliar de serialización.
Para crear un proxy para un objeto, COM requiere dos fragmentos de información del objeto original: la cantidad de datos que se van a escribir en el flujo de cálculo de referencias y el CLSID del proxy.
El código auxiliar de serialización obtiene estas dos partes de información con llamadas sucesivas a CoGetMarshalSizeMax y CoMarshalInterface.
Notas a los autores de llamadas
El código auxiliar de serialización llama a la implementación del objeto de este método para obtener el CLSID que se usará para crear una instancia del proxy. El cliente, al recibir el CLSID, carga el archivo DLL que aparece para él en el registro del sistema.No llama explícitamente a este método si va a implementar interfaces COM existentes o mediante el Lenguaje de definición de interfaz de Microsoft (MIDL) para definir sus propias interfaces. En cualquier caso, el código auxiliar realiza automáticamente la llamada. Consulte Definición de interfaces COM.
Si no usa MIDL para definir su propia interfaz, el código auxiliar debe llamar a este método, ya sea directa o indirectamente, para obtener el CLSID que la biblioteca COM del lado cliente necesita para crear un proxy para el objeto que implementa la interfaz.
Si el autor de la llamada tiene un puntero a la interfaz que se va a serializar, debe, como cuestión de eficiencia, usar el parámetro pv para pasar ese puntero. De este modo, una implementación que puede usar este puntero para determinar el CLSID adecuado para el proxy no tiene que llamar a QueryInterface en sí mismo. Si un llamador no tiene un puntero a la interfaz que se va a serializar, puede pasar NULL.
Notas para los implementadores
COM llama a GetUnmarshalClass para obtener el CLSID que se usará para crear un proxy en el proceso de cliente. El CLSID que se va a usar para un proxy no suele ser el del objeto original, pero uno que habrá generado (mediante la herramienta Guidgen.exe) específicamente para el objeto proxy.Implemente este método para cada objeto que proporciona serialización para una o varias de sus interfaces. El código responsable de serializar el objeto escribe el CLSID, junto con los datos de serialización, en una secuencia; COM extrae el CLSID y los datos de la secuencia en el lado receptor.
Si la implementación del proxy consiste simplemente en copiar todo el objeto original en el proceso de cliente, lo que elimina la necesidad de reenviar llamadas al objeto original, el CLSID devuelto sería el mismo que el del objeto original. Esta estrategia, por supuesto, solo es aconsejable para los objetos que no se espera que cambien.
Si el parámetro pv es NULL y la implementación necesita un puntero de interfaz, puede llamar a QueryInterface en el objeto actual para obtenerlo. El parámetro pv existe simplemente para mejorar la eficiencia.
Para asegurarse de que la implementación de GetUnmarshalClass sigue funcionando correctamente a medida que se admiten nuevos contextos de destino en el futuro, delegue las referencias a la implementación predeterminada de COM para todos los valores dwDestContext que la implementación no controla. Para delegar la serialización en la implementación predeterminada de COM, llame a la función CoGetStandardMarshal .
Requisitos
Requisito | Value |
---|---|
Cliente mínimo compatible | Windows 2000 Professional [aplicaciones de escritorio | Aplicaciones para UWP] |
Servidor mínimo compatible | Windows 2000 Server [aplicaciones de escritorio | Aplicaciones para UWP] |
Plataforma de destino | Windows |
Encabezado | objidl.h |