Utilizarea SHFileOperation în cadrul unui serviciu Windows

Este posibil, dar este potrivit să utilizați SHFileOperation în cadrul unui serviciu Windows? Toate funcțiile API ale SHxxx din shell32.dll par să fi fost scrise cu programe la nivel de utilizator. Pot fi sigur că SHFileOperation nu va afișa niciodată GUI?

1

4 răspunsuri

În conformitate cu documentația SHFILEOPTSTRUCT , puteți utiliza următoarele steaguri pentru a împiedica apariția oricărui UI:

FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_NOCONFIRMMKDIR

sau (dacă vizați Windows Vista), FOF_NO_UI , care este aceeași cu cea de mai sus.

Privind în fișierul de antet ShellAPI.h din SDK-ul Windows, comentariul împotriva codului FOF_NO_UI spune că "nu afișați niciun interfață UI", de aici presupun că este OK pentru a utiliza SHFileOperation .

6
adăugat

Aș spune că nu este adecvat sau recomandabil. Majoritatea API-urilor shell32 au fost scrise cu o înțelegere de bază că ar fi folosite în procese interactive. Nu cred că există nici un fel de garanție că SHFileOperation nu va afișa niciodată o componentă UI. De fapt, dacă te uiți la IFileOperation (care este noua interfață Vista care înlocuiește SHFileOperation), afirmă în mod clar:

Expune metodele de copiere, mutare, redenumire, creare și ștergere a obiectelor Shell, precum și metode pentru a furniza diagrame de progres și de eroare. Această interfață înlocuiește funcția SHFileOperation.

2
adăugat
În acest moment, sunt de acord. Mă gândeam să o folosesc pentru că pare să copieze fișiere împreună cu descriptorul lor de securitate. CopyFile standard nu are, deci este nevoie de un cod suplimentar pentru a obține același comportament.
adăugat autor Charles, sursa

Trebuie să fiu de acord: nu este adecvat sau recomandabil.

Motivul principal pentru a utiliza SHFileOperation este de a efectua operațiuni cu un UI și/sau care sunt reversibile. I.E. folosind SHFileOperation pentru a șterge fișierele va plasa fișierele într-un coș de gunoi, mai degrabă decât să le șterge, permițând utilizatorului interactiv curent să anuleze sau să anuleze operațiunea efectuată. Pe măsură ce serviciile rulează pe un desktop non interactiv, nimeni nu va putea vreodată să elibereze binoclul.

1
adăugat

Am avut și această problemă și lucrez la implementarea unei copii de siguranță a fișierelor de rețea între servere și acțiuni de rețea (cele mai multe dintre aceste acțiuni sunt bazate pe CIFS/NetApp filer) și SHFileOperation eșuează din când în când.

acum a început să utilizeze ROBOCOPY (disponibil în mod implicit în toate sistemele Microsoft de la Vista/Server 2008 în sus) și pare cu adevărat interesant și de încredere.

this has opened my eyes: https://stackoverflow.com/a/1030752/559144

0
adăugat