2011-02-24 6 views
5

Tengo un servidor COM LocalServer32 EXE comenzó cuando una aplicación llama cliente c_com_ptr :: CreateInstance (usando envolturas ATL.)¿La activación COM de LocalServer32 EXE desde la misma cuenta de usuario comparte un proceso existente o no?

En Windows 7, cuando una segunda aplicación cliente que se ejecuta en la misma cuenta de usuario también llamadas c_com_ptr :: CreateInstance , se inicia una segunda copia del EXE ejecutando bajo la misma cuenta de usuario. Tenía la impresión, de una vida anterior, de que el segundo cliente compartiría el primer EXE.

¿El proceso de LocalServer32 se comparte o no? ¿Cuándo o cuándo no? Buscar una respuesta en Google me da una gran relación ruido/señal y no puedo encontrar la respuesta.

Mi clave de registro CLSID tiene el valor LocalServer32 que da la ruta de acceso EXE, ProgID, Programable (cadena vacía), TypeLib (GUID) y VersionIndependentProgId. Tengo una clave de AppID.

No no quiero ejecutar EXE como un servicio, y no me importa que el proceso no se comparta. Solo quiero saber las reglas para saber qué esperar (en Windows Server 2003 en adelante)

EDITAR: Siguiendo la respuesta de Chris a continuación, examiné la llamada CoRegisterClassObject en mi servidor. Estoy usando ATL, y superé MyServer :: RegisterClassObjects para engancharme en la cadena de llamadas a CAtlExeModuleT :: RegisterClassObjects y veo que ATL está utilizando CLSCTX_LOCAL_SERVER y REGCLS_MULTIPLEUSE.

Al cambiar esto a CLSCTX_LOCAL_SERVER y REGCLS_SINGLEUSE, se inician más procesos, según la cantidad de objetos COM creados por el cliente, como se esperaba.

Todavía, volviendo a REGCLS_MULTIPLEUSE, obtengo un proceso de servidor COM por proceso de cliente COM, cada proceso de servidor contiene todos los objetos COM para su cliente, como se esperaba, excepto que si dos clientes COM se ejecutan bajo el mismo usuario cuenta, cada uno tiene su propio servidor que no es como entendí REGCLS_MULTIPLEUSE.

¿Podría ser que los clientes sean en realidad servicios de Windows? (Lo son). Cuando un proceso de servicio de Windows que se ejecuta como una cuenta de usuario crea un objeto COM en REGCLS_MULTIPLEUSE, ¿se trata de manera diferente, lo que causa el comportamiento observado? ¿Por qué recibo más de un proceso? (Y sólo para aclarar, yo no que mi servidor COM se ejecute como un servicio de Windows, pero los clientes que lo utilizan hacer ejecución como servicios de Windows.)

Además, la ejecución de los clientes como sistema local , o Servicio de red, REGCLS_MULTIPLEUSE funciona como esperaba: solo se inicia un único proceso EXE de servidor COM. Los múltiples procesos se inician cuando los clientes COM son servicios de Windows que se ejecutan en cuentas de usuario.

Respuesta

7

El enrutamiento de las solicitudes de activación fuera de proceso se controla mediante el registro de objetos de clase con el Administrador de control de servicios COM. Si el SCM tiene un objeto de clase registrado utilizable, se usará para dar servicio a la solicitud. Si no lo hace, comenzará una instancia de proceso exe del servidor COM para obtener uno.Si múltiples solicitudes de activación se encaminan a un solo proceso exe servidor COM, por tanto, depende de los siguientes factores de por lo menos (no estoy seguro si esto es una lista completa):

  • las banderas de activación especificado por el servidor COM cuando que llama CoRegisterClassObject registrarse con el SCM puede causar futuras solicitudes de activación para dar lugar a una nueva instancia de proceso exe siendo iniciado, siendo el uso de la REGCLS_SINGLEUSE bandera, que permite que el objeto de clase registrado para ser utilizado para una sola activación el más simple y más común caso solamente.
  • Dependiendo de cómo se ha registrado en la clase, las solicitudes de activación de diferentes contextos de seguridad pueden ser atendidos por diferentes instancias exe servidor COM (parece que esto no va a aplicar en su escenario como sus aplicaciones cliente se ejecutan bajo el mismo contexto de seguridad).
+0

Su respuesta me llevó a investigar los parámetros CoRegisterClassObject pero todavía no entiende el comportamiento observado - Estoy usando REGCLS_MULTIPLEUSE. Ver mis ediciones en mi pregunta anterior. –

+0

@Jim: Ahora estoy en los límites de mi conocimiento, pero tengo el presentimiento de que las tablas de objetos de clase que mantiene el SMC COM están en el ámbito de inicio de sesión y que el SMC sólo se volverá a utilizar un objeto de clase dentro de la misma sesión. Si sus clientes son todos servicios que se ejecutan en sesiones separadas, obtienen su propia instancia de objeto de clase (y por lo tanto su propio proceso de servidor) incluso con REGCLS_MULTIPLEUSE y aunque se ejecute con la misma identidad de cuenta. Una hipótesis que podrías probar, de todos modos. –

+0

Eso tiene sentido. Voy a mirar un poco más por mi cuenta, pero me complace marcar esto como la respuesta. Gracias. –

Cuestiones relacionadas