Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Dienst, Service oder was? (D 2009 Prof) (https://www.delphipraxis.net/152134-dienst-service-oder-d-2009-prof.html)

stahli 12. Jun 2010 11:08

Dienst, Service oder was? (D 2009 Prof)
 
Hallo zusammen,

ich möchte täglich/stündlich eine php-WebSite abrufen und auf einen bestimmten Inhalt (enthaltenen Text) prüfen.
Mit einem Formular und WebBrowser könnte ich das lösen.
Ich möchte das aber gern mit einemm Dienst im Hintergrund realisieren, finde aber passenden Informationen.

Die Fragen sind:
Wie kann ich solch einen Dienst erstellen und automatisch täglich starten?
Wie kann ich damit eine php-Seite als Text abholen?

Danke
Stahli

Bernhard Geyer 12. Jun 2010 12:35

AW: Dienst, Service oder was? (D 2009 Prof)
 
Du kannst einen Dienst nehmen oder einfach auch in Windows eine wiedergehrende Aufgabe eintragen und dort dein Programm entsprechend Starten lassen.

stahli 12. Jun 2010 12:44

AW: Dienst, Service oder was? (D 2009 Prof)
 
Gibt es ein Tutorial, wie man so einen Windowsdienst erstellt und automatisch starten lässt? Ich finde keinen Einstieg dazu.

Luckie 12. Jun 2010 14:06

AW: Dienst, Service oder was? (D 2009 Prof)
 
Und warum muss es unbedingt ein Dienst sein? Reicht nicht ein Programm im Autostart?

stahli 12. Jun 2010 14:18

AW: Dienst, Service oder was? (D 2009 Prof)
 
Es sollte halt unauffällig im Hintergrund laufen und vor allem wollte ich mich mit dem Thema einmal beschäftigen.
Ich dachte, das wäre gut lösbar, ich habe nur eben keinen Ansatz gefunden, wie...

Ich habe mal testweise eine "Service-Anwendung" erstellt, die jede Sekunde einen Beep erzeugt, weiß aber schon nicht, ob das der richtige Weg ist und wie man diesen "Dienst" im Windows automatisch im Hintergrund laufen lässt...

Luckie 12. Jun 2010 14:22

AW: Dienst, Service oder was? (D 2009 Prof)
 
Und warum darf der Benutzer nicht wissen, dass da was im Hintergrund läuft?

Der Dienst muss vom Administrator installiert werden und der Starttyp auf automatisch stehen,m dann wird er bei jedem Windowsstart mit gestartet.

Und ich weiß nicht, wie du suchst, aber Bei Google suchendelphi dienst tutorial liefert mehr als genug Treffer.

Bernhard Geyer 12. Jun 2010 16:20

AW: Dienst, Service oder was? (D 2009 Prof)
 
Zitat:

Zitat von stahli (Beitrag 1028363)
weiß aber schon nicht, ob das der richtige Weg ist und wie man diesen "Dienst" im Windows automatisch im Hintergrund laufen lässt...

Der Dienst läuft immer "automatisch im Hintergrund". Ab Vista kannst du jedoch nicht mit "normalen" (Message-)Dialogen mit dem angemeldeten Benutzer interagieren. Der Dienst läuft auch ohne das ein User angemeldet ist.

stahli 12. Jun 2010 19:58

AW: Dienst, Service oder was? (D 2009 Prof)
 
Ok, danke erst mal für die Hilfen.
Momentan kriege ich wohl nicht mal das googeln richtig hin ;-(
Ich werde mal ein bischen testen...

stahli 13. Jun 2010 12:50

AW: Dienst, Service oder was? (D 2009 Prof)
 
Ich komme noch nicht klar damit und finde auch im Netz sehr Widersprüchliches :-(
Vielleicht können wir das ja mal hier Stück für Stück nachvollziehbar aufarbeiten:

Delphi-Quellcode:
unit sju;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,
  ExtCtrls;

type
  TServiceJu = class(TService)
    Timer1: TTimer;
    procedure ServiceExecute(Sender: TService);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    function GetServiceController: TServiceController; override;
    { Public-Deklarationen }
  end;

var
  ServiceJu: TServiceJu;

implementation

{$R *.DFM}

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

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

procedure TServiceJu.ServiceExecute(Sender: TService);
begin
  Timer1.Enabled := True;
  while not Terminated do
    ServiceThread.ProcessRequests(False); // or True
  Timer1.Enabled := False;
end;

procedure TServiceJu.Timer1Timer(Sender: TObject);
begin
  Beep;
end;

end.
Wenn ich den Dienst in der Dos-Box mit "ju /install" installiere, erhalte ich eine MessageBox "Service erfolgreich installiert". Jede Sekunde beept der Service erwartungsgemäß.
Wenn ich die Meldung schließe, beept nix mehr.
Der Dienst läuft (wie man in der Systemüberwachung sieht) nach der Installation nicht automatisch. Wenn ich ihn starte, ist keine Reaktion ersichtlich (es beept nichts).
Wenn ich den Dienst mit "ju /uninstall" deinstalliere, erhalte ich eine MessageBox "Service erfolgreich deinstalliert". Jede Sekunde beept der Service wieder.
Wenn ich die Meldung schließe, beept nix mehr.

Ersetze ich das False im "ServiceThread.ProcessRequests(False);" durch True sind keine Änderungen zu bemerken.

Der Service ist auf "interactiv" gesetzt

Wenn ich den Timer entferne und ServiceExecute ändere in
Delphi-Quellcode:
while not Terminated do
begin
  ServiceThread.ProcessRequests(False);
  Beep;
  Sleep(500);
end;
erhalte ich zu keinem Zeitpunkt einen Beep.

Was mache ich falsch?

sx2008 13. Jun 2010 13:37

AW: Dienst, Service oder was? (D 2009 Prof)
 
Wenn das Programm nur jede Stunde arbeiten soll, dann ist ja eigentlich kein Dienst erforderlich.
Die restliche Zeit würde das Programm nur auf "der faulen Haut" liegen und Resourcen verbrauchen.
Ich würde daher eine normale Anwendung zeitgesteuert mit dem Taskplaner starten.
Den Taskplaner kann man über TASKSCHD.MSC konfigurieren.

stahli 13. Jun 2010 14:13

AW: Dienst, Service oder was? (D 2009 Prof)
 
Ja klar, aber mir geht es auch um´s Prinzip.
Es sollte doch gehen, einen solchen Dienst zu realisieren - und das möchte ich mal testen.
Vielleicht können ja auch andere mal von dem Thread profitieren.

Luckie 13. Jun 2010 19:07

AW: Dienst, Service oder was? (D 2009 Prof)
 
Zitat:

Zitat von stahli (Beitrag 1028510)
Der Service ist auf "interactiv" gesetzt

Ab Windows Vista gibt es keine interaktiven Dienste mehr!

stahli 13. Jun 2010 22:11

AW: Dienst, Service oder was? (D 2009 Prof)
 
Ich habe jetzt noch einmal einen neuen Service erstellt, aber bekomme das auch nicht hin.

In den Service-Ereignissen lasse ich mir Nachrichten ausgeben:

* Beim Installieren: create, beforeinstall, afterinstall, "wurde installiert", destroy
* Starten des Dienstes bricht nach einigen Sekunden mit einer Fehlermeldung ab (Dienst antwortet nicht rechtzeitig)
(Das Ereignis Execute wird gar nicht erreicht.)
* Beim Deinstallieren: create, beforedeinstall, afterdeinstall, "wurde deinstalliert", destroy

Muss man noch etwas bei den Eigenschaften einstellen?
"Interactive" scheint ja egal zu sein.

kuba 13. Jun 2010 22:30

AW: Dienst, Service oder was? (D 2009 Prof)
 
Zitat:

Zitat von stahli (Beitrag 1028520)
Ja klar, aber mir geht es auch um´s Prinzip.
Es sollte doch gehen, einen solchen Dienst zu realisieren - und das möchte ich mal testen.
Vielleicht können ja auch andere mal von dem Thread profitieren.

Hy,

probier mal den NT-Service von Assabard !!

Der funktioniert auch noch unter Vista/7, um deine Abfrage jede Stunde auszulösen verwende folgenden Code:

Delphi-Quellcode:
var
    Time  :real;
PROCEDURE SERVICE_MAIN;
begin
  Time := Now+(StrtoTime('01:00:00'));
repeat
  if Now > TimeToStr(Time) then
  begin
     //AKTION
  end;
  sleep(1000); //den Dienst "bremsen", sonst 100% CPU Auslastung.
until stopped;
end;

BEGIN
  PROG_MAIN;
END.
KUBA

stahli 14. Jun 2010 14:09

AW: Dienst, Service oder was? (D 2009 Prof)
 
Hmm, das wird mir zu kompliziert. Das Tut ist ja auch aus 2001.

Soll es nicht möglich sein, so einen einfachen "Dienst" (z.B. Beep jede Minute) mit D2009 und dem TService unter Windows7 komfortabel zu realisieren?
Das kann ich mir eigentlich nicht vorstellen...

kuba 14. Jun 2010 15:24

AW: Dienst, Service oder was? (D 2009 Prof)
 
Zitat:

Zitat von stahli (Beitrag 1028767)
Hmm, das wird mir zu kompliziert. Das Tut ist ja auch aus 2001.

Soll es nicht möglich sein, so einen einfachen "Dienst" (z.B. Beep jede Minute) mit D2009 und dem TService unter Windows7 komfortabel zu realisieren?
Das kann ich mir eigentlich nicht vorstellen...

NT-Service ist immer noch NT-Service, hat sich seit 2001 nichts verändert, nur die Umgebung hat sich verändert sodass bei neueren NT-Systemen evtl. etwas beachtet werden muss.

Das Beispiel ist doch ganz einfach zu kompilieren, oder ?

Schau nochmal hier rein, das ist das gleiche.

Ein einfacher Dienst und Beep kannst du auch so machen:

Delphi-Quellcode:
PROCEDURE SERVICE_MAIN;
begin
repeat
  beep;
  sleep(60000); //jede Minute ein beep
until stopped;
end;

BEGIN
  PROG_MAIN;
END.

Luckie 14. Jun 2010 22:06

AW: Dienst, Service oder was? (D 2009 Prof)
 
Zitat:

Zitat von stahli (Beitrag 1028767)
Hmm, das wird mir zu kompliziert.

Mit manchen Sachen muss man sich eben mal etwas intensiver beschäftigen, da ist es mit Copy and Paste nicht getan, weil man auch verstehen muss, was man tut.

stahli 15. Jun 2010 19:31

AW: Dienst, Service oder was? (D 2009 Prof)
 
Ja klar, muss man sich beschäftigen. Aber man sollte immer den günstigsten/einfachsten Weg wählen.
Ich verstehe das immer noch so, dass für diese Zwecke EIGENTLICH der TService vorgesehen ist und dass die MainSchleife in der OnExecute-Behandlung läuft.
Entsprechende Beispiele habe ich im Netz gefunden, bei mir funktioniert das aber nicht.

Verstehe ich das völlig falsch? Kann das gar nicht gehen oder geht das nur unter Vista und Win7 nicht (mehr)?

Installieren kann ich den von mir erstellten Dienst ja, er lässt sich nur nicht korrekt starten.
Die Alternative nach "Assabard" finde ich recht umständlich und würde mich da nur einarbeiten wollen, wenn ich mit dem TService völlig auf dem Holzweg bin.
Vielleicht klemmt mein bisheriger Dienst-Versuch ja auch nur an einer Kleinigkeit?

SirThornberry 15. Jun 2010 20:12

AW: Dienst, Service oder was? (D 2009 Prof)
 
Es ist schon sehr merkwürdig das nur bei dir der TService nicht funktioniert.
Hast du denn schonmal überprüft ob überhaupt die Execute-Methode aufgerufen wird?
Das du während dem installieren und desinstallieren ein Beep hörst wird übrigens nicht an der Execute-Methode liegen. Viel mehr vermute ich das dein Timer zur Designzeit platziert wurde und Enabled dort noch auf True steht. Denn die Execute-Methode wird während dem installieren und deinstallieren eigentlich nicht aufgerufen.

stahli 15. Jun 2010 20:26

AW: Dienst, Service oder was? (D 2009 Prof)
 
Das mit dem Timer stimmt. Der war in der "Form" zur Designzeit aktiviert.

Ich habe dann einen Test ohne Timer versucht und in den Ereignissen Nachrichten ausgegeben (habe ich weiter oben aufgeführt).
OnInstall usw werden durchgeführt.

In der Systemüberwachung/Dienste starte ich dann den Service, was nach einer Weile mit einer Fehlermeldung abbricht.
OnExecute wird nicht erreicht.

Klaus01 15. Jun 2010 20:45

AW: Dienst, Service oder was? (D 2009 Prof)
 
Hallo Stahli,

ist die Fehlermeldung irgendwie hilfreich?
Oder steht da nur drinnen das der Service abgebrochen wurde?
Wo hast Du die Meldung gefunden - im Eventlog?

Grüße
Klaus

stahli 15. Jun 2010 21:47

AW: Dienst, Service oder was? (D 2009 Prof)
 
Beim Starten des Dienstes gibt es eine Progressbar und nach ein paar Sekunden erscheint die Fehlernachricht:
"Der Dienst xy auf LokalerComputer konnte nicht gestartet werden.
Fehler 1053: Der Dienst antwortete nicht rechtzeitig auf die Start- oder Steuerungsanforderung."

Die OnStart-Behandlung wird offenbar nicht ausgeführt, da ich meine dort auszugebende Message nicht erhalte.

SirThornberry 16. Jun 2010 07:13

AW: Dienst, Service oder was? (D 2009 Prof)
 
Zitat:

Zitat von stahli (Beitrag 1029154)
Die OnStart-Behandlung wird offenbar nicht ausgeführt, da ich meine dort auszugebende Message nicht erhalte.

Wie gibst du die Message aus und unter welchem Betriebssystem? Hast du mal daran gedacht das eventuell deine Ausgabe der Message fehlschlägt aufgrund von fehlenden Berechtigungen bei einem Dienst und deswegen dein ganzer Dienst nicht startet?

Bummi 16. Jun 2010 10:02

AW: Dienst, Service oder was? (D 2009 Prof)
 
Ich habe vor Einiger Zeit mal einen Apachewatcher geschrieben, der den Apachedienst neu starten soll wenn er hängt (kann auch www-publishingdienst sein).
Vieleicht kannst Du aus dem Code extrahieren was Du brauchst.

Konfuration über ini-datei:
[Settings]
URL=128.0.0.1
ServiceName=www-publishingdienst
IdleTimeSek=10
MaxErrorCount=3

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,WinSvc,inifiles,
  clTcpClient, clHttp, ExtCtrls,Shellapi;
type
  TWorkThreadThread = class(TThread)
  private
    procedure Check4Url;
    public
      procedure Execute; override;
  end;
  TApacheWatcher = class(TService)
    http: TclHttp;
    RestartTimer: TTimer;
    procedure ServiceStart(Sender: TService; var Started: Boolean);
    procedure ServiceContinue(Sender: TService; var Continued: Boolean);
    procedure ServicePause(Sender: TService; var Paused: Boolean);
    procedure ServiceStop(Sender: TService; var Stopped: Boolean);
    procedure ServiceCreate(Sender: TObject);
    procedure RestartTimerTimer(Sender: TObject);
  private
    WorkThreadThread:TWorkThreadThread;
    procedure ReadInifile;
    procedure WriteInifile;
    procedure WriteLog(const FLogMessage: String);
    procedure StartForeignService;
    procedure StopForeignService;
    procedure Restart;
    procedure Check4Url;
    { Private-Deklarationen }
  public
  FErrors:Integer;
    function GetServiceController: TServiceController; override;
    { Public-Deklarationen }
  end;

var
  ApacheWatcher: TApacheWatcher;
  G_SleepTime:Integer;
  G_Log:String;
  G_ErrorCount:Integer;
  G_IniFile :String;
  G_JobRunning:Boolean;
  G_URL:String;
  G_ServiceName:WideString;
  ss:SERVICE_STATUS;
  type
  TSStatus=Array[1..7] of String;
  Const
  SStatus:TSStatus=('SERVICE_STOPPED', 'SERVICE_START_PENDING', 'SERVICE_STOP_PENDING', 'SERVICE_RUNNING', 'SERVICE_CONTINUE_PENDING', 'SERVICE_PAUSE_PENDING', 'SERVICE_PAUSED');


implementation

{$R *.DFM}
Function TimeStamp:String;
begin
  Result := FormatDateTime('yyyymmdd hh:nn:ss ',Now);
end;

Procedure CheckFileSize(Const FN:String;MaxLen:Integer);
var
sr:TSearchrec;
sl:TStringList;
begin
  if FindFirst(FN,faAnyfile, sr)=0 then
     begin
     if SR.Size>MaxLen then
        begin
        sl:=TStringList.Create;
        sl.LoadFromFile(fn);
        while length(SL.Text)>(MaxLen div 2) do
              begin
              sl.Delete(0);
              end;
        sl[0]:='[clipped] '+TimeStamp;
        sl.SaveToFile(FN);
        end;
     end;
  FindClose(sr);
end;

Procedure TApacheWatcher.WriteLog(Const FLogMessage:String);
var
F:TextFile;
begin

if length(G_Log)>0 then
  begin
  try
    AssignFile(F, G_Log);
    if not Fileexists(G_Log) then Rewrite(F) else Append(F);
    Writeln(F,TimeStamp+': '+FLogMessage);
    CloseFile(F);
    CheckFileSize(G_Log,500000);
  except
  end;
  end;
end;


procedure TWorkThreadThread.Check4Url;
begin
    ApacheWatcher.Check4Url;
end;

procedure TWorkThreadThread.Execute;
begin

  while not Terminated do
  begin
    try
        Synchronize(Check4Url);
    except

    end;
    Sleep(1000*G_SleepTime);
  end;
end;



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


Procedure TApacheWatcher.Check4Url;
var
  sl:TStringList;
begin
   if not RestartTimer.Enabled then
   begin
     sl:=TStringList.Create;
     if (Length(G_URL)>0) and (Length(G_ServiceName)>0) then
        begin
         try
         Http.Close;
         Http.Get(G_URL, sl);
         except
           ON E:Exception DO WriteLog(E.Message);
         end;
         if Length(sl.Text) = 0  then inc(FErrors)
         else
            begin
            FErrors := 0;
            RestartTimer.Enabled := false;
            end;
         if FErrors > 0 then WriteLog('Error # :' + IntToStr(FErrors));
         if FErrors > G_ErrorCount then Restart;
        end;
     sl.Free;
   end;
end;

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

procedure TApacheWatcher.ServiceContinue(Sender: TService;
  var Continued: Boolean);
begin
  ReadInifile;
  WriteLog('Service continued');
  WorkThreadThread.Resume;
  Continued := True;
end;

procedure TApacheWatcher.ServiceCreate(Sender: TObject);
begin
  G_Log:=ChangeFileExt(ParamStr(0) ,'.log');
  G_IniFile:=ChangeFileExt(ParamStr(0),'.ini');
  G_JobRunning:=false;
end;

procedure TApacheWatcher.ServicePause(Sender: TService; var Paused: Boolean);
begin
  WriteLog('Service paused');
  WorkThreadThread.Suspend;
  Paused := True;
end;

procedure TApacheWatcher.ServiceStart(Sender: TService; var Started: Boolean);
begin
  ReadInifile;
  WriteLog('Service started');
  WorkThreadThread:= TWorkThreadThread.Create(False);
  Started := True;
end;

procedure TApacheWatcher.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
  WriteInifile;
  WriteLog('Service stopped');
  WorkThreadThread.Terminate;
  G_JobRunning:=false;
  Stopped := True;
end;


procedure TApacheWatcher.ReadInifile;
var
  ini:TInifile;
begin
  WriteLog( 'reading inifile: '+G_iniFile);
  ini:=TInifile.Create(G_iniFile);
  G_URL        := ini.ReadString('Settings','URL','');
  G_ServiceName := ini.ReadString('Settings','ServiceName','');
  G_SleepTime  := ini.ReadInteger('Settings','IdleTimeSek',10);
  G_ErrorCount := ini.ReadInteger('Settings','MaxErrorCount',3);
  ini.Free;
end;

procedure TApacheWatcher.RestartTimerTimer(Sender: TObject);
var
  V_SC_HANDLE:SC_HANDLE;
  V_SC_HANDLE2:SC_HANDLE;
  SName:WideString;
begin
  sName := G_ServiceName;
  V_SC_HANDLE:=OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS);
  V_SC_HANDLE2:=OpenService(V_SC_HANDLE,PChar(SName),SERVICE_QUERY_STATUS);
  FErrors := 0;
  WriteLog('Wait for ' + G_ServiceName +  ' shutdown');
  if QueryServiceStatus(V_SC_HANDLE2,ss) then
     begin
     if ss.dwCurrentState in [1,7] then
        begin
        WriteLog(Sname + ' shutdown confirmed');
        RestartTimer.Enabled:=false;
        StartForeignService;
        end;
     end;
  CloseServiceHandle(V_SC_HANDLE2);
  CloseServiceHandle(V_SC_HANDLE);
end;



procedure TApacheWatcher.StartForeignService;
begin
  WriteLog('Start ' + G_ServiceName);
  Shellexecute(0,'OPEN','net.exe',Pchar('start ' + G_ServiceName),nil,SW_Hide)
end;

procedure TApacheWatcher.StopForeignService;
begin
  WriteLog('Stop ' + G_ServiceName);
  Shellexecute(0,'OPEN','net.exe',Pchar('stop ' + G_ServiceName),nil,SW_Hide)
end;


procedure TApacheWatcher.WriteInifile;
var
  ini:TInifile;
begin
  ini:=TInifile.Create(G_inifile);
  ini.WriteString('Settings','URL',G_URL);
  ini.WriteString('Settings','ServiceName',G_ServiceName);
  ini.WriteInteger('Settings','IdleTimeSek',G_SleepTime);
  ini.WriteInteger('Settings','MaxErrorCount',G_ErrorCount);
  ini.Free;
end;

procedure TApacheWatcher.Restart;
begin

  StopForeignService;
  RestartTimer.Enabled:=true;
end;


end.

stahli 16. Jun 2010 13:09

AW: Dienst, Service oder was? (D 2009 Prof)
 
@SirThornberry: Ich nutze Win7 und für die Ausgabe ShowMessage. Während der Installation/Deinstallation funktionieren die Nachrichten. Ob ShowMessage in der OnStart-Behandlung stört, kann ich heute Abend mal testen.

@Bummi: Sollte denn meine Anforderung "zyklischer Beep" nun eigentlich mit einem nackigen TService, der von Hand installiert und gestartet wird möglich sein oder nicht?
Du hast Deine Hauptschleife ja in einem eigenen Thread laufen, nach anderen Beispielen sollte das aber wohl auch direkt in der OnExecute-Behandlung des TService gehen. Insofern wäre Deine Lösung (für meine Zwecke) vermutlich wohl zu umständlich.

Ich werde mal heute Abend noch etwas weiter testen...

Bummi 16. Jun 2010 13:20

AW: Dienst, Service oder was? (D 2009 Prof)
 
Sollte denn meine Anforderung "zyklischer Beep" nun eigentlich mit einem nackigen TService, der von Hand installiert und gestartet wird möglich sein oder nicht?

>> ja


Du hast Deine Hauptschleife ja in einem eigenen Thread laufen, nach anderen Beispielen sollte das aber wohl auch direkt in der OnExecute-Behandlung des TService gehen.
>> ja, ich setze meine Dienste alleredings immer auf dem selben Template auf, welches seit ich in einem Dienst diverse IO's , Dateiübertragungen, Spooljobs und Druckausgaben parallel zu verarbeiten hatte immer zumindest einen Workerthread enthält

stahli 18. Jun 2010 16:43

AW: Dienst, Service oder was? (D 2009 Prof)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich komme einfach nicht weiter und lade mal eine kleine j.exe hoch.
Vielleicht kann es ja mal jemand testen, das als Service zu installieren und zu starten.
Die Installation wird mit Nachrichten porotokolliert und beim starten und ausführen sollten beep erzeugt werden, der Dienst lässt sich aber bei mir nicht starten.

Der komplette Quelltext:
Delphi-Quellcode:
unit sj;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs;

type
  TServiceJ = class(TService)
    procedure ServiceExecute(Sender: TService);
    procedure ServiceAfterInstall(Sender: TService);
    procedure ServiceAfterUninstall(Sender: TService);
    procedure ServiceBeforeInstall(Sender: TService);
    procedure ServiceBeforeUninstall(Sender: TService);
    procedure ServiceContinue(Sender: TService; var Continued: Boolean);
    procedure ServiceCreate(Sender: TObject);
    procedure ServiceDestroy(Sender: TObject);
    procedure ServicePause(Sender: TService; var Paused: Boolean);
    procedure ServiceShutdown(Sender: TService);
    procedure ServiceStart(Sender: TService; var Started: Boolean);
    procedure ServiceStop(Sender: TService; var Stopped: Boolean);
  private
    { Private-Deklarationen }
  public
    function GetServiceController: TServiceController; override;
    { Public-Deklarationen }
  end;

var
  ServiceJ: TServiceJ;

implementation

{$R *.DFM}

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

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

procedure TServiceJ.ServiceAfterInstall(Sender: TService);
begin
  ShowMessage('ServiceAfterInstall');
end;

procedure TServiceJ.ServiceAfterUninstall(Sender: TService);
begin
  ShowMessage('ServiceAfterUninstall');
end;

procedure TServiceJ.ServiceBeforeInstall(Sender: TService);
begin
  ShowMessage('ServiceBeforeInstall');
end;

procedure TServiceJ.ServiceBeforeUninstall(Sender: TService);
begin
  ShowMessage('ServiceBeforeUninstall');
end;

procedure TServiceJ.ServiceContinue(Sender: TService; var Continued: Boolean);
begin
  Beep;
end;

procedure TServiceJ.ServiceCreate(Sender: TObject);
begin
  ShowMessage('ServiceCreate');
end;

procedure TServiceJ.ServiceDestroy(Sender: TObject);
begin
  ShowMessage('ServiceDestroy');
end;

procedure TServiceJ.ServiceExecute(Sender: TService);
begin
  Beep;
  while not Terminated do
  begin
    ServiceThread.ProcessRequests(False); // wait for termination
    Sleep(1);
  end;
  Beep;
end;

procedure TServiceJ.ServicePause(Sender: TService; var Paused: Boolean);
begin
  Beep;
end;

procedure TServiceJ.ServiceShutdown(Sender: TService);
begin
  Beep;
end;

procedure TServiceJ.ServiceStart(Sender: TService; var Started: Boolean);
begin
  Beep;
end;

procedure TServiceJ.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
  Beep;
end;

end.

Luckie 18. Jun 2010 18:19

AW: Dienst, Service oder was? (D 2009 Prof)
 
Wo wird da was protokolliert? Ich habe dir schon mal gesagt, dass du die ShowMessage Aufrufe nie sehen wirst, es sei denn du arbeitest noch unter Windows XP. Ab Windows Vista gibt es keine interaktiven Dienste mehr. Ein Dienst kann also kein Fenster auf dem Desktop des interaktiven Benutzers anzeigen.

stahli 19. Jun 2010 00:29

AW: Dienst, Service oder was? (D 2009 Prof)
 
ShowMessage funktioniert beim Installieren und Deinstallieren.
Zur Dienst-Laufzeit habe ich testweise nur einen Beep verwendent. Ich werde mal noch ohne den Beep testen, ob der Dienst dann gestartet werden kann (der Dienst heisst übrigens "ServiceJ").
Wie kann man denn dann Nachrichten ausgeben? Dienste blenden ja unter Vista/Win7 immer kleine Fenster über der Symbolleiste ein.

stahli 19. Jun 2010 00:54

AW: Dienst, Service oder was? (D 2009 Prof)
 
Aha!
Ich habe die units SysUtils und Dialogs entfernt und alle ShowMessage und Beeps.
Jetzt lässt sich der Service starten, wobei ich halt keine "Einblicke" habe.

Jetzt muss ich noch einen zyklischen Website-Abruf regeln:
- Internet-Komponente (muss ich mich damit beschäftigen)
- Pausen (sollte sicher Sleep in der Schleife reichen)
und vor allem:
- eine AUSGABE, wenn die Website einen bestimmten Text enthält.

Wie kann man den letzten Punkt (unter Win7) realisieren?

taveuni 19. Jun 2010 09:57

AW: Dienst, Service oder was? (D 2009 Prof)
 
Zitat:

Zitat von stahli (Beitrag 1030021)
Aha!
und vor allem:
- eine AUSGABE, wenn die Website einen bestimmten Text enthält.

Wie kann man den letzten Punkt (unter Win7) realisieren?

Mit Hilfe einer Applikation welche unter dem aktuellen Benutzer gestartet ist und
via IPC mit Deinem Service kommuniziert.

stahli 19. Jun 2010 11:30

AW: Dienst, Service oder was? (D 2009 Prof)
 
Ok, ich habe es jetzt doch mit einer normalen Anwendung gelöst, die nur in den Prozessen zu sehen ist.

Caption der MainForm habe ich auf '' gesetzt. Die Anwendung wird im Autostart-Ordner aufgenommen.
OnCreate der MainForm sieht folgendermaßen aus:

Delphi-Quellcode:
procedure TFormJC.FormCreate(Sender: TObject);
var
  BreakFlag: Boolean;
begin
  BreakFlag := False;
  repeat
    Beep; // wird noch mit Leben gefüllt
    Sleep(60000);
  until BreakFlag;
  Close;
end;
Die Anwendung kommt einfach nicht dazu, ein Formular einzublenden und ist nur in den Prozessen der Systemüberwachung zu sehen.

Mein Anliegen, dass keine störenden Formulare und Einträge in den "Anwendungen" der Systemüberwachung oder in der Taskleiste auftauchen ist damit gelöst.
Außerdem kann ich mit den üblichen VCL-Komponenten arbeiten.

Trotzdem wäre mal ein Dienst-Beispiel für Win7 (mit D2009 oder höher erstellt) interessant, das z.B. jede Minute einen BallonTip o.ä. einblendet.
Das mal als Anregung, falls jemand einmal ein Tutorial erstellen will...

Luckie 19. Jun 2010 12:27

AW: Dienst, Service oder was? (D 2009 Prof)
 
Zitat:

Zitat von stahli (Beitrag 1030049)
Die Anwendung kommt einfach nicht dazu, ein Formular einzublenden

Das ist schon mehr als grausam. Dabei gibt es hier im Forum mehr genug Beispiele, wie man das Hauptformular und den Taskbareintrag ausblendet.

Und hättest du mal auf mich gehört, als ich dir ganz zu Anfang gesagt habe, dass das mit der ShowMessage nichts wird, hättest du deinen Dienst schon viel früher zum Laufen gebracht.

stahli 19. Jun 2010 14:54

AW: Dienst, Service oder was? (D 2009 Prof)
 
1) Form und Taskar ausblenden
Ok, dafür reicht (unter Win7) offenbar ein Eintrag im Projektquelltext:
Delphi-Quellcode:
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TFormXYZ, FormXYZ);
  Application.ShowMainForm := False; // <---
  Application.Run;
2) ShowMessage
Sorry, kommt nicht wieder vor. Ich werde schneller von Dir lernen.
Mich hat eben verwirrt, dass es entsprechende (widersprüchliche) Infos dazu gab und offenbar Dienste ja auch Nachrichten einblenden.
Aber ist jetzt egal (für mich).
Dennoch Danke für die Hilfe.

Luckie 19. Jun 2010 15:43

AW: Dienst, Service oder was? (D 2009 Prof)
 
Die Nachrichten werden nicht von dem Dienst direkt angezeigt, sondern von einem Programm welches im Kontext des Benutzers läuft und mit dem Dienst kommuniziert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:39 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz