Ich habe einen Out-of-Process-COM-Server, der die Dinge im Auge behalten muss. Dieser Server wird als Dienst ausgeführt und ist intern ein Singleton. Der Einfachheit halber werde ich ihn BossCom nennen.Wie kann ich eine prozessexterne COM-Referenz über Prozessgrenzen hinweg bereitstellen?
Ich habe einen anderen Out-of-Process-COM-Server, der ein Arbeiter ist. Aus Gründen der Systemstabilität handelt es sich um einen Single-Use-Server (das heißt, wenn Sie 2 WorkerCom erstellen, werden 2 WorkerCom.exe ausgeführt). Der Einfachheit halber werde ich ihn WorkerCom nennen.
WorkerCom kann von jedem gestartet werden, auch von selbst, wenn jemand ihn über die Befehlszeile mit den richtigen Befehlszeilenargumenten ausführt.
Das übergeordnete Ziel ist, dass BossCom weiß, welche WorkerComs in der Nähe sind, was sie tun und in der Lage sind, ihnen Befehle zu erteilen (Pause, Stopp, Hochfahren, usw.).
Mein erster Gedanke daran wäre, dass wann immer WorkerCom startet, er CoCreateInstance ein BossCom und BossCom-> RegisterWorker (IUnknown me) aufrufen würde. Wenn dann die WorkerCom kurz vor dem Herunterfahren steht, ruft sie BossCom-> UnregisterWorker (IUnknown me) an. BossCom konnte das IUnknown für IWorkerCom mit QueryInterface abfragen und Befehle ausgeben.
Das würde gut funktionieren, wenn alle diese com-Objekte in demselben Prozess sind, aber sie sind nicht. Ich habe über die Verwendung von GlobalInterfaceTable nachgedacht, aber es ist nur global im Sinne eines einzelnen Prozesses.
Ich habe ein paar Tage damit verbracht, dies zu erforschen und bin ratlos. Vielleicht bin ich Tunnel-Visoned.
Wie kann ich einen Verweis auf ein com-Objekt vom Arbeiter zum Chef marshalieren?
Oh, und was es wert ist, ist BossCom in C# geschrieben und WorkerCom ist in ATL C++ geschrieben, aber ich nehme Lösungen in VB, Scala, Lisp oder irgendetwas geschrieben. Ich denke, ich kann die Kernidee übersetzen. :-)
Ist das nicht funktionieren? Ich gebe zu, ich habe mit COM nicht viel getan, aber der Hauptgrund dafür ist, dass Sie bereits COM bekommen, um Anrufe über Prozessgrenzen zu verteilen, nicht wahr? –
Richtig, für die meisten Dinge, aber IUnknown ist nur ein Zeiger, oder? Der "This" -Zeiger in WorkerCom wird in BossCom keine Bedeutung haben, richtig? Oder wird der Marshalling-Prozess die Bedeutung behalten? Ich denke, ich sollte es zumindest versuchen. –
Es sollte von der Stange funktionieren, vorausgesetzt, es gibt Proxy/Stubs oder Typelib, um das Marshalling zu erleichtern. Tatsächlich ist das Marshalling genau das - um einem Client ein gefälschtes Objekt ("Proxy") zu geben, das auf den Server gespiegelt wird. Es funktioniert transparent aus der Code-Perspektive. – sharptooth