windows winapi service shell32

Usar SHFileOperation dentro de un servicio de Windows



winapi service (4)

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?


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á orientando a Windows Vista), FOF_NO_UI , que es el mismo que el anterior.

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


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, usar 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.


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 observa IFileOperation (que es la nueva interfaz de Vista que reemplaza a SHFileOperation), indica claramente:

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


Tuve este problema también y trabajé en la implementación de 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 por defecto en todos los sistemas operativos de Microsoft desde Vista / Server 2008 en adelante) y realmente se ve interesante y confiable.

esto me ha abierto los ojos: https://.com/a/1030752/559144