¿Cómo reutilizar un servidor OLE(Delphi) con un segundo cliente?
com automation (6)
Escribí un servidor de automatización OLE (usando Delphi). Normalmente inicio el servidor OLE manualmente y lo uso como una aplicación normal. De vez en cuando, inicio un cliente que se conecta automáticamente al servidor OLE existente.
Cuando termino el cliente, el servidor no finaliza (al menos cuando se inició manualmente antes que el cliente) pero no acepta ninguna otra conexión OLE. Al iniciar otro cliente se activará un nuevo servidor en lugar de reutilizar el primero.
¿Cómo puedo reutilizar el mismo servidor con el segundo cliente?
(Pregunta editada para reformularla correctamente. En la versión original preguntaba cómo evitar que el servidor finalizara, lo cual no era una buena formulación)
Cree el objeto COM como Singleton. Y también para mantener el objeto en ejecución incluso después de que el Cliente se vaya, ponga un recuento de referencia adicional. Para hacer esto, llame a QI una vez dentro del objeto COM.
Debería poder incrementar el contador de referencia del servidor de automatización cuando inicia el servidor como una aplicación normal. Lo que desea lograr es doble: deje que el servidor no termine cuando el cliente salga, y también permita que el servidor no finalice cuando cierre su formulario principal mientras el cliente todavía está en ejecución.
En el cliente, use
ConnectKind := ckRunningOrNew
y se debe usar un servidor existente en lugar de comenzar uno nuevo.
Hay una configuración "Instalar" en el Asistente de objetos COM en Delphi. Los valores permitidos son "interno", "Instancia múltiple", "Instancia única".
Quería volver a usar el mismo servidor COM con múltiples clientes. Es por eso que elegí "instancia única" y aunque tendría una sola instancia de mi aplicación de servidor para todos los clientes. Pero estaba equivocado. "Instancia única" significa que solo habrá una instancia de una conexión COM en mi servidor. Debería haber elegido "Instancia múltiple" para permitir la conexión COM múltiple (pero una después de la otra, no simultánea) en el mismo servidor.
Creo que las palabras utilizadas en el Asistente de objetos COM en Delphi no son muy claras. En lugar de "instancia múltiple", "instancia única", sería mejor tener "uso múltiple" y "uso único", como en este artículo sobre OLE Server y VB .
También puede intentar cambiar la identidad del usuario que inicia el servidor OLE, si es un Exe y no un dll, ejecutando dcomcnfg y eligiendo Servicios de componentes / Equipos / Mi PC / Configuración DCOM y seleccionando su servidor.
Puede que tenga que jugar con eso, no puedo recordar las diferencias entre todos pero creo que el "Usuario interactivo" debería hacerlo.
Una nota sobre la publicación anterior ''Hay una configuración'' Instancia ''en el Asistente de objetos COM en Delphi.'' : Al menos en el constructor C ++, esta opción simplemente se puede cambiar luego en la configuración del proyecto, elemento "ATL". Este elemento solo aparece allí para un EXE-ole-server después de haber agregado el primer objeto de automatización.
(También le pedí al autor de This fine page que mencione esto en el ítem 18.)