Ho un server COM fuori processo che deve tenere d'occhio le cose. Questo server viene eseguito come servizio ed è, internamente, un singleton. Per motivi di semplicità, lo chiamerò BossCom.Come posso effettuare il marshalling di un riferimento COM fuori processo tra i limiti del processo?
Ho un altro server COM out-of-process che è un lavoratore. È, per la stabilità del sistema, un server monouso (nel senso che se crei 2 WorkerCom, ci sono 2 WorkerCom.exe in esecuzione). Per motivi di semplicità, lo chiamerò WorkerCom.
WorkerCom può essere avviato da qualsiasi cosa, anche da solo se qualcuno lo esegue tramite la riga di comando con gli argomenti della riga di comando destra.
L'obiettivo generale è che BossCom sappia cosa sono WorkerComs in giro, sanno cosa stanno facendo e sono in grado di impartire ordini (pausa, arresto, accelerazione, ecc.).
Il mio pensiero iniziale è che ogni volta che WorkerCom inizia, CoCreateInstance è un BossCom e chiama BossCom-> RegisterWorker (IUnknown me). Poi, quando WorkerCom sta per chiudere, chiamerà BossCom-> UnregisterWorker (IUnknown me). BossCom potrebbe QueryInterface IUnknown per IWorkerCom ed essere in grado di emettere comandi.
Ciò funzionerebbe benissimo se tutti questi oggetti COM fossero nello stesso processo, ma non lo sono. Ho pensato di utilizzare GlobalInterfaceTable, ma è globale solo nel senso di un singolo processo.
Ho trascorso alcuni giorni a cercare questo e sono in perdita. Forse sono a visione di tunnel.
Come è possibile effettuare il marshalling di un riferimento a un oggetto com dal Worker al Boss?
Oh, e, per quello che vale, BossCom è scritto in C# e WorkerCom è scritto in ATL C++ ma prenderò soluzioni scritte in VB, Scala, Lisp o altro. Immagino di poter tradurre l'idea principale. :-)
Questo non solo di lavoro? Devo ammettere che non ho fatto molto con la COM, ma il fatto che sia fuori processo è che la COM sta già facendo il marshalling attraverso i confini del processo, vero? –
Giusto, per la maggior parte delle cose, ma IUnknown è solo un puntatore, giusto? Il puntatore "this" in WorkerCom non avrà alcun significato in BossCom, giusto? O il processo di marshalling manterrà il significato. Credo che dovrei almeno provarlo. –
Dovrebbe funzionare off-the-shelf dato che ci sono proxy/stub o typelib per facilitare il marshalling. In realtà, il marshalling è esattamente per questo: dare a un client un oggetto falso ("proxy") che viene specchiato sul server. Funziona in modo trasparente dalla prospettiva del codice. – sharptooth