Todas as versões do Windows, desde os nomes extensos dos arquivos adicionados, funcionam desse modo do Windows 95 até o Windows 7.
Este comportamento é documentado :
The lpApplicationName parameter can be NULL. In that case, the module name must be the first white space–delimited token in the lpCommandLine string. If you are using a long file name that contains a space, use quoted strings to indicate where the file name ends and the arguments begin; otherwise, the file name is ambiguous. For example, consider the string "c:\program files\sub dir\program name". This string can be interpreted in a number of ways. The system tries to interpret the possibilities in the following order:
c:\program.exe files\sub dir\program name c:\program files\sub.exe dir\program name c:\program files\sub dir\program.exe name c:\program files\sub dir\program name.exe
Quanto ao porquê ele pede isso - para que não quebre programas que não podem manipular espaços em nomes de arquivos corretamente .
Editar
Parece que o comando "Run" não se comporta assim - deve ter alguma lógica extra adicionada para lidar com este caso exato. No entanto, tentar executar a partir de qualquer outro lugar - incluindo o uso da função CreateProcess
diretamente, que é o que a maioria dos aplicativos usaria para executar um comando.
Veja este comportamento em ação:
- Abra um prompt de comando administrativo
- Executar:
copy c:\Windows\System32\notepad.exe c:\program.exe
- Executar:
c:\Program Files\Internet Explorer\iexplore.exe
- O bloco de notas será aberto informando que não é possível encontrar
Files\Internet Explorer\iexplore.exe
- Digite
c:\Program Files\Internet Explorer\iexplore.exe
na opção Executar e o IE será aberto corretamente.
Editar 2 No caso do seu C:\program files\internet.exe
example; Eu acredito que este é o intérprete de linha de comando ficando no caminho. Ele tenta processar e tokenizar a linha de comando em parâmetros divididos por espaços. Por isso, leva C:\program
como o primeiro token e interpreta isso como o nome do programa como o resto como parâmetros.
Para um teste, criei um pequeno aplicativo que chama CreateProcess
diretamente e se comporta exatamente como documentado. Seu C:\program files\internet.exe
exemplo lançará C:\program files\internet.exe
. Assim, parece que o comportamento depende exatamente de como o comando é executado - algo pode estar processando a linha de comando antes de passá-lo para CreateProcess
.
Exemplo de programa:
#include <Windows.h>
void main()
{
STARTUPINFO si = {0};
si.cb= sizeof(si);
PROCESS_INFORMATION pi = {0};
CreateProcess(NULL, "c:\program files\internet explorer\iexplore.exe",
NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
}