GARANTIR DESCONTO

Fórum Fechar e abrir programas.exe com delphi #513434

12/03/2015

0

Boa tarde!
Mais uma vez recorro aos colegas,
Estou tentando fazer o seguinte, o usuária executa o sistema vamos chamar de XXX.exe, nesse momento o sistema verifica se tem uma novo versão instalada no Servidor se tiver o Sistema XXX.exe vai chamar um outro sistema com o nome de YYY.exe o que ele deve fazer copiar para pasta a nova versão do XXX.exe e fechar em seguida e abrir novamente o XXX.exe para o usuária executar suas tarefas.
Já tentei vários exemplos e nada qdo abre o YYY.exe e copia da erro na copia, qdo copia d fala que o XXX.exe já esta sendo executado por outro.
Quem tiver tempo.
Desde já fico grato.
Luiz Estevam

Luiz Estevam

Responder

Posts

13/03/2015

Renato Rubinho

Se o XXX ainda estiver em execução no momento em que o YYY tentar copiar o novo arquivo, acontecerá a falha na cópia.

Tenta, no YYY, colocar um loop com algumas tentativas com intervalos para aguardar o fechamento do XXX onde tenta renomear o XXX e, quando conseguir, aí sim, copia o novo.
Obs: Não costumo usar, mas se por algum motivo seu XXX não estiver fechando após chamar o YYY, usa o Application.Terminate;

Exemplo:

  // XXX
  ShellExecute(0,nil,'YYY.exe',nil,'c:\caminhodosistema\',SW_SHOWNORMAL);
  Self.Close; // Caso esteja no form principal ou FrmPrincipal.Close; caso esteja em outro. Se não funcionar o fechamento do sistema, usa o Application.Terminate;

  //YYY
  // tenta até 10 vezes
  for i:1 to 10 do
  begin
    // Apaga um antigo arquivo que tenha sido renomeado para atualização
    DeleteFile('c:\caminhodosistema\XXX_bkp.exe');

    // Renomeia o atual
    RenameFile('c:\caminhodosistema\XXX.exe','c:\caminhodosistema\XXX_BKP.exe');

    // Copia o novo arquivo caso tenha conseguido renomear o atual
    if not FileExists('c:\caminhodosistema\XXX.exe') then
    begin
      //copia o novo arquivo
      CopyFile('c:\caminhodosistema\XXX_novo.exe','c:\caminhodosistema\XXX.exe');

      // apaga o antigo renomeado
      DeleteFile('c:\caminhodosistema\XXX_bkp.exe');

      // finaliza o loop quando conseguir atualizar
      break;
    end;

    // Aguarda 1 segundo até a próxima tentativa para dar tempo do XXX fechar caso não tenha conseguido atualizar
    Sleep(1000);
  end;
Responder

Gostei + 0

15/03/2015

Luiz Estevam

Valeu colega, coloquei um Sleep() e funcionou.
Responder

Gostei + 0

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

Aceitar