Fórum Winexec com problema #315954
14/03/2006
0
WinExec(PChar(´C:\Arquivo de Programas\WinZip\WinZip32, etc
no meu computador funciona, no do cliente funcionava e de uma hora para outra parou de funcionar (não sei o que ele fez), simplesmente não reconhece o ´nome grande´, se trocar para c:\arquiv~!\winzip\winzip32 ele volta a funcionar, alguém sabe qual é o problema? O Windows é o XP
Edilcimar
Curtir tópico
+ 0Posts
14/03/2006
Paullsoftware
procedure ExecProg(Nome, Parametros: String; Janela:Integer); Var Comando: Array[0..1024] of Char; Parms: Array[0..1024] of Char; begin Nome := ´"´ + Nome + ´"´;//Coloca o endereço entre aspas, deve ser usado em path´s muito longas... StrPCopy (Comando, Nome); StrPCopy (Parms, Parametros); ShellExecute (0, Nil, Comando, Parms, Nil, Janela); end;
espero ter ajudado :wink:
Gostei + 0
14/03/2006
Turbo Drive
Grato pela atenção.
Gostei + 0
14/03/2006
Turbo Drive
Grato pela atenção.
Gostei + 0
14/03/2006
Edilcimar
Gostei + 0
14/03/2006
Edilcimar
Gostei + 0
14/03/2006
Paullsoftware
Normalmente o Windows se encarrega de substituir espaços em branco por ~ tipo assim:
para acessar a pasta C:\Paulo Ricardo\Arquivos muitas vezes ele faz assim: C:\Paul~1\arquivos e na época do dos para se acessar paths que continham espaços era preciso colocá-lo entre aspas assim:
´C:\Paulo Ricardo\Arquivos´ entedeu?
Gostei + 0
14/03/2006
Edilcimar
2) tem computador que está aceitando nome grande, tem computador que está aceitando nome pequeno e tem computador que não está aceitando nem o nome grande nem o nome pequeno
3) o meu comando do winexec() está entre aspas
Eu sempre achei que o xp não trocasse o nome grande pelo pequeno, e pelo tipo de erro que está dando não creio que seja este relamente o problema, mas sim um outro que não descobri
Gostei + 0
14/03/2006
Martins
Interessante isso [b:5deb70c036]Edilcimar[/b:5deb70c036], vc já tentou pelo prompt? Tente colocar no prompt assim:
[b:5deb70c036]´C:\Arquivo de Programas\WinZip\WinZip32... etc´[/b:5deb70c036]
coloque entre aspas.
Boa sorte!!!
Gostei + 0
14/03/2006
Edilcimar
Gostei + 0
14/03/2006
Edilcimar
Gostei + 0
15/03/2006
Edilcimar
Gostei + 0
15/03/2006
Martins
Muito estrranho isso aí viu [b:5647079e2d]Edilcimar[/b:5647079e2d], poderia ser vírus ou alguma config. do Windows?
Pq nunca vi isso.
Gostei + 0
15/03/2006
Edilcimar
Gostei + 0
15/03/2006
Martins
Então pode ser a config. mas é estranho, não caberia encontrar outra solução para esse problema?
Podemos tentar.
Gostei + 0
15/03/2006
Aroldo Zanela
Fiz algumas pesquisas para ver se alguém na comunidade internacional já tinha passado pelo problema e infelizmente, não encontrei nada. Esta funcionalidade da API (Kernel32) já não é recomendada há algum tempo e ShellExecute deve ser usada em sua substituição.
Mesmo assim, encontrei uma função escrita por Pat Ritchey (TeamB) e aprimorada por Xavier Pacheco (TeamB) para executar um processo e aguardar sua finalização. Como não se trata de uma API, podemos efetuar qualquer correção que seja necessária.
function WinExecAndWait32(FileName:String; Visibility : integer):
LongWord;
var { by Pat Ritchey }
zAppName:array[0..512] of char;
zCurDir:array[0..255] of char;
WorkDir:String;
StartupInfo:TStartupInfo;
ProcessInfo:TProcessInformation;
begin
StrPCopy(zAppName,FileName);
GetDir(0,WorkDir);
StrPCopy(zCurDir,WorkDir);
FillChar(StartupInfo,Sizeof(StartupInfo),#0);
StartupInfo.cb := Sizeof(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := Visibility;
if not CreateProcess(nil,
zAppName, // pointer to command line string
nil, // pointer to process security attributes
nil, // pointer to thread security attributes
false, // handle inheritance flag
CREATE_NEW_CONSOLE or // creation flags
NORMAL_PRIORITY_CLASS,
nil, //pointer to new environment block
nil, // pointer to current directory name
StartupInfo, // pointer to STARTUPINFO
ProcessInfo) // pointer to PROCESS_INF
then Result := WAIT_FAILED
else begin
WaitforSingleObject(ProcessInfo.hProcess, INFINITE);
GetExitCodeProcess(ProcessInfo.hProcess, Result);
CloseHandle( ProcessInfo.hProcess );
CloseHandle( ProcessInfo.hThread );
end;
end;Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)