Forum: PC-Programmierung Windows Service Parameterübergabe


von Smocky (Gast)


Lesenswert?

Grüß euch!

Weiß jemand wie ich einem Windows Service einen fixen Startparameter 
einstellen kann.
Bei den Serviceeigenschaften kann man ja "lokal" die Startparameter 
eingeben, welche dann beim Starten übergeben werden. Dass Problem ist 
jetzt nur dass die nur fürs manuelle Starten verwendet werden können.

Gibt es irgendeinen Registry Eintrag der die Parameter repräsentiert?

Ein Anfügen der Parameter an den Pfad der Exe hilft mir leider auch 
nichts, weils es dann der Exe übergeben wird und nicht der eigentlichen 
OnStart-Funktion.

Hoffentlich kann mir einer von auch weiterhelfen, suche schon ziemlich 
lange danach.

Mfg Smocky

von Peter (Gast)


Lesenswert?

das mit dem Parameter an die EXE ist aber der normale weg (siehe dienst 
RPC) dann musst du wohl dein Programm anpassen damit du an die parameter 
rankommst.

von Smocky (Gast)


Lesenswert?

Ja aber wieso hat dann die OnStart Methode ein Stringarray als 
Parameter, wenn dort nie etwas übergeben werden kann, außer mit diesen 
"lokalen" Startparametern?

von Peter (Gast)


Lesenswert?

dafür sollte du eventuell erstmal sagen in welcher Programmiersprache du 
das ganze Programmierst. Zum schluss ist ein Service ein ganz normales 
Programm welches Parameter über die Kommandozeile übergeben bekommt. 
Irgendwie muss es ja dann einen weg von vom main er winmain zu deiner 
OnStart geben.

von Smocky (Gast)


Lesenswert?

Also ich hab teilweise das Template vom Visual Studio 2005 verwendet

Code der eigentlichen Exe:
1
//To install/uninstall the service, type: "XXX_Service.exe -Install [-u]"
2
int _tmain(int argc, _TCHAR* argv[])
3
{
4
  if (argc >= 2)
5
  {
6
    if (argv[1][0] == _T('/'))
7
    {
8
      argv[1][0] = _T('-');
9
    }
10
11
    if (_tcsicmp(argv[1], _T("-Install")) == 0)
12
    {
13
      MyProjectInstaller^ service_installer = gcnew MyProjectInstaller();
14
15
      array<String^>^ myargs = System::Environment::GetCommandLineArgs();
16
      array<String^>^ args = gcnew array<String^>(myargs->Length - 1);
17
18
      // Set args[0] with the full path to the assembly,
19
      Assembly^ assem = Assembly::GetExecutingAssembly();
20
      args[0] = assem->Location;
21
22
      Array::Copy(myargs, 2, args, 1, args->Length - 1);
23
      AppDomain^ dom = AppDomain::CreateDomain(L"execDom");
24
      Type^ type = System::Object::typeid;
25
      String^ path = type->Assembly->Location;
26
      StringBuilder^ sb = gcnew StringBuilder(path->Substring(0, path->LastIndexOf(L"\\")));
27
      sb->Append(L"\\InstallUtil.exe");
28
      Evidence^ evidence = gcnew Evidence();
29
      dom->ExecuteAssembly(sb->ToString(), evidence, args);
30
    }
31
    else
32
    {
33
      ServiceBase::Run(gcnew XXX_ServiceWinService());
34
    }
35
  }
36
  else
37
  {
38
    ServiceBase::Run(gcnew XXX_ServiceWinService());
39
  }
40
}


Code der Serviceklasse:
1
public ref class XXX_ServiceWinService : public System::ServiceProcess::ServiceBase
2
  {
3
  public:
4
    XXX_ServiceWinService()
5
    {
6
      //array<String^>^test;
7
      InitializeComponent();
8
      //
9
      //TODO: Add the constructor code here
10
      //
11
      //this->OnStart(test);
12
    }
13
  protected:
14
    /// <summary>
15
    /// Clean up any resources being used.
16
    /// </summary>
17
    ~XXX_ServiceWinService()
18
    {
19
      if (components)
20
      {
21
        delete components;
22
      }
23
    }
24
25
    /// <summary>
26
    /// Set things in motion so your service can do its work.
27
    /// </summary>
28
    virtual void OnStart(array<String^>^ argv) override
29
    {
30
      //BLA BLA BLA
31
    }
32
33
    /// <summary>
34
    /// Stop this service.
35
    /// </summary>
36
    virtual void OnStop() override
37
    {
38
      // TODO: Add code here to perform any tear-down necessary to stop your service.
39
    }
40
41
  private:
42
    /// <summary>
43
    /// Required designer variable.
44
    /// </summary>
45
    System::ComponentModel::Container ^components;
46
47
#pragma region Windows Form Designer generated code
48
    /// <summary>
49
    /// Required method for Designer support - do not modify
50
    /// the contents of this method with the code editor.
51
    /// </summary>
52
    void InitializeComponent(void)
53
    {
54
      this->components = gcnew System::ComponentModel::Container();
55
      this->CanStop = true;
56
      this->CanPauseAndContinue = true;
57
      this->AutoLog = true;
58
      this->ServiceName = L"XXX_Service";
59
    }


Und das Problem ist jetzt wie ich Parameter an die OnStart Methode 
übergeben kann, welche ja aufgerufen wird, wenn der Service gestartet 
wird.

von Peter (Gast)


Lesenswert?

http://msdn.microsoft.com/de-de/library/system.serviceprocess.servicebase.onstart.aspx

Verarbeiten Sie Initialisierungsargumente für den Dienst in der 
OnStart-Methode und nicht in der Main-Methode. Die Argumente im 
args-Parameterarray können manuell in der Dienstekonsole im 
Eigenschaftenfenster für den Dienst festgelegt werden. Die in der 
Konsole eingegebenen Argumente werden nicht gespeichert, sondern immer 
dann an den Dienst übergeben, wenn dieser in der Systemsteuerung 
gestartet wird. Argumente, die beim automatischen Starten des Diensts 
vorhanden sein müssen, können im ImagePath-Zeichenfolgenwert für den 
Registrierungsschlüssel des Diensts 
(HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<Dienstname>) 
platziert werden. Sie können die Argumente mit der 
GetCommandLineArgs-Methode aus der Registrierung abrufen, z. B.: 
string[] imagePathArgs = Environment.GetCommandLineArgs();.

von Smocky (Gast)


Lesenswert?

Danke für deine Hilfe, du hast mir echt den Tag gerettet.

von Peter (Gast)


Lesenswert?

naja das steht ja nun alles Perfekt in der Doku drin, warum hast du dort 
nicht mal nachgelesen?

von Smocky (Gast)


Lesenswert?

Ich hab damals blöderweise schlicht und einfach nur den Anfang des 
Absatzes gelesen. Und dann hab ich eben dass mit den Startparameter 
heraus gefunden und dachte mir dass es so geht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.