2008-12-26 11 views
6

Ich habe einen Depli-basierten Windows-Dienst, der bei der Installation einige Befehlszeilenargumente analysiert. Ich möchte, dass diese Argumente der Befehlszeile für Dienste hinzugefügt werden (ImagePath-Wert für die Registrierung), damit der Dienst immer mit ihnen gestartet wird.Delphi Windows Services Befehlszeilenargumente

Wie kann ich das erreichen?

Ich möchte die regedit wie folgt aussehen:
im Registrierungsschlüssel HKEY_LOCAL_MACHINE \ SYSTEM \ ControlSet001 \ Services \ MyService

  • ImagePath = C:\Path\to\my\service.exe -some -arguments

Dank

Update: Die Installation erfolgt mit >MyService.exe /install -some -arguments. Diese Argumente sind diejenigen, die ich in der Befehlszeile beibehalten möchte.

Update: Ich habe eine Lösung gefunden, indem ich direkt in die Registrierung geschrieben habe (siehe here), aber ich möchte immer noch eine elegantere Lösung, wie die Verwendung einiger TService-Eigenschaft oder etwas dieser Art. Vielen Dank!

+0

Wie erfolgt die Installation? –

Antwort

8

Ok, nach einigen Recherchen habe ich einen eleganten Ansatz aufgegeben und den direkten Weg eingeschlagen, direkt in die Registry zu schreiben.

Um die Dinge einfach zu machen, habe ich Folgendes getan: Ich speichere die Argumente, die ich in Variablen auf meinem TService übergeben wollte. Dann legte ich das AfterInstall-Ereignis fest, um die genaue Befehlszeile, die ich wollte, direkt in die Registrierung (unter Verwendung eines TRegistry-Objekts) zu schreiben.

uses Registry; 
procedure MyService.AfterInstall(Sender: TObject) ; 
var 
    reg:TRegistry; 
begin 
    reg := TRegistry.Create; 
    try 
    reg.RootKey := 'HKEY_LOCAL_MACHINE'; 
    if reg.OpenKey('SYSTEM\CurrentControlSet\Services\MyService', True) then 
    begin 
     reg.WriteExtendString ('ImagePath', ParamStr(0) + ' -some -arguments') ; 
     reg.CloseKey; 
    end; 
    finally 
    reg.Free; 
    end; 
end; 

Nicht die elegante Lösung, die ich suchte, aber es macht den Job.

Danke für die anderen Antworten durch!

0

Ich glaube nicht, dass Sie den Dienst mit ihnen starten können, aber wenn Sie diese Parameter in der Registrierung speichern, können Sie das Programm ändern, um zukünftige Starts immer gehen und greifen sie. (d. h. wenn ParamCount = 0, dann params aus der Registrierung abrufen)

+0

Mit diesen Parametern können Sie den Service sicher starten. Die Frage ist, wie das Installationsprogramm sie zur Registrierung hinzufügen kann. –

4

Dienstargumente können im Argument lpBinaryPathName an die CreateService-Funktion übergeben werden. In Delphis TService wird dies in TServiceApplication.RegisterServices.InstallService aufgerufen, das Sie (leicht) nicht überschreiben können.

Daher vermute ich, dass der einfachste Weg, dies zu tun ist, das TService.AfterInstall-Ereignis zu behandeln und die Registrierung selbst über ChangeServiceConfig zu aktualisieren.

0

Pablo, Ich hatte die gleiche Frage und konnte nichts finden und ging auch den Weg der Bearbeitung der Registrierung. Zusätzlich verwende ich benutzerdefinierte Aktionen auch, um zusätzliche Installationsverzeichnisse zu erstellen und Dateien zu kopieren (in C#). Ihr Vorschlag war hilfreich und ich habe aufgehört, nach einem "eleganten" Weg zu suchen. danke

2

Ich fand gerade etwas wenig überraschend, könnte es wert sein, zu teilen.folgende Möglichkeiten

können Sie Parameter angeben, für Windows-Dienste in (mindestens):

  1. Geben Sie es in dem Service Manager-GUI als "STARTPARAMTER".
  2. Direkt als Argumente an: sc.exe Your param1 param2
  3. es in der Registry in Eintrag Geben Sie ImagePath = .. \ YourService.exe param1 param2

In Delphi gibt es 2 Möglichkeiten Anwendung zur Abfrage/Serviceparameter:

  • System.ParamCount/System.ParamStr: Auf diese Weise erhalten Sie die Parameter von 3. oben.
  • TService.ParamCount/TService.Param []: Auf diese Weise erhalten Sie die Parameter 1. und 2. oben.
+0

1. Funktioniert nur, wenn Sie den Dienst vom Dienstmanager starten, er wird nicht beibehalten. –

+0

Wahr. Ich habe persistent die Parameter wie in der oben genannten Antwort (AfterInstall) beschrieben implementiert. Diese Antwort war nur als zusätzliche Information gedacht. – nang

2

Sie sollten den SCM-API verwenden, um einen Dienst richtig zu installieren und konfigurieren. SC.EXE ist eine Befehlszeilenschnittstelle zur SCM-API. Sie sollten die Registrierung nicht direkt in dieser Situation manipulieren, es funktioniert aber es hängt auch ab, welche Berechtigung das Dienstkonto hat. Wie auch immer ich frage mich, warum Sie Befehlszeilenargumente benötigen, wenn Sie sie in den Code einbetten - normalerweise werden diese Argumente außerhalb des Dienstes (von einem Installer, Konfigurator, was auch immer) gesetzt, um das Dienstverhalten zu ändern.

+0

Guter Punkt über Erlaubnis, hatte das nicht berücksichtigt. Über meine Notwendigkeit, mein Service hat keine Konfigurations-App, und die Installation ist mit dem/install param getan (Ich denke, auf diese Weise, wenn ich die Erlaubnis habe, den reg-Schlüssel für den Dienst zu erstellen, habe ich auch die Erlaubnis, manuell bearbeite den Schlüssel). Sind diese Parameter vorgesehen, die ich beibehalten will? Ich erinnere mich nicht genau, warum jetzt, aber ich denke, weil ich wollte, dass der Dienst viele Male mit verschiedenen Parametern lief. –

+0

"wenn ich die Berechtigung habe, den Registrierungsschlüssel zu erstellen". Ja, das Problem ist da. Vista/7 erlaubt es möglicherweise nicht, es sei denn, der Vorgang wird mit erhöhten Rechten ausgeführt. Der Schalter/install ist praktisch für eine schnelle Installation, aber es wäre besser, dem Benutzer ein geeignetes Installations-/Deinstallationsverfahren anzubieten. Ich schrieb ein Skript, das in dem kostenlosen InnoSetup Setup-Tool verwendet werden soll, um Dienste (http://www.sandon.it/?q=node/9), andere Installer-Support-Dienste nativ zu behandeln. –