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 |
---|---|
|
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:
- Crea un objeto serializador sin subprocesos.
- Agrega este serializador al objeto especificado por el parámetro punkOuter . Normalmente, este objeto es el cuyos punteros de interfaz se van a serializar.
- Comprueba el contexto de destino especificado por el parámetro dwDestContext de la función CoMarshalInterface.
- Si el contexto de destino es MSHCTX_INPROC, copia el puntero de interfaz en el flujo de serialización.
- 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.
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 |