Entwickler-Ecke
Windows API - Service und OnException
Peter2002 - Di 30.09.08 17:22
Titel: Service und OnException
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
Delete - Di 30.09.08 22:17
Wohr weißt du, dass sie nie ausgeführt wird? Und etwas Code wäre hilfreich.
Peter2002 - 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
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 public function GetServiceController: TServiceController; override; 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. |
Delete - 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 - 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 - 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.)
Delete - Mi 01.10.08 13:51
White-Tiger hat folgendes geschrieben : |
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 - 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. :?
Peter2002 - Mi 08.10.08 12:08
Hat sowas noch niemand versucht? Oder löst man das anders?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!