AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Beliebiges Programm als Service?
Thema durchsuchen
Ansicht
Themen-Optionen

Beliebiges Programm als Service?

Ein Thema von quirks · begonnen am 27. Dez 2004 · letzter Beitrag vom 6. Mär 2012
 
Benutzerbild von himitsu
himitsu

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

AW: Beliebiges Programm als Service?

  Alt 13. Feb 2012, 16:40
Oder andersrum.

Man baut einen Service, welcher sich (über einen Parameter, bzw. über eine Debugger-Erkennung) als normales Programm startet.
So hab ich das mit dem Service unsere unserer Produktes auch gehandhabt.

[edit]
Delphi-Quellcode:
unit MyServiceDataModul;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, SvcMgr, Math, AppEvnts, Registry, Dialogs, ExtCtrls, Types, StdCtrls;

type
  TMyService = class(TService)
    function GetServiceController: TServiceController; override;
    procedure ServiceCreate(Sender: TObject);
    procedure ServiceStart(Sender: TService; var Started: Boolean);
    procedure ServiceExecute(Sender: TService);
    procedure DebugServiceClose(Sender: TObject; var CanClose: Boolean);
  end;

var
  MyService: TMyService;

implementation

{$R *.DFM}

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  MyService.Controller(CtrlCode);
end;

function TMyService.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;

type
  TServiceApplicationHack = class(TServiceApplication);

procedure TMyService.ServiceCreate(Sender: TObject);
var
  Started: Boolean;
  Temp: TForm;
begin
  if IsDebuggerPresent or FindCmdLineSwitch('DEBUG', ['-', '/'], True) 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 do begin
    {}      Forms.Application.ProcessMessages;
    {}      Sleep(20);
    {}    end;
    {}  Forms.Application.Terminate;
    {}end;
  end;
end;

procedure TMyService.ServiceStart(Sender: TService; var Started: Boolean);
begin
  try

    ...

  except
    on E: Exception do begin
      Started := False;
      ErrCode := 666;
      E.Message := 'Service konnte nicht gestartet werden.' + sLineBreak + E.Message;
      raise;
    end;
  end;
end;

procedure TMyService.ServiceExecute(Sender: TService);
begin
  while not Terminated do
    try
      ServiceThread.ProcessRequests(False);
    except
      on E: Exception do begin
        LogEvent('Es ist ein nicht abgefangener Fehler aufgetreten.', E);
        Sleep(500);
      end;
    end;
end;

procedure TMyService.DebugServiceClose(Sender: TObject; var CanClose: Boolean);
begin
  if Assigned(MyService) and Assigned(MyService.ServiceThread) then
    MyService.ServiceThread.Terminate;
end;

end.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (13. Feb 2012 um 16:54 Uhr)
  Mit Zitat antworten Zitat
 


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 01:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz