Método IMarshal::GetMarshalSizeMax (objidl.h)

Recupera el tamaño máximo del búfer que se necesitará durante la serialización.

Sintaxis

HRESULT GetMarshalSizeMax(
  [in]  REFIID riid,
  [in]  void   *pv,
  [in]  DWORD  dwDestContext,
  [in]  void   *pvDestContext,
  [in]  DWORD  mshlflags,
  [out] DWORD  *pSize
);

Parámetros

[in] riid

Referencia al identificador de la interfaz que se va a serializar.

[in] pv

Puntero de interfaz que se va a serializar. Este parámetro puede ser NULL.

[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] pSize

Puntero a una variable que recibe el tamaño máximo del búfer.

Valor devuelto

Este método puede devolver los valores devueltos estándar E_FAIL y S_OK, así como el siguiente valor.

Código devuelto Descripción
E_NOINTERFACE
No se admite la interfaz especificada.

Comentarios

Este método se denomina indirectamente, en una llamada a CoGetMarshalSizeMax, por cualquier código del proceso del 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, a través de una llamada a CoGetMarshalSizeMax, llama a la implementación del objeto de este método para asignar previamente el búfer de secuencia que se pasará a MarshalInterface.

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 personalizadas. En cualquier caso, el código auxiliar generado por MIDL realiza automáticamente la llamada.

Si no usa MIDL para definir su propia interfaz (consulte Definición de interfaces COM), el código auxiliar de serialización no tiene que llamar a GetMarshalSizeMax, aunque es muy recomendable hacerlo. Un objeto sabe mejor que un código auxiliar de interfaz lo que es probable que sea el tamaño máximo de un paquete de datos de serialización. Por lo tanto, a menos que proporcione un flujo de crecimiento automático que sea tan eficaz que la sobrecarga de expansión sea insignificante, debe llamar a este método incluso al implementar sus propias interfaces.

Se garantiza que el valor devuelto por este método es válido solo siempre que el estado interno del objeto que se serializa no cambie. Por lo tanto, la serialización real debe realizarse inmediatamente después de que se devuelva esta función, o el código auxiliar corre el riesgo de que el objeto, debido a algún cambio en el estado, pueda requerir más memoria para calcular las referencias que se indicaron originalmente.

Notas para los implementadores

La implementación de MarshalInterface usará el búfer asignado previamente para escribir datos de serialización en la secuencia. Si el búfer es demasiado pequeño, se producirá un error en la operación de serialización. Por lo tanto, el valor devuelto por este método debe ser una estimación conservadora de la cantidad de datos que se necesitarán para calcular las referencias de la interfaz. La infracción de este requisito debe tratarse como un error catastrófico.

En una llamada posterior a MarshalInterface, la implementación de IMarshal no puede basarse en el autor de la llamada que realmente ha llamado a GetMarshalSizeMax de antemano. Todavía debe ser cautelosa de STG_E_MEDIUMFULL errores devueltos por la secuencia y estar preparados para controlarlos correctamente.

Para asegurarse de que la implementación de GetMarshalSizeMax seguirá funcionando correctamente, ya que en el futuro se admiten nuevos contextos de destino, delegue las referencias a la implementación predeterminada de COM para todos los valores dwDestContext que la implementación no entiende. Para delegar la serialización en la implementación predeterminada de COM, llame a la función CoGetStandardMarshal .

Requisitos

   
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

Consulte también

CoGetMarshalSizeMax

IMarshal