Announcement

Collapse
No announcement yet.

COMServer bzw. Taks wird nicht richtig beendet

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

  • COMServer bzw. Taks wird nicht richtig beendet

    Hallo,
    in einem Com-Client erzeuge ich mittels folgender Anweisung eine Server-Instanz, falls der Server noch nicht laueft:

    <PRE>
    (* Interface - MSGServer-Objekt erzeugen und/oder verbinden *)
    GetActiveObject(CLASS_MsgServer, nil, aSrv);
    if Assigned(aSrv) then<br>
    begin<br>
    ConnectMsgServer := aSrv as IMsgServer;
    IF DebugMod then
    ShowMessage('Connect mit laufender Instanz')
    end
    else
    begin
    ConnectMsgServer :=CoMsgServer.Create;//Create; //Remote(IpList[i]);
    IF DebugMod then
    ShowMessage('Connect mit neuer Instanz')
    end;
    </PRE>

    <p>
    ConnectMsgServer ist eine Privte-Instanz, die auf jeden Fall nach dem schliessen des Clients freigegeben wird.
    Der Client ist z.Zt. auch der einzigste der auf diesen Server zugreift.
    Der Start und die Schnittstellen funktionieren auch einwandfrei. Da der Server ein kleines angehängtest Formular enthält und der ausgeben wird, was er so alles macht, kann man auch beobachgten, dass zumindest dieses Formular zu macht, sobald der Client beendet wird.
    Leider verschwindet der Task nicht aus der Taskleiste.
    Wird der Client neu gestartet wird einfach ein neuer Task aufgemacht in dieser nun als Server-Instanz registriert.
    </p>

    Warum wird der Task nicht beendet? <br>
    Laesst sich dies programmtechnisch beheben, und wenn ja wo? Serverseitig oder Clientseitig? <br>
    Oder handelt es sich um ein Rechte-Problem? <br>
    Ich verwende Delphi6 Prof Updpack 2
    Gruss Frank

  • #2
    Hallo,

    &gt;Warum wird der Task nicht beendet?

    dafür kann es mehrere Gründe geben: <br>
    1. Der Server hat sich über die Win32-API-Funktion <i>CoAddRefServerProcess</I> selbst gesperrt. <br>
    2. Der Server stellt ein Event-Interface zur Verfügung, an das sich ein Client aufgeschaltet hatte und das nicht korrekt abgeräumt wurde.<br>
    3. Eine Exception im COM-Server sorgt dafür, dass das Aufräumen bei Freigeben des letzten Interface-Zeigers vom Client nicht korrekt abläuft.

    Über die API-Funktionen <i>CoReleaseServerProcess</i> und <i>CoDisconnectObject</i> kann ein COM-Server mit der "Brechstange" alle Verbindungen kappen, so dass er entsorgt werden kann. Allerdings ist so etwas für "Notfälle" gedacht, sollte aber in einer regulären Anwendung nicht auftauchen :-

    Comment


    • #3
      Hallo,
      <P>
      das Problem hatte sich zunächst dadurch erledigt, dass an einer Bestimmten Stelle eine zusaetzlich Uniz eingebunden wurde, die da nichts zu suchen hatte.
      </P>
      <P>
      Allerdings taucht ein aehnliches wieder auf einem anderem Rechner auf, der statt mit XP-Professionel mit XP-home-edition ausgerüstet ist. Hier jedoch derart dass der Server auch nach dem direkt-Aufruf und beenden nicht richtig geschlossen wird (Task bleibt im Taskmanager), obwohl ich dort als Admin lokal eingeloggt bin.
      <PRE>
      Application.Run;
      MessageDlg('Sauber beendet',mtInformation,[mbOK] ,0);
      end.
      </PRE>
      wird ganz durchlaufen
      </P>
      <P>
      Ich hab darauf mal gedebuggt, es wurden keine Excetopions ausgeloest und der Debug hat auch das Hauptprogramm scheinbar sauber beendet-es was garantiert kein client offen.
      </P>
      <P>
      Der Server stellt in meinem Fall lediglich 4-Funktionen zur verfügung.
      Ist hier bekannt, dass sich XP-home-edition derart anders verhält?
      </P>
      Gruss Fran

      Comment


      • #4
        Hallo,

        &gt;..Ist hier bekannt, dass sich XP-home-edition derart anders verhält?

        Meines Wissens nicht.

        Bei derartigen Problemen würde ich zum Test ein eines Minimal-Projekt beginnen und dort prüfen, ob sich das Problem jederzeit reproduzieren lässt. Wenn ja, wie sieht dieses Beispiel (Server + Client) im Sourcecode aus (inkl. Typbibliothek in der IDL-Syntax)

        Comment


        • #5
          Hallo,
          Das Projekt ist Serverseitig fast minimal. Das anghängte Formular kann imho nichts mit dem fehlenden beenden zu tun haben, die Close-Routine wird vollständig durchlaufen.
          Ich habe nun folgendes festgestellt:<br>
          XP-Professionel:<br>
          Wenn:
          <PRE>
          1. Server wird geändert
          2. Server wird aus IDE gestartet (incl. kleines Formular)
          -> Server wird automatisch registriert
          3. Server wird über Formlar nicht sauber geschlossen
          </PRE>
          dann hab ich einfach mal folgden Prozedur versucht:
          <PRE>
          1. DComCNFG->...->DCOMKonfiguration SErverObjekt per DEL-Taste entfernt
          2. Neuer Compilierter Server gestartet (exe)
          3. Server Beendet, auch in Taskmanager
          4. DComCNFG->...->DCOMKonfiguration aufgerufen-dabei wird abgefragt ob die CLSID in die entsprechende Stelle eingetragen werden soll (Ja)
          5. Client gestartet->Server laueft auch hoch
          6. Client beendet ->Server-Formular verschwindet (task in Taskmanger nicht)
          7. Client gestartet->Server laueft auch hoch in zweitem Task
          </PRE>

          Danach habe ich einen Neustart des Rechners gemacht und nun funzt es auch mit sauber mit dem beenden.
          Die Schnittstellen wurden vom Client bis dato noch gar nicht benutzt, lediglich das Server-Objekt erzeugt (s.o.)
          Ich frage mich nun noch was beim Neustarten noch grundsätzlich anderst gemacht wird.
          Gruss Frank

          &#10

          Comment


          • #6
            Hallo,

            &gt;..-> Server wird automatisch registriert

            was passiert, wenn die binäre .TLB-Datei des Projekts von Hand über das Borland-Tool <b>tregsvr.exe</b> registriert wird? Wenn dieser Aufruf "hängenbleibt" oder sonst irgend etwas "unnormales" passiert, scheint die Registry dieses Rechners in der Struktur beschädigt zu sein ??

            Comment

            Working...
            X