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)

War es hilfreich?

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öglichen

Ich 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.

(Ich habe auch gefragt, Autor von

Sie können auch versuchen, die Identität des Benutzers zu ändern, die den OLE-Server startet, wenn es sich um eine Exe und kein DLL ist, von dcomcnfg ausgeführt und die Auswahl Komponentendienste / Computer / Arbeitsplatz / DCOM-Konfiguration und die Auswahl des Servers.

Sie können mit ihm spielen, um müssen, kann ich nicht die Unterschiede zwischen ihnen erinnern alle, aber ich denke, „Interactive User“ sollte es tun.

scroll top