Rodolfo:
Esta rutina me ha funciona perfectamente
funciona de la siguiente manera:
1.- Cuando instalo una actualizaci贸n guardo en la carpeta update\ dos archivo, uno el ejecutable.exe y otro la update.ini, que es el siguiente
_____________________________________________________________ Sistema Administrativo Version 1.0.0
(c) copyright: Patricio Avalos Aguirre, 2005
patricio_avalos_aguirre@hotmail.com
_____________________________________________________________
[Version]
numero=1.0.19
[Revision]
;08 Julio del 2006, versi贸n 1.0.19
;bla bla bla..
;y mas blabla
#Define DRIVELOCAL DiskName() + ":\"+Curdir()
Static oApp
procedure Main()
//mi programa bla bla bla...
return
//-----------------------------------------------------------------------
Init Procedure Inicio()
oApp := MyApp():Load()
aEval( DIRECTORY( oApp:cPathTmp + "\*.*" ), { |aFichero| fErase( oApp:cPathTmp + "\"+aFichero[1] ) } )
if VerUpdate()
PostQuitMessage( 0 )
QUIT
endif
return
//-----------------------------------------------------------------------
CREATE CLASS MyApp
VAR Usuario AS CHARACTER INIT ""
VAR Nombre AS CHARACTER INIT ""
VAR Grupo AS CHARACTER INIT ""
VAR Depto AS CHARACTER INIT ""
VAR Clave AS CHARACTER INIT ""
VAR cPathTmp AS CHARACTER INIT DRIVELOCAL + "\TEMPORAL"
VAR cPathDbf AS CHARACTER INIT DRIVELOCAL + "\DATOS"
VAR cPathUpd AS CHARACTER INIT DRIVELOCAL + "\UPDATE"
VAR cPathLocal AS CHARACTER INIT DRIVELOCAL
//impresion
VAR Factura AS CHARACTER INIT "LPT1"
VAR Boleta AS CHARACTER INIT "LPT1"
VAR GDespacho AS CHARACTER INIT "LPT1"
VAR ordenCompra AS CHARACTER INIT "LPT1"
VAR Cotizacion AS CHARACTER INIT "LPT1"
VAR GRecepcion AS CHARACTER INIT "LPT1"
VAR SaliBode AS CHARACTER INIT "LPT1"
VAR ordentrabajo AS CHARACTER INIT "LPT1"
VAR Cajadiaria AS CHARACTER INIT "LPT1"
VAR nCredito AS CHARACTER INIT "LPT1"
VAR Arriendo AS CHARACTER INIT "LPT1"
VAR Finiquito AS CHARACTER INIT "LPT1"
VAR AdsServer AS NUMERIC INIT ""
VAR AdsConnect AS NUMERIC INIT ADS_LOCAL_SERVER
VAR cVersion AS CHARACTER INIT "1.0.0"
METHOD Load()
METHOD Save()
METHOD End() INLINE ::Save()
ENDCLASS
//------------------------------------------------------------------------------------------------
METHOD Load( oDbf ) CLASS MyApp
local oIni
INI oIni FILE (::cPathLocal + "\wInvent.ini")
GET ::cPathDbf SECTION "Servidor" ENTRY "Name" OF oIni DEFAULT ""
GET ::cPathUpd SECTION "Servidor" ENTRY "Update" OF oIni DEFAULT ""
GET ::Factura SECTION "Puertos" ENTRY "Factura" OF oIni DEFAULT "LPT1"
GET ::Boleta SECTION "Puertos" ENTRY "Boleta" OF oIni DEFAULT "LPT1"
GET ::GDespacho SECTION "Puertos" ENTRY "GDespacho" OF oIni DEFAULT "LPT1"
GET ::OrdenCompra SECTION "Puertos" ENTRY "ordencompra" OF oIni DEFAULT "LPT1"
GET ::Cotizacion SECTION "Puertos" ENTRY "Cotizacion" OF oIni DEFAULT "LPT1"
GET ::GRecepcion SECTION "Puertos" ENTRY "GRecepcion" OF oIni DEFAULT "LPT1"
GET ::SaliBode SECTION "Puertos" ENTRY "SaliBode" OF oIni DEFAULT "LPT1"
GET ::ordentrabajo SECTION "Puertos" ENTRY "ordentrabajo" OF oIni DEFAULT "LPT1"
GET ::Cajadiaria SECTION "Puertos" ENTRY "CajaDiaria" OF oIni DEFAULT "LPT1"
GET ::cVersion SECTION "Version" ENTRY "Version" OF oIni DEFAULT "1.0.0"
GET ::Usuario SECTION "Usuario" ENTRY "Usuario" OF oIni DEFAULT ""
GET ::Nombre SECTION "Usuario" ENTRY "Nombre" OF oIni DEFAULT ""
GET ::AdsServer SECTION "ServerAds" ENTRY "Servidor" OF oIni DEFAULT ""
GET ::AdsConnect SECTION "ServerAds" ENTRY "TypeConnect" OF oIni DEFAULT ADS_LOCAL_SERVER
::Factura := Alltrim( ::Factura )
::Boleta := Alltrim( ::Boleta )
::GDespacho := Alltrim( ::GDespacho )
::OrdenCompra := Alltrim( ::OrdenCompra)
::Cotizacion := Alltrim( ::Cotizacion )
::GRecepcion := Alltrim( ::GRecepcion )
::SaliBode := Alltrim( ::SaliBode )
::CajaDiaria := Alltrim( ::CajaDiaria )
ENDINI
return( Self )
// --------------------------------------------------------------------------------------------
METHOD Save( oDbf ) CLASS MyApp
local oIni
if !empty( ::Usuario )
INI oIni FILE (::cPathLocal + "\wInvent.ini")
oIni:Set( "Usuario", "Usuario", ::Usuario )
oIni:Set( "Usuario", "Nombre", ::Nombre )
oIni := NIL
endif
return( NIL )
// --------------------------------------------------------------------------------------------
Function ViewUsu()
Return( oApp )
// --------------------------------------------------------------------------------------------
static function VerUpdate()
local oIniUpdate, oIniLocal, cVersion, cVersion2, lReturn := .f.
if !file( ViewUsu():cPathUpd + "\Update.exe" ) .or. !file( ViewUsu():cPathUpd + "\Wcta.exe" )
return( lReturn )
endif
INI oIniUpdate FILE ( ViewUsu():cPathUpd + "\update.ini" )
GET cVersion SECTION "Version" ENTRY "numero" OF oIniUpdate DEFAULT "1.0.0"
INI oIniLocal FILE (ViewUsu():cPathLocal + "\wInvent.ini")
GET cVersion2 SECTION "Version" ENTRY "Version" OF oIniLocal DEFAULT "1.0.0"
if PadR( cVersion2,6 ) <> PadR( cVersion,6 )
if Parame->( NetRLock() )
Parame->Version := cVersion
WinExec( ViewUsu():cPathUpd+"\Update.exe "+cVersion )
lReturn := .t.
endif
endif
USE
return( lReturn )
//------------------------------------------------------------------------------------------------
//programa update.exe
//este debe compilarse solo...
#include "ini.ch"
#include "FiveWin.ch"
#Define DRIVELOCAL DiskName() + ":\"+Curdir()
//----------------------------------------------------------------------------
function Update( cValor )
local PATHSERVER, PATHDATOS, lExe, oIni, Usuario
if empty( cValor )
return( .f. )
endif
INI oIni FILE (DRIVELOCAL + "\wInvent.ini")
GET Usuario SECTION "Usuario" ENTRY "Usuario" OF oIni DEFAULT ""
GET PATHSERVER SECTION "Servidor" ENTRY "Update" OF oIni DEFAULT ""
GET PATHDATOS SECTION "Servidor" ENTRY "Name" OF oIni DEFAULT ""
ENDINI
if !file( PATHSERVER + "\wcta.exe" )
MsgInfo( "Falta un archivo imposible actualizar" +CRLF+;
PATHSERVER + "\wcta.exe", "Usuario" )
return( .f. )
endif
if file( DRIVELOCAL + "\wcta.ex_" )
if fErase( DRIVELOCAL + "\wcta.ex_" ) = -1
MsgInfo( "Favor borrar archivo de respaldo "+DRIVELOCAL + "\wcta.ex_", "Usuario" )
return( .f. )
endif
endif
MsgInfo( "Actualizaci贸n Sistema Win-Facturaci贸n" + CRLF + "Versi贸n "+cValor )
if fRename( DRIVELOCAL + "\wcta.exe", DRIVELOCAL + "\wcta.ex_" ) = -1
Msginfo( "Error al actualizar"+CRLF+"Cierre todos las ventanas del sistema"+CRLF+CRLF+ "si persiste este error reinicie la maquina", "usuario" )
return( .f. )
endif
Usuario := Alltrim( Usuario )
lExe := .f.
MsgRun( "Actualizando aplicaci贸n..", "Espere..", ;
{ || lExe := CopyFile( PATHSERVER + "\wcta.exe",;
DRIVELOCAL + "\wcta.exe", .f. ) } )
if lExe //sa ha copiado correctamente
oIni := TIni():New( DRIVELOCAL + "\wInvent.Ini" )
oIni:Set( "Version", "Version", cValor )
oIni:Set( "Creado", "Programador", "Patricio Avalos Aguirre" )
oIni:Set( "Creado", "Email", "patricio_avalos_aguirre@hotmail.com" )
oIni:Set( "Creado", "Copyright(c)", "2005" )
MsgInfo( "Actualizaci贸n se ha realizado con 茅xito" + CRLF + CRLF +;
"Vuelva a ejecutar el sistema", "Agrotec Ltda." )
fErase( DRIVELOCAL + "\wcta.ex_" )
else
if file( DRIVELOCAL + "\wcta.exe" )
fErase( DRIVELOCAL + "\wcta.exe" )
endif
fRename( DRIVELOCAL + "\wcta.ex_", DRIVELOCAL + "\wcta.exe" ) //volvemos el resplado a su origen
MsgInfo( "Error Al actualizar!!"+ CRLF + CRLF + "EXE Error" + CRLF + CRLF + ;
"Comuniquese con Patricio Avalos Aguirre"+CRLF+"Email:patricio_avalos_aguirre@hotmail.com", "Actualizaci贸n" )
endif
Return( .t. )
//-----------------------------------------------------------------------------------------------------
//no recuerdo el autor de esta funcion, pero no es m铆a
static function CopyFile( cORIGEN, cDestino, lBorrar )
local cBuffer, fIfile, fOfile, nNumRead
DEFAULT lBorrar := .F.
#DEFINE BUF_SIZE 1024
cBuffer := SPACE(BUF_SIZE)
fIfile := FOPEN(cORIGEN)
IF FERROR() != 0
MsgStop("Error no se ha podido abrir el fichero "+ CRLF+ CRLF + cORIGEN )
return( .f. )
ENDIF
fOFile := LCreat( cDestino,0 )
IF FERROR() != 0
MsgStop("Error no se ha podido crear el fichero "+CRLF+cDESTINO)
FCLOSE(fIFile)
return( .f. )
ENDIF
nNumRead := FREAD(fIfile,@cBuffer,BUF_SIZE)
DO WHILE nNumRead == BUF_SIZE
FWRITE(fOfile, cBuffer, BUF_SIZE)
nNumRead := FREAD(fIFile,@cBuffer,BUF_SIZE)
ENDDO
FWRITE(fOfile, cBuffer, nNumRead)
FCLOSE(fIFile)
FCLOSE(fOFile)
IF lBorrar
FERASE(cORIGEN)
ENDIF
return( .t. )
//------------------------------------------------------------------------------------------------
Espero que te sirva,
Saludos
Patricio
La Serena, Chile