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.
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
Curtir tópico
+ 0
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:
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
Clique aqui para fazer login e interagir na Comunidade :)