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 indica el modelo de subprocesos que usará el programa. COM admite dos modelos de subprocesos diferentes, subprocesos controlados y multiproceso. Si indica subprocesos controlados, está aplicando las siguientes garantías:

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

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

Marca Descripción
COINIT_APARTMENTTHREADED Subproceso controlado.
COINIT_MULTITHREADED Multiproceso.

 

Debe crear exactamente una de estas flags. Por lo general, un subproceso que crea una ventana debe usar la flag COINIT_APARTMENTTHREADED y otros subprocesos deben usar COINIT_MULTITHREADED. Sin embargo, algunos componentes COM requieren un modelo de subprocesos determinado.

Nota:

En realidad, aunque indique subprocesos controlados, todavía es posible compartir interfaces entre subprocesos mediante una técnica denominada serialización. La serialización no se trata en este módulo. Lo importante es que, con subprocesos controlados, nunca debe copiar un puntero de interfaz a otro subproceso. (Para obtener más información sobre la arquitectura de subprocesos COM, consulte Procesos, subprocesos y apartamentos.

 

Además de las flags ya mencionadas, es una buena idea incluir la flag COINIT_DISABLE_OLE1DDE en el parámetro dwCoInit. Al crear esta flag, se evita cierta sobrecarga asociada a la vinculación e incrustación de objetos (OLE) (Object Linking and Embedding 1.0), una tecnología ya obsoleta.

Este es el modo en que se inicializaría COM para subprocesos controlados:

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

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

Anulación de la inicialización de 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 ningún parámetro y no tiene ningún valor devuelto.

CoUninitialize();

Siguientes

Códigos de error en COM