He aqui las funciones que tengo en uso:
Al instalar el sistema en las terminales se mejora bastante el tiempo de respuesta y se evitan fallas por carga de Dlls y transferencia; entre otras.
STAT FUNC Chk_Update() // Verifica actualizaciones
LOCAL cOld, cNew, aOld, aNew
LOCAL cIni, cDir, cDat, aDrv
IF Left(CurDir(),1)<>"\"
cDir:=CurDrive()+":\"+CurDir()+"\"
ELSE
cDir:="\"+CurDir()+"\"
ENDIF
cIni:=GetWinDir()+"\"+cNSys+".Ini" // Path en INI
cDat:=GetPvProfString(cNSys,"DirDat","",cIni)
cDir:=Lower(cDir) // Local
cDat:=Lower(cDat) // Servidor
IF !Empty(cDat) .AND. cDir<>cDat
CursorWait()
IF File("RC-Update.Exe")
cOld:=cDir+"RC-eXtended.Exe"
cNew:=cDat+"RC-eXtended.Exe"
IF !File(cNew)
aDrv:=ADrives() // Abre unidades disponibles (por si acaso)
ENDIF
IF File(cNew)
aOld:=Directory(cOld)
aNew:=Directory(cNew)
IF aOld[1,3]<aNew[1,3] .OR. (aOld[1,3]=aNew[1,3] .AND. aOld[1,4]<>aNew[1,4])
CursorWait()
WinExec("RC-Update.Exe")
QUIT
ENDIF
ELSE
MsgAlert("La ruta de trabajo no esta disponible.","Precauci贸n!")
QUIT
ENDIF
ENDIF
ENDIF
RETURN (NIL)
#Include "FiveWin.Ch"
FUNCTION RC_Update() // Copia actualizaci贸n
LOCAL cIni, cDir, cDat
LOCAL cOld, cNew
LOCAL cNSys
CursorWait()
cNSys:="RC-eXtended"
IF Left(CurDir(),1)<>"\"
cDir:=CurDrive()+":\"+CurDir()+"\"
ELSE
cDir:="\"+CurDir()+"\"
ENDIF
cIni:=GetWinDir()+"\"+cNSys+".Ini"
cDat:=GetPvProfString(cNSys,"DirDat","",cIni)
cOld:=cDir+"RC-eXtended.Exe"
cNew:=cDat+"RC-eXtended.Exe"
SysWait(1)
IF File(cNew)
FErase(cOld)
CursorWait()
CopyFile(cNew,cOld,.F.)
ENDIF
WinExec(cOld)
QUIT
RETURN (NIL)