Función CoInitializeEx (combaseapi.h)

Inicializa la biblioteca COM para que la use el subproceso que realiza la llamada, establece el modelo de simultaneidad del subproceso y crea un nuevo apartamento para el subproceso si es necesario.

Debes llamar a Windows::Foundation::Initialize para inicializar el subproceso en lugar de CoInitializeEx si quieres usar las API de Windows Runtime o si quieres usar componentes COM y Windows Runtime. Windows::Foundation::Initialize es suficiente para usar para los componentes COM.

Sintaxis

HRESULT CoInitializeEx(
  [in, optional] LPVOID pvReserved,
  [in]           DWORD  dwCoInit
);

Parámetros

[in, optional] pvReserved

Este parámetro está reservado y debe ser NULL.

[in] dwCoInit

El modelo de simultaneidad y las opciones de inicialización del subproceso. Los valores de este parámetro se toman de la enumeración COINIT . Se puede usar cualquier combinación de valores de COINIT , excepto que no se pueden establecer las marcas de COINIT_APARTMENTTHREADED y COINIT_MULTITHREADED. El valor predeterminado es COINIT_MULTITHREADED.

Valor devuelto

Esta función puede devolver los valores devueltos estándar E_INVALIDARG, E_OUTOFMEMORY y E_UNEXPECTED, así como los siguientes valores.

Código devuelto Descripción
S_OK
La biblioteca COM se inicializó correctamente en este subproceso.
S_FALSE
La biblioteca COM ya se ha inicializado en este subproceso.
RPC_E_CHANGED_MODE
Una llamada anterior a CoInitializeEx especificó el modelo de simultaneidad para este subproceso como apartamento multiproceso (MTA). Esto también podría indicar que se ha producido un cambio de un apartamento de subproceso neutro a un solo subproceso.

Comentarios

Se debe llamar a CoInitializeEx al menos una vez y normalmente se llama solo una vez para cada subproceso que use la biblioteca COM. Se permiten varias llamadas a CoInitializeEx por el mismo subproceso siempre que pasen la misma marca de simultaneidad, pero las llamadas válidas posteriores devuelven S_FALSE. Para cerrar correctamente la biblioteca COM en un subproceso, cada llamada correcta a CoInitialize o CoInitializeEx, incluida cualquier llamada que devuelva S_FALSE, debe equilibrarse mediante una llamada correspondiente a CoUninitialize.

Debe inicializar la biblioteca COM en un subproceso antes de llamar a cualquiera de las funciones de biblioteca excepto CoGetMalloc, para obtener un puntero al asignador estándar y las funciones de asignación de memoria.

De lo contrario, la función COM devolverá CO_E_NOTINITIALIZED.

Después de establecer el modelo de simultaneidad para un subproceso, no se puede cambiar. Se producirá un error en una llamada a CoInitialize en un apartamento que se inicializó previamente como multiproceso y devolverá RPC_E_CHANGED_MODE.

Los objetos creados en un apartamento de un solo subproceso (STA) reciben llamadas de método solo desde el subproceso de su apartamento, por lo que las llamadas se serializan y llegan solo a los límites de la cola de mensajes (cuando se llama a la función PeekMessage o SendMessage ).

Los objetos creados en un subproceso COM en un apartamento multiproceso (MTA) deben poder recibir llamadas de método de otros subprocesos en cualquier momento. Normalmente, implementaría alguna forma de control de simultaneidad en el código de un objeto multiproceso mediante primitivos de sincronización, como secciones críticas, semáforos o exclusión mutua para ayudar a proteger los datos del objeto.

Cuando un subproceso (NTA) llama a un objeto configurado para ejecutarse en el apartamento subproceso neutro (NTA) que se encuentra en una STA o en el MTA, ese subproceso se transfiere a la NTA. Si este subproceso llama posteriormente a CoInitializeEx, se produce un error en la llamada y devuelve RPC_E_CHANGED_MODE.

Dado que las tecnologías OLE no son seguras para subprocesos, la función OleInitialize llama a CoInitializeEx con la marca COINIT_APARTMENTTHREADED. Como resultado, un apartamento que se inicializa para la simultaneidad de objetos multiproceso no puede usar las características habilitadas por OleInitialize.

Dado que no hay ninguna manera de controlar el orden en el que los servidores en proceso se cargan o descargan, no llame a CoInitialize, CoInitializeEx o CoUninitialize desde la función DllMain .

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

Procesos, subprocesos y apartamentos