Ich habe drei Prozesse:
Prozess A: Server, implementiert COM-Objekt SVR
Prozess B: Server, implementiert COM-Objekt FACTORY
Prozess C: Client
Der Client erzeugt im Prozess B ein FACTORY-Objekt. Dieses besitzt eine Methode GetServer : IUnknown. Jetzt ruft der Client diese Methode auf und das FACTORY-Objekt erzeugt eine Instanz von SVR in Prozess A. Gleichzeitigt speichert das FACTORY-Objekt diese Referenz. Zustand also hinterher:
Client:
Prozess B (Factory):
Mein Problem ist die Referenzzählung!! Ich möchte auf der Serverseite (A) die Anzahl der mit dem Objekt verbundenen Prozesse ermitteln. Die Referenzzählung mit _AddRef und _Release funktioniert ja sinnvollerweise Prozessbezogen. Aber da muss es doch noch etwas anderes geben, denn die Freigabe des Serverobjektes erfolgt tatsächlich erst, wenn alle Referenzen verschwunden sind. Frage ich allerdings RefCount ab, so sieht die Sache so aus:
Client: RefCount=1;
Factory: RefCount=1;
Server: RefCount=4; // 2 hätte ich verstanden
Eine weitere Referenzierung innerhalbe des Clients erhöht zwar das RefCount im Clientprozess, nicht aber auf der Serverseite, dort bleibt RefCount, egal was man tut, konstant auf 4 stehen. D.h. wenn der Client folgendes macht:
var svr2 : IUnknown;
svr2:=svr; // nun Refcount auf 2 (für diesen Prozess!)
dann steht das Serverobjekt immernoch bei RefCount=4; und Nach
svr2:=NIL;
svr:=NIL;
ebenfalls.
Kann jemand helfen!??
PS: Wenn alle Objekte innerhalb eines Prozesses laufen, dann geht das mit der Referenzzählung natürlich.
Prozess A: Server, implementiert COM-Objekt SVR
Prozess B: Server, implementiert COM-Objekt FACTORY
Prozess C: Client
Der Client erzeugt im Prozess B ein FACTORY-Objekt. Dieses besitzt eine Methode GetServer : IUnknown. Jetzt ruft der Client diese Methode auf und das FACTORY-Objekt erzeugt eine Instanz von SVR in Prozess A. Gleichzeitigt speichert das FACTORY-Objekt diese Referenz. Zustand also hinterher:
Client:
Code:
var svr : IUnknown; factory : IWFactory; factory:=CoWFactory.CreateRemote('B'); svr:=factory.GetServer; factory:=NIL;
Code:
type TWFactory = class(TAutoObject, IWFactory) private FSVR : IWSVR; protected function GetServer: IUnknown; safecall; end; implementation function TWFactory.GetServer: IUnknown; begin FSVR:=CoWSVR.CreateRemote('A'); Result:=FSVR; end;
Mein Problem ist die Referenzzählung!! Ich möchte auf der Serverseite (A) die Anzahl der mit dem Objekt verbundenen Prozesse ermitteln. Die Referenzzählung mit _AddRef und _Release funktioniert ja sinnvollerweise Prozessbezogen. Aber da muss es doch noch etwas anderes geben, denn die Freigabe des Serverobjektes erfolgt tatsächlich erst, wenn alle Referenzen verschwunden sind. Frage ich allerdings RefCount ab, so sieht die Sache so aus:
Client: RefCount=1;
Factory: RefCount=1;
Server: RefCount=4; // 2 hätte ich verstanden
Eine weitere Referenzierung innerhalbe des Clients erhöht zwar das RefCount im Clientprozess, nicht aber auf der Serverseite, dort bleibt RefCount, egal was man tut, konstant auf 4 stehen. D.h. wenn der Client folgendes macht:
var svr2 : IUnknown;
svr2:=svr; // nun Refcount auf 2 (für diesen Prozess!)
dann steht das Serverobjekt immernoch bei RefCount=4; und Nach
svr2:=NIL;
svr:=NIL;
ebenfalls.
Kann jemand helfen!??
PS: Wenn alle Objekte innerhalb eines Prozesses laufen, dann geht das mit der Referenzzählung natürlich.