Winexec com problema

14/03/2006

0

Tenho o seguinte comando para zipar arquivos
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

Edilcimar

Responder

Posts

14/03/2006

Paullsoftware

olá Eldicimar, tente substituir o comando WinExec() por essa procedure que fiz depois de ter problemas semelhantes ao seu...

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:


Responder

14/03/2006

Turbo Drive

Aproveitando a dúvida do nosso colega, vc poderia colocar um exemplo de como se utiliza esta procedure para o winzip ?


Grato pela atenção.


Responder

14/03/2006

Turbo Drive

Aproveitando a dúvida do nosso colega, vc poderia colocar um exemplo de como se utiliza esta procedure para o winzip ?


Grato pela atenção.


Responder

14/03/2006

Edilcimar

Ok, PaullSoftware, mas vc sabe o porquê deste problema?


Responder

14/03/2006

Edilcimar

e acabei de descobrir que em um dos computadores mesmo com o nome ´curto´, c:\arquiv~1\winzip\winzip32 não funciona!


Responder

14/03/2006

Paullsoftware

Ok, PaullSoftware, mas vc sabe o porquê deste problema?

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?


Responder

14/03/2006

Edilcimar

1) no DOS eu sei que ele transforma o nome grande em nome pequeno, com 8 caracteres
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


Responder

14/03/2006

Martins

e acabei de descobrir que em um dos computadores mesmo com o nome ´curto´, c:\arquiv~1\winzip\winzip32 não funciona!


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!!!


Responder

14/03/2006

Edilcimar

se eu colocar no ´executar´ do windows, na máquina onde o winexec não funciona dentro do programa, o comando c:\arquivos de programas\winzip\winzip32 não funciona, porém se colocar entre aspas funciona, mas dentro do meu programa ele está com aspas, e na máquina onde o nem longo nem nome curto não funcionam, o executar do windows funciona normalmente entre aspas


Responder

14/03/2006

Edilcimar

se eu colocar no ´executar´ do windows, na máquina onde o winexec não funciona dentro do programa, o comando c:\arquivos de programas\winzip\winzip32 não funciona, porém se colocar entre aspas funciona, mas dentro do meu programa ele está com aspas, e na máquina onde o nem longo nem nome curto não funcionam, o executar do windows funciona normalmente entre aspas


Responder

15/03/2006

Edilcimar

sobe


Responder

15/03/2006

Martins

sobe


Muito estrranho isso aí viu [b:5647079e2d]Edilcimar[/b:5647079e2d], poderia ser vírus ou alguma config. do Windows?

Pq nunca vi isso.


Responder

15/03/2006

Edilcimar

Não sei se tem virus ou se é uma configuração do windows, mas talvez seja configuração do windows, pois todos os computadores do cliente estão em rede e em cada um acontece uma das coisas, e no meu computador está funcionando perfeitamente


Responder

15/03/2006

Martins

Não sei se tem virus ou se é uma configuração do windows, mas talvez seja configuração do windows, pois todos os computadores do cliente estão em rede e em cada um acontece uma das coisas, e no meu computador está funcionando perfeitamente


Então pode ser a config. mas é estranho, não caberia encontrar outra solução para esse problema?

Podemos tentar.


Responder

15/03/2006

Aroldo Zanela

Colega,

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;



Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar