Thema: Delphi Service startet nicht

Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.166 Beiträge
 
Delphi 12 Athens
 
#7

AW: Service startet nicht

  Alt 16. Jun 2011, 11:26
Zitat:
Delphi IDE -> Menü Run -> Parameters -> Host application: "net", Parameters: "start MeinServiceName" (jeweils ohne die Anführungszeichen).
Über NET START im Debugger gestartet funktioniert nicht.

Application.Run; beendet sich dann immer sofort und startet erst garnicht.
Das passierte auch schon, als ich damals versuchte den Prozess (die Service.exe) direkt im Delphi zu debuggen.

Irgendwie erkennt TService anscheinend, daß es nicht als "Dienst" im SYSTEM-Konto läuft und startet dann garnicht erst.

Aus diesem Grund hatte ich damals sowas gemacht, um es Debuggen zu können.
Delphi-Quellcode:
procedure TProdatSRVXEService.ServiceCreate(Sender: TObject);
var
  Started: Boolean;
  Temp: TForm;
begin
  LogEvent('DataServer-Create');
  LoadConfiguration;

  if Trim(SvcMgr.Application.Title) = 'then
    SvcMgr.Application.Title := ExtractFileName(Forms.Application.ExeName);
  if IsDebuggerPresent or FindCmdLineSwitch('DEBUG') then begin
    Forms.Application.MainFormOnTaskBar := False; // geht leider doch nicht ohne Form
    Forms.Application.CreateForm(TForm, Temp); // Form zum Beenden und für Eintrag in Taskbar
    Temp.Caption := 'Debug-Mode: ' + SvcMgr.Application.Title;
    Temp.OnCloseQuery := DebugServiceClose;
    Temp.Visible := True;
    { SvcMgr.Application.Run; }
    {}if FindCmdLineSwitch('INSTALL', ['-', '/'], True) then
    {}  TServiceApplicationHack(Application).RegisterServices(True, FindCmdLineSwitch('SILENT', ['-', '/'], True))
    {}else if FindCmdLineSwitch('UNINSTALL', ['-', '/'], True) then
    {}  TServiceApplicationHack(Application).RegisterServices(False, FindCmdLineSwitch('SILENT', ['-', '/'], True))
    {}else begin
    {}  Started := True;
    {}  ServiceStart(Self, Started);
    {}  if Started then
    {}    while not (Terminated or StopService) do begin
    {}      Forms.Application.ProcessMessages;
    {}      Sleep(20);
    {}    end;
    {}  Forms.Application.Terminate;
    {}end;
  end;
end;

procedure TProdatSRVXEService.DebugServiceClose(Sender: TObject; var CanClose: Boolean);
begin
  StopService := True;
end;
Diese "Hack" läuft, wobei Application.Ran umgangen wird, welches ja erzeit nicht geht und beim Debuggen auch nie funktionierte.
Allerdings läuft er so als Anwendung und nicht als Dienst.

PS: Diesen Codeteil hatte ich gerade natürlich auskommentiert.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (16. Jun 2011 um 11:29 Uhr)
  Mit Zitat antworten Zitat