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 Dienst installieren? (https://www.delphipraxis.net/104032-dienst-installieren.html)

1ceman 26. Nov 2007 13:12


Dienst installieren?
 
Ich hab angefangen mir einen dienst zu schreiben, der wenn er login daten vom server zugesendet bekommt,
diese Daten für nen Autologin in die registry schreibt und den pc dann neustartet.
Aber irgendwie bekomme ich den dienst noch nichtmal installiert. Hab zum testen erstmal diesen Dienst aus dem
Beispiel von MaBuSE genommen.
Dann habe ich in Delphi 7 den Parameter /install eingestellt und gestartet, es passiert aber nix, der dienst wird auch
unter Systemsteuerung->Verwaltung->Dienste nicht aufgeführt.
Ist das mit dem Parameter überhaupt richtig oder muss man den dienst anders installieren??

Mfg,
1ceman

//EDIT: Namen vom Autor des Bsp. geändert (hattte den falschen genommen sry)

SirThornberry 26. Nov 2007 13:19

Re: Dienst installieren?
 
der Parameter ist richtig wenn es sich um eine Serviceanwendung (abgeleitet von TService) handelt.

1ceman 26. Nov 2007 13:45

Re: Dienst installieren?
 
Ja ist von TService abgeleitet.
Hier ist der Quellcode:(damit ihr nicht zwangsläufig auf den link vom bsp. gehen müsst)
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs;

type
  TService1 = class(TService)
    procedure ServiceAfterInstall(Sender: TService);
    procedure ServiceAfterUninstall(Sender: TService);
    procedure ServiceBeforeInstall(Sender: TService);
    procedure ServiceBeforeUninstall(Sender: TService);
    procedure ServiceContinue(Sender: TService; var Continued: Boolean);
    procedure ServiceCreate(Sender: TObject);
    procedure ServiceDestroy(Sender: TObject);
    procedure ServiceExecute(Sender: TService);
    procedure ServicePause(Sender: TService; var Paused: Boolean);
    procedure ServiceShutdown(Sender: TService);
    procedure ServiceStart(Sender: TService; var Started: Boolean);
    procedure ServiceStop(Sender: TService; var Stopped: Boolean);
  private
    { Private-Deklarationen }
  public
    function GetServiceController: TServiceController; override;
    { Public-Deklarationen }
  end;

var
  Service1: TService1;

implementation

{$R *.DFM}

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

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

procedure TService1.ServiceAfterInstall(Sender: TService);
begin
  showMessage('AfterInstall');
end;

procedure TService1.ServiceAfterUninstall(Sender: TService);
begin
  showMessage('AfterUninstall');
end;

procedure TService1.ServiceBeforeInstall(Sender: TService);
begin
  showMessage('BeforeInstall');
end;

procedure TService1.ServiceBeforeUninstall(Sender: TService);
begin
  showMessage('BeforeUninstall');
end;

procedure TService1.ServiceContinue(Sender: TService;
  var Continued: Boolean);
begin
  showMessage('OnContinue');
  Continued := True;
end;

procedure TService1.ServiceCreate(Sender: TObject);
begin
  showMessage('OnCreate');
end;

procedure TService1.ServiceDestroy(Sender: TObject);
begin
  showMessage('OnDestroy');
end;

procedure TService1.ServiceExecute(Sender: TService);
begin
  showMessage('OnExecute - begin');
  while not Terminated do
  begin
    ServiceThread.ProcessRequests(False);
  end;
  showMessage('OnExecute - end');
end;

procedure TService1.ServicePause(Sender: TService; var Paused: Boolean);
begin
  showMessage('OnPause');
  Paused := True;
end;

procedure TService1.ServiceShutdown(Sender: TService);
begin
  showMessage('OnShutdown');
end;

procedure TService1.ServiceStart(Sender: TService; var Started: Boolean);
begin
  showMessage('OnStart');
  Started := True;
end;

procedure TService1.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
  showMessage('OnStop');
  Stopped := True;
end;

end.

DelphiKlaus 26. Nov 2007 13:49

Re: Dienst installieren?
 
Hallo,

und was passiert, wenn Du den Dienst nicht aus Delphi heraus sondern aus einem Kommandozeilenfenster installierst?

Klaus

SirThornberry 26. Nov 2007 14:02

Re: Dienst installieren?
 
ein Showmessage im ServicePause etc.? Man müsste dich schlagen. Ein Service besitzt im Normallfall keinen Desktop womit du auch keine dieser Messages siehst!

RavenIV 26. Nov 2007 14:16

Re: Dienst installieren?
 
Zitat:

Zitat von SirThornberry
ein Showmessage im ServicePause etc.? Man müsste dich schlagen. Ein Service besitzt im Normallfall keinen Desktop womit du auch keine dieser Messages siehst!

Ich würde als erstes alle ShowMessage rausmachen.
Ein Service kann nichts auf dem Desktop ausgeben.

Du musst Deine "Debug-Infos" in ein logfile schreiben.

1ceman 27. Nov 2007 09:52

Re: Dienst installieren?
 
So hab den Dienst nochmal komplett neu geschrieben.
Jetzt kann ich ihn immerhin schonmal installieren. Wird auch bei meine diensten angezeigt
und ich kann ihn starten. Jetzt hab ich folgenden Code genommen, um meinem Dienst ne beschreibung
zu geben.
Delphi-Quellcode:
procedure TService1.ServiceAfterInstall(Sender: TService);
var
  Reg: TRegistry;
begin
  Reg := TRegistry.Create(KEY_READ or KEY_WRITE);
  try
    Reg.RootKey := HKEY_LOCAL_MACHINE;
    if Reg.OpenKey('\SYSTEM\CurrentControlSet\Services\' + Name, false) then
    begin
      Reg.WriteString('Description', 'This is a description for my fine Service Application.');
      Reg.CloseKey;
    end;
  finally
    Reg.Free;
  end;
end;
Diese Code erzeugt den Registry Eintrag "Description" an folgender Stelle:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Servic es\MeinService

Das Problem ist allerdings, dass kein registry-Eintrag erstellt wird, sprich der Dienst hat keine Beschreibung.
Hat jm ne Idee warum er das nicht macht?

@RavenIV: Ich werd das mit dem LogFile mal versuchen.

Mfg
1ceman

//Edit: Also hab mein Problem gefunden, hatte die procedure nur von hand eingetippt. Nachdem ich im Objekt Inspector unter Events auf ServiceAfterinstall geklikt habe, funktioniert die alles ohne Probleme.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:09 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