www.mikrocontroller.net

Forum: PC-Programmierung Windows Service Parameterübergabe


Autor: Smocky (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Smocky (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Smocky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich hab teilweise das Template vom Visual Studio 2005 verwendet

Code der eigentlichen Exe:
//To install/uninstall the service, type: "XXX_Service.exe -Install [-u]"
int _tmain(int argc, _TCHAR* argv[])
{
  if (argc >= 2)
  {
    if (argv[1][0] == _T('/'))
    {
      argv[1][0] = _T('-');
    }

    if (_tcsicmp(argv[1], _T("-Install")) == 0)
    {
      MyProjectInstaller^ service_installer = gcnew MyProjectInstaller();

      array<String^>^ myargs = System::Environment::GetCommandLineArgs();
      array<String^>^ args = gcnew array<String^>(myargs->Length - 1);

      // Set args[0] with the full path to the assembly,
      Assembly^ assem = Assembly::GetExecutingAssembly();
      args[0] = assem->Location;

      Array::Copy(myargs, 2, args, 1, args->Length - 1);
      AppDomain^ dom = AppDomain::CreateDomain(L"execDom");
      Type^ type = System::Object::typeid;
      String^ path = type->Assembly->Location;
      StringBuilder^ sb = gcnew StringBuilder(path->Substring(0, path->LastIndexOf(L"\\")));
      sb->Append(L"\\InstallUtil.exe");
      Evidence^ evidence = gcnew Evidence();
      dom->ExecuteAssembly(sb->ToString(), evidence, args);
    }
    else
    {
      ServiceBase::Run(gcnew XXX_ServiceWinService());
    }
  }
  else
  {
    ServiceBase::Run(gcnew XXX_ServiceWinService());
  }
}


Code der Serviceklasse:
public ref class XXX_ServiceWinService : public System::ServiceProcess::ServiceBase
  {
  public:
    XXX_ServiceWinService()
    {
      //array<String^>^test;
      InitializeComponent();
      //
      //TODO: Add the constructor code here
      //
      //this->OnStart(test);
    }
  protected:
    /// <summary>
    /// Clean up any resources being used.
    /// </summary>
    ~XXX_ServiceWinService()
    {
      if (components)
      {
        delete components;
      }
    }

    /// <summary>
    /// Set things in motion so your service can do its work.
    /// </summary>
    virtual void OnStart(array<String^>^ argv) override
    {
      //BLA BLA BLA
    }

    /// <summary>
    /// Stop this service.
    /// </summary>
    virtual void OnStop() override
    {
      // TODO: Add code here to perform any tear-down necessary to stop your service.
    }

  private:
    /// <summary>
    /// Required designer variable.
    /// </summary>
    System::ComponentModel::Container ^components;

#pragma region Windows Form Designer generated code
    /// <summary>
    /// Required method for Designer support - do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    void InitializeComponent(void)
    {
      this->components = gcnew System::ComponentModel::Container();
      this->CanStop = true;
      this->CanPauseAndContinue = true;
      this->AutoLog = true;
      this->ServiceName = L"XXX_Service";
    }


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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
http://msdn.microsoft.com/de-de/library/system.ser...

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();.

Autor: Smocky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für deine Hilfe, du hast mir echt den Tag gerettet.

Autor: Peter (Gast)
Datum:

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

Autor: Smocky (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.