¿Debe inicializar el COM (fuera de proceso) dentro del objeto creado?

Creé un servicio de Windows NT, que exporta una interfaz COM usando ATL (COM fuera de proceso), hago llamadas API CoInitializeEx (0, COINIT_MULTITHREADED) en Ctor(), CoUninitialize() en Dtor() de la clase de mi objeto?

Lectura Los diseñadores de aplicaciones de moda están de acuerdo: el modelo Free Threading es lo que está de moda este otoño y Dé un impulso a las páginas web basadas en ActiveX con el modelo Apartment Threading no hizo nada para aclarar.

Mi proyecto ATL tiene una declaración de:

#define _ATL_FREE_THREADED

preguntado el 10 de marzo de 12 a las 12:03

1 Respuestas

Para un servidor ATL fuera de proceso del que ya se ocupa el constructor CAtlExeModuleT. Llamará a InitializeCom() en su constructor. Cuando haya #definido _ATL_FREE_THREADED, eso producirá automáticamente una llamada a CoInitializeEx(NULL, COINIT_MULTITHREADED), como era de esperar. El código es fácil de encontrar en vc/atlmfc/include/atlbase.h

Las llamadas al método de interfaz se realizarán desde el stub mediante un subproceso RPC, el subproceso real que realiza la llamada es completamente impredecible. Bastante peligroso también porque RPC recicla subprocesos y las llamadas a menudo las realiza el mismo subproceso. Pero no siempre, dependiendo de cuántas llamadas simultáneas se estén procesando. La carga de admitir subprocesos gratuitos es garantizar que su código sea completamente seguro para subprocesos. Si tiene algún error del tipo interbloqueo o carrera de subprocesos o confía en un objeto de sincronización que tiene afinidad de subprocesos como Mutex en varias llamadas, entonces no arruinarán su día hasta que el servidor esté muy cargado. Asegúrese de probar esto.

respondido 10 mar '12, 13:03

Sí, el código es altamente concurrente, pero está bien sincronizado. Su ayuda fue esclarecedora. Gracias. - lsalamon

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.