AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Tutorials Delphi Service debuggen leicht gemacht
Tutorial durchsuchen
Ansicht
Themen-Optionen

Service debuggen leicht gemacht

Ein Tutorial von gsh · begonnen am 11. Nov 2008 · letzter Beitrag vom 9. Nov 2009
Antwort Antwort
Benutzerbild von gsh
gsh

Registriert seit: 24. Okt 2004
1.542 Beiträge
 
Delphi XE Architect
 
#1

Service debuggen leicht gemacht

  Alt 11. Nov 2008, 14:04
Hi Leute

ich ärger mich seit Tagen mit meinem blöden Service rum. Durch log einträge schreiben und dann stunden langes "in den Code starren" kommt man zwar auch auf die Fehler drauf, aber es ist lang nicht so effektiv wie wenn man einfach mit F8 durchgehen kann
Deshalb habe ich mich heute drangemacht dieses zu verbessern und zu meiner großen Verwunderung habe ich es sogar geschafft

So genug zur Vorgeschichte nun der Code:
Einmal den Project Quellcode auf folgendes ändern:
Delphi-Quellcode:
program Project1;

{$IFDEF DebugEXE}
   {$APPTYPE CONSOLE}
{$ENDIF}

uses
  SvcMgr,
  Unit1 in 'Unit1.pas{Service1: TService};

{$R *.RES}

{$IFDEF DebugEXE}
var
  TempBool : Boolean;
begin
  Service1 := TService1.Create(nil);
  try
    TempBool := false;
    Service1.ServiceStart(nil, TempBool);
    if TempBool = false then
    begin
      Writeln('!!!Service did not start correct');
      Readln;
      exit;
    end;
    Service1.ServiceExecute(nil);
    TempBool := false;
    Service1.ServiceStop(nil, TempBool);
    if TempBool = false then
    begin
      Writeln('!!!Service did not stop correct');
      Readln;
      exit;
    end;
  finally
    Service1.Free;
  end;
{$ELSE}
begin
  if not Application.DelayInitialize or Application.Installing then
    Application.Initialize;
  Application.CreateForm(TService1, Service1);
  Application.Run;
{$ENDIF}
end.
Dann noch eine kleine Nachrichtenschleife bzw. ein ReadLn damit die Anwendung nicht gleich wieder weg ist:
Delphi-Quellcode:
procedure TService1.ServiceExecute(Sender: TService);
begin
{$IFDEF DebugEXE}
  Readln;
{$ELSE}
  while not Terminated do
  begin
    ServiceThread.ProcessRequests(False);
    sleep(20);
  end;
{$ENDIF}
end;
So wenn man jetzt unter den Projektoptionen -> Verzeichnisse/Bedingungen -> Definition den Wert DebugEXE einträgt dann wird es nach dem nächsten kompilieren eine direkt startbare und debugbare Exe heraus. Lässt man die Definition wieder weg wird es wieder ein normaler Service der installiert werden kann.

So viel Spaß damit
Alex
"Sage nicht alles, was du weißt, aber wisse alles, was du sagst!" Matthias Claudius
"Wer sich über Kritik ärgert, gibt zu, daß er sie verdient hat." Tacitus
  Mit Zitat antworten Zitat
Larsi

Registriert seit: 10. Feb 2007
2.262 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Service debuggen leicht gemacht

  Alt 11. Nov 2008, 14:05
Wäre nit Tutorials passender?
Ein Tag ohne Delphi ist ein verlorener Tag!

Homepage zu meinem neuen Programm: StreamZ
  Mit Zitat antworten Zitat
Benutzerbild von nicodex
nicodex

Registriert seit: 2. Jan 2008
Ort: Darmstadt
286 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Service debuggen leicht gemacht

  Alt 11. Nov 2008, 14:23
Das hilft leider nicht, wenn der Dienst nicht als normale Anwendung ausgeführt werden kann.
Eines der Probleme ist, dass der SCM standardmäßig Dienste, die 30 Sekunden lang keine Anfragen beantworten, terminiert (inklusive Debugger). Da hilft dann nur noch das Setzen des Timeouts (http://support.microsoft.com/kb/824344). Wenn man erstal genug "Zeit" hat, dann ist es auch nicht mehr so aufwändig (Dienst interaktiv machen, Dienst starten, MessageBox einbauen, mit Prozeß verbinden und debuggen).
  Mit Zitat antworten Zitat
Benutzerbild von gsh
gsh

Registriert seit: 24. Okt 2004
1.542 Beiträge
 
Delphi XE Architect
 
#4

Re: Service debuggen leicht gemacht

  Alt 11. Nov 2008, 14:36
Zitat von nicodex:
Das hilft leider nicht, wenn der Dienst nicht als normale Anwendung ausgeführt werden kann.
Eines der Probleme ist, dass der SCM standardmäßig Dienste, die 30 Sekunden lang keine Anfragen beantworten, terminiert (inklusive Debugger). Da hilft dann nur noch das Setzen des Timeouts (http://support.microsoft.com/kb/824344). Wenn man erstal genug "Zeit" hat, dann ist es auch nicht mehr so aufwändig (Dienst interaktiv machen, Dienst starten, MessageBox einbauen, mit Prozeß verbinden und debuggen).
die Anwendung wird ja nicht wirklich als dienst ausgeführt und somit vom SCM auch nicht beendet!
Habs zur sicherheit nochmal getestet ... meine anwendung läuft ohne irgendwelche eingabe ohne probleme durch.
Alex
"Sage nicht alles, was du weißt, aber wisse alles, was du sagst!" Matthias Claudius
"Wer sich über Kritik ärgert, gibt zu, daß er sie verdient hat." Tacitus
  Mit Zitat antworten Zitat
Benutzerbild von nicodex
nicodex

Registriert seit: 2. Jan 2008
Ort: Darmstadt
286 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Service debuggen leicht gemacht

  Alt 11. Nov 2008, 14:45
Zitat von gsh:
die Anwendung wird ja nicht wirklich als dienst ausgeführt und somit vom SCM auch nicht beendet!
Ich wollte nur darauf hinaus, dass es Funktionalität in einem Dienst geben kann, welche eben dafür sorgt, dass der "Dienst" nicht mehr als normale Anwendung testbar ist.

Wie auch immer, da ich meine Dienste nicht in Delphi entwicklen kann (64-Bit), habe ich mir ohnehin angewöhnt die Funktionalität in eigenen Klassen zu kapseln (der "Dienst" ruft nur noch Start/Stop der Klasse auf) - was es deutlich einfacher macht, die Kommunikation (Pipes) und Funktionalität in einer "normalen" Anwendung zu testen. Wir machen also das Gleiche, nur in einer anderen Sprache Ich wollte nur auf den o.g. Sonderfall und mögliche Lösungen hinweisen (wobei Vista diese "Lösung" durch die Isolation der "interaktiven" Dienste wieder erschwert/verhindert).
  Mit Zitat antworten Zitat
9. Nov 2009, 12:11
Dieses Thema wurde von "Daniel G" von "Neuen Beitrag zur Code-Library hinzufügen" nach "Tutorials und Kurse" verschoben.
Für die CL etwas zu umfangreich, unter Beachtung von NicoDEs Beiträge verschoben...
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#7

Re: Service debuggen leicht gemacht

  Alt 9. Nov 2009, 16:25
Servicemanager muss man ausschließen, aber der Rest funktioniert:
http://blog.delphi-jedi.net/2008/05/...s-an-easy-way/
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Antwort Antwort


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 01:05 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz