Función CoCreateFreeThreadedMarshaler (combaseapi.h)

Crea un objeto aggregatable capaz de calcular referencias dependientes del contexto.

Sintaxis

HRESULT CoCreateFreeThreadedMarshaler(
  [in]  LPUNKNOWN punkOuter,
  [out] LPUNKNOWN *ppunkMarshal
);

Parámetros

[in] punkOuter

Puntero al agregado del objeto que controla IUnknown.

[out] ppunkMarshal

Dirección de la variable de puntero que recibe el puntero de interfaz al serializador aggregatable.

Valor devuelto

Esta función puede devolver el valor devuelto estándar E_OUTOFMEMORY, así como el siguiente valor.

Código devuelto Descripción
S_OK
Se creó el serializador.

Comentarios

La función CoCreateFreeThreadedMarshaler permite a un objeto serializar eficazmente punteros de interfaz entre subprocesos del mismo proceso. Si los objetos no admiten la serialización entre subprocesos, no es necesario llamar a esta función. Está pensado para su uso por parte de servidores DLL sin subprocesos a los que deben tener acceso directamente todos los subprocesos de un proceso, incluso aquellos subprocesos asociados a apartamentos de un solo subproceso. Serializa el puntero de memoria real sobre otros apartamentos como un "proxy" falso y, por lo tanto, proporciona acceso directo a todos los autores de llamadas, incluso si no están subprocesos libres.

La función CoCreateFreeThreadedMarshaler realiza las siguientes tareas:

  1. Crea un objeto serializador sin subprocesos.
  2. Agrega este serializador al objeto especificado por el parámetro punkOuter . Normalmente, este objeto es el cuyos punteros de interfaz se van a serializar.
La implementación del objeto de agregación de IMarshal debe delegar las llamadas QueryInterface para IID_IMarshal a IUnknown del serializador de subprocesos libres. Al recibir una llamada, el serializador de subprocesos libre realiza las siguientes tareas:
  1. Comprueba el contexto de destino especificado por el parámetro dwDestContext de la función CoMarshalInterface.
  2. Si el contexto de destino es MSHCTX_INPROC, copia el puntero de interfaz en el flujo de serialización.
  3. Si el contexto de destino es cualquier otro valor, busca o crea una instancia del serializador predeterminado (estándar) de COM y le delega las referencias.
Los valores de dwDestContext proceden de la enumeración MSHCTX . MSHCTX_INPROC indica que el puntero de interfaz se va a serializar entre subprocesos diferentes en el mismo proceso. Dado que ambos subprocesos tienen acceso al mismo espacio de direcciones, el subproceso de cliente puede desreferenciar el puntero directamente en lugar de tener que dirigir llamadas a un proxy. En todos los demás casos, se requiere un proxy, por lo que CoCreateFreeThreadedMarshaler delega el trabajo de serialización a la implementación predeterminada de COM.

Se debe tener gran cuidado en el uso de la función CoCreateFreeThreadedMarshaler . Esto se debe a que el rendimiento de los objetos que agregan el serializador sin subprocesos se obtiene a través de una infracción calculada de las reglas COM, con el riesgo siempre presente de comportamiento indefinido a menos que el objeto funcione dentro de determinadas restricciones. Las restricciones más importantes son:

  • Un objeto serializador de subprocesos libre no puede contener punteros directos a interfaces en un objeto que no agrega el serializador de subprocesos libre como parte de su estado. Si el objeto usara referencias directas a objetos agregados de un solo subproceso normales, puede interrumpir su propiedad de subproceso único. Si el objeto tuviera que usar referencias directas a objetos agregados multiproceso normales, estos objetos se pueden comportar de maneras que no muestran ninguna sensibilidad a las necesidades de clientes agregados de un solo subproceso directo. Por ejemplo, estos objetos pueden girar nuevos subprocesos y pasar parámetros a los subprocesos que son referencias a objetos agregados de un solo subproceso normales.
  • Un objeto serializador sin subprocesos no puede contener referencias a servidores proxy a objetos de otros apartamentos. Los servidores proxy son sensibles al modelo de subprocesos y pueden devolver RPC_E_WRONG_THREAD si lo llama el cliente incorrecto.

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 combaseapi.h (incluya Objbase.h)
Library Ole32.lib
Archivo DLL Ole32.dll

Consulte también

CoGetInterfaceAndReleaseStream

CoMarshalInterThreadInterfaceInStream