Tengo un servidor COM fuera de proceso que necesita vigilar las cosas. Este servidor se ejecuta como un servicio y, internamente, es un singleton. Por simplicidad, lo llamaré BossCom.¿Cómo puedo ordenar una referencia COM fuera de proceso a través de los límites del proceso?
Tengo otro servidor COM fuera de proceso que es un trabajador. Es, para la estabilidad del sistema, un servidor de un solo uso (lo que significa que si crea 2 WorkerCom, hay 2 WorkerCom.exe en ejecución). Por simplicidad, lo llamaré WorkerCom.
WorkerCom puede iniciarse por cualquier cosa, incluso por sí mismo si alguien lo ejecuta a través de la línea de comandos con los argumentos correctos de la línea de comando.
El objetivo general es que BossCom sepa qué son los WorkerComs, sepa lo que están haciendo y sea capaz de darles órdenes (pausar, detener, acelerar, etc.).
Mi primer pensamiento en esto sería que cada vez que WorkerCom comienza, él CoCreateInstance a BossCom y llama a BossCom-> RegisterWorker (IUnknown me). Luego, cuando el WorkerCom esté a punto de apagarse, llamaría a BossCom-> UnregisterWorker (No me conocía). BossCom podría QueryInterface the IUnknown para IWorkerCom y poder emitir comandos.
Eso funcionaría muy bien si todos estos objetos com estuvieran en el mismo proceso, pero no es así. Pensé en usar GlobalInterfaceTable, pero solo es global en el sentido de un solo proceso.
He pasado unos días investigando esto y estoy perdido. Tal vez estoy con visión de túnel.
¿Cómo puedo obtener una referencia a un objeto com del Worker to the Boss?
Ah, y, por lo que vale, BossCom está escrito en C# y WorkerCom está escrito en ATL C++, pero tomaré las soluciones escritas en VB, Scala, Lisp o cualquier otra cosa. Me imagino que puedo traducir la idea central. :-)
¿Esto no sólo el trabajo? Admito que no he hecho mucho con COM, pero el hecho de que esté fuera de proceso es que ya está logrando que COM coordine las llamadas a través de los límites del proceso, ¿no es así? –
Correcto, para la mayoría de las cosas, pero IUnknown es solo un puntero, ¿verdad? El puntero "this" en WorkerCom no tendrá ningún significado en BossCom, ¿verdad? O el proceso de clasificación mantendrá el significado. Supongo que al menos debería intentarlo. –
Debería funcionar fuera de la plataforma dado que hay proxy/stubs o typelib para facilitar la clasificación. De hecho, el marshalling es exactamente para eso, para darle a un cliente un objeto falso ("proxy") que se refleja en el servidor. Funciona de forma transparente desde la perspectiva del código. – sharptooth