[ franjo_tahi @ 28.10.2009. 11:45 ] @
Pokušavam napraviti program koji bi se vrtio kao servis.
Win vista, D2007

Program bi trebao zatvoriti progab B ako je ovaj aktivan.
Problem je što se servis ne izvrši. Pokušao sam staviti timer, niti on se ne okine.

Ako poziv procedure (Izvrsi) napravim u AfterInstall, izvrši se. Isto tako u bazu se uredno svaki put upiše vrijeme pokretanja.

Porgram pokrećem tako da sam u Delphi-u, "Project -> Otpitons -> Debugger -> Parameters" upisao: /install, a kad želim deinstalirati servis promjenim parametar u /deinstall. Nakon toga mi Run napravi compile i install ili deinstall programa.

Ovo je osnovni kod:

Code:

procedure TIntraReg.Izvrsi;
var tl: TStringList;
begin
   tl := TStringList.Create;
   tl.LoadFromFile('C:\RegInit.ini');
   // ako je u ini file-u upisao "Ime programa=KRAJ", zatvornit će taj program
   if tl.Values['KRAJ'] = 'True' then KillApp('Neki program');
   tl.Free;
end;

function TIntraReg.KillApp(const sCapt: PChar): boolean;
  var AppHandle:THandle;
begin
  AppHandle:=FindWindow(Nil, sCapt) ;
  Result:=PostMessage(AppHandle, WM_QUIT, 0, 0) ;
end;

procedure TIntraReg.ServiceAfterInstall(Sender: TService);
begin
   ibd.Open;
   q.Open;
   q.Append;
   qPODATAK.AsString := 'Start: ' + TimeToStr(now);
   q.Post;
   q.Transaction.Commit;
   ibd.Close;
end;

procedure TIntraReg.ServiceExecute(Sender: TService);
begin
   while not Terminated do begin
      Izvrsi;
      Sleep(1000);
   end;
end;


Zanim me još jedna stvar: da li i kako mogu otkriti da li je neki program pokrenut i zatvoriti ga preko njegovog imena (npr: Notepad.exe)

[ priki @ 28.10.2009. 14:50 ] @
jedno pitanje
zašto mora biti servis ?

i jedan odgovor
http://www.delphi3000.com/articles/article_513.asp?SK=
[ franjo_tahi @ 28.10.2009. 18:50 ] @
1. Mora biti van dohvata prosječnog korisnika
2. tako su tražili :(

Imam još jedan problem (osim što ne radi...):
Servis se nakon install-a ne starta, a kad ga pokušam startati ručno - neće.

Može li tko reći u čemu je greška?
[ savkic @ 28.10.2009. 20:32 ] @
> Imam još jedan problem (osim što ne radi...):

Da li ti je uključeno interact with desktop u opcijama servisa? Ti ne proveravaš da li je poziv FindWindow uspeo, ako nije pozovi GetLastError.

> Servis se nakon install-a ne starta, a kad ga pokušam startati ručno - neće.

Šta ti javi, pogledaj u sistemskom event vieweru ima li grešaka? I da li ga startuješ iz Services managera?

Dodaj i sledeći red u petlji Execute metodi:
ServiceThread.ProcessRequests(False);