Autor |
Beitrag |
HelgeLange
      
Beiträge: 735
Erhaltene Danke: 6
Windows 7
Delphi7 - Delphi XE
|
Verfasst: Mi 07.12.11 17:36
Hallo,
ich habe mal wieder ein Problem
Ich habe mit DelphiXE einen Windows-Dienst geschrieben (nachdem ich es mit Delphi 2007 ohne Erfolg versucht habe, da ging garkein Event).
Mein Rechner ist ein Win7 64 bit und der Dienst läuft einwandfrei. Auch auf dem Firmenserver mit Windows Server 2008 32bit geht alles klasse.
Jetzt wollten wir den Dienst probeweise auf anderen Konfigurationen installieren (namentlich WinXP 32 und Vista 32) und sie starten nicht. Ich habe mir eine Anwendung geschrieben, die alle wichtigen Funktionen des Dienstes emuliert, die geht ohne Probleme.
Habe dann einige LogMessages eingebaut und er kommt zwar in ServiceCreate (ohne Fehler und führt alles aus), aber nie in ServiceStart (erste Linie ist ein Log-Eintrag, der erscheint aber nie). Aber wie gesagt, auf meinem Rechner und dem Server läuft es
Hier der Code des Services :
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: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114:
| unit svcMain;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs, ExtCtrls, uMAF_ManagerLoader, uMAF_Core, uMAF_HookClient, uMAF_Globals, uPTI_LogFile;
type TSIERP_WXService = class(TService) IdleTimer: TTimer; ML: TmafManagerLoader; HC: TmafHookClient; procedure ServiceStart(Sender: TService; var Started: Boolean); procedure ServiceStop(Sender: TService; var Stopped: Boolean); procedure MLDataLoad(Sender: TObject; Manager: string; var ManagerFileName: string); procedure IdleTimerTimer(Sender: TObject); procedure ServiceExecute(Sender: TService); procedure ServiceCreate(Sender: TObject); procedure ServiceDestroy(Sender: TObject); private public function GetServiceController: TServiceController; override; end;
var SIERP_WXService: TSIERP_WXService;
implementation
{$R *.DFM}
procedure ServiceController(CtrlCode: DWord); stdcall; begin SIERP_WXService.Controller(CtrlCode); end;
function TSIERP_WXService.GetServiceController: TServiceController; begin Result := ServiceController; end;
procedure TSIERP_WXService.MLDataLoad(Sender: TObject; Manager: string; var ManagerFileName: string); begin LogToFile('Requested Manager: ' + Manager); ManagerFileName := 'svcRouter_UniDAC.dll'; end;
procedure TSIERP_WXService.ServiceCreate(Sender: TObject); begin bRunMode := True; LogToFile('TSIERP_WXService.ServiceCreate'); LogToFile('ML.ConnectManager start'); ML.ConnectManager; LogToFile('ML.ConnectManager done'); end;
procedure TSIERP_WXService.ServiceDestroy(Sender: TObject); begin LogToFile('TSIERP_WXService.ServiceDestroy'); end;
procedure TSIERP_WXService.ServiceExecute(Sender: TService); begin While Not Terminated Do ServiceThread.ProcessRequests(True); end;
procedure TSIERP_WXService.ServiceStart(Sender: TService; var Started: Boolean); begin LogToFile('TSIERP_WXService.ServiceStart begin');
try bDebug := True; LogToFile('HC.SetGlobalBoolean start'); HC.SetGlobalBoolean('Debug', True, [vfSave], lsINIFile); LogToFile('HC.SetGlobalBoolean done');
LogToFile('HC.ExecuteHook(HK_INIT_SERVICE) start'); HC.ExecuteHook(10000); LogToFile('HC.ExecuteHook(HK_INIT_SERVICE) end'); IdleTimer.Enabled := True; Started := True; except on E: Exception do begin LogToFile('Exception: ' + E.Message); Started := False; end; end; LogToFile('TSIERP_WXService.ServiceStart end'); end;
procedure TSIERP_WXService.ServiceStop(Sender: TService; var Stopped: Boolean); begin IdleTimer.Enabled := False; HC.ExecuteHook(10001); ML.DisconnectManager; Stopped := True; end;
procedure TSIERP_WXService.IdleTimerTimer(Sender: TObject); begin IdleTimer.Enabled := False; Try ML.ProcessApplication_OnIdle; except on E: Exception do LogMessage(E.Message); End; IdleTimer.Enabled := True; end; |
und das Logfile von meinem Rechner (wo der Service geht) :
Zitat: | 10:26 a.m. - Requested Manager: HookManager
10:26 a.m. - Requested Manager: LinkManager
10:26 a.m. - Requested Manager: GlobalVars
10:26 a.m. - TSIERP_WXService.ServiceCreate
10:26 a.m. - ML.ConnectManager start
10:26 a.m. - ModulePath = C:\Program Files (x86)\WXServer\Modules\
10:26 a.m. - Database = C:\WXDatos\WXServiceDB.fdb
10:26 a.m. - DB connected
10:26 a.m. - HookManager connected
10:26 a.m. - hooks loaded=4
10:26 a.m. - modules loaded=4
10:26 a.m. - ML.ConnectManager done
10:26 a.m. - TSIERP_WXService.ServiceStart begin
10:26 a.m. - HC.SetGlobalBoolean start
10:26 a.m. - HC.SetGlobalBoolean done
10:26 a.m. - HC.ExecuteHook(HK_INIT_SERVICE) start
10:26 a.m. - WXServer.Listen
10:26 a.m. - Enter __InitModule
10:26 a.m. - Leave __InitModule
10:26 a.m. - HC.ExecuteHook(HK_INIT_SERVICE) end
10:26 a.m. - TSIERP_WXService.ServiceStart end
|
und das Logfile von einem der Rechner, wo es nicht geht :
Zitat: | 7:45 PM - Requested Manager: HookManager
7:45 PM - Requested Manager: LinkManager
7:45 PM - Requested Manager: GlobalVars
7:45 PM - TSIERP_WXService.ServiceCreate
7:45 PM - ML.ConnectManager start
7:45 PM - ModulePath = C:\Program Files\WXServer\Modules\
7:45 PM - Database = C:\WXDatos\WXServiceDB.fdb
7:45 PM - DB connected
7:45 PM - HookManager connected
7:45 PM - hooks loaded=4
7:45 PM - modules loaded=4
7:45 PM - ML.ConnectManager done |
Hat jemand schonmal so ein Problem gehabt und eine Idee, was das sein könnte ?
Danke schonmal
_________________ "Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 07.12.11 18:04
Wenn du das im lokalen Netzwerk reproduzieren kannst, wäre es wohl am einfachsten einfach mal den Remotedebugger zu bemühen. 
|
|
HelgeLange 
      
Beiträge: 735
Erhaltene Danke: 6
Windows 7
Delphi7 - Delphi XE
|
Verfasst: Mi 07.12.11 18:15
Ich reproduziere das in 2 VMs hier im eigenen Rechner. Debugging habe ich auch schonmal dran gedacht, nur bietet mir Delphi beim Attach Process den Process nicht an, hehe
Habs auch mit Sleep probiert, dem ganzen etwas Zeit zu geben, dammit man sich verbinden kann etc.
Ich habe auch mal den ganzen Code jetzt von ServiceStart in ServiceCreate bewegt (ausser dem Starten der des Timers und dem Setzen der Variable Started). Er führt alles ohne Probleme aus, keine Exception, kommt aber trotzdem nie dazu, ServiceStart auszuführen.
Remote-Debugging habe ich noch nie probiert
Mal im Netz nachschaun, wie das genau geht und was ich auf der VM installieren muss.
_________________ "Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
|
|
HelgeLange 
      
Beiträge: 735
Erhaltene Danke: 6
Windows 7
Delphi7 - Delphi XE
|
Verfasst: Mi 07.12.11 19:17
Ich vermute fast, dass es eine fehlende DLL oder so ist, ich habe gerade den Service auf dem Rechner meiner Frau installiert, die hat auch ein Win7 64bit, aber frisch installiert vor 2 Wochen. Da ist weder Delphi noch sonstirgendwas drauf. Und der Service hängt dort auch.
Gibt es eine Möglichkeit zu sehen, was der alles so lädt ?
_________________ "Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
|
|
Boldar
      
Beiträge: 1555
Erhaltene Danke: 70
Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
|
Verfasst: Mi 07.12.11 19:22
ProcMon von Sysinternals.
|
|
HelgeLange 
      
Beiträge: 735
Erhaltene Danke: 6
Windows 7
Delphi7 - Delphi XE
|
Verfasst: Mi 07.12.11 20:01
Ok, man sieht, was für DLLs geladen werden. Auch das Eventlog hat viele Informationen, aber nix, was hilft. Sieht alles ok und dann hört es abrupt auf mit Thread_exits 
_________________ "Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 07.12.11 20:24
Starte Delphi bzw. den Remotedebugger mit Adminrechten, dann kannst du auch einen Dienst debuggen.
Ich vermute bei dir reicht vielleicht auch schon OnException einer TApplicationEvents Komponente auf deinem Servicemodul. Falls da eine auftritt, solltest du die in das Systemlog schreiben.
Mehr ggf. zu Hause, am Handy kann ich grad nicht so gut schauen...
|
|
HelgeLange 
      
Beiträge: 735
Erhaltene Danke: 6
Windows 7
Delphi7 - Delphi XE
|
Verfasst: Mi 07.12.11 20:53
jaenicke hat folgendes geschrieben : | Starte Delphi bzw. den Remotedebugger mit Adminrechten, dann kannst du auch einen Dienst debuggen.
Ich vermute bei dir reicht vielleicht auch schon OnException einer TApplicationEvents Komponente auf deinem Servicemodul. Falls da eine auftritt, solltest du die in das Systemlog schreiben.
Mehr ggf. zu Hause, am Handy kann ich grad nicht so gut schauen... |
Ich habe eine TApplicationEvents Komponente mal mit in den Service eingebaut und schreibe eine logmessage in mein logfile im Event OnException. Leider nichts. Er führt ServiceCreate aus (und loggt das) und dann ist stille. Das Schreiben des Logs ist auch das letzte in ServiceCreate, danach kommt nur noch das "end;" der Procedure
Selbst wenn das mit den Adminrechten geht, was soll ich denn da debuggen, wenn er erst garnicht in das event kommt.
Wundere mich eh, warum ich soviele Probleme habe, einen service zu schreiben. In Delphi 2007 hab ich es garnicht hinbekommen, nichtmal der leere automatisch von Delphi erstellte Service ging da
Habt Ihr die gleichen Probleme oder geht immer alles auf Anhieb ?
_________________ "Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 07.12.11 21:56
|
|
HelgeLange 
      
Beiträge: 735
Erhaltene Danke: 6
Windows 7
Delphi7 - Delphi XE
|
Verfasst: Mi 07.12.11 22:47
Naja, debuggen auf meinem Arbeitsrechner geht jetzt, Delphi als Admin ausführen und schon zeigt er den Service an.
kleiner Tipp wegen der Variable, es geht auch IsDebuggerPresent als Bedingung für ein Repeat-Until.
Jetzt installiere ich mal alles auf der VM und teste dort.
_________________ "Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 07.12.11 22:54
|
|
bummi
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: Mi 07.12.11 23:01
Nur so am Rande , ist auf dem Rechner AVG am laufen, der bringt bei Verwendung von IsDebuggerPresent unter nicht nachvollziehbaren Konstellationen Fehlermeldungen(Warnungen) und Sperren.
_________________ Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
|
|
HelgeLange 
      
Beiträge: 735
Erhaltene Danke: 6
Windows 7
Delphi7 - Delphi XE
|
Verfasst: Mi 07.12.11 23:58
HelgeLange hat folgendes geschrieben : | Jetzt installiere ich mal alles auf der VM und teste dort. |
Es reicht dort denke ich den Remotedebugger zu installieren bzw. zu kopieren. Wenn der als Admin gestartet wird, sollte das auch gehen.[/quote]
jo, sind ja nur 3 Komponenten-Pakete, die sind schnell installiert. Ausserdem bin ich gleichmal so forsch und teste das gleich mit Delphi 2007 statt mit XE, da die Client-Anwendung ja auch in Delphi 2007 geschrieben ist und es ein rumgemache ist mit UniCode und AnsiCode in der Kommunikation.
@Bummi : AVG ? Igitt... nee, VM immer ohne antivirus, damit surfe ich ned
_________________ "Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
|
|
HelgeLange 
      
Beiträge: 735
Erhaltene Danke: 6
Windows 7
Delphi7 - Delphi XE
|
Verfasst: Do 08.12.11 00:43
So, habe jetzt einfach mal ALLES aus der unit rausgenommen und in Datenmodul gepackt und rufe jetzt nur noch in ServiceStart/Stop das Datemodul auf.
Hier der Auszug :
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:
| procedure TSIERP_WXService.ServiceCreate(Sender: TObject); begin DMM := nil; end;
procedure TSIERP_WXService.ServiceDestroy(Sender: TObject); begin LogToFile('TSIERP_WXService.ServiceDestroy'); end;
procedure TSIERP_WXService.ServiceExecute(Sender: TService); begin While Not Terminated Do ServiceThread.ProcessRequests(True); end;
procedure TSIERP_WXService.ServiceStart(Sender: TService; var Started: Boolean); begin Try DMM := TDMM.Create(nil); LogToFile('TSIERP_WXService.ServiceCreate'); Except on E: Exception do LogToFile(E.Message); End; Started := DMM.StartService; end;
procedure TSIERP_WXService.ServiceStop(Sender: TService; var Stopped: Boolean); begin Stopped := DMM.StopService; DMM.Free; DMM := nil; end; |
und das läuft, sogar in Delphi 2007. Vorher lief es nicht, und das debuggen machte Probleme, weil wenn man in ServiceCreate oder ServiceStart so durch-stepped, dann kriegt man den Timeout von Windows.
Jetzt das ganze noch unter den verschiedenen Systemen testen und dann ans TestLab wieder raus und schaun, dass die ihr OK geben.
_________________ "Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 08.12.11 01:21
|
|
HelgeLange 
      
Beiträge: 735
Erhaltene Danke: 6
Windows 7
Delphi7 - Delphi XE
|
Verfasst: Do 08.12.11 01:52
genau das ist jetzt passiert und ich habe eine kleine exception bekommen, aber es wundert mich, dass dies auf einigen Rechnern lief, auf anderen nicht. Und ich hatte es in einem Try..Except block und das hat nicht geholfen.
_________________ "Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
|
|
HelgeLange 
      
Beiträge: 735
Erhaltene Danke: 6
Windows 7
Delphi7 - Delphi XE
|
Verfasst: Fr 09.12.11 00:32
So zum schnellen informativen update mit den Tücken des Services...
ok, heut morgen wollte ich die Tests machen auf verschiedenen Systemen und gleich beim ersten die gleichen Probleme wie vorher
Habe dann dort Delphi installiert um mal zu schaun, was er dort hat, hab den Service auf das Entwicklungsverzeichnis uminstalliert. Auf einmal ging es. Dann den Service deinstalliert, einen neuen Installer gebaut, Delphi und BPL Verzeichnisse unzugänglich gemacht. Und es ging wieder nicht. Alle BPLs ins Verzeichnis des Services kopiert, kein Erfolg. Konnte dort nichtmal debuggen, kam zwar in ServiceCreate, aber danach war Schluss.
Um eine Lange Geschichte von 8 Stunden Suchen und probieren kurz zu machen : Es blieben 2 Möglichkeiten
1.) Er versucht auf einen Entwicklungspfad zuzugreifen (unwahrscheinlich, das prüfte ich)
2.) Installationsmethode.
Zu 2. muss man sagen, dass es 2 Möglichkeiten gibt einen Delphi Service zu installieren. "<Programmname>.exe / install" oder "SC.exe CREATE <ServiceName.exe> binPath= "<Pfad>\ServiceName.exe"" im command prompt mit admin.
Nun habe ich halt festgestellt, dass ich beim rumprobieren immer erstere Variante genommen habe (schneller zu schreiben  ), aber im installer die SC variante. Und die ging scheinbar nicht. Habe es mal per Hand probiert, Service installiert mit beiden Methoden und es ging nur mit der 1. Variante.
Hab dann den Installer umgeschrieben und gleich beim 1. Versuch alles geklappt.
_________________ "Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 09.12.11 06:43
Ein Unterschied zwischen deinen beiden Methoden, der mir direkt auffällt, ist, dass du als Name für den Dienst (der z.B. im Dienstmanager angezeigt wird) den Namen der Exe nimmst. Wenn du das nicht manuell in Delphi auch so eingestellt hast, heißt der dort anders.
Ich habe aber glaube ich für einen Delphidienst noch nie die sc.exe zur Installation benutzt, das werde ich bei Gelegenheit mal testen. 
|
|
baka0815
      
Beiträge: 489
Erhaltene Danke: 14
Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
|
Verfasst: Fr 09.12.11 12:38
Auf jeden Fall wird die ServiceAfterInstall-Funktion nur beim Aufruf über <EXE> /install aufgerufen und nicht über die sc.exe.
|
|
HelgeLange 
      
Beiträge: 735
Erhaltene Danke: 6
Windows 7
Delphi7 - Delphi XE
|
Verfasst: Fr 09.12.11 17:24
Gibt es eigentlich eine Möglichkeit, den Dienst zu starten per Kommando-Zeile ? Sowas wie <MyService>.exe /start ?
_________________ "Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
|
|
|