Delphi-PRAXiS
Seite 1 von 2  1 2   

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:36 Uhr.
Seite 1 von 2  1 2   

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