Geraldo (gbsilva) Posted November 13, 2014 Report Share Posted November 13, 2014 Pessoal estou tendo problemas para atualizar a versão do sistema. No XP funciona normalmente, mas no Win7 dá erro, alguém faz atualização com Win7. Uso esse código há muito tempo e apesar de meio ultrapassado funciona. Tentei modernizar um pouco e fiz uma pequena classe, mas também não deu certo no Win7. #include "FiveWin.ch"function Main() local oDlg,oAnimate,oSay,oFont local cOrigem,cFile MsgWait("Verificando Atualizações!","GbSoftware",5) MsgRun("Atualizando o Sistema...Aguarde","GbSoftware",; {|| Atualiza(@cOrigem,@cFile) }) //-> Chama novamente o sistema com o executável atualizado winexec(cFile)return nilStatic function Atualiza(cOrigem,cFile) //-> Pega local do novo executável (cOrigem) e nome do executável (cFile) PegaIni(@cOrigem,@cFile) CopiaArquivos(cOrigem,cFile)return(.t.)Function CopiaArquivos(cOrigem,cFile) Local xOrigem,xDestino,lNewFile,cRota:=cFILEPATH(GETMODULEFILENAME(GETINSTANCE())) //-> Se o arquivo existir deleta para atualizar WaitSeconds(10) //-> Aguarda para dar tempo do executável fechar na rede Delete file ".\"+cFile //-> Deleta executável atual xOrigem := cOrigem+cFile //-> Define arquivo a ser copiado (local+nome) xDestino := cFile //-> destino é o nome do novo arquivo que é o mesmo do antigo Copy File &xOrigem To &xDestino //-> copia o novo executávelreturn(.t.)Static function PegaIni(cOrigem,cFile) local oWnd, oIni INI oIni FILE ".\Amostra.ini" GET cOrigem SECTION "config" ENTRY "origem" OF oIni GET cFile SECTION "config" ENTRY "file" OF oIni ENDINIreturn nil//----------------------------------------------------------------------------//procedure AppSys // XBase++ requirementreturn Function Main() local oFile //-> instancia objeto da classe oFile := TGbUpdate():new() //-> metódo para identificar a origem e o executável oFile:GetIni() //-> mensagem e método de atualização da nova versão MsgWait("Verificando Atualizações!","GbSoftware",3) MsgRun("Atualizando o Sistema...Aguarde","GbSoftware",; {|| oFile:Update() }) //-> Chama novamente o sistema com o executável atualizado IF MsgYesNo("Atualização efetuada com sucesso"+CRLF+; "Deseja executar o sistema (S/N) ?","Atualização de Versão") Winexec(oFile:cFile) ENDIFreturn nil************************************************************************************************************************CLASS TGbUpdate DATA root,cFile,hTime DATA lSave METHOD New() CONSTRUCTOR METHOD GetIni() METHOD Update()ENDCLASSMETHOD New() CLASS TGbUpdate ::root := "" ::cFile := "" ::hTime := 10 //-> tempo de exibição da mensagem de verificação de atualizações (tempo para fechar o executável)return selfMETHOD GetIni() CLASS TGbUpdate local oWnd,hIni,c #ifdef rdd_sqllib INI hIni FILE ".\gb_connect.ini" GET ::root SECTION "mysql" ENTRY "origem" OF hIni GET ::cFile SECTION "mysql" ENTRY "file" OF hIni ENDINI #else c = "mysql" hIni := HB_ReadIni( "connect.ini" ) ::root := hIni[ c ]["host"] ::cFile := hIni[ c ]["user"] #endifreturn(.t.)METHOD Update() CLASS TGbUpdate local lRoot,lHome WaitSeconds(::hTime) Delete file ".\"+::cFile //-> Deleta o executável atual lRoot := ::root+::cFile //-> lRoot é a junção do local de origem + nome do executável lHome := ::cFile //-> lHome é o nome do executável a ser copiado LZCopyFile(lRoot,lHome) //-> substituida comando Copy File pela função LZCopyFile() // Copy File &lRoot TO &lHome //-> copia o novo executável para a pasta do sistemareturn(.t.)****************************** FINAL DA CLASSE *************************************************************************//----------------------------------------------------------------------------//procedure AppSys // XBase++ requirementreturn//----------------------------------------------------------------------------// Quote Link to comment Share on other sites More sharing options...
Geraldo (gbsilva) Posted November 13, 2014 Author Report Share Posted November 13, 2014 Pessoal mais uma coisa aceito sugestões de como atualizar, hoje posto no servidor o executável com a nova versão e quando o usuário acessa se tiver uma nova versão, atualiza o executável na máquina local. Grato, Quote Link to comment Share on other sites More sharing options...
kapiaba Posted November 14, 2014 Report Share Posted November 14, 2014 Não entendi muito bem... Veja se a idéia ajuda: http://fivewin.com.br/index.php?/topic/21155-verificar-nova-verso-no-site/ Quote Link to comment Share on other sites More sharing options...
zekasan Posted November 14, 2014 Report Share Posted November 14, 2014 Você já verificou as regras de compartilhamento da pasta? usuários que tem acesso a ela (leitura e escrita) Quote Link to comment Share on other sites More sharing options...
rochinha Posted November 14, 2014 Report Share Posted November 14, 2014 Amiguinho, Coloque os caminhos completos de atuação, não use ".\" mesmo estando você na pasta de atuação. Salve os caminhos em .INI como você vem fazendo. Quote Link to comment Share on other sites More sharing options...
Geraldo (gbsilva) Posted November 14, 2014 Author Report Share Posted November 14, 2014 Obrigado a todos. Na realidade são algumas máquinas, hoje estive fora, mas segunda vou ver as permissões com o pessoal do TI de lá e também vou aproveitar e dar uma olhada nas dicas postadas. Agradeço a todos e assim que verificar volto com o resultado. Sds, Quote Link to comment Share on other sites More sharing options...
CIACPD Posted November 15, 2014 Report Share Posted November 15, 2014 Geraldo, antes de copiar os arquivos execute esta função abaixo SendMessage( FindWindow( 0, "coloque aqui o titulo da windows principal da aplicação" ), WM_CLOSE ) exemplo que uso com a minha aplicação: SendMessage( FindWindow( 0, "CiaCpd - Aplicativos e Sistemas - Desde 1992" ), WM_CLOSE ) João se voce usa o actver.exe coloque esta função para continuar atualizando no win7 Daniel Segura Quote Link to comment Share on other sites More sharing options...
Theotokos Posted November 15, 2014 Report Share Posted November 15, 2014 Geraldo, antes de copiar os arquivos execute esta função abaixo SendMessage( FindWindow( 0, "coloque aqui o titulo da windows principal da aplicação" ), WM_CLOSE ) exemplo que uso com a minha aplicação: SendMessage( FindWindow( 0, "CiaCpd - Aplicativos e Sistemas - Desde 1992" ), WM_CLOSE ) João se voce usa o actver.exe coloque esta função para continuar atualizando no win7 Daniel Segura Olá, eu utilizo actver.exe mas não uso SendMessage()... Gostaria de saber para que server esta função e onde coloca-lá, é antes de executar o actver.exe? Obgdão!!! Quote Link to comment Share on other sites More sharing options...
CIACPD Posted November 15, 2014 Report Share Posted November 15, 2014 Em algumas versões do windows 7, o actver.exe não trabalha direito porque o executável da aplicação demora para finalizar por diversos motivos, o que impede que ocorra a atualização. Abaixo o fonte que uso. #include "\comp\xharbour12\include\FiveWin.ch" // -------------------------------------------------------------------------- // Function main(cFile) local cFileName , ntentativa syswait(1.7) ntentativa :=1 if file('tmp.exe') while .t. if FErase( cFile ) == -1 syswait(1.7) SendMessage( FindWindow( 0, "CiaCpd - Aplicativos e Sistemas - Desde 1992" ), WM_CLOSE ) ntentativa++ if ntentativa > 20 nMsgBox( "Não foi possível criar o arquivo.", "Atenção" ) return nil endif loop endif cFileName:=cFileName(cFile) FRename('tmp.exe',cFileName) exit enddo EndIf WinExec( cFileName ) PostQuitMessage(0) Quit Return NIL // -------------------------------------------------------------------------- // Daniel Segura Quote Link to comment Share on other sites More sharing options...
Geraldo (gbsilva) Posted November 15, 2014 Author Report Share Posted November 15, 2014 Daniel obrigado pela dica, farei isso sim pode ter certeza e também obrigado pelo fonte. Sds, Quote Link to comment Share on other sites More sharing options...
Geraldo (gbsilva) Posted November 15, 2014 Author Report Share Posted November 15, 2014 Daniel abusando da sua boa vontade, fiquei em dúvida no seu fonte, coloquei em vermelho algumas dúvidas, como exatamente ele funciona? É que me pareceu tão simples, talvez eu possa adaptar para o meu atualizador. Grato, //-> cFile seria o nome do seu executável Function main(cFile) local cFileName , ntentativa syswait(1.7) ntentativa :=1 //-> de onde vem esse tmp.exe ? como você passa ele para a função ? if file('tmp.exe') while .t. //-> tenta apagar o cFile até 20 vezes if FErase( cFile ) == -1 syswait(1.7) SendMessage( FindWindow( 0, "CiaCpd - Aplicativos e Sistemas - Desde 1992" ), WM_CLOSE ) ntentativa++ if ntentativa > 20 nMsgBox( "Não foi possível criar o arquivo.", "Atenção" ) return nil endif loop endif //-> Dúvida você não deletou o cFile? como atribui ao cFileName cFileName:=cFileName(cFile) //-> Aqui tudo bem renomeia o tmp.exe para nome do cFileName exceto a obs anterior FRename('tmp.exe',cFileName) exit enddo EndIf //-> executa o arquivo WinExec( cFileName ) PostQuitMessage(0) Quit Return NIL Quote Link to comment Share on other sites More sharing options...
CIACPD Posted November 17, 2014 Report Share Posted November 17, 2014 Vamos lá, cFile -> é o nome do executável. tmp.exe -> é o novo executável que foi baixado do site via ftp conforme http://bielsys.blogspot.com.br/2009/04/actualizacion-automatica-de.html. 20 vezes-> é o número referente ao STRESS do dia quando falava para uma operadora de caixa atualizar o sistema e não dava certo no win7. cFileName ->recebe o nome de um arquivo completo incluindo o caminho e devolve só o nome . WinExec -> executa a aplicação já atualizada. segui fielmente o exemplo do biel no link informado acima, vale fazer uso desta rotina é prático e seguro. Quote Link to comment Share on other sites More sharing options...
Geraldo (gbsilva) Posted November 17, 2014 Author Report Share Posted November 17, 2014 Obrigado Daniel vou fazer um teste. Sds Quote Link to comment Share on other sites More sharing options...
Eroni Posted May 4, 2015 Report Share Posted May 4, 2015 Boa noite, revivendo o tópico antigo: Estou tentando fazer minha rotina de atualização conforme os exemplos acima, porém, ao executar, ao chamar a linha: oInternet := tInternet():New() Aparece a mensagem: Cannot load WinInet.dll Alguem sabe o motivo? Windows 8 64 bits Quote Link to comment Share on other sites More sharing options...
Ariston Santos Posted May 4, 2015 Report Share Posted May 4, 2015 Uso assim há muito tempo e nunca tive problema com nenhuma versão do windows. // Verificar se existe uma versão mais recente do EXE no servidor cExeName := UPPER(CFILENOEXT( HB_ARGV( 0 ) ))+".EXE" cDirSrv := SUBSTR(ALLTRIM(cPasta), 1, RAT("\",cPasta)) IF RIGHT(cDirSrv,1) == "\"; cDirSrv := SUBSTR(cDirSrv, 1, LEN(cDirSrv)-1) ; ENDIF IF EMPTY(cDirSrv) ; cDirSrv := "." ; ENDIF aDire := DIRECTORY(cDirSrv+"\*.EXE") nFile := ASCAN(aDire, {|nPos|UPPER(nPos[1])==cExeName}) IF nFile > 0 wdata1=aDire[nFile,3] wtime1=aDire[nFile,4] ENDIF aDire := DIRECTORY("*.EXE") nFile := ASCAN(aDire, {|nPos|UPPER(nPos[1])==cExeName}) IF nFile > 0 wdata2=aDire[nFile,3] wtime2=aDire[nFile,4] ENDIF // Descomente as 3 linhas abaixo para checar por MD5 (Comente o teste por data e hora) * cMd5This := HB_MD5File( cExeName ) * cMd5That := HB_MD5File( cDirSrv+"\SISCOM.EXE" ) * IF cMd5This != cMd5That // Descomente a linha IF abaixo para testar por data e hora com tolerência de 15 minutos (Comente o teste por MD5) IF (WDATA1 > WDATA2) .OR. (WDATA1 = WDATA2) .AND. (SECS(wtime1) > (SECS(wtime2)+SECS("00:15:00"))) cDirAtu := CurDrive()+":\"+CurDir() if file(cDirAtu+"\ATUALIZA.BAT") ferase(cDirAtu+"\ATUALIZA.BAT") endif WritePProString("ACESSOS", "ChecarDbf", "T", ".\SISCOM.INI") cAtuInf := "TASKKILL /IM "+cExeName+" /F"+CRLF+; "XCOPY /Y /D "+cDirSrv+"\bitmaps\*.* "+cDirAtu+"\bitmaps\"+CRLF+; "XCOPY /Y /D "+cDirSrv+"\modelos\*.* "+cDirAtu+"\modelos\"+CRLF+; "XCOPY /S /Y /D "+cDirSrv+"\manual\*.* "+cDirAtu+"\manual\"+CRLF+; "XCOPY /Y /D "+cDirSrv+"\DLL32\*.dll "+cDirAtu+"\DLL32\"+CRLF+; "XCOPY /Y /D "+cDirSrv+"\*.dll "+cDirAtu+"\"+CRLF+; "XCOPY /Y /D "+cDirSrv+"\"+cExeName+" "+cDirAtu+CRLF+; "START "+cExeName+CRLF+; "EXIT" arq2 := fcreate(cDirAtu+"\ATUALIZA.BAT") fwrite(arq2, cAtuInf) fclose(arq2) WAITRUN( GetEnv( "ComSpec" )+" /C START "+cDirAtu+"\ATUALIZA.BAT", 0 ) SYSWAIT(3) ELSE ferase(".\ATUALIZA.BAT") ENDIF Coloque antes do seu menu principal, na função inicial (Main). Adepte aí e veja se funciona. É claro que só vai funcionar após todos os computadores terem sidos atualizados pelo menos uma vez com a versão que contém este código. Quote Link to comment Share on other sites More sharing options...
Eroni Posted May 4, 2015 Report Share Posted May 4, 2015 Obrigado Ariston, mas uma pergunta, esta sua função atualiza o executável, isso? Pergunto porque no meu caso eu quero atualizar (baixar) o instalador e depois executar o mesmo, para que faça uma nova instalação, desta forma, eu tenho um exe que vai baixar outro. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.