Announcement

Collapse
No announcement yet.

Wie ermittelt man, wieviele Clients mit dem COM-Objekt verbunden sind?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Wie ermittelt man, wieviele Clients mit dem COM-Objekt verbunden sind?

    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:
    Code:
      var svr : IUnknown;
            factory : IWFactory;
    
      factory:=CoWFactory.CreateRemote('B');
      svr:=factory.GetServer;
      factory:=NIL;
    Prozess B (Factory):

    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.
Working...
X