A UseShellExecute
propriedade booleana está relacionada ao uso da função ShellExecute do Windows versus a função CreateProcess - a resposta curta é que, se UseShellExecute
for verdadeira, a Process
classe usará a ShellExecute
função, caso contrário, ela a usará CreateProcess
.
A resposta mais longa é que a ShellExecute
função é usada para abrir um programa ou arquivo especificado - é praticamente equivalente a digitar o comando a ser executado na caixa de diálogo de execução e clicar em OK, o que significa que pode ser usado (por exemplo):
- Abra arquivos .html ou web usando o navegador padrão sem precisar saber o que é esse navegador,
- Abra um documento do Word sem precisar saber qual é o caminho de instalação do Word
- Execute qualquer comando no
PATH
Por exemplo:
Process p = new Process();
p.StartInfo.UseShellExecute = true;
p.StartInfo.FileName = "www.google.co.uk";
p.Start();
É muito fácil de usar, versátil e poderoso, porém vem com algumas desvantagens:
Não é possível redirecionar os identificadores padrão de entrada / saída / erro
Não é possível especificar descritores de segurança (ou outras coisas interessantes) para o processo filho
Existe a possibilidade de introduzir vulnerabilidades de segurança se você fizer suposições sobre o que realmente será executado:
// If there is an executable called "notepad.exe" somewhere on the path
// then this might not do what we expect
p.StartInfo.FileName = "notepad.exe";
p.Start();
CreateProcess
é uma maneira muito mais precisa de iniciar um processo - não pesquisa o caminho e permite redirecionar a entrada ou saída padrão do processo filho (entre outras coisas). A desvantagem, CreateProcess
porém, é que nenhum dos três exemplos que dei acima funcionará (tente e veja).
Em resumo, você deve definir UseShellExecute
como false se:
- Você deseja redirecionar a entrada / saída / erro padrão (esse é o motivo mais comum)
- Você não deseja procurar o caminho pelo executável (por exemplo, por razões de segurança)
Por outro lado, você deve manter- UseShellExecute
se verdadeiro se desejar abrir documentos, URLs ou arquivos em lotes, etc ... em vez de precisar explicitamente dar o caminho para um executável.
processStartInfo.RedirectStandardOutput=true
, parece-me que você ainda pode redirecionar a saída padrão fazendo issoprocess.Arguments= "cmd /c dir >c:\\crp\\a.a"
. Da mesma forma a partir de uma caixa de diálogo Executar você pode fazercmd /c dir>c:\crp\a.a