Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Delphi - aplikácia bez GUI - ako na to?

Chcel by som urobiť program na logovanie času zapnutia počítača. Malo by to bežať na pozadí ako proces bez okna aplikácie, to znamená, že nechcem, aby sa zobrazovala aplikácia dole na lište. Nebudem teda vytvárať okno aplikácie. Lenže dá sa niečo také vôbec napísať? Mal by som vlastne len súbor DPR bez knižníc (PAS, DFM), čiže formulárov. Ako budem potom testovať správu na ukončenie aplikácie, čiže udalosť OnCloseQuery?

Předmět Autor Datum
V menu File / New / Other si vyberes Console application V DPR pak smazes {APP_TYPE_CONSOLE} Pak bud…
Jan Fiala 27.05.2007 08:15
Jan Fiala
Tiež som myslel na to, že služba je výhodnejšia v tomto prípade. Vedel by si mi poradiť ako takú slu…
msx. 27.05.2007 09:34
msx.
Menu File / New / Service nebo Service application Myslis, ze je vhodne to detekovat pomoci hodin?…
Jan Fiala 27.05.2007 11:02
Jan Fiala
Pri prechode do režimu S1 dostaneš správu?::)
msx. 27.05.2007 11:20
msx.
Zkus se podivat na WM_POWERBROADCAST http://msdn2.microsoft.com/en-us/library/aa373247.a spx
Jan Fiala 27.05.2007 11:50
Jan Fiala
Ak nemas okno nemozes ani dostat ziadnu spravu (spravy sa posielaju pod win len oknam). Da sa to tak…
MM.. 27.05.2007 12:55
MM..
Mám vlastne jednoduchý zápis služby. Neivem ako to spustiť, prípadne, čo tomu ešte chýba. Tiež by ma…
msx. 27.05.2007 16:42
msx.
Ked nieco nevies, tak si to najdi v MSDN, to je standardny postup. P.S. Aby si nepovedal ze som svi… poslední
MM.. 27.05.2007 19:29
MM..

V menu File / New / Other si vyberes Console application
V DPR pak smazes {APP_TYPE_CONSOLE}
Pak budes mit aplikaci bez okna na hlavnim panelu.

Ale tyhle veci se normalne resi jako sluzba (TService), protoze takova aplikace nema zpracovani zprav.

Dalsi vec je, zda na to psat aplikaci, prooze tyt veci muzes logovat pres klasicky EventLog, staci to nastavit pres politiky.

Tiež som myslel na to, že služba je výhodnejšia v tomto prípade. Vedel by si mi poradiť ako takú službu vytvoriť?

Nie je možné to riešiť cez EventLog, pretože chcem detekovať aj hibernáciu alebo akýkoľvek stav nečinnosti procesora a to sa tam nenachádza. Detekovať to chcem porovnávaním času Windows s časom hodín.

Ak nemas okno nemozes ani dostat ziadnu spravu (spravy sa posielaju pod win len oknam).
Da sa to tak ze okno aplikacie nezobrazis, alebo uplne inac ze napises sluzbu so specialnym rozhranim pre sluzby (vyzaduje nastudovat si patricne sekcie z MSDN prip. mozno aj z DDK)

Mám vlastne jednoduchý zápis služby. Neivem ako to spustiť, prípadne, čo tomu ešte chýba. Tiež by ma zaujímalo, či opakované spúšťanie metódy Execute zabezpečí systém alebo si to musím zabezpečiť sám pomocou TTimer. Myslím, že s tým súvisí vlastnosť WaitHint.

unit uShutDown;

interface

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

type
  TShutdownLog = class(TService)
    procedure ServiceCreate(Sender: TObject);
    procedure ServiceDestroy(Sender: TObject);
    procedure ServiceContinue(Sender: TService; var Continued: Boolean);
    procedure ServiceExecute(Sender: TService);
    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 declarations }
    LogFile: TInifile;
    LogIndex: Integer;
    procedure SaveTime;
  public
    function GetServiceController: TServiceController; override;
    { Public declarations }
  end;

var
  ShutdownLog: TShutdownLog;

implementation

{$R *.DFM}

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

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

procedure TShutdownLog.SaveTime;
begin
  LogFile.WriteDateTime('Logs', 'Time' + IntToStr(LogIndex) + 'Off', Time);
end;

procedure TShutdownLog.ServiceCreate(Sender: TObject);
begin
  LogFile := TIniFile.Create('Computer.log');
  LogIndex := LogFile.ReadInteger('Main', 'Count' , 0);
  Inc(LogIndex);
  LogFile.WriteDateTime('Logs', 'Time' + IntToStr(LogIndex) + 'On', Time);
  LogFile.WriteInteger('Main', 'Count', IntToStr(LogIndex));
  SaveTime;
end;

procedure TShutdownLog.ServiceDestroy(Sender: TObject);
begin
  SaveTime;
  LogFile.Free;
end;

procedure TShutdownLog.ServiceContinue(Sender: TService;
  var Continued: Boolean);
begin
  SaveTime;
end;

procedure TShutdownLog.ServiceExecute(Sender: TService);
begin
  SaveTime;
end;

procedure TShutdownLog.ServicePause(Sender: TService; var Paused: Boolean);
begin
  SaveTime;
end;

procedure TShutdownLog.ServiceShutdown(Sender: TService);
begin
  SaveTime;
end;

procedure TShutdownLog.ServiceStart(Sender: TService;
  var Started: Boolean);
begin
  SaveTime;
end;

procedure TShutdownLog.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
  SaveTime;
end;

end.

Ked nieco nevies, tak si to najdi v MSDN, to je standardny postup.

P.S. Aby si nepovedal ze som svina nasiel som ti v tom MS bordeli ze kde sa pojednava o services
http://msdn2.microsoft.com/en-us/library/ms685141.a spx
mas tam about services, using services, reference, about je vzdy vseobecny pokec (ako to funguje), using ze ako sa to pouziva, reference je zoznam funkcii/struktur atd.
P.S.2. prip ak pouzivas nejaky medziclanok (ten class TService apod tak si pozri pokec o nom alebo zdrojak, a ak je to bez pokecu tak nepouzivaj Delphi nechapem ako moze niekto nieco pouzivat bez toho aby mal o tom informacie).

Zpět do poradny Odpovědět na původní otázku Nahoru