Wenn dies Ihr erster Besuch hier ist,
lesen Sie bitte zuerst die Hilfe - Häufig gestellte Fragen
durch. Sie müssen sich vermutlich registrieren,
bevor Sie Beiträge verfassen können. Klicken Sie oben auf 'Registrieren', um den Registrierungsprozess zu
starten. Sie können auch jetzt schon Beiträge lesen. Suchen Sie sich einfach das Forum aus, das Sie am meisten
interessiert.
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?
ü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;
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 ????
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)
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)
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
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>"
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