Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Gleichen Dienst mehrfach installieren -> Name? (https://www.delphipraxis.net/184730-gleichen-dienst-mehrfach-installieren-name.html)

Captnemo 17. Apr 2015 08:30

Gleichen Dienst mehrfach installieren -> Name?
 
Hi,

ich will einen Dienst mehrfach auf dem gleichen Rechner installieren.
Nun gibt es je TService.Displayname und TService.Name, die ich während der Entwicklung festlege, und die ja bei der Installation als Anzeigename und Dienstname einträgt, was natürlich schlecht ist.

Jetzt könnte man ja die Installation mit einem zusätzlichen Parameter aufrufen, der dann den Dienstnamen und den Anzeigename für den jeweiligen Dienst anpasst.

Muss aber dann der Dienst diese Informationen (Dienstname und Anzeigename) beim Starten auch jedes mal haben, damit er gestartet werden kann? Ich nehme mal an ja. Dann müsste man ja nach der Installation in die Dienste gehen und den Aufruf manuell anpassen, oder trägt er das selber gleich mit ein?

Und welchen Einfluss hat das Ändern von TService.Name auf den Ablauf des Services?

Sir Rufo 17. Apr 2015 08:38

AW: Gleichen Dienst mehrfach installieren -> Name?
 
Der Dienst selber braucht den Namen nicht zum Starten, der ServiceController benötigt den schon, sonst weiß er nicht, welchen er starten soll

Captnemo 17. Apr 2015 08:47

AW: Gleichen Dienst mehrfach installieren -> Name?
 
ja, aber ist es wichtig den Namen später nach der Installation auch jedes Mal auf den gleichen zu setzen den man während der Installation verwendet hat, oder ist das dann egal?

[Edit] hab grad deine Antwort nochmal gelesen.
Also muss ich das so verstehen, dass er den gleichen Namen doch jedesmal benötigt. Aber wie macht man das am geschicktesten? Über einen Startparameter?

himitsu 17. Apr 2015 08:55

AW: Gleichen Dienst mehrfach installieren -> Name?
 
Lösungen, denn Delphi-Services sind da echt besch* implementiert: (vieles ist hartgecodet und lässt sich nicht anpassen)
  • Entweder mehrere Verzeichnisse und eine INI im Programmverzeichnis, über welche der nötige Service.Name und Service.DisplayName (Name + '_Display') ermittelt wird.
  • Oder über StartParameter (bei Installieren einen Namen angeben), zuweisen und nach dem Installieren durch den Service (OnAfterInstall) den ImagePath um den Parameter erweitern, da man sonst scheinbar nitgendwo rausbekommen kann, über welchen Registryeintrag man gestartet wurde und mit welchem Namen man dann weiter machen soll.

Alternative Lösung:
Die Service-Implementation von Fremdanbietern (gibt es bestimmt irgendwo etwas ... man kann es ja fast nur noch besser machen)

Captnemo 17. Apr 2015 09:06

AW: Gleichen Dienst mehrfach installieren -> Name?
 
Zitat:

Zitat von himitsu (Beitrag 1298117)
  • Entweder mehrere Verzeichnisse und eine INI im Programmverzeichnis, über welche der nötige Service.Name und Service.DisplayName (Name + '_Display') ermittelt wird.
  • Oder über StartParameter (bei Installieren einen Namen angeben), zuweisen und nach dem Installieren durch den Service (OnAfterInstall) den ImagePath um den Parameter erweitern, da man sonst scheinbar nitgendwo rausbekommen kann, über welchen Registryeintrag man gestartet wurde und mit welchem Namen man dann weiter machen soll.

Den ersten Vorschlag hatte ich auch schon im Hinterkopf.
Die zweite Lösung gefällt mir aber noch besser, da ich dann nicht abhängig von irgendwelchen Inidateien bin.

Eigentlich schade, dass das so unglücklich gelöst ist, aber solange es einen Workaround gibt. Sind ja nur ein paar Zeilen Code.

Noch eine andere Frage: Gibt es eigentlich irgendeine Beschränkung bezüglich der Länge der Parameter? Ich würde nämlich gerne eine GUID verwenden.

Sir Rufo 17. Apr 2015 09:09

AW: Gleichen Dienst mehrfach installieren -> Name?
 
Hier mal einen Service, den du mit mehreren Namen installieren kannst
Delphi-Quellcode:
unit Service.Main;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.SvcMgr, Vcl.Dialogs;

type
  TServiceName = class( TService )
    procedure ServiceCreate( Sender: TObject );
    procedure ServiceAfterInstall( Sender: TService );
  private
    FName: string;
  public
    function GetServiceController: TServiceController; override;
    {Public-Deklarationen}
  end;

var
  ServiceName: TServiceName;

implementation

{$R *.dfm}

uses
  System.Win.Registry;

procedure ServiceController( CtrlCode: DWord ); stdcall;
begin
  ServiceName.Controller( CtrlCode );
end;

function TServiceName.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;

procedure TServiceName.ServiceAfterInstall( Sender: TService );
var
  reg: TRegistry;
begin
  if FName <> '' then
    begin
      reg := TRegistry.Create;
      try
        reg.RootKey := HKEY_LOCAL_MACHINE;
        if reg.OpenKey( 'SYSTEM\CurrentControlSet\Services\' + Self.Name, True ) then
          begin
            reg.WriteExpandString( 'ImagePath', ParamStr( 0 ) + ' -name ' + FName );
            reg.CloseKey;
          end;
      finally
        reg.Free;
      end;
    end;
end;

procedure TServiceName.ServiceCreate( Sender: TObject );
begin
  if FindCmdLineSwitch( 'name', FName ) and (FName <> '') then
    begin
      Self.DisplayName := Self.DisplayName + '(' + FName + ')';
      Self.Name := Self.Name + '_' + FName;
    end;
end;

end.
Installieren mit
Code:
myservice.exe -install [-name <service-name-addon>]
und deinstallieren eben analog mit
Code:
myservice.exe -uninstall [-name <service-name-addon>]
PS Das Verwenden von MagicValues möge man mir hier nachsehen und bitte selber korrigieren :)

Dalai 17. Apr 2015 10:12

AW: Gleichen Dienst mehrfach installieren -> Name?
 
Es wurde noch nicht gesagt, daher eine Ergänzung von mir: Wichtig ist, dass der Dienstname eindeutig ist, denn anhand desselben arbeitet der Service Control Manager (SCM). Der Display Name kann identisch sein, weil dieser nur der Anzeige dient.

MfG Dalai

Sir Rufo 17. Apr 2015 10:13

AW: Gleichen Dienst mehrfach installieren -> Name?
 
Zitat:

Zitat von Dalai (Beitrag 1298155)
Der Display Name kann identisch sein, weil dieser nur der Anzeige dient.

Leider nein, auch der muss eindeutig sein, sonst gibt es eine Fehlermeldung :)

Dalai 17. Apr 2015 10:32

AW: Gleichen Dienst mehrfach installieren -> Name?
 
Zitat:

Zitat von Sir Rufo (Beitrag 1298157)
Zitat:

Zitat von Dalai (Beitrag 1298155)
Der Display Name kann identisch sein, weil dieser nur der Anzeige dient.

Leider nein, auch der muss eindeutig sein, sonst gibt es eine Fehlermeldung :)

Hoppla. Ich sollte öfter testen, bevor ich etwas schreibe (noch dazu, weil ich mich seit Monaten mit Diensten beschäftige). Ich ging tatsächlich davon aus, dass das geht. Stattdessen kommt die Meldung vom System
Zitat:

System Error. Code: 1078.

Der Name wird bereits als Dienstname oder als Dienstanzeigename verwendet.
:shock:
Irgendwie sinnfrei, sowohl Service Name als auch Display Name als Identifikationsmerkmal zu benutzen. Naja, MS wird seine Gründe haben, auch wenn diese nicht ersichtlich sind. Vorteil davon ist aber, dass man bei net start/stop auf einer CMD auch den Display Name benutzen kann, ohne den Dienstnamen kennen zu müssen (der zumindest mir oft nicht einfällt).

MfG Dalai

himitsu 17. Apr 2015 10:36

AW: Gleichen Dienst mehrfach installieren -> Name?
 
Die Hilfe von
Delphi-Quellcode:
net start ...
meint, daß man ihm den Dienstnamen geben soll, aber wenn man sich die vorgeschlagenen Namen ansieht, dann erkennt man, daß der den Displaynamen meint.
Wenn ich es richtig in Erinnerung hab, dann nimmt der Beides an und demnach erklärt sich auch, warum beide Namen (Name und DisplayName) jeweils eindeutig sein müssen.

Captnemo 17. Apr 2015 10:40

AW: Gleichen Dienst mehrfach installieren -> Name?
 
Zitat:

Zitat von Sir Rufo (Beitrag 1298157)
Zitat:

Zitat von Dalai (Beitrag 1298155)
Der Display Name kann identisch sein, weil dieser nur der Anzeige dient.

Leider nein, auch der muss eindeutig sein, sonst gibt es eine Fehlermeldung :)

Selbst wenn's ginge, wär's ja blöd. Wie sollte man die dann noch in der MMC unterscheiden können.

taveuni 17. Apr 2015 12:52

AW: Gleichen Dienst mehrfach installieren -> Name?
 
Wozu würde man einen Dienst mehrfach installieren wollen? Sieht nach Designfehler aus.

Sir Rufo 17. Apr 2015 13:19

AW: Gleichen Dienst mehrfach installieren -> Name?
 
Zitat:

Zitat von taveuni (Beitrag 1298216)
Wozu würde man einen Dienst mehrfach installieren wollen? Sieht nach Designfehler aus.

Das erzähl mal Microsoft (z.B. SQL-Server), Oracle (z.B. MySQL-Server), usw.

Es gibt dafür durchaus gute Einsatzgründe für diese Named Services.

taveuni 17. Apr 2015 13:28

AW: Gleichen Dienst mehrfach installieren -> Name?
 
Ich habe SQL Server, Webserver usw. mal stillschweigend ausgeklammert da ich nicht davon ausgegangen bin dass der Ersteller bezüglich Anforderungen an Anzahl Threads, Clientverbindungen usw. die Frage nach einer Mehrfachinstallation gestellt hat. Wir haben hier auch schon einige Multitier Anwendungen geschrieben mit tausenden von Clients auf einen Serverdienst und standen noch nie vor dem Problem. Aber vermutlich gibt es ja andere Gründe dafür. Deshalb auch meine Eingangsfrage gefolgt von der zugegeben provokativen Bemerkung von wegen Designfehler.

jaenicke 17. Apr 2015 13:36

AW: Gleichen Dienst mehrfach installieren -> Name?
 
Zitat:

Zitat von taveuni (Beitrag 1298216)
Wozu würde man einen Dienst mehrfach installieren wollen? Sieht nach Designfehler aus.

Zum Beispiel weil ein Server so für mehrere Kundenumgebungen als Host benutzt werden kann. Es existieren bei uns z.B. mehrere Verzeichnisse für verschiedene Filialen, auf denen jeweils ein Server läuft.

Theoretisch könnte man so etwas mit mehr Aufwand auch in eine einzelne Exe packen, aber das erweist sich in der Praxis oft als nicht sinnvoll.

// EDIT:
Ist der Tab schon so lange offen? O.O

himitsu 17. Apr 2015 14:16

AW: Gleichen Dienst mehrfach installieren -> Name?
 
Der 32-Bit Service ist bissl klein, da klappt es nicht, daß er sich bei uns gleichzeitig um zwei/mehr Datenbanken/Dateimanagements kümmert.
Und zusätlich, wenn einer abraucht, dann läuft der Andere weiter.

Bisher hatten wir das über mehrere Installationspfade geregelt, aber das ist bei Updates einfach nur unschön und fehleranfällig (da vergisst man schnell mal Einen upzugraden).

Zitat:

Zum Beispiel weil ein Server so für mehrere Kundenumgebungen als Host benutzt werden kann. Es existieren bei uns z.B. mehrere Verzeichnisse für verschiedene Filialen, auf denen jeweils ein Server läuft.
Ist bei einigen unserer Kunden ähnlich.

Oder Firma ging pleite und fängt neu. Da macht man einen radikalen Schnitt und setzt eine neue Umgegbung für die neue Firma auf,
vorallem da für die Buchhaltung, den Insolvenzverwalter usw. alte und neue Firma getrennt sein müssen und schwupps, so hat man alles doppelt, bis die alte Firma komplett abgewickelt ist.
Oder eben mehrere Filialen/Abteilungen, die in sich aber getrennt sind.

Captnemo 17. Apr 2015 16:11

AW: Gleichen Dienst mehrfach installieren -> Name?
 
Um ein bisschen mehr Licht in's Dunkel zu bringen:

Es handelt sich dabei um einen Dienst, der seriell angeschlossenen Grosswaagen ausliest, und die Gewichte und Waagenbenutzer in eine Datenbank schreibt. Weiterhin wird der Waagencontroller (Fremdfabrikat) aus der DB mit bestimmten Daten versorgt.

Natürlich hätte man das ganze jetzt auch mal locker in einen Dienst über mehrere Threads packen können, was ich auch in der 1. Lösung so realisiert hatte. Nun ist es aber so, dass bei der Kommunikation zu den Waagen manches mal Probleme auftreten können (Anschluss erfolgt über virtuelle Com-Schnistelle<->TCP<->IP-Seriell-Interface) und auch die Waagencontroller kommen gerne mal aus dem Tritt (was aber Gott sei Dank nicht soo häufig auftritt).
Weiterhin sind die Waagen teilweise auch noch über verschiedene Server angeschlossen, und nicht alle immer gleichzeitig in Betrieb.
Kurz und gut, um also von vorneherein das ganze sauber von einander zu trennen und um zu vermeiden, dass eine Fehlfunktion einer Waage im schlimmsten Fall andere Waagen in der Kommunikation stört, habe ich mich dafür entschieden, je Waage ein Dienst.
Mal abgesehen davon ist es für den Kunden später einfacher, einen bestimmten Dienst neuzustarten, ohne dabei die anderen Wiegevorgänge zu beeinträchtigen.

Das kann man als Designfehler bezeichnen....muss man aber nicht. Für jedes Problem gibt es verschiedene Lösungsansätze, und je nach Überlegungen und Schwerpunkte kann man auch verschiedene Lösungen favorisieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:47 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz