Não consigo atualizar executável.

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

porter
Usuário Nível 5
Usuário Nível 5
Mensagens: 1057
Registrado em: 10 Dez 2009 16:44
Localização: OLIMPIA-SP

Não consigo atualizar executável.

Mensagem 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
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Não consigo atualizar executável.

Mensagem 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
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
porter
Usuário Nível 5
Usuário Nível 5
Mensagens: 1057
Registrado em: 10 Dez 2009 16:44
Localização: OLIMPIA-SP

Não consigo atualizar executável.

Mensagem 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
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Não consigo atualizar executável.

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
porter
Usuário Nível 5
Usuário Nível 5
Mensagens: 1057
Registrado em: 10 Dez 2009 16:44
Localização: OLIMPIA-SP

Não consigo atualizar executável.

Mensagem 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.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Não consigo atualizar executável.

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
porter
Usuário Nível 5
Usuário Nível 5
Mensagens: 1057
Registrado em: 10 Dez 2009 16:44
Localização: OLIMPIA-SP

Não consigo atualizar executável.

Mensagem 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...
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Não consigo atualizar executável.

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
porter
Usuário Nível 5
Usuário Nível 5
Mensagens: 1057
Registrado em: 10 Dez 2009 16:44
Localização: OLIMPIA-SP

Não consigo atualizar executável.

Mensagem 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.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Não consigo atualizar executável.

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
porter
Usuário Nível 5
Usuário Nível 5
Mensagens: 1057
Registrado em: 10 Dez 2009 16:44
Localização: OLIMPIA-SP

Não consigo atualizar executável.

Mensagem 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)
Responder