Ist es möglich, mehrere Instanzen derselben Delphi-Dienstanwendung zu installieren?

8

Ich habe eine in Delphi erstellte Dienstanwendung, die großartig funktioniert. Es macht genau das, was ich will und alles ist glücklich. Alles ist in Ordnung, bis ich zwei (oder mehr) Instanzen dieses Dienstes auf einem einzelnen Rechner ausführen möchte. Da der Name des Dienstes fest in das Programm codiert ist (über die Name-Eigenschaft des Dienstes), kann ich den Dienst nur einmal auf einem bestimmten Computer installieren. Wenn ich versuche, die Name-Eigenschaft zur Laufzeit zu ändern, reagiert der Dienst nicht, es sei denn, die Name-Eigenschaft ist auf dieselbe Eigenschaft festgelegt, die während der Entwurfszeit festgelegt wurde.

Ich habe einen Workaround dafür gemacht, bei dem der gesamte Code, der nicht direkt mit dem Dienststeuerungs-Manager interagiert, in separate Einheiten gekapselt ist. Dann schreibe ich ein separates Delphi-Projekt für jede Instanz, die ich von dem Dienst haben möchte, der gerade genug Code hat, um sich selbst zu starten und den Hauptcode zu starten.

Diese Methode ist meiner Meinung nach hässlich und ist sicherlich ineffizient. Es funktioniert in Ordnung für zwei Instanzen, aber dann brauchen wir eine dritte und eine vierte und ...

Gibt es eine Möglichkeit, dass ich meinen Code ändern kann, so dass ich nur ein Delphi-Projekt habe, das sich als mehrere Dienstinstanzen mit einer einfachen Laufzeiteingabe installieren und ausführen lässt (z. B. Befehlszeilenflag)?

Oder vielleicht eine breitere Frage: Gibt es einen "richtigen Weg", um das Ziel zu erreichen?

    
Scott W 04.03.2009, 21:44
quelle

5 Antworten

13

Sie haben nicht klargestellt, was Sie in der TService-Unterklasse zu ändern versucht haben.

Haben Sie einen "BeforeInstall" -Handler hinzugefügt?

Etwas wie:

%Vor%

Wenn Sie dies regelmäßig tun, müssen Sie die Unterklasse TService dazu veranlassen, dies im Konstruktor zu tun.

Sie sollten das gleiche auch in BeforeUninstall tun - zeigen Sie beide Ereignisse auf die gleiche Methode.

%Vor%     
Gerry Coll 04.03.2009, 23:16
quelle
3

Sie können Ihren Dienst intern mit mehreren Threads erstellen, wobei jeder wie seine eigene Version / Kopie des Dienstes agiert. Sie steuern es mit der Service Controller API, IIRC.

    
Ken White 04.03.2009 21:56
quelle
2

Nun ja, es ist möglich, mehrere Instanzen desselben Dienstes zu installieren, Sie müssen lediglich den Namen zur Installationszeit (nicht zur Laufzeit) dynamisch ändern, aber dies macht es nicht wünschenswert. (Es gibt einen Beispielcode für das Code-Projekt Ссылка )

Ich wäre jedoch geneigt, Ihre Herangehensweise zu überdenken. Service-Prozesse selbst sind eigentlich Singleton. Wenn Sie mehrere Instanzen eines Prozesses benötigen, sollte Ihr Service vielleicht nur die verschiedenen Prozesse steuern und verwalten, anstatt der Prozess zu sein .

    
Tim Jarvis 04.03.2009 22:01
quelle
0

Fügen Sie Ihren gesamten Code in eine Klasse ein, die von TThread erbt.

Wenn Ihr Dienst startet, liest er eine Nummer aus einer Einstellungsdatei oder aus der Registrierung und erstellt so viele Instanzen Ihrer Klasse.

Jede Instanz läuft unabhängig.

Um die Anzahl der ausgeführten Instanzen zu ändern, könnten Sie den Dienst herunterfahren, bearbeiten Sie die Einstellung (in einer Datei oder Registrierung) und starten Sie den Dienst neu.

    
Chapel 04.03.2009 23:45
quelle
0

Die angenommene Antwort oben war schrecklich hilfreich.

Code, den ich verwendet habe:

%Vor%

SaveRegSetting ist meine eigene Prozedur und FCommandLineOptions ist ein Objekt, das die Befehlszeilenparameter in Token behandelt.

    
cja 26.01.2010 10:45
quelle

Tags und Links