Si algun compañero del foro le quiere hacer alguna mejora bienvenido.
Code: Select all
FUNCTION Main()
// En este ejemplo el nombre de nuestro programa es 'MyProgram.exe'
// el nombre de la nueva version a bajar del server es '_MyProgram.exe'
//Añadir al inicio del programa
// Nombre de la aplicacion que esta corriendo, incluyendo la ruta
cPathAppliName := alltrim(hb_argv( 0 ))
nLen := len(cPathAppliName)
nAtNum := atnum( "\", cPathAppliName)
nPos := nLen - nAtNum
// Nombre de la aplicacion que esta corriendo unicamente
// Puede ser 'MyProgram.exe' o "_MyProgram.exe"
cAppliName := right(cPathAppliName, nPos)
// Nombre original de mi programa
cOrigAppli := alltrim(cAppliDir) + "\MyProgram.exe"
// Ck si esta corriendo el update recien bajado
IF upper((cPathAppliName)) <> upper((cOrigAppli))
// Esta corriendo la nueva version
// Borrar la version original 'MyProgram.exe'
ferase(cOrigAppli) <> 0
syswait(1)
// Renombrar la nueva version con el nombre de mi programa original
RENAME "_MyProgram.exe" TO "MyProgram.exe"
ENDIF
/*
Su codigo de su programa
*/
RETURN (.T.)
FUNCTION CkUpdate()
// Esta es la funcion que se debe ejecutar para
//verificar si existe una nueva version del programa
dbselectarea("PATHFILE") // Archivo donde estan los parametros del server
cAlias := alias()
GO 1
cServFtp := alltrim((cAlias)->SERVER) // Direccion del server
cUserFTp := alltrim((cAlias)->USER) // User Name
cPassFTp := alltrim((cAlias)->PASSW) // Password
cServPath := alltrim((cAlias)->SERPATH) // Ruta del server donde esta '_MyProgram.exe'
cVersion2 := (cAlias)->VERSION // Version actual de 'MyProgram.exe'
Dbcloseall()
// Ir al server a bajar la informacion de la nueva version, si existe
IF !GetUpdateFromServer(cServFtp, cUserFTp, cPassFTp, cServPath, cVersion2 )
// No existe nueva version o la conexion al server fallo
RETURN .F.
ENDIF
// Se bajo del server la nueva version '_MyProgram.exe'
cFileExe := (cAppliDir) + "\_MyProgram.exe"
OpenFiles() // Funcion para abrir los archivos (tablas) de la base de datos
// Correr la nueva version bajada del server ''_MyProgram.exe'
WinExec("_MyProgram.exe")
// 'Matar' el programa actual 'MyProgram.exe'
PostQuitMessage(0)
__Quit()
RETURN (.T.)
Function GetUpdateFromServer( cServFtp, cUserFTp, cPassFTp, cServPath, cVersion2 )
Local oInternet, oFtp, oMeter, oText
Local cTitle := "Connecting to SDN Server", lExistAlt := .F.
LOCAL hInternet, hConnect, cAlias, cAlias1, cNewTitle, lGetFileAll := .F.
PRIVATE oSay
// Dialogo con un mensaje indicando la conexion al server
DEFINE DIALOG oDlg RESOURCE "DIALOG_13";
TITLE cTitle
REDEFINE SAY oSay ID 55 of oDlg
ACTIVATE DIALOG oDlg NOWAIT
oSay:SetText ("Checking for update....")
hLib = LOADLIBRARY( "wininet.dll" )
hInternet = INETOPEN( "Anystring", INTERNET_OPEN_TYPE_DIRECT, 0, 0, 0 )
hConnect = INETCONNECT( hInternet, cServFtp, INTERNET_INVALID_PORT_NUMBER,;
cUserFTp, cPassFTp, INTERNET_SERVICE_FTP, 0, 0 )
IF hConnect = 0
MsgAlert("Connection to server failed!" + chr(13)+;
"Please check your internet connection and try later.")
oDlg:end()
OpenFiles() // Funcion para abrir los archivos (tablas) de la base de datos
RETURN .F.
ENDIF
// P_VERS.DBF es un archivo con un campo con el No. de la version
cDownUPD := cAppliDir + "\P_VERS.DBF"
cLastUPD := cServPath + "/P_VERS.DBF"
lGetLastUPD := FTPGETFILE( hConnect, cLastUPD, cDownUPD, 0, FILE_ATTRIBUTE_ARCHIVE, 0, 0 )
IF !lGetLastUPD
MsgAlert("P_VERS Downloaded failed!" + chr(13) +;
"Please check your internet connection!")
INETCLOSEHANDLE( hConnect )
INETCLOSEHANDLE( hInternet )
FREELIBRARY( hLib )
OpenFiles()
oDlg:End()
RETURN .F.
ENDIF
OpenFiles()
dbselectarea("P_VERS")
cAlias := alias()
GO 1
cVersion1 := (cAlias)->VERSION
dbcloseall()
// Se compara el No. de la version del programa corriendo
// con el No. de la version del programa en el server
IF alltrim(cVersion1) == alltrim(cVersion2)
// Si es el mismo numero no se baja la version del programa que esta en el Server
Msginfo(" You already have the most recent version.")
INETCLOSEHANDLE( hConnect )
INETCLOSEHANDLE( hInternet )
FREELIBRARY( hLib )
OpenFiles()
oDlg:End()
RETURN .F.
ENDIF
// Si son diferentes se baja la version del programa que esta en el Server
cDataSDN := cServPath + "/_MyProgram.exe"
cPathDir := cAppliDir + "\_MyProgram.exe"
oDlg:End()
MsgRun( "Downloading Update Files Please Wait...", "My Program",;
{ || lGetFileAll := FTPGETFILE( hConnect, cDataSDN, cPathDir, 0, FILE_ATTRIBUTE_ARCHIVE, 0, 0 ) } )
IF !lGetFileAll
MsgAlert("File Downloaded failed!" + chr(13) +;
"Please check your internet connection!")
INETCLOSEHANDLE( hConnect )
INETCLOSEHANDLE( hInternet )
FREELIBRARY( hLib )
OpenFiles()
RETURN .F.
ENDIF
INETCLOSEHANDLE( hConnect )
INETCLOSEHANDLE( hInternet )
FREELIBRARY( hLib )
oDlg:end()
RETURN .T.
George