Autor Beitrag
Peter2002
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 103

Win XP, Win 7
Delphi 2007 / XE3
BeitragVerfasst: Di 30.09.08 17:22 
Hallo zusammen,

in einer "normalen" Anwendung lassen sich mittels des Events OnException alle nicht behandelten Exceptions protokollieren...
Wie realisiere ich soetwas in einem Dienst?
Ich habe einfach die TApplicationEvents auf den TService gepackt und versucht das OnException zu nutzen. Diese Methode wird allerdings nie ausgeführt.

Hat jemand schon mal sowas gemacht?

Gruß
Peter
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 30.09.08 22:17 
Wohr weißt du, dass sie nie ausgeführt wird? Und etwas Code wäre hilfreich.
Peter2002 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 103

Win XP, Win 7
Delphi 2007 / XE3
BeitragVerfasst: Mi 01.10.08 08:42 
Ich hab nen neuen Service erstellt, die Komponente ApplicationEvents draugelegt, das Event OnException angelegt, im Execute ne Exception ausgelöst
und festgestellt dass nichts passiert...
In einer normalen Anwendung lande ich nach einem erfolglosen StrToInt ohne try...except in diesem Event

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
unit Unit1;

interface

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

type
  TService1 = class(TService)
    ApplicationEvents1: TApplicationEvents;
    procedure ServiceExecute(Sender: TService);
    procedure ApplicationEvents1Exception(Sender: TObject; E: Exception);
  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.ServiceExecute(Sender: TService);
begin
  StrToInt ('xyz');
end;

procedure TService1.ApplicationEvents1Exception(Sender: TObject; E: Exception);
begin
  ShowMessage('hier komm ich nie an');
end;


end.

_________________
Gruß Peter
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 01.10.08 08:57 
Und was passiert in dem Event? Falls du eine MessageBox erwartest, die wirst du nie sehen, da dein Service in einer anderen Windows Station läuft und keinen Zugriff auf deinen Desktop hat.
Peter2002 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 103

Win XP, Win 7
Delphi 2007 / XE3
BeitragVerfasst: Mi 01.10.08 09:46 
In dem Event passiert gar nichts bzw. es wird nicht ausgelöst. Die MessageBox steht da nur zur Veranschaulichung. (Trotzdem sollete man sie sehen, jedenfalls ein Showmessage im Execute sieht man). Eigentlich sollten die Fehler hier in ne Logfile geschrieben werden. Das passiert aber nicht. Setze ich nen Breakpoint in dieses Event, lande ich dort auch nie. Ich seh nur den Hinweis vom Debugger, dass eine Exception aufgetreten ist.
White-Tiger
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Mi 01.10.08 13:32 
Hast du den Dienst auch schon mal normal als Dienst ausgeführt? Also Ohne Delphi Debugger?
Ich bin derzeit auch am Dienst basteln und bei mir Debugt Delphi den garnicht erst :( er Startet nur und schließt sofot.. aber wenn ich ihn normal als Dienst in Windows starte macht er auch das was er soll..

Zum nicht anzeigen einer ShowMessage... es wird schon ausgegeben man muss nur dem Dienst die interaktion mit dem Desktop erlauben (Start->Ausführen->services.msc und dort eben den Dienst suchen und unter Anmelden "Datenaustausch zwischen DIenst und Desktop zulassen" aktivieren.)
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 01.10.08 13:51 
user profile iconWhite-Tiger hat folgendes geschrieben Zum zitierten Posting springen:
Zum nicht anzeigen einer ShowMessage... es wird schon ausgegeben man muss nur dem Dienst die interaktion mit dem Desktop erlauben (Start->Ausführen->services.msc und dort eben den Dienst suchen und unter Anmelden "Datenaustausch zwischen DIenst und Desktop zulassen" aktivieren.)

Das hat er wohl schon gemacht, sonst würde er die erste nachricht nicht sehen. Anzumerken dazu ist nur noch, dass interaktive Dienste eine Sicherheitslücke darstellen können und sie aus diesem Grund unter Vista nicht mehr existieren.
Peter2002 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 103

Win XP, Win 7
Delphi 2007 / XE3
BeitragVerfasst: Mi 01.10.08 14:33 
ShowMessage... Danke für die Hinweise
Mir geht es aber um das das Exception-Handling. Ich möchte alle Excetions, die nicht behandelt wurden (weil vielleicht mal ein try..except vergessen wurde) zentral abfangen, es protokollieren und definiert reagieren.
Genau an dem, welches in "normalen" Applicationen problemlos funktioniert, bin ich bisher gescheitert. :?

_________________
Gruß Peter
Peter2002 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 103

Win XP, Win 7
Delphi 2007 / XE3
BeitragVerfasst: Mi 08.10.08 12:08 
Hat sowas noch niemand versucht? Oder löst man das anders?

_________________
Gruß Peter