Code : Tout sélectionner
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GUIConstants.au3>
#include <array.au3>
; ========================================
; Predefine variables
; ========================================
Global Const $s_Title = 'Telechargement de la Dernière Version'
Global Const $s_Version = '2.7'
Global Const $s_DatFile = 'http://***.********.***.fr/update.dat'
Global Const $b_Download_UpdateDat = 1
Global Const $s_DatFile_Local = @ScriptDir & '\au3_update.dat'
Global Const $s_Au3UpReg = 'HKLM\SOFTWARE\******'
Global $i_DownSize, $s_DownPath, $s_DownTemp, $s_DownFolder
Global $i_DatFileLoaded, $i_ValidAu3Path, $i_DnInitiated
Global $s_AutoUpdate, $i_SilentInstall
Global $s_CurrDate
Dim $s_ReleaseVer, $s_ReleaseFile, $i_ReleaseSize, $i_ReleaseDate, $s_ReleasePage
; ========================================
; Read registry settings
; ========================================
Global $s_DefDownDir = RegRead($s_Au3UpReg, 'DownloadDir')
If @error Then
$s_DefDownDir = @DesktopDir
EndIf
Global $s_Au3Path = RegRead($s_Au3UpReg, 'InstallDir')
If Not @error And FileExists($s_Au3Path & '\******.exe') Then
$s_CurrVer = RegRead($s_Au3UpReg, 'Version')
$s_CurrDate = _FriendlyDate(FileGetTime($s_Au3Path & "\******.exe", 0, 1))
Else
$s_Au3Path = "****** n'est pas installé sur cet ordinateur."
$s_CurrVer = 'Aucune'
$s_CurrDate = 'Aucune'
EndIf
; ========================================
; GUI - Main Application
; ========================================
Opt("GuiResizeMode", $GUI_DOCKALL)
$gui_Main = GUICreate($s_Title, 350, 310 + 20)
$me_Mn_Help = GUICtrlCreateMenu('&Menu')
$me_Mn_Proxy = GUICtrlCreateMenuItem('Utiliser une connexion avec &Proxy', $me_Mn_Help)
$me_Mn_VisitSite = GUICtrlCreateMenuItem('Aller sur le &Forum de ******', $me_Mn_Help)
$me_Mn_About = GUICtrlCreateMenuItem('&A Propos', $me_Mn_Help)
$lb_separator = GUICtrlCreateLabel('', 0, 0, 350, 2, $SS_SUNKEN)
$gr_Instal_Details = GUICtrlCreateGroup("Détails sur la Version Installée", 5, 5, 340, 70)
GUICtrlCreateLabel('Version Actuelle: ' & $s_CurrVer, 15, 25, 325, 15)
GUICtrlCreateLabel('Date: ' & $s_CurrDate, 15, 40, 325, 15)
GUICtrlCreateLabel("Répertoire d'installation: " & $s_Au3Path, 15, 55, 325, 15)
GUICtrlSetFont(-1, 8, 290, 2)
$gr_Mn_Release = GUICtrlCreateGroup("Dernière Version", 5, 85, 340, 60)
$lb_Mn_ReleaseVer = GUICtrlCreateLabel('Version: Chargement...', 15, 105, 145, 15)
$lb_Mn_ReleaseDate = GUICtrlCreateLabel('Date: Chargement...', 15, 120, 145, 15)
GUIStartGroup()
$ra_Mn_DoneNotify = GUICtrlCreateRadio('&Ne rien faire à la fin du Telechargement', 70, 155, 340, 15)
$ra_Mn_DoneRun = GUICtrlCreateRadio("&Lancer l'installation à la fin du Telechargement", 70, 175, 340, 15)
; Check default done option
If RegRead($s_Au3UpReg, 'DoneOption') = 'Run' Then
GUICtrlSetState($ra_Mn_DoneRun, $GUI_CHECKED)
Else
GUICtrlSetState($ra_Mn_DoneNotify, $GUI_CHECKED)
EndIf
$bt_Mn_Close = GUICtrlCreateButton('&Quitter', 10, 275, 330, 25)
; ========================================
; Control Set - Download Buttons
; ========================================
$bt_Mn_ReleaseDl = GUICtrlCreateButton('Télécharger la Dernière Version', 80, 195, 180, 30)
GUICtrlSetState(-1, $GUI_DISABLE)
$lb_Mn_ReleaseSize = GUICtrlCreateLabel('Taille: Chargement...', 100, 230, 165, 15, $SS_CENTER)
$lb_Mn_ReleasePage = GUICtrlCreateLabel('&Page de Telechargement', 100, 245, 165, 15, $SS_CENTER)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlSetFont(-1, 9, 400, 4)
GUICtrlSetColor(-1, 0x0000ff)
GUICtrlSetCursor(-1, 0)
$a_DownButtons = StringSplit($bt_Mn_ReleaseDl & '.' & $lb_Mn_ReleaseSize & '.' & $lb_Mn_ReleasePage, '.')
; ========================================
; Control Set - Download Display
; ========================================
$lb_Mn_DwnToTtl = GUICtrlCreateLabel('Installer dans:', 5, 195, 290, 15, $SS_LEFTNOWORDWRAP)
$lb_Mn_DwnToTxt = GUICtrlCreateLabel('', 5, 210, 290, 15, $SS_LEFTNOWORDWRAP)
$pg_Mn_Progress = GUICtrlCreateProgress(5, 225, 340, 20)
$lb_Mn_Progress = GUICtrlCreateLabel('', 5, 250, 290, 15)
$bt_Mn_OpenFile = GUICtrlCreateButton('&Ouvrir', 105, 275, 75, 25)
GUICtrlSetState(-1, $GUI_DISABLE)
$bt_Mn_OpenFolder = GUICtrlCreateButton('Ouvrir &Répertoire', 185, 275, 75, 25)
GUICtrlSetState(-1, $GUI_DISABLE)
$a_DownDisplay = StringSplit($lb_Mn_DwnToTtl & '.' & _
$lb_Mn_DwnToTxt & '.' & _
$pg_Mn_Progress & '.' & _
$lb_Mn_Progress & '.' & _
$bt_Mn_OpenFile & '.' & _
$bt_Mn_OpenFolder, '.')
_GuiCtrlGroupSetState($a_DownDisplay, $GUI_HIDE)
; ========================================
; GUI - About
; ========================================
$gui_About = GUICreate('A Propos', 400, 120, -1, -1, BitOR($WS_CAPTION, $WS_SYSMENU), -1, $gui_Main)
GUICtrlCreateLabel($s_Title & '<><> v' & $s_Version & ' - Utilitaire de téléchargement' & @LF & _
@LF & _
"Cette application est un utilitaire pour telecharger facilement" & _
"la dernière Version de ******." & _
'Merci à Rob Saunders pour son aide dans le codage.', 5, 5, 390, 75)
$lb_Ab_VisitSite = GUICtrlCreateLabel("Visiter le forum", 5, 100, 145, 15)
GUICtrlSetFont(-1, 9, 400, 4)
GUICtrlSetColor(-1, 0x0000ff)
GUICtrlSetCursor(-1, 0)
GUICtrlSetTip(-1, 'http://******.****.com')
$lb_Ab_ContactAuthor = GUICtrlCreateLabel("Demander de l'aide", 5, 100, 145, 15)
GUICtrlSetFont(-1, 9, 400, 4)
GUICtrlSetColor(-1, 0x0000ff)
GUICtrlSetCursor(-1, 0)
GUICtrlSetTip(-1, '******@gmail.com')
$bt_Ab_Close = GUICtrlCreateButton('&Quitter', 220, 90, 75, 25)
; ========================================
; Application start
; ========================================
GUISetState(@SW_SHOW, $gui_Main)
; Download update data file
If $b_Download_UpdateDat Then
InetGet($s_DatFile, $s_DatFile_Local, 1)
Else
FileCopy(@ScriptDir & '\update.dat', $s_DatFile_Local) ; to test locally
EndIf
; Harness GUI Events
While 1
$a_GMsg = GUIGetMsg(1)
If Not @InetGetActive And Not $i_DatFileLoaded Then
If @InetGetBytesRead = -1 And $b_Download_UpdateDat Then
$i_Res = MsgBox(5 + 16 + 8192, 'Erreur', 'Erreur de connexion au serveur.' & @LF & _
'Veuillez vérifier que:' & @LF & _
' - Vous êtes bien connectés à Internet' & @LF & _
' - Vous pouvez acceder au forum http://******.***.com' & @LF & _
" - Votre pare-feu ne bloque pas l'accès Internet à ce programme")
If $i_Res = 4 Then
InetGet($s_DatFile, $s_DatFile_Local, 1, 1)
Else
Exit
EndIf
Else
_LoadUpdateData()
$i_ReleaseSizeKB = Round($i_ReleaseSize / 1024)
If _CompareVersions($s_ReleaseVer, $s_CurrVer) Then
GUICtrlSetData($gr_Mn_Release, 'Dernière Version *New*')
GUICtrlSetColor($gr_Mn_Release, 0x0000ff)
EndIf
GUICtrlSetData($lb_Mn_ReleaseVer, 'Version: ' & $s_ReleaseVer)
GUICtrlSetData($lb_Mn_ReleaseDate, 'Date: ' & _FriendlyDate($i_ReleaseDate))
GUICtrlSetData($lb_Mn_ReleaseSize, 'Taille: ' & $i_ReleaseSizeKB & ' KB')
GUICtrlSetTip($lb_Mn_ReleasePage, $s_ReleasePage)
GUICtrlSetState($bt_Mn_ReleaseDl, $GUI_ENABLE)
GUICtrlSetState($lb_Mn_ReleasePage, $GUI_ENABLE)
$i_DatFileLoaded = 1
EndIf
EndIf
If $i_DnInitiated Then
If @InetGetActive Then
$i_DnPercent = Int(@InetGetBytesRead / $i_DownSize * 100)
$s_DnBytes = Round(@InetGetBytesRead / 1024) & ' KB'
$s_DnSize = Round($i_DownSize / 1024) & ' KB'
GUICtrlSetData($pg_Mn_Progress, $i_DnPercent)
GUICtrlSetData($lb_Mn_Progress, 'Progression: ' & $i_DnPercent & '% (' & $s_DnBytes & ' of ' & $s_DnSize & ')')
Else
GUICtrlSetData($pg_Mn_Progress, 100)
If Not FileMove($s_DownTemp, $s_DownPath, 1) Then
MsgBox(16 + 8192, 'Erreur', 'Erreur en déplacant le fichier.')
GUICtrlSetData($lb_Mn_Progress, 'Erreur')
Else
If GUICtrlRead($ra_Mn_DoneRun) = $GUI_CHECKED Then
_Start('"' & $s_DownPath & '"')
Exit
Else
GUICtrlSetData($lb_Mn_Progress, 'Telechargement Réussi!')
GUICtrlSetData($bt_Mn_Close, '&Quitter')
GUICtrlSetState($bt_Mn_OpenFile, $GUI_ENABLE)
GUICtrlSetState($bt_Mn_OpenFolder, $GUI_ENABLE)
$i_Response = MsgBox(4 + 64 + 256 + 8192, $s_Title, 'Telechargement Reussi!' & @LF & _
"Voulez vous lancer l'installation?")
If $i_Response = 6 Then
_Start('"' & $s_DownPath & '"')
Exit
EndIf
EndIf
EndIf
$i_DnInitiated = 0
EndIf
EndIf
If $a_GMsg[1] = $gui_Main Then
Select
; Radio buttons
Case $a_GMsg[0] = $ra_Mn_DoneRun
RegWrite($s_Au3UpReg, 'DoneOption', 'REG_SZ', 'Run')
Case $a_GMsg[0] = $ra_Mn_DoneNotify
RegWrite($s_Au3UpReg, 'DoneOption', 'REG_SZ', 'Notify')
; Download buttons
Case $a_GMsg[0] = $bt_Mn_ReleaseDl
$tmp = StringInStr($s_ReleaseFile, '/', 0, -1)
$s_DefFileName = StringTrimLeft($s_ReleaseFile, $tmp)
$i_DownSize = $i_ReleaseSize
_DownloadFile($s_ReleaseFile, '******-setup.exe')
Case $a_GMsg[0] = $lb_Mn_ReleasePage
_Start($s_ReleasePage)
; Open buttons
Case $a_GMsg[0] = $bt_Mn_OpenFile
_Start('"' & $s_DownPath & '"')
Exit
Case $a_GMsg[0] = $bt_Mn_OpenFolder
_Start('"' & EnvGet('windir') & '\explorer.exe" /select,"' & $s_DownPath & '"')
Exit
; Menu items
Case $a_GMsg[0] = $me_Mn_Proxy
If BitAND(GUICtrlRead($me_Mn_Proxy), $GUI_CHECKED) = $GUI_CHECKED Then
GUICtrlSetState($me_Mn_Proxy, $GUI_UNCHECKED)
HttpSetProxy(0)
Else
GUICtrlSetState($me_Mn_Proxy, $GUI_CHECKED)
HttpSetProxy(1)
EndIf
Case $a_GMsg[0] = $me_Mn_VisitSite
_Start('http://www.******.***.com')
Case $a_GMsg[0] = $me_Mn_About
GUISetState(@SW_SHOW, $gui_About)
; Close buttons
Case $a_GMsg[0] = $bt_Mn_Close
_CancelDownload()
Case $a_GMsg[0] = $GUI_EVENT_CLOSE
_CancelDownload(1)
EndSelect
ElseIf $a_GMsg[1] = $gui_About Then
Select
Case $a_GMsg[0] = $lb_Ab_VisitSite
_Start('http://www.******.***.com')
Case $a_GMsg[0] = $lb_Ab_ContactAuthor
_Start('"mailto:******@gmail.com?Subject=Question à Propos du Telechargement de Nouvelle Version"')
Case $a_GMsg[0] = $GUI_EVENT_CLOSE Or $a_GMsg[0] = $bt_Ab_Close
GUISetState(@SW_HIDE, $gui_About)
EndSelect
EndIf
WEnd
; ========================================
; Function Declarations
; ========================================
; App. specific functions
Func _DownloadFile($s_DownUrl, $s_DownName)
$s_DownTemp = @TempDir & '\' & $s_DownName
$len = InetGetSize($s_DownUrl)
If @error Then
MsgBox(16 + 8192, 'Erreur', "Impossible de commencer le Telechargement." & @CRLF & @CRLF & $s_DownUrl)
Return
EndIf
InetGet($s_DownUrl, $s_DownTemp, 1, 1)
$s_DownPath = FileSaveDialog('Enregistrer', $s_DefDownDir, 'Executables (*.exe)', 16, $s_DownName)
If Not @error Then
If Not (StringRight($s_DownPath, 4) = '.exe') Then
$s_DownPath = $s_DownPath & '.exe'
EndIf
$tmp = StringInStr($s_DownPath, '\', 0, -1)
$s_DownFolder = StringLeft($s_DownPath, $tmp)
RegWrite($s_Au3UpReg, 'DownloadDir', 'REG_SZ', $s_DownFolder)
GUICtrlSetData($lb_Mn_DwnToTxt, _ClipPath($s_DownPath, 55))
GUICtrlSetData($lb_Mn_Progress, 'Progression du Telechargement: Calcul...')
_GuiCtrlGroupSetState($a_DownButtons, $GUI_HIDE)
_GuiCtrlGroupSetState($a_DownButtons, $GUI_DISABLE)
_GuiCtrlGroupSetState($a_DownDisplay, $GUI_SHOW)
GUICtrlSetData($bt_Mn_Close, 'Cancel')
$i_DnInitiated = 1
Else
InetGet('Abort')
FileDelete($s_DownTemp)
EndIf
EndFunc ;==>_DownloadFile
Func _CancelDownload($i_Flag = 0)
If $i_DnInitiated Then
$i_Response = MsgBox(4 + 64 + 256 + 8192, $s_Title, 'Mettre en Pause est Impossible.' & @LF & _
'Votre téléchargement va être perdu.' & @LF & _
'Continuer?')
If $i_Response = 6 Then
$i_DnInitiated = 0
InetGet('abort')
FileDelete($s_DownTemp)
If $i_Flag = 1 Then
Exit
EndIf
_GuiCtrlGroupSetState($a_DownDisplay, $GUI_HIDE)
GUICtrlSetData($bt_Mn_Close, '&Quitter')
If $s_PreBetaVer <> '' Then
GUICtrlSetPos($bt_Mn_Close, 10, 275, 330 + 175, 25)
Else
GUICtrlSetPos($bt_Mn_Close, 10, 275, 330, 25)
EndIf
GUICtrlSetData($pg_Mn_Progress, 0)
_GuiCtrlGroupSetState($a_DownButtons, $GUI_SHOW)
_GuiCtrlGroupSetState($a_DownButtons, $GUI_ENABLE)
EndIf
Else
Exit
EndIf
EndFunc ;==>_CancelDownload
Func _LoadUpdateData()
Global $s_ReleaseVer, $s_ReleaseFile, $s_ReleasePage, $i_ReleaseSize, $i_ReleaseDate
$s_ReleaseVer = IniRead($s_DatFile_Local, '******', 'version', 'Erreur de lecture')
$s_ReleaseFile = IniRead($s_DatFile_Local, '******', 'setup', '')
$s_ReleasePage = IniRead($s_DatFile_Local, '******', 'index', 'http://******.***.com')
$i_ReleaseSize = IniRead($s_DatFile_Local, '******', 'filesize', 0)
$i_ReleaseDate = IniRead($s_DatFile_Local, '******', 'filetime', 0)
FileDelete($s_DatFile_Local)
EndFunc ;==>_LoadUpdateData
; Utility functions
Func _Start($s_StartPath)
If @OSTYPE = 'WIN32_NT' Then
$s_StartStr = @ComSpec & ' /c start "" '
Else
$s_StartStr = @ComSpec & ' /c start '
EndIf
Run($s_StartStr & $s_StartPath, '', @SW_HIDE)
EndFunc ;==>_Start
Func _GuiCtrlGroupSetState(ByRef $a_GroupArray, $i_State)
For $i = 1 To $a_GroupArray[0]
GUICtrlSetState($a_GroupArray[$i], $i_State)
Next
EndFunc ;==>_GuiCtrlGroupSetState
Func _ClipPath($s_Path, $i_ClipLen)
Local $i_Half, $s_Left, $s_Right
If StringLen($s_Path) > $i_ClipLen Then
$i_Half = Int($i_ClipLen / 2)
$s_Left = StringLeft($s_Path, $i_Half)
$s_Right = StringRight($s_Path, $i_Half)
$s_Path = $s_Left & '...' & $s_Right
EndIf
Return $s_Path
EndFunc ;==>_ClipPath
Func _NumSuffix($i_Num)
Local $s_Num
Switch Int($i_Num)
Case 1, 21, 31
$s_Num = Int($i_Num) & 'st'
Case 2, 22
$s_Num = Int($i_Num) & 'nd'
Case 3, 23
$s_Num = Int($i_Num) & 'rd'
Case Else
$s_Num = Int($i_Num) & 'th'
EndSwitch
Return $s_Num
EndFunc ;==>_NumSuffix
Func _FriendlyDate($s_Date)
Local $a_Months = StringSplit('Janvier,Fevrier,Mars,Avril,Mai,Juin,Juillet,Aout,Septembre,Octobre,Novembre,Decembre', ',')
Local $s_Year, $s_Month, $s_Day
$s_Year = StringLeft($s_Date, 4)
$s_Month = StringMid($s_Date, 5, 2)
$s_Month = $a_Months[Int(StringMid($s_Date, 5, 2))]
$s_Day = StringMid($s_Date, 7, 2)
$s_Day = _NumSuffix(StringMid($s_Date, 7, 2))
Return $s_Month & ' ' & $s_Day & ', ' & $s_Year
EndFunc ;==>_FriendlyDate
Func _StringInArray($a_Array, $s_String)
Local $i_ArrayLen = UBound($a_Array) - 1
For $i = 0 To $i_ArrayLen
If $a_Array[$i] = $s_String Then
Return $i
EndIf
Next
SetError(1)
Return 0
EndFunc ;==>_StringInArray
Func _CompareVersions($s_Vers1, $s_Vers2, $i_ReturnFlag = 0)
If $s_Vers1 = '' Then Return 0
Local $i, $i_Vers1, $i_Vers2, $i_Top
Local $a_Vers1 = StringSplit($s_Vers1, '.')
Local $a_Vers2 = StringSplit($s_Vers2, '.')
$i_Top = $a_Vers1[0]
If $a_Vers1[0] < $a_Vers2[0] Then
$i_Top = $a_Vers2[0]
EndIf
For $i = 1 To $i_Top
$i_Vers1 = 0
$i_Vers2 = 0
If $i <= $a_Vers1[0] Then
$i_Vers1 = Number($a_Vers1[$i])
EndIf
If $i <= $a_Vers2[0] Then
$i_Vers2 = Number($a_Vers2[$i])
EndIf
If $i_Vers1 > $i_Vers2 Then
$v_Return = 1
ExitLoop
ElseIf $i_Vers1 < $i_Vers2 Then
$v_Return = 0
ExitLoop
Else
$v_Return = -1
EndIf
Next
If $i_ReturnFlag Then
Select
Case $v_Return = -1
SetError(1)
Return 0
Case $v_Return = 1
Return $s_Vers1
Case $v_Return = 0
Return $s_Vers2
EndSelect
ElseIf $v_Return = -1 Then
SetError(1)
Return 0
Else
Return $v_Return
EndIf
EndFunc ;==>_CompareVersions
Func _Status($s_MainText, $s_SubText = '', $i_BytesRead = -1, $i_DownSize = -1)
Global $i_ProgOn
Global $i_StatusPercent
If @OSVersion = "WIN_XP" Or @OSVersion = "WIN_2000" Or @OSVersion = "WIN_2003" Then
If $s_SubText <> '' Then
$s_SubText = @LF & $s_SubText
EndIf
If $i_BytesRead = -1 Then
TrayTip($s_Title, $s_MainText & $s_SubText, 10, 16)
Else
$s_DownStatus = Round($i_BytesRead / 1024) & ' of ' & Round($i_DownSize / 1024) & ' KB'
TrayTip($s_Title, $s_MainText & $s_SubText & @LF & $s_DownStatus, 10, 16)
EndIf
Else
If Not $i_ProgOn Then
ProgressOn($s_Title, $s_MainText, $s_SubText, -1, -1, 2 + 16)
$i_ProgOn = 1
Else
If $i_BytesRead = -1 Then
ProgressSet($i_StatusPercent, $s_SubText, $s_MainText)
Else
$s_DownStatus = 'Downloading ' & Round($i_BytesRead / 1024) & ' of ' & Round($i_DownSize / 1024) & ' KB'
$i_StatusPercent = Round($i_BytesRead / $i_DownSize * 100)
ProgressSet($i_StatusPercent, $s_DownStatus, $s_MainText)
EndIf
EndIf
EndIf
EndFunc ;==>_Status