Compartir a través de


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 se requiere uno.

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 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, salvo que no se pueden establecer las marcas 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ó un modelo de simultaneidad incompatible para este subproceso. Esto también podría indicar que se ha producido un cambio de un apartamento de subproceso neutro a un solo subproceso.

Observaciones

CoInitializeEx debe llamarse 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. Si la marca de simultaneidad no coincide, se produce un error en la llamada y se devuelve RPC_E_CHANGED_MODE. (Para este propósito, una llamada a CoInitialize equivale a llamar a CoInitializeEx con la marca COINIT_APARTMENTTHREADED). Para anular la inicialización de la biblioteca COM correctamente 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. Una vez que COM no se ha inicializado en un subproceso, puede reinicializarlo en cualquier modo, sujeto a las restricciones anteriores.

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.

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 al PeekMessage o función 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 se 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 inicializado 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, CoInitializeExo CoUninitialize desde la función DllMain.

Requisitos

Requisito Valor
cliente mínimo admitido Windows 2000 Professional [aplicaciones de escritorio | Aplicaciones para UWP]
servidor mínimo admitido Windows 2000 Server [aplicaciones de escritorio | Aplicaciones para UWP]
de la plataforma de destino de Windows
encabezado de combaseapi.h (incluya Objbase.h)
biblioteca de Ole32.lib
DLL de Ole32.dll

Consulte también

procesos, subprocesos y apartamentos de