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
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
"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
 
Larsi

 
Delphi 2007 Professional
 
#2
  Alt 11. Nov 2008, 13:05
Wäre nit Tutorials passender?
  Mit Zitat antworten Zitat
Benutzerbild von nicodex
nicodex

 
Delphi 2007 Professional
 
#3
  Alt 11. Nov 2008, 13: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).
Nico Bendlin
  Mit Zitat antworten Zitat
Benutzerbild von gsh
gsh

 
Delphi XE Architect
 
#4
  Alt 11. Nov 2008, 13: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
  Mit Zitat antworten Zitat
Benutzerbild von nicodex
nicodex

 
Delphi 2007 Professional
 
#5
  Alt 11. Nov 2008, 13: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).
Nico Bendlin
  Mit Zitat antworten Zitat
9. Nov 2009, 11: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

 
Delphi 7 Professional
 
#7
  Alt 9. Nov 2009, 15:25
Servicemanager muss man ausschließen, aber der Rest funktioniert:
http://blog.delphi-jedi.net/2008/05/...s-an-easy-way/
Christian
  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 10:17 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