Usar SHFileOperation dentro de un servicio de Windows

Es posible, pero ¿es apropiado usar SHFileOperation dentro de un servicio de Windows? Todas esas funciones de la API SHxxx en shell32.dll parecen haberse escrito teniendo en cuenta los programas de nivel de usuario. ¿Puedo estar seguro de que SHFileOperation no mostrará GUI alguna vez?

1

4 Respuestas

De acuerdo con la documentación de SHFILEOPTSTRUCT , puede usar los siguientes indicadores para evitar que aparezca la IU:

FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_NOCONFIRMMKDIR

o (si está apuntando a Windows Vista), FOF_NO_UI , que es el mismo que el anterior.

Al buscar en el archivo de encabezado ShellAPI.h en el SDK de Windows, el comentario en contra de FOF_NO_UI dice "no muestra ninguna UI en absoluto", así que de esto supongo que está bien para usar SHFileOperation .

6
agregado

Yo diría que no es apropiado o aconsejable. La mayoría de las API de shell32 se escribieron con un entendimiento básico de que se usarían en procesos interactivos. No creo que haya ninguna forma de garantizar que SHFileOperation nunca muestre un componente UI. De hecho, si nos fijamos en IFileOperation (que es la nueva interfaz de Vista que reemplaza a SHFileOperation), establece claramente:

Expone métodos para copiar, mover, cambiar el nombre, crear y eliminar elementos del Shell, así como métodos para proporcionar diálogos de progreso y error. Esta interfaz reemplaza la función SHFileOperation.

2
agregado
En este punto, estoy de acuerdo. Estaba pensando en usarlo porque parece copiar archivos junto con su descriptor de seguridad. El CopyFile estándar no lo hace, por lo que requiere código adicional para obtener el mismo comportamiento.
agregado el autor Charles, fuente

Tengo que estar de acuerdo: no es apropiado o aconsejable.

La razón principal para usar SHFileOperation es realizar operaciones con una IU, y/o que sean reversibles. Es decir. el uso de SHFileOperation para eliminar archivos va a colocar los archivos en una papelera de reciclaje en lugar de eliminarlos permitiendo que el usuario interactivo actual recupere o deshaga la operación realizada. Como los servicios se ejecutan en un escritorio no interactivo, nadie podrá borrar esa papelera de reciclaje.

1
agregado

También tuve este problema y trabajé para implementar una copia segura y confiable de archivos de red entre servidores y recursos compartidos de red (la mayoría de estos recursos compartidos están basados ​​en CIFS/NetApp) y SHFileOperation falla de vez en cuando.

ahora comenzó a usar ROBOCOPY (disponible de forma predeterminada en todos los sistemas operativos de Microsoft desde Vista/Server 2008 en adelante) y realmente se ve interesante y confiable.

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

0
agregado