Einzelnen Beitrag anzeigen

Susanne

Registriert seit: 21. Mai 2004
Ort: Lage
232 Beiträge
 
Delphi 2005 Professional
 
#8

Re: Anwendung --> Dienst erstellen

  Alt 28. Okt 2004, 20:53
Ich glaube, den Thread selber habe ich am Laufen. Ich habe das ganze jetzt mit einer einfach normalen Anwendung ausprobiert, damit funktioniert es nun, ohne Probleme. Beide Varianten habe keine Timer und nichts unötiges.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Thread;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  TThread: TimeManagerThread;
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
   TThread:= TimeManagerThread.Create (false);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if Assigned(TThread) then
         begin
            {TMThread.Terminated;}
            TThread.Terminate;
            //kehrt erst zurück, wenn Thread beendet ist!
            //TThread.WaitFor;
            //Freigeben des Threads
            FreeAndNil(TThread);
         end
end;

end.
Damit bin ich mir erst mal sicher, dass der Thread läuft. Nun habe ich das ganze nochmal mit dem Dienst probiert.

Delphi-Quellcode:
unit Dienst;

interface

uses
  Windows, Messages, extctrls, WinSvc, SysUtils, Classes, Graphics, Controls,
  SvcMgr, ShellAPI, Dialogs, Thread;

type
  TTimeManagerService = class(TService)
     {Initialisierung des TimeManagerServices}
     procedure ServiceStart(Sender: TService; var Started: Boolean);
     {Deinitialisierung des TimeManagerServices}
     procedure ServiceStop(Sender: TService; var Stopped: Boolean);
     {hier erfolgt die Steuerung des Dienstes}
     procedure ServiceExecute(Sender: TService);
  private
    { Private-Deklarationen }
  public
    function GetServiceController: TServiceController; override;
    { Public-Deklarationen }
  end;

var
  TimeManagerService: TTimeManagerService;
  TMThread: TimeManagerThread;
implementation

{$R *.DFM}

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


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


//Initialisierung des TimeManagerServices
procedure TTimeManagerService.ServiceStart(Sender: TService; var Started: Boolean);
   begin
      TMThread:= TimeManagerThread.Create(false);
   end;

//DeInitialisierung des TimeManagerServices
procedure TTimeManagerService.ServiceStop(Sender: TService; var Stopped: Boolean);
   begin
    //Hier müsste dann der TimeManagerTeil CloseQueryForm aufgerufen werden
      if Assigned(TMThread) then
         begin
            {TMThread.Terminated;}
            TMThread.TerminateThread;
            //kehrt erst zurück, wenn Thread beendet ist!
            //TMThread.WaitFor;
            //Freigeben des Threads
            FreeAndNil(TMThread);
         end;
   end;

//Steuerung des Dienstes
procedure TTimeManagerService.ServiceExecute(Sender: TService);
   begin
     while not Terminated do
         ServiceThread.ProcessRequests(True);
   end;

end.
Und hier funktioniert das ganze natürlich nicht richtig. im OnStart habe ich ServiceStart zugeordnet und onstop Servicestop. installieren, deinstallieren macht er, er startet auch, aber es passiert nichts, er müsste eine Anwendung öffnen. Wenn ich dann den Dienst beende kommt folgende Fehlermeldung

Dienst auf lokaler comüuter konnt nicht bendetwerden, Kein Fehler zurück gegeben, kann interne Windows-Fehler sein, oder interner Dienst fehler

Im TaskManager unter Prozesse ist er auch immernoch vorhanden. Wo verflucht nochmal ist denn nun noch was,was ziemlich schief läuft?
Susanne
  Mit Zitat antworten Zitat