AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Tutorials Delphi Wie erstelle ich einen Dienst für WinNT / Win2000 / Win XP

Wie erstelle ich einen Dienst für WinNT / Win2000 / Win XP

Ein Tutorial von MaBuSE · begonnen am 28. Dez 2005 · letzter Beitrag vom 21. Okt 2013
Antwort Antwort
Seite 2 von 4     12 34   
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#1

Re: Wie erstelle ich einen Dienst für WinNT / Win2000 / Win

  Alt 6. Apr 2006, 17:38
ah alles klar, ich möchte auch kakein dienst erstlelen, war nur mal so ne frage *G*
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
Andru

Registriert seit: 1. Feb 2006
Ort: Salzgitter
24 Beiträge
 
Delphi 6 Enterprise
 
#2

Re: Wie erstelle ich einen Dienst für WinNT / Win2000 / Win

  Alt 15. Jun 2006, 11:09
Hi,
erstmal vielen Dank für dieses TUT. Hat mir auf jeden Fall super weitergeholfen.
Mein Problem jedoch ist, wenn ich den Service installiert habe und starte,
startet er meine Anwendung (ShellExecute in der ServiceStart-Prozedur), aber der Status
in der Dienste verwaltung ändert sich nicht.
Es steht zwar, dass der Dienst gestartet ist, aber ich habe nicht die Möglichkeit ihn wieder
zu beenden.
Was mache ich denn noch falsch? Wird der Status nicht über 'started := true' übergeben?

Hoffe, Ihr könnt mir weiterhelfen!


Delphi-Quellcode:
unit Unit1;

interface

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

type
  TTestService = 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
  TestService: TTestService;
  ProgHandle, RemoteHandle: THandle;

implementation

{$R *.DFM}

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

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

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

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

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

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

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

procedure TTestService.ServiceCreate(Sender: TObject);
begin
  showMessage('OnCreate');
   ServiceExecute(self);
end;

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

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



  showMessage('OnExecute - end');


end;

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

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

procedure TTestService.ServiceStart(Sender: TService; var Started: Boolean);
begin
  ShellExecute(ProgHandle, 'open', PChar('notepad.exe'),
  Nil, Nil, SW_NORMAL);
 // showMessage('OnStart');
  Started := True;
end;

procedure TTestService.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
  RemoteHandle := FindWindow(NIL,'unbenannt - Editor');
  if RemoteHandle<>0 then PostMessage(RemoteHandle, wm_close, 1, 1);
 // showMessage('OnStop');
  Stopped := True;
end;




end.
  Mit Zitat antworten Zitat
franktron

Registriert seit: 11. Nov 2003
Ort: Oldenburg
1.446 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#3

Re: Wie erstelle ich einen Dienst für WinNT / Win2000 / Win

  Alt 24. Aug 2006, 10:26
Zitat von MaBuSE:
Die erzeugte Exe Datei mußt Du Mit dem Parameter INSTALL aufrufen um den Dienst zu registrieren.
Mit Projekt1.exe UNINSTALL kannst Du den Dienst wieder aus der Diesteverwaltung entfernen.

Ich hoffe das hilft Dir erst mal weiter.
Da hat sich ein kleiner Fehler eingeschlichen das mus Projekt1.exe /INSTALL und /UNINSTALL heisen
Frank
Tux sein Lieblingsquellcode
While anzfische<TuxSatt do begin
Fisch:=TFisch.Create; Tux.EssenFisch(Fisch); Fisch.Free;inc(anzfische); end;
  Mit Zitat antworten Zitat
Benutzerbild von stz
stz

Registriert seit: 8. Sep 2005
Ort: Neuendeich, Lübeck
277 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Wie erstelle ich einen Dienst für WinNT / Win2000 / Win

  Alt 10. Aug 2007, 17:03
Erstmal vielen Dank für das Tutorial

Zitat von MaBuSE:
Benutzt Du eine Komponente (z.B. TTimer) um die Anrufe zu pollen dann z.B.
Delphi-Quellcode:
...
  while not Terminated do
  begin
    ServiceThread.ProcessRequests(False);
  end;
...
Wenn ich das tatsächlich so mache (inklusive Timer) habe ich einen wunderbaren Dienst zum lahmlegen des Systems . Durch die Endlosschleife braucht der Thread fast 100% der CPU-Zeit. Deutlich besser ist in diesem FallServiceThread.ProcessRequests(True); Nun wartet ProcessRequest auf die nächste Message, bevor es weitergeht. Da man ja eh mit dem Timer auf genau eine solche wartet, empfiehlt sich das.

Ansonsten muss man zu mindestens irgendetwas tun, um die Endlosschleife zu entschärfen (sleep?!)

Noch eine weitere Frage: Kann ich auch irgendwie komfortabel eine Beschreibung definieren, die in Systemsteuerung -> Verwaltung -> Dienste angezeigt wird?

Gruß
Malte

PS: Ich hoffe ich darf den Thread nach so langer Zeit noch aufwärmen...
Malte Schmitz
Der Unterschied zwischen Theorie und Praxis ist in der Praxis größer als in der Theorie.

Entwickler des HTML-Editors MEdit (DP)
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Wie erstelle ich einen Dienst für WinNT / Win2000 / Win

  Alt 10. Aug 2007, 17:09
mit der Funktion ChangeServiceConfig2A kannst du die Beschreibung ändern
Delphi-Quellcode:
function ChangeServiceConfig2A(hService: HWND; dwInfoLevel: DWord; lpInfo: Pointer): BOOL; stdcall; external 'advapi32.dll';
[...]
var
  lDescription : TSERVICE_DESCRIPTION;
  lManager,
  lServiceHandle : Cardinal;
begin
  lManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
  if (lManager <> 0) then
  begin
    lServiceHandle := OpenService(lManager, 'NameDeinesService'{bei Ableitung von TService wäre das: PChar(Self.Name)}, SERVICE_ALL_ACCESS);
    if (lServiceHandle <> 0) then
    begin
      lDescription.lpDescription := 'Deine Beschreibung';
      ChangeServiceConfig2A(lServiceHandle, SERVICE_CONFIG_DESCRIPTION, @lDescription);
      CloseServiceHandle(lServiceHandle);
    end;
    CloseServiceHandle(lManager);
  end;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von stz
stz

Registriert seit: 8. Sep 2005
Ort: Neuendeich, Lübeck
277 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Wie erstelle ich einen Dienst für WinNT / Win2000 / Win

  Alt 11. Aug 2007, 10:41
@SirThornberry: Das sieht doch ganz gut aus, aber...
Ich habe jetzt die Unit Winsvc eingebunden und mir den Typ TSERVICE_DESCRIPTION mithilfe des PSDKs zusammengebastelt:
Delphi-Quellcode:
type
  PServiceDescription = ^TServiceDescription;
  {$EXTERNALSYM _SERVICE_DESCRIPTION}
  _SERVICE_DESCRIPTION = record
    lpDescription: LPTSTR;
  end;
  {$EXTERNALSYM SERVICE_DESCRIPTION}
  SERVICE_DESCRIPTION = _SERVICE_DESCRIPTION;
  TServiceDescription = _SERVICE_DESCRIPTION;
Aber die Konstante SERVICE_CONFIG_DESCRIPTION kann ich nirgendwo finden

Gruß
Malte
Malte Schmitz
Der Unterschied zwischen Theorie und Praxis ist in der Praxis größer als in der Theorie.

Entwickler des HTML-Editors MEdit (DP)
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#7

Re: Wie erstelle ich einen Dienst für WinNT / Win2000 / Win

  Alt 25. Nov 2007, 16:03
Es wird hier häufig geschrieben, dass der Dienst möglichst nicht interaktiv sein sollte.
Nun wie kann ich dennoch etwas für den Benutzer ausgeben?
Mir schwebt ein Konzept vor, dass im Autostart sozusagen das Frontend (eine stinknormale exe) gestartet wird.
Aber ich weiß jetzt nicht wie man das machen könnte.

MfG
xZise
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: Wie erstelle ich einen Dienst für WinNT / Win2000 / Win

  Alt 25. Nov 2007, 16:11
Das ist auch der zugehende Weg. Du musst entweder per Netzprotokoll oder durch Pipes, IPC o.ä. mit dem Dienst kommunizieren.
Markus Kinzler
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Wie erstelle ich einen Dienst für WinNT / Win2000 / Win

  Alt 25. Nov 2007, 16:18
Wenn es nur um einfache Ausgabe geht, kann man auch die Messagebox mit MB_SERVICE_NOTIFICATION verwenden.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#10

Re: Wie erstelle ich einen Dienst für WinNT / Win2000 / Win

  Alt 26. Nov 2007, 14:01
Zitat von Apollonius:
Wenn es nur um einfache Ausgabe geht, kann man auch die Messagebox mit MB_SERVICE_NOTIFICATION verwenden.
Achso Das reicht dann auch eigentlich

Nun eine ganz andere Frage zu der Schleife.
Und zwar erstelle ich eine UDP-Verbindung mithilfe von UdpSockUtil. Nun weiß ich nicht, wie ich die Schleife gestalten muss, weil das Pollen übernimmt ja die Komponente.
Aber der Dienst wird ja ohne "Aufgaben" beendet.
Kann man irgendwo sagen: "KillOnIdle := false"? ^^

MfG
xZise
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34   

Themen-Optionen Tutorial durchsuchen
Tutorial durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:23 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