Usando SHFileOperation em um serviço do Windows
Pergunta
É possível, mas é apropriado usar SHFileOperation em um serviço do Windows?Todas essas funções da API SHxxx em shell32.dll parecem ter sido escritas com programas de nível de usuário em mente.Posso ter certeza de que SHFileOperation nunca exibirá a GUI?
Solução
Eu diria que não, não é apropriado ou aconselhável.A maioria das APIs shell32 foram escritas com o entendimento básico de que seriam usadas em processos interativos.Não acho que haja alguma maneira de garantir que SHFileOperation nunca exibirá um componente de UI.Na verdade, se você olhar Operação IFile (que é a nova interface do Vista que substitui SHFileOperation), afirma claramente:
Expõe métodos para copiar, mover, renomear, criar e excluir itens do Shell, bem como métodos para fornecer caixas de diálogo de progresso e de erro.Esta interface substitui a função SHFileOperation.
Outras dicas
De acordo com Shfileoptstruct Documentação, você pode usar os seguintes sinalizadores para impedir que qualquer interface do usuário apareça:
FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_NOCONFIRMMKDIR
ou (se você está segmentando o Windows Vista), FOF_NO_UI
, que é o mesmo que acima.
Olhando no ShellAPI.h
arquivo de cabeçalho no Windows SDK, o comentário contra FOF_NO_UI
diz "Não exiba nenhuma interface do usuário", então isso suponho que não há problema em usar SHFileOperation
.
Eu tenho que concordar: não é apropriado ou aconselhável.
O motivo do PrincPal para usar o Shfileoperation é executar operações com uma interface do usuário e/ou que são reversíveis. Ou seja, usando o shfileoperation para excluir arquivos, colocará os arquivos em uma lixeira em vez de excluí -los, permitindo que o usuário interativo atual não esteja, ou desfazer a operação executada. Como os serviços são executados em uma área de trabalho não interativa, ninguém jamais poderá limpar a lixeira.
Eu também tinha esse problema e trabalhando na implementação de uma cópia de arquivo de rede segura e confiável entre servidores e compartilhamentos de rede (a maioria dessas ações é baseada no CIFS / NetApp Filer) e SHFileOperation
falha de tempos em tempos.
agora começou a usar ROBOCOPY
(Disponível por padrão em todo o Microsoft OS do Vista/Server 2008 para cima) e realmente parece interessante e confiável.
Isso abriu meus olhos: https://stackoverflow.com/a/1030752/559144