Compartir a través de


Inicialización de la biblioteca COM

Cualquier programa de Windows que use COM debe inicializar la biblioteca COM llamando a la función CoInitializeEx . Cada subproceso que use una interfaz COM debe realizar una llamada independiente a esta función. CoInitializeEx tiene la siguiente firma:

HRESULT CoInitializeEx(LPVOID pvReserved, DWORD dwCoInit);

El primer parámetro está reservado y debe ser NULL. El segundo parámetro especifica el modelo de subprocesos que usará el programa. COM admite dos modelos de subprocesos diferentes, subprocesos de apartamento y multiproceso. Si especifica subprocesos de apartamento, está realizando las siguientes garantías:

  • Tendrá acceso a cada objeto COM desde un único subproceso; no compartirá punteros de interfaz COM entre varios subprocesos.
  • El subproceso tendrá un bucle de mensajes. (Vea Mensajes de ventana en el módulo 1).

Si alguna de estas restricciones no es true, use el modelo multiproceso. Para especificar el modelo de subprocesos, establezca una de las siguientes marcas en el parámetro dwCoInit .

Marca Descripción
COINIT_APARTMENTTHREADED Piso roscado.
COINIT_MULTITHREADED Multiproceso.

 

Debe establecer exactamente una de estas marcas. Por lo general, un subproceso que crea una ventana debe usar la marca COINIT_APARTMENTTHREADED y otros subprocesos deben usar COINIT_MULTITHREADED. Sin embargo, algunos componentes COM requieren un modelo de subproceso determinado. La documentación de MSDN debe indicarle cuándo es el caso.

Nota

En realidad, incluso si especifica subprocesos de apartamento, todavía es posible compartir interfaces entre subprocesos mediante una técnica denominada serialización. La serialización está fuera del ámbito de este módulo. El punto importante es que con el subproceso de apartamento, nunca debe copiar simplemente un puntero de interfaz a otro subproceso. Para obtener más información sobre los modelos de subprocesos COM, vea Procesos, Subprocesos y Apartamentos.

 

Además de las marcas ya mencionadas, es recomendable establecer la marca COINIT_DISABLE_OLE1DDE en el parámetro dwCoInit . Al establecer esta marca, se evita cierta sobrecarga asociada a la vinculación de objetos y la inserción (OLE) 1.0, una tecnología obsoleta.

Aquí se muestra cómo inicializaría COM para el subproceso de apartamento:

HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);

El tipo de valor devuelto HRESULT contiene un código de error o correcto. Veremos el control de errores COM en la sección siguiente.

Anular inicializar la biblioteca COM

Para cada llamada correcta a CoInitializeEx, debe llamar a CoUninitialize antes de que se cierre el subproceso. Esta función no toma parámetros y no tiene ningún valor devuelto.

CoUninitialize();

Siguientes

Códigos de error en COM