Página 1 de 1

Não consigo atualizar executável.

Enviado: 23 Dez 2016 17:13
por porter
Olá pessoal, sempre utilizei a rotina abaixo para atualizar o Executável mesmo que as estações estivessem acessando o sistema,
mas para usar a nova versão, tinha que sair do sistema e entrar novamente, de um tempo para cá está dando a mensagem:
"O arquivo já está sendo usado por outro processo"

Porque não consigo mais atualizar o executável, voces conhecem uma forma melhor ?, obrigado.

Código: Selecionar todos

If hb_FileExists("C:\ESTOQUE\ATUALIZA.EXE")
   ! del loja.old
   ! ren loja.exe *.old
   ! ren atualiza.exe loja.exe
   MENSAGEM("Atualizado !")
endif

Não consigo atualizar executável.

Enviado: 26 Dez 2016 09:40
por Jairo Maia
Olá Porter,

Você trocou o título, mas isso já está sendo discutido aqui: comando File falhando para ver se arquivo existe

Não consigo atualizar executável.

Enviado: 26 Dez 2016 09:53
por porter
olá Jairo,
O problema está acontecendo no momento de renomear atualiza.exe para loja.exe, a verificação se o arquivo ATUALIZA.EXE existe, está dando certo,
no momento que tento atualizar está dando a seguinte mensagem:
"O arquivo já está sendo usado por outro processo"

Gostaria de renomear o arquivo, mesmo com as estações acessando o sistema, sempre usei essa rotina e deu certo, agora não consigo atualizar,
tenho que fechar o sistema em todas as estações para fazer a atualização.

Código: Selecionar todos

If hb_FileExists("C:\ESTOQUE\ATUALIZA.EXE")
	   ! del loja.old
	   ! ren loja.exe *.old
	   ! ren atualiza.exe loja.exe   --> O arquivo já está sendo usado por outro processo
	   MENSAGEM("Atualizado !")
endif

Não consigo atualizar executável.

Enviado: 26 Dez 2016 14:30
por JoséQuintas
Aceita sugestão? Esqueça essa forma.

Crie um BAT, e vá trocando o nome dentro do BAT.
Ou através de um EXE intermediário, que execute o EXE mais atual.

E tente apagar tudo que sobrar.

lojannn.exe

Assim não precisa renomear EXE.

E um EXE intermediário que vai testar loja*.exe, e executar o EXE mais atual.

Assim fica simples e prático.

Em caso de falha no automático, dá até pro usuário baixar direto do site e salvar na pasta.

Não consigo atualizar executável.

Enviado: 26 Dez 2016 16:33
por porter
olá JoseQuintas,
Se o executável intermediário executar o atual, posso mudar o atual sempre porque o
que estará sendo usado por outro processo é o intermediário ?
É assim que funciona ?
Não sei se consegui explicar.

obrigado.

Não consigo atualizar executável.

Enviado: 26 Dez 2016 17:14
por JoséQuintas
Não.
O intermediário nunca se altera. (ou BAT sendo alterado)
E o EXE normal vai ter um nome diferente a cada atualização.

Não consigo atualizar executável.

Enviado: 28 Dez 2016 17:27
por porter
olá, criei um arquivo .bat que executa intermediario. exe que por sua vez executa LOJA001.EXE ou LOJA002.EXE, pois estará sempre mudando,
seria isso ?
obrigado.

acessar.bat
==========

Código: Selecionar todos

f:\estoque\intermediario.exe

intermediario.prg
===============

Código: Selecionar todos

FUNCTION INTERMEDIARIO
   RUN LOJA001.EXE  <---  aqui muda o nome a cada atualização pode ser LOJA001.EXE, LOJA002.EXE...

Não consigo atualizar executável.

Enviado: 28 Dez 2016 18:03
por JoséQuintas
Não. O EXE intermediário será fixo, senão vai continuar com o mesmo problema pra atualizar.

Opção 1: um BAT
Nesse bat chama loja1.exe, loja2.exe, loja3.exe
Cada vez que atualizar, o EXE altera o nome dentro do BAT, e grava o EXE com o nome novo.

Na minha máquina esta assim:

Código: Selecionar todos

@ECHO OFF
CLS
START D:\CDROM\FONTES\INTEGRA\JPA.EXE %1 %2 %3 %4 %5
REM EXIT
Esse nome JPA.EXE pode ser alterado pra JPA2.EXE, JPA3.EXE, JPA4.EXE.
Trata-se de alterar o BAT, e salvar o EXE com o respectivo nome.


Opção 2: um EXE intermediário
Neste caso o EXE executa o mais novo, e o atalho será direto pra este EXE.

Criei este EXE, que nunca vai se alterar, como intermediário.

Código: Selecionar todos

/*
sjpa - intermediário pra carga do EXE final
*/

REQUEST HB_Codepage_PTISO

#include "directry.ch"
#include "hbwin.ch"

PROCEDURE Main( cmdParam1, CmdParam2, cmdParam3, cmdParam4, cmdParam5 )

   LOCAL oExeList, cPath

   Set( _SET_CODEPAGE, "PTISO" )
   SET DATE BRITISH
   SET EPOCH TO Year( Date() ) - 90

   cPath := hb_Argv(0)
   cPath := Left( cPath, Rat( "\", cPath ) )
   cmdParam1 := iif( cmdParam1 == NIL, "", cmdParam1 )
   cmdParam2 := iif( cmdParam2 == NIL, "", cmdParam2 )
   cmdParam3 := iif( cmdParam3 == NIL, "", cmdParam3 )
   cmdParam4 := iif( cmdParam4 == NIL, "", cmdParam4 )
   cmdParam5 := iif( cmdParam5 == NIL, "", cmdParam5 )

   oExeList := Directory( cPath + "JPA*.EXE" )

   IF Len( oExeList ) == 0
      MsgExclamation( "Não encontrado EXE na pasta " + cPath )
      RETURN
   ENDIF

   ASort( oExeList, , , { | a, b | Dtos( a[ F_DATE ] ) + a[ F_TIME ] > Dtos( b[ F_DATE ] ) + b[ F_TIME ] } )
   // MsgExclamation( "Executando " + oExeList[ 1, F_NAME ] )
   WAPI_ShellExecute( NIL, "open", cPath + oExeList[ 1, F_NAME ], cmdParam1 + " " + cmdParam2 + " " + cmdParam3 + " " + cmdParam4 + " " + cmdParam5, hb_cwd(), SW_SHOWNORMAL )

   RETURN

FUNCTION MsgExclamation( cText )

   wapi_MessageBox( wapi_GetActiveWindow(), cText, "Atenção", WIN_MB_ICONASTERISK )

   RETURN NIL
Explicação:
O EXE intermediário vai testar e executar o EXE mais novo da pasta.
Só precisa decidir qual será o prefixo do EXE em questão.
No meu caso uso JPAxxxx.EXE
Se salvou um EXE novo como JPAxxxx.exe, ele vai passar a ser o novo EXE chamado, automaticamente.

Não consigo atualizar executável.

Enviado: 29 Dez 2016 09:14
por porter
Bom dia JoséQuintas, estou compilando com o xHarbour:
xHarbour Compiler build 1.2.1 (SimpLex) (Rev. 6633)

Estou tentando executar a rotina para entender, está dando erro de compilação nessa linha 8:
#include "hbwin.ch"

Error F0029 Can't open #include file: 'hbwin.ch'

Tem como usar a rotina que você passou compilando com xHarbour ?

Obrigado.

Não consigo atualizar executável.

Enviado: 29 Dez 2016 10:42
por JoséQuintas
Eu já disse o que faz a rotina:
Basicamente é pegar a lista de EXEs, e escolher o que tem data mais nova pra executar.

1. Directory() ou algo assim pra pegar a lista de EXEs

Deve ter diversas rotinas suas que fazem isso

2. Colocar em ordem, ou apenas pegar o EXE mais novo

Deve ter diversas rotinas suas que fazem isso

3. Executar o EXE mais novo, respeitando o diretório/pasta atual, sem deixar o EXE preso.

Deve ter alguma rotina sua que faça isso.

Nota:
Retire esse #include pra ver aonde ele faz falta, é onde terá que alterar.

Não consigo atualizar executável.

Enviado: 29 Dez 2016 17:01
por porter
A rotina está dando certo, executei passo a passo e entendi como funciona, apenas na hora de executar o EXE mais novo, não consigo compilar, estou tentando com uma pequeno comando para executar calculadora mas também da erro de compilação, sempre usei apenas o comando (run rotina.exe), se conseguir, volto a postar o resultado, obrigado pela atenção.

WAPI_ShellExecute( NIL, "open", cPath + oExeList[ 1, F_NAME ], cmdParam1 + " " + cmdParam2 + " " + cmdParam3 + " " + cmdParam4 + " " + cmdParam5, hb_cwd(), SW_SHOWNORMAL )

ShellExecuteEx("calc.exe",nil)