[ franjo_tahi @ 02.12.2009. 10:06 ] @
Napravio sam servis koji u određenim uvjetima kopira file s određene adresa na lokalni disk
Servis kreira thread u kom se sve radi. Nakon što se file kopira, thread se uništava.

U proceduri:
Code:

procedure tNewThread_1.Execute;
begin
   ...
   if CopyFileFromServer then 
      if DeleteFile(LocalFileName) then
         RenameFile(TempFileName, LocalFileName);
  ...
end;


Funkcija za kopiranje file-a:
Code:

Function tNewThread_1.CopyFileFormServer: boolean;
begin
   result := true;
   with TDownloadURL.Create(nil) do
   try
     URL:='http://' + fUpdateFile;
     FileName := TemFileName;
     ExecuteTarget(nil) ;
     Free;
   except
      result := false; 
      Free;
   end;
end;


Nakon ovoga file mi je lock-an, tj. ne mogu ga obrisati bez restarta stroja. Pri pokušaju brisanja javlja mi sljedeću poruku:
"You need permission to perform this action"

Brisanje nije dozvoljeno niti nakon deinstall-a servisa koji je kopirao file.


Odgonetnuo sam dio:
u Permissions-ima dodam user-a pod kojim radim. Nakon toga dozvoli brisanje, ali javi poruku:
"The action can't bi completed because file is open in another program"

1. Kako uprediti permissions-e pri kopiranje?
2. Što drži program? Sevice je ugašen..


[Ovu poruku je menjao franjo_tahi dana 02.12.2009. u 11:21 GMT+1]

[Ovu poruku je menjao franjo_tahi dana 02.12.2009. u 11:22 GMT+1]
[ stankons @ 02.12.2009. 10:32 ] @
Iz koda koji si poslao ne vidim tačno kako se snima fajl, mislim da ne release - aš handle na file.

Na primer, ako ne uradiš Close, prilikom Assign - a TextFile - a, file će ti ostati zaključan.

Skini i Unlocker Assistant (vidi na google - u), on ti takođe može biti od pomoći...
[ franjo_tahi @ 02.12.2009. 10:36 ] @
Funkcija CopyFileFormServer kopira file sa određene adrese na lokalni disk i to s nazivom: File.new gdje je File ime originalnog file-a.
Nakon kopiranja procedura briše originalni file, a novi (.new) preimenuje u originalni (.exe)

Zaboravio sam napomenuti:
pri razvoju srvisne app, radio sam ju kao običnu. Dok je to radio obični program, a ne servis, nije bilo tih problema...
[ franjo_tahi @ 02.12.2009. 10:50 ] @
Otrkio sam zašto ga ne mogu obrisati :)

Servis osim skidanja i preimenovanja file-a starta program. Za start programa koristim:
Code:

   ShellExecute(Handle, 'open', PChar(FileName), nil, nil, SW_SHOWNORMAL); 


Nakon ovoga, program se ne vidi, tj. nema njegove forme.
U Task Manager-u ga nema u "Application" već samo u "Processes"
Očito je to greška. Start programa sa ShellExecute je iz običnog programa radio normalno.

Može pomoć?

Još nešto: Kako iz servise prikazati poruku "ShowMessage". Treba mi da bi obavjestio korisnika da je program zamjenjen.
[ savkic @ 02.12.2009. 11:34 ] @
> Nakon ovoga, program se ne vidi, tj. nema njegove forme.
> U Task Manager-u ga nema u "Application" već samo u "Processes"
> Očito je to greška. Start programa sa ShellExecute je iz običnog programa radio normalno.

Servisi se izvršavaju pod posebnim system accountom i bez desktopa, običan ShellExecute tu nije dovoljan (eventualno ako je uključen Interact with Desktop), možda možeš postići sa CreateProcessAsUser, mada je bolje da to startovanje uradi glavni (običan) program.

> Još nešto: Kako iz servise prikazati poruku "ShowMessage". Treba mi da bi obavjestio korisnika da je program zamjenjen.

Za prvu pomoć koristi MessageBox sa MB_SERVICE_NOTIFICATION flagom, mada je bolje da servis signalizira glavnom programu koji će to uraditi.
[ tkaranovic @ 02.12.2009. 14:32 ] @
Da bi servis to radio mora da je service.interactive - true.
[ franjo_tahi @ 03.12.2009. 09:52 ] @
Servis mora startati program (opcija 1) ili prikazati poruku korisniku da on starta program (opcija 2). Ne mogu obavjestiti program da on prikaže poruku jer nije startan, a servis mora upravo njega startati (ili prikazati poruku korisniku da ga starta ručno).
[ tkaranovic @ 03.12.2009. 11:42 ] @
Ako je servis.servicetype - stWin32...

ShellExecute mora da radi svakako. Ako neće da radi onda hoće da kaže zašto neće:

gr := ShellExecute(0, 'open',
PChar('C:\putanja do programa'), nil, nil, SW_SHOWNORMAL);
if gr < 33 then
if gr = ERROR_FILE_NOT_FOUND then
showmessage('nema programa...')
else
showmessage(IntToStr(gr));

Da bi se showmessage videle mora biti servis.interactive - true. Ovo treba da se promeni u object inspectoru pre kompajliranja.
[ franjo_tahi @ 03.12.2009. 12:13 ] @
tkaranovic, izgleda da nisi pročitao moj predhodnim post:
ShellExecute ne radi dobro. Program postoji, ShellExecute ga pokrene, tj. vidi se u procesima i to samo u precesima i nigdje drugdje.

Što se tiče message-a iz servisa: pokušao sam sve što ste napisali - promjenio sam u property-u Interactive = true, pokušao sam sa:
Code:

MessageBox(0, 'Tekst 1', PAnsiChar('Tekst 2'), MB_OK + MB_SERVICE_NOTIFICATION);

ShowMessage('Tekst');

... poruka se ne pojavi na ekranu...
[ tkaranovic @ 03.12.2009. 14:42 ] @
Sad sam pogledao pažljivije šta piše i vidi da je prvi parametar za ShellExecute Handle. Ako se stavi 0 (nula) onda bi trebalo da se statuje odvojeno od servisa ili da se startuje program sa winexec. Odvojeno jer iz istog razloga se ne vidi program kao što se i iz servisa ne vide poruke. Inače ima primera (mogu da se nađu na netu) servisa sa (svojim) prozorom (formom) koji se pojavljuje iz servisa bez ikakvih problema. Probao bi da napravim sasvim jednostavan servis koji treba da pokaže samo poruku i ako on hoće da radi onda nešto u kodu tog servisa (koji neće) pravi problem. Ako ni jednostavan servis neće da radi onda je uzrok u nečem drugom. Inače sve to hoće da radi ... probao sam.
[ savkic @ 03.12.2009. 15:04 ] @
> MessageBox(0, 'Tekst 1', PAnsiChar('Tekst 2'), MB_OK + MB_SERVICE_NOTIFICATION);
> ... poruka se ne pojavi na ekranu...

Negde grešiš, ta varijanta provereno funkcioniše (eventualno ako imaš više desktopa, onda se prikazuje na defaultu) pokaži malo više koda i gde si to tačno ubacio i da li u trenutku poziva postoji ulogovan korisnik.
[ franjo_tahi @ 03.12.2009. 22:04 ] @
Nisam niti ja detaljnije pogledao navedenu funkciju ShellExecute, nisam primjetio 0 umjesto koje sam pisao Handle.

Sutra ću isprobati.

Ispričavam se... tako je to kad radiš više stvari odjednom, negdje moraš zaribati....