Announcement

Collapse
No announcement yet.

COM-Server als normale Applikation starten?

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

  • COM-Server als normale Applikation starten?

    Herr Kosch !!!!
    Danke
    Sie sind der Beste :

  • #2
    COM-Server als normale Applikation starten?

    Hallo,
    ich möchte gern einen COM-Server so starten, wie es z.B. mit Word möglich ist, d.h. Word läuft nach dem Start über COM auch dann noch, wenn sich das aufrufende Programm beendet hat und Word kann vom Anwender problemlos beendet werden, auch wenn das aufrufende Programm noch läuft. Mein Delphi-COM-Server beendet sich automatisch, wenn die Interface-Variable nicht mehr gültig ist und wenn ich ihn beenden möchte, wenn das Client-Programm noch läuft, erscheint die Meldung "...mindestens ein Client verweist noch auf diese Objekte...". Ist das eine andere Art der Erzeugung eines COM-Servers?

    Comment


    • #3
      Hallo,

      über die Win32-API-Funktion <b>CoAddRefServerProcess</b> darf sich ein Local Server selbst sperren, so dass das Programm auch dann noch weiterläuft, wenn der letzte Client seinen letzten Interface-Zeiger freigibt:
      <pre>
      unit VBSCallDelphiForm2_Impl;

      interface

      uses
      ComObj, ActiveX, VBSCallDelphiForm2_TLB, StdVcl;

      type
      TVBS_Call_DelphiForm = class(TAutoObject, IVBS_Call_DelphiForm)
      protected
      procedure FormClose; safecall;
      procedure FormShow; safecall;
      public
      procedure Initialize; override;
      end;

      implementation

      uses ComServ, VBSCallDelphiForm2_Frm;

      procedure TVBS_Call_DelphiForm.Initialize;
      begin
      inherited;
      CoAddRefServerProcess;
      end;

      procedure TVBS_Call_DelphiForm.FormClose;
      begin
      Form1.Release;
      end;

      procedure TVBS_Call_DelphiForm.FormShow;
      begin
      Form1 := TForm1.Create(nil);
      Form1.Show;
      end;

      initialization
      TAutoObjectFactory.Create(ComServer, TVBS_Call_DelphiForm, Class_VBS_Call_DelphiForm,
      ciMultiInstance, tmApartment);
      end.
      </pre&gt

      Comment


      • #4
        Danke Herr Kosch, das hat mir sehr geholfen

        Comment


        • #5
          Hallo Herr Koch,
          das funktioniert super mit Win85/98/ME. Unter WINNT oder Win2000 funktuioniert es leider so, daß ein neues Task gestartet wird. Wenn ich von 3 client-Rechner den gleichen OLE-Server(EXE) aufrufe, werden in dem Server-Rechner gleichzeitig 3 Tasks gestartet.
          Können Sie mir weiter helfen ????

          Comment


          • #6
            Hallo,

            wenn der DCOM-Server in der Voreinstellung (<i>Identität: Benutzer, der die Anwendung startet</i>) betrieben wird, <b>muss</b> NT/2000 für jeden Client eine neue (eigene) Instanz starten. Über das Tool DCOMCNFG sollte der DCOM-Server auf den Eintrag <i>Identität: Dieser Benutzer</i> konfiguriert werden (d.h. alle Clients arbeiten mit einem DCOM-Server, der unter einem eigenen fest zugewiesenen Benutzerkonto arbeitet)

            Comment


            • #7
              Hallo Herr Kosch,

              mit WINNT Ich habe eine Fehlermeldung erhalten " Interface nicht unterstützt ".

              Die Gleiche .EXE unter Win2000 funktioniert einwandfrei.

              Ich habe per Dcomcfg in WINNT verschiedene Einstellungen durchgeführt, aber die Meldung ist trotzdem da.

              Können Sie mir weiter helfen. In Ihrem Buch habe ich auch nachgeschlagen, komme trotzdem nicht weiter.

              Ich bin Ihen sehr dankbar für Ihre Antwort.

              Ngockhanh Le
              [email protected]

              Comment


              • #8
                Hallo,

                sind auf dem NT-Rechner auch alle zusätzlichen Typbibliotheken registriert, die vom eigenen COM-Objekt eingebunden werden (siehe Registerseite <i>Verwendet</i> beim Typbibliothek-Editor)

                Comment


                • #9
                  Hallo,<p>
                  noch mal zum Thema CoAddRefServerProcess :
                  Die (oben beschriebene) gewollte Funktionalität möchte ich nun nicht immer haben. Word kann ich ja mit "Quit" aus meinem Programm heraus auch beenden. Aber solange ich in meinem Client-Programm meinen COM-Server anspreche, kann ich aus dem Client-Programm heraus nicht den COM-Server beenden, es kommt die Meldung "...mindestens ein Client verweist noch auf diese Objekte...".
                  Nun könnte ich eine andere Schnittstelle für den "stillen" Aufruf entwerfen, in der ich nicht CoAddRefServerProcess verwende, aber gibt es da vielleicht eine elegantere Variante

                  Comment


                  • #10
                    Hallo,

                    Microsoft hat für diese Aufgabe die API-Funktion <b>CoDisconnectObject</b> vorgesehen, die <b>nicht</b> vom Client, sondern nur vom Server selbst aufgerufen werden sollte. In der Hilfe des Platform SDK liest sich das so: "<i>An object's client does not call CoDisconnectObject to disconnect itself from the server (clients should use IUnknown::Release for this purpose). Rather, an OLE server calls CoDisconnectObject to forcibly disconnect an object's clients, usually in response to a user closing the server application.</i>"

                    Comment


                    • #11
                      Danke Herr Kosch,<p>
                      Sie haben mich auf die richtige Spur gebracht. Folgende Methode beendet einen mittels CoAddRefServerProcess "losgelösten" Server:
                      <pre>
                      procedure TMyInterfaceObject.Quit;
                      begin
                      CoReleaseServerProcess;
                      CoDisconnectObject(Self, 0);
                      end;
                      </pre>
                      CoDisconnectObject allein reichte nicht

                      Comment

                      Working...
                      X