Wie ein (Delphi) OLE-Server mit einem zweiten Client wiederverwenden?
-
20-08-2019 - |
Frage
Ich schrieb einen OLE-Automation-Server (mit Delphi). Ich beginne in der Regel den OLE-Server manuell und sie als normale Anwendung verwenden. Ich von Zeit zu Zeit einen Client starten, die automatisch eine Verbindung mit dem vorhandenen OLE-Server.
Wenn ich den Client beenden, wird der Server nicht beenden (zumindest wenn es manuell, bevor der Client gestartet wurde), aber es wird andere OLE-Verbindung nicht akzeptieren. einen anderen Client starten einen neuen Server auslösen, anstatt die erste wiederzuverwenden.
Wie kann ich den gleichen Server mit dem zweiten Client wiederverwenden?
(Frage bearbeiten es richtig zu formulieren. In der ursprünglichen Version wurde ich gefragt, wie Sie den Server zu verhindern, beendet, das war keine gute Formulierung)
Lösung
Es gibt eine Einstellung "Instancing" im COM-Objekt-Assistenten in Delphi. Zulässige Werte sind "intern", "Multiinstanz", "Single Instance".
Ich wollte den gleichen COM-Server mit mehreren Clients wieder zu verwenden. Deshalb habe ich „Single Instance“ gewählt und obwohl das würde ich eine einzelne Instanz meiner Server-Anwendung für alle Kunden. Aber ich habe mich getäuscht. „Single Instance“ bedeutet, dass es nur eine Instanz eines COM-Anschlusses in meinem Server sein. Ich habe „Multiple Instance“ gewählt werden, sollten mehrere COM-Anschluss (aber einer nach dem anderen, nicht gleichzeitig) in dem gleichen Server.
ermöglichenIch denke, dass die Worte in den COM-Objekt-Assistenten in Delphi verwendet werden, sind nicht wirklich klar. Anstelle von "Multiinstanz", "Single Instance", wäre es besser, "Mehrweg" zu haben und "single use" wie in dieser Artikel über OLE-Server und VB .
Andere Tipps
Im Client Verwendung
ConnectKind := ckRunningOrNew
und ein vorhandener Server verwendet werden soll, statt einen neuen zu starten.
Es sollte möglich sein, den Referenzzähler des Automatisierungsservers zu erhöhen, wenn Sie den Server als normale Anwendung zu starten. Was Sie erreichen wollen, ist zweifach:. Der Server Lassen Sie nicht kündigen, wenn der Client beendet wird, und lassen Sie auch der Server nicht beenden, wenn Sie Ihre Haupt-Formular zu schließen, während der Client noch läuft
Erstellen Sie das COM-Objekt als Singleton. Und auch das Objekt Laufen zu halten, selbst nachdem der Kunde geht, setzen zusätzliche Referenzzähler. Gehen Sie einmal diesen Aufruf QI innerhalb des COM-Objekts.
Ein Hinweis zu der früheren Post ‚Es gibt eine Einstellung‚Instancing‘im COM-Objekt-Assistenten in Delphi.‘ : Mindestens in C ++ Builder, kann diese Option einfach geändert werden danach in den Projekteinstellungen, Punkt "ATL". Dieses Element erscheint nur dort für eine EXE-ole-Server, nachdem Sie das erste Automatisierungsobjekt, um es hinzugefügt haben.