Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Tutorials und Kurse (https://www.delphipraxis.net/36-tutorials-und-kurse/)
-   -   Delphi Wie erstelle ich einen Dienst für WinNT / Win2000 / Win XP (https://www.delphipraxis.net/59752-wie-erstelle-ich-einen-dienst-fuer-winnt-win2000-win-xp.html)

mimi 6. Apr 2006 17:38

Re: Wie erstelle ich einen Dienst für WinNT / Win2000 / Win
 
ah alles klar, ich möchte auch kakein dienst erstlelen, war nur mal so ne frage *G*

Andru 15. Jun 2006 11:09

Re: Wie erstelle ich einen Dienst für WinNT / Win2000 / Win
 
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.

franktron 24. Aug 2006 10:26

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

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

stz 10. Aug 2007 17:03

Re: Wie erstelle ich einen Dienst für WinNT / Win2000 / Win
 
Erstmal vielen Dank für das Tutorial :thumb:

Zitat:

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 Fall
Delphi-Quellcode:
ServiceThread.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...

SirThornberry 10. Aug 2007 17:09

Re: Wie erstelle ich einen Dienst für WinNT / Win2000 / Win
 
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;

stz 11. Aug 2007 10:41

Re: Wie erstelle ich einen Dienst für WinNT / Win2000 / Win
 
@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 :gruebel:

Gruß
Malte

xZise 25. Nov 2007 16:03

Re: Wie erstelle ich einen Dienst für WinNT / Win2000 / Win
 
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

mkinzler 25. Nov 2007 16:11

Re: Wie erstelle ich einen Dienst für WinNT / Win2000 / Win
 
Das ist auch der zugehende Weg. Du musst entweder per Netzprotokoll oder durch Pipes, IPC o.ä. mit dem Dienst kommunizieren.

Apollonius 25. Nov 2007 16:18

Re: Wie erstelle ich einen Dienst für WinNT / Win2000 / Win
 
Wenn es nur um einfache Ausgabe geht, kann man auch die Messagebox mit MB_SERVICE_NOTIFICATION verwenden.

xZise 26. Nov 2007 14:01

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

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:19 Uhr.
Seite 2 von 4     12 34      

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