Что нового

[Интернет] Автообновление программы в нормальном и скрытом (в фоне) режимах

kzru_hunter

Осваивающий
Сообщения
144
Репутация
49
AutoIt: 3.3.6.0
Версия: 1.0

Категория: Автоматизация, Вспомогательные функции, Интернет

Описание:
Функция для проверки новой версии программы в интернете.
Старался её сделать так, чтобы в любых ситуациях (при включенном и выключенном интернете) были минимальные задержки при проверке последей версии программы.

Как работает функция:
Сначала функция скачивает файл информационный файл (к примеру, MyApp_Update.inf) с вашего сайта, в котором хранится информация о последней версии, а также ссылка для скачивания. Происходит сравнение текущей версии и последней. В случае обнаружения новой версии, выводится MessageBox: "Скачать новую версию? Да/Нет". Во время скачивания новой версии будет отображаться прогресс скачки, и после окончания скачивания будет запущена новая версия.

Функция может работать в 2-х режимах:
1) В нормальном, т.е. при вызове функции будет в любом случае отображено сообщение либо о наличии последней версии либо о проблеме проверки последней версии.
В этом режиме функцию вызывать посредством ручного вызова в программе (например, при нажатии в меню или на кнопку).
2) В тихом(скрытом), т.е. при вызове функции не будут появляться никакие сообщения в случае, если не удалось обнаружить новую версию. В этом режиме функцию нужно вызывать при запуске программы. При этом функция будет работать в фоне и не будет влиять на работу программы.


Использование функции:
Для того, чтобы проверить последнюю версию программы на своём сайте, нужно в коде скрипта вызывать функцию _StartCheckForUpdate($url_check, $Current_Version, $Silent_Mode = true)

Вот описание параметров:
1-й параметр ($url_check) - это ссылка на файл с информацией о последней версии, при этом этот файл должен иметь следующий вид (например):
Код:
[Info]
Update Version = 1.1 
Update File = http://mysite.com/program-v1.1.exe
Update Changes = Исправлены баги
Замечание: Ключ "Update Changes" можно не указывать или оставить пустым

2-й параметр ($Current_Version): Тут нужно указать текущую версию программы в виде строки

3-й параметр ($Silent_Mode = True): Тут указывается, какой режим использовать: скрытый или нормальный. По умолчанию, скрытый

Код/Пример:
Код:
#Include "Update.au3" ; обязательно нужно включить
$Current_Version = "1.0"
; -- Будет вызвана функция в скрытом режиме в фоне для проверки последней версии программы ---
_StartCheckForUpdate("http://mysite.com/MyApp_Update.inf",$Current_Version,True)
; При этом не забудьте залить на сайт файл MyApp_Update.inf, а также новую версию программы


Файл: Update.au3

Автор: hunter
Credits: Пример автообновления версии своего приложения by ViSiToR a.k.a CreatoR
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 472
Репутация
2 401
Re: [Сеть, интернет] Автообновление программы в нормальном и скрытном режимах

kzru_hunter
Неплохо сделано.

[?]
Пример автообновления версии своего приложения by ViSiToR
a.k.a CreatoR :whistle: ещё было бы полезно добавить ссылку на оригинальный пример.
 
Автор
K

kzru_hunter

Осваивающий
Сообщения
144
Репутация
49
Re: [Сеть, интернет] Автообновление программы в нормальном и скрытном режимах

CreatoR Подправил :smile:

Обновлён Update.au3: подправил некоторые недочёты
 

dimart

Новичок
Сообщения
21
Репутация
0
а можно сделать совсем без сообщений и запросов? то есть, если есть обновление, то скрипт закачивает новую версию и запускает её? :scratch:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 472
Репутация
2 401
dimart [?]
Нужно в коде покапаться (удалить MsgBox'ы, и упоминания о GUI*, хотя конекчно стоило бы сделать опцию для тихого обновления).
 

dimart

Новичок
Сообщения
21
Репутация
0
Я этим и занимался, но там всё так взаимосвязано, мне похоже на такое опыта общения с GUI не хватает.

Вот подредактировал, хотя бы ошибок больше не вылазит. Но он походу теперь не работает ;D

проверьте пожалуйста, где ошибка? :smile:

Код:
#Include <Misc.au3>
#include <WindowsConstants.au3>

Global $g_hInet_Update, $g_CurrentVersion_Update, $g_SilentMode_Update
Global $g_TempFileInfo_Update = @TempDir & "\MyApp_Update.inf"

Func _StartCheckForUpdate($url,$cur_version,$silent_mode = True)
	$g_CurrentVersion_Update = $cur_version
	$g_SilentMode_Update = $silent_mode

	; ------ Пингуем хост в нормальном режиме, прежде чем скачивать MyApp_Update.inf ----------
	If $g_SilentMode_Update <> True Then
		Local $host = StringRegExpReplace($url,".+?//(.+?)/.+","$1")
		If not Ping($host,1000) Then

			Return
		EndIf
	EndIf
	;-------------------------------------------------------------------------------------------

	$g_hInet_Update = InetGet($url,$g_TempFileInfo_Update,1,1)
	AdlibRegister("_CheckUpdate",20)
EndFunc

Func _CheckUpdate()
	If InetGetInfo($g_hInet_Update,2) Then
		AdlibUnRegister("_CheckUpdate")

		Local $DowloadSuccesfull = InetGetInfo($g_hInet_Update,3)
		InetClose($g_hInet_Update)

		If $DowloadSuccesfull Then

			Local $error_in_section = False

			; ---------------------- Проверяем ключ "Update Version" --------------------
			Local $Last_Version = IniRead($g_TempFileInfo_Update,"Info","Update Version","")
			If $Last_Version = "" Then $error_in_section = True
			; ---------------------------------------------------------------------------

			; ---------------------- Проверяем ключ "Update File" -----------------------
			Local $Update_File = IniRead($g_TempFileInfo_Update,"Info","Update File","")
			If $Update_File = "" Then $error_in_section = True
			; ---------------------------------------------------------------------------

			; ---------------------- Выводим сообщение об ошибке, если в какой-то ключе произошла ошибка ---------------------------
			If $error_in_section Then
				If not $g_SilentMode_Update Then Return

			EndIf
			; ----------------------------------------------------------------------------------------------------------------------

			; ------------------ Проверяем ключ "Update Changes" -----------------------
			; --------------------- Этот ключ необязателен -----------------------------
			$Update_Changes = IniRead($g_TempFileInfo_Update,"Info","Update Changes","")
			; --------------------------------------------------------------------------

			FileDelete($g_TempFileInfo_Update)

			Local $CRLF = @CRLF

			Local $VersionCompare = _VersionCompare($g_CurrentVersion_Update,$Last_Version)
			If $VersionCompare = -1 Then
				; ------------ Формируем сообщение, которое будет выведено при обнаружении новой версии ---------------------
				Local $message_string = "Доступна новая версия программы: " & $Last_Version
				If $Update_Changes <> "" Then $message_string &= $CRLF & $CRLF & "Изменения в новой версии: " & $Update_Changes & $CRLF
				$message_string &= $CRLF & "Скачать новую версию программы?"
				; -----------------------------------------------------------------------------------------------------------

				Local $msg_ret = MsgBox(68,"Информация",$message_string)
				If $msg_ret = 6 Then
					_DownloadNewVerion($Update_File)
				Else
					return
				EndIf
			Elseif $VersionCompare = 0 Then
				If not $g_SilentMode_Update Then MsgBox(64,"Информация","У вас самая последняя версия!")
			EndIf
		Else
			If not $g_SilentMode_Update Then MsgBox(16,"Ошибка","Файл с информацией о новой версии программы не доступен на сервере!")
		EndIf
	EndIf
EndFunc

; Данная Функция скачивает новую версию программы, при этом отображая прогресс скачивания.
; По завершении скачивания программа завершается и запускается новая версия программы.
Func _DownloadNewVerion($Update_File)
		; ------- Пингуем сервер. В случае неудачи, отображаем сообщение ---------
	; ------- P.S. На пинг уходит меньше времени в случае, если инет выключен, ----
	; ------- чем просто при использовании InetGet ---------------------------
		; -------------------------------------------------------------------------

	; ---- Выводим сообщение, если файл, указанный в MyApp_Update.inf, не доступен -----


	; -----------------------------------------------------------------------------------

	; --------------------------------------- Скачиваем новую версию программы и затем её запускаем --------------------------------
	Local $FileName = StringRegExpReplace($Update_File,".+/(.+)","$1")
	Local $FileInTempDir = @TempDir & "\" & $FileName
	Local $FileInScriptDir = @ScriptDir & "\" & $FileName

	Local $hInet = InetGet($Update_File,$FileInTempDir,1,1)
	Do
		Sleep(20)
	Until InetGetInfo($hInet,2)


	Local $DowloadSuccesfull = InetGetInfo($hInet,3)
	InetClose($hInet)

	If $DowloadSuccesfull Then
		; Сюда можно вставить функцию для сохранения настроек перед выходом
		Run(@ComSpec & ' /c ping -n 2 localhost>nul & Move /y "' & $FileInTempDir & '" "' & $FileInScriptDir & '" & Start "" "' & $FileInScriptDir & '"', '', @SW_HIDE)
	EndIf
	;-------------------------------------------------------------------------------------------------------------------------------

	Exit
EndFunc

Код:
#Include <Misc.au3>
#include <WindowsConstants.au3>

Global $g_hInet_Update, $g_CurrentVersion_Update, $g_SilentMode_Update
Global $g_TempFileInfo_Update = @TempDir & "\MyApp_Update.inf"

Func _StartCheckForUpdate($url,$cur_version,$silent_mode = True)
	$g_CurrentVersion_Update = $cur_version
	$g_SilentMode_Update = $silent_mode

	; ------ Пингуем хост в нормальном режиме, прежде чем скачивать MyApp_Update.inf ----------
	If $g_SilentMode_Update <> True Then
		Local $host = StringRegExpReplace($url,".+?//(.+?)/.+","$1")
		If not Ping($host,1000) Then
			MsgBox(16,"Ошибка","Не могу подключиться к серверу!")
			Return
		EndIf
	EndIf
	;-------------------------------------------------------------------------------------------

	$g_hInet_Update = InetGet($url,$g_TempFileInfo_Update,1,1)
	AdlibRegister("_CheckUpdate",20)
EndFunc

Func _CheckUpdate()
	If InetGetInfo($g_hInet_Update,2) Then
		AdlibUnRegister("_CheckUpdate")

		Local $DowloadSuccesfull = InetGetInfo($g_hInet_Update,3)
		InetClose($g_hInet_Update)

		If $DowloadSuccesfull Then

			Local $error_in_section = False

			; ---------------------- Проверяем ключ "Update Version" --------------------
			Local $Last_Version = IniRead($g_TempFileInfo_Update,"Info","Update Version","")
			If $Last_Version = "" Then $error_in_section = True
			; ---------------------------------------------------------------------------

			; ---------------------- Проверяем ключ "Update File" -----------------------
			Local $Update_File = IniRead($g_TempFileInfo_Update,"Info","Update File","")
			If $Update_File = "" Then $error_in_section = True
			; ---------------------------------------------------------------------------

			; ---------------------- Выводим сообщение об ошибке, если в какой-то ключе произошла ошибка ---------------------------
			If $error_in_section Then
				If not $g_SilentMode_Update Then MsgBox(16,"Ошибка","Ошибка в файле, содержащем информацию о новой версии программы!")
				Return
			EndIf
			; ----------------------------------------------------------------------------------------------------------------------

			; ------------------ Проверяем ключ "Update Changes" -----------------------
			; --------------------- Этот ключ необязателен -----------------------------
			$Update_Changes = IniRead($g_TempFileInfo_Update,"Info","Update Changes","")
			; --------------------------------------------------------------------------

			FileDelete($g_TempFileInfo_Update)

			Local $CRLF = @CRLF

			Local $VersionCompare = _VersionCompare($g_CurrentVersion_Update,$Last_Version)
			If $VersionCompare = -1 Then
				; ------------ Формируем сообщение, которое будет выведено при обнаружении новой версии ---------------------
				Local $message_string = "Доступна новая версия программы: " & $Last_Version
				If $Update_Changes <> "" Then $message_string &= $CRLF & $CRLF & "Изменения в новой версии: " & $Update_Changes & $CRLF
				$message_string &= $CRLF & "Скачать новую версию программы?"
				; -----------------------------------------------------------------------------------------------------------

				Local $msg_ret = MsgBox(68,"Информация",$message_string)
				If $msg_ret = 6 Then
					_DownloadNewVerion($Update_File)
				Else
					return
				EndIf
			Elseif $VersionCompare = 0 Then
				If not $g_SilentMode_Update Then MsgBox(64,"Информация","У вас самая последняя версия!")
			EndIf
		Else
			If not $g_SilentMode_Update Then MsgBox(16,"Ошибка","Файл с информацией о новой версии программы не доступен на сервере!")
		EndIf
	EndIf
EndFunc

; Данная Функция скачивает новую версию программы, при этом отображая прогресс скачивания.
; По завершении скачивания программа завершается и запускается новая версия программы.
Func _DownloadNewVerion($Update_File)
	Local $Form_DownloadNewVersion, $Progress_Downloaded

	#Region ### START Koda GUI section ### Form=H:\AutoIT 3.3.0.0\Инструметы для AutoIt\koda_1.7.2.8_b247_2010-04-15\Forms\Form_download.kxf
	$Form_DownloadNewVersion = GUICreate("Скачивание новой версии...", 191, 26, -1, -1, -1, BitOR($WS_EX_TOOLWINDOW,$WS_EX_WINDOWEDGE))
	$Progress_Downloaded = GUICtrlCreateProgress(0, 0, 190, 25, 0)
	GUISetState(@SW_SHOW)
	#EndRegion ### END Koda GUI section ###

	; ------- Пингуем сервер. В случае неудачи, отображаем сообщение ---------
	; ------- P.S. На пинг уходит меньше времени в случае, если инет выключен, ----
	; ------- чем просто при использовании InetGet ---------------------------
	Local $host = StringRegExpReplace($Update_File,".+?//(.+?)/.+","$1")
	If not Ping($host,1000) Then
		GUIDelete($Form_DownloadNewVersion)
		MsgBox(16,"Ошибка","Не могу подключиться к серверу для скачивания новой версии программы!")
		Return
	EndIf
	; -------------------------------------------------------------------------

	; ---- Выводим сообщение, если файл, указанный в MyApp_Update.inf, не доступен -----
	Local $FileSize = InetGetSize($Update_File,1)
	If @error Then
		GUIDelete($Form_DownloadNewVersion)
		MsgBox(16,"Ошибка","На сервере не найден файл с новой версией программы!")
		Return
	EndIf
	; -----------------------------------------------------------------------------------

	; --------------------------------------- Скачиваем новую версию программы и затем её запускаем --------------------------------
	Local $FileName = StringRegExpReplace($Update_File,".+/(.+)","$1")
	Local $FileInTempDir = @TempDir & "\" & $FileName
	Local $FileInScriptDir = @ScriptDir & "\" & $FileName

	Local $hInet = InetGet($Update_File,$FileInTempDir,1,1)
	Do
		Sleep(20)
		GUICtrlSetData($Progress_Downloaded,InetGetInfo($hInet,0)/$FileSize*100)
	Until InetGetInfo($hInet,2)

	GUIDelete($Form_DownloadNewVersion)

	Local $DowloadSuccesfull = InetGetInfo($hInet,3)
	InetClose($hInet)

	If $DowloadSuccesfull Then
		; Сюда можно вставить функцию для сохранения настроек перед выходом
		Run(@ComSpec & ' /c ping -n 2 localhost>nul & Move /y "' & $FileInTempDir & '" "' & $FileInScriptDir & '" & Start "" "' & $FileInScriptDir & '"', '', @SW_HIDE)
	Else
		MsgBox(16,"Ошибка","Не удалось скачать новую версию программы!" & @CRLF & "Возможно оборвалось интернет-соединение!")
	EndIf
	;-------------------------------------------------------------------------------------------------------------------------------

	Exit
EndFunc
 

dimart

Новичок
Сообщения
21
Репутация
0
Неужели никто не может помочь? :(
 

Arei

Скриптер
Сообщения
938
Репутация
115
скрой окно обновления и всё.Что сложного?
 

Prorok

Новичок
Сообщения
3
Репутация
0
У меня проблема,кто может подскажите.(я просто новичек в этом деле)

I.я залил на сайт,а если быть точным на укоз 2 файла

1- MyApp_Update.inf с внутренним кодом

Код:
[Info] 
 Update Version=1.1 
 Update File=http://sait.ucoz.ru/razdel/прога.exe
2- файл прога.exe
II. Мой файл прога.exe ,который расположен на рб имеет внутрений код вида
Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Misc.au3> 
#include <Inet.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 615, 438, 193, 125)
$Pic1 = GUICtrlCreatePic("D:\foto\990415523.jpg", 0, 0, 609, 433)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

#include <GUIConstantsEx.au3> 
#include <Misc.au3> 
#include <Inet.au3> 
; 
  
Global $sAppUpdate_Page = "http://sait.ucoz.ru/razdel/MyApp_Update.inf" 
Global $sApp_Version = "1.0" 
  
Global $hGUI = 0 
  
;Here we checking in quiet mode (only if new version available there will be a message). 
 _AppCheckUpdates_Proc($sAppUpdate_Page, $sApp_Version, 1) 
  
#Region GUI Part 
$hGUI = GUICreate("My Application", 300, 200) 
  
$CheckUpdates_Button = GUICtrlCreateButton("Check Updates", 200, 170, 90, 20) 
$Exit_Button = GUICtrlCreateButton("Exit", 20, 170, 60, 20) 
  
GUISetState(@SW_SHOW, $hGUI) 
#EndRegion GUI Part 
; 
  
While 1 
     Switch GUIGetMsg() 
         Case $GUI_EVENT_CLOSE, $Exit_Button 
             Exit 
         Case $CheckUpdates_Button 
             _AppCheckUpdates_Proc($sAppUpdate_Page, $sApp_Version) 
     EndSwitch 
 WEnd 
  
 Func _AppCheckUpdates_Proc($sServer_Page, $sCurrent_AppVersion, $iMode=-1) ;$iMode <> -1 to check quitly 
     Local $sUpdate_Info = _INetGetSource($sServer_Page) 
  
     If Not StringInStr($sUpdate_Info, "[Info]") Then 
         If $iMode = -1 Then MsgBox(48, "Update check", _ 
             StringFormat("There was an error (%i) to check update, please contact with the author.", 1), 0, $hGUI) 
  
         Return SetError(1, 0, 0) 
     EndIf 
  
     Local $sUpdate_Version = StringRegExpReplace($sUpdate_Info, "(?s)(?i).*Update Version=(.*?)(\r|\n).*", "\1") 
     Local $sUpdate_File = StringRegExpReplace($sUpdate_Info, "(?s)(?i).*Update File=(.*?)(\r|\n).*", "\1") 
  
     If _VersionCompare($sUpdate_Version, $sCurrent_AppVersion) = 1 Then 
         Local $iUpdate_Ask = MsgBox(36, "Update check", _ 
             StringFormat("There is new version available (%s).\n\nWould you like to download the update?", $sUpdate_Version), _ 
             0, $hGUI) 
  
         If $iUpdate_Ask <> 6 Then Return 0 
  
         Local $sScript_Name = StringTrimRight(@ScriptName, 4) & ".efe" 
  
         Local $iInetGet = InetGet($sUpdate_File, @TempDir & "\" & $sScript_Name) 
  
         If @error Or Not $iInetGet Then 
             If $iMode = -1 Then MsgBox(48, "Update check", _ 
                 StringFormat("There was an error (%i) to download the update, please contact with the author.", 2), 0, $hGUI) 
  
             Return SetError(2, 0, 0) 
         EndIf 
  
         Run(@ComSpec & ' /c Ping -n 2 localhost > nul & Move /y "' & _ 
             @TempDir & '\' & $sScript_Name & '" "' & @ScriptFullPath & '" & Start "" "' & @ScriptFullPath & '"', '', @SW_HIDE) 
  
         Exit 
     EndIf 
  
     If $iMode = -1 Then MsgBox(48, "Update check", "You are using the newest version of this software.", 0, $hGUI) 
     Return 1 
EndFunc


While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

	EndSwitch
WEnd

В итоге : при запуске файла прога.exe с рабочего стола ,она предлагает обновиться на версию 1,1 и уже через секунду вылазиет ошибка что файл не той разрядности,хотя оба exe скомпилированы для х64 систем.Вообщем дело не в разрядности,а в чем то я допустил ошибку.Прошу подскажите новичку.
P.S. Извените за огромное сообщение
 

iDisketka

Новичок
Сообщения
20
Репутация
0
Привет всем. Автор а если можно пожалуста то опиши как создать этот инфформационный файл....в каком расширении итд. итп. у меня при использовании твоей библиотеки и вышеприведённых примеров выскакивает ошибка (ошибка в файле содержащем информацию о новой версии программы) хотя всё сделанно точно по гайду.
 

rusreg79

Продвинутый
Сообщения
159
Репутация
57
Создаешь новый текстовый документ и сохраняешь его, дописав в названии файла: .inf
Я например использую расширение txt а не inf, так удобнее редактировать файл прямо с сайта.
 

iDisketka

Новичок
Сообщения
20
Репутация
0
Вообщем я разобрался как всё работает ...библиотека работает на отлично.....но есть небольшая проблемка....тоесть даже очень огромная. Дело в том что при запуски библиотеки...происходит проверка файла помещённого на любой сайт скачивание с которого не требует подтверждения далее данные в файле сопоставляются с версией программы...
И далее если версия программы ниже чем версия записанная в информационный файл то происходит скачивание новой версии которая по идее залита на тотже сайт....Так вот проблемма состоит в том
если обновление программы в формате .exe залито на сервер скачивание с которого требует подтверждения либо скачивание .ехе файла требует подтверждения на закачку пример Ucoz.ru
ТО вместо скачивания новой обновлённой версии...происходит регистрация кода выскакивающей страници с формой подтверждения на закачку. тоесть сам .ехе файл не скачивается....
Пример с Ucoz.ru не единственный.
Ну и естественно вопрос что можно с этим поделать...как можно изменить библиотеку? либо задать параметры чтоб вместо ехе файла можно было закачать на сайт файл в формате Rar но чтоб библиотека была способна распаковать ево.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 472
Репутация
2 401
iDisketka [?]
вопрос что можно с этим поделать
Заливать не «file.exe» а «file.efe», и при скачиваний просто переименовывать файл.
 

tukhvatullinrr

Новичок
Сообщения
1
Репутация
0
Код:
Func _AutoUpdate()
    $sTemp = _TempFile(@TempDir, '~', '.bat')
    $sPath = FileGetShortName(@ScriptFullPath)
    $sDir = FileGetShortName(@ScriptDir)
    $hFile = FileOpen($sTemp, 2)
	FileWriteLine($hFile, '@echo off')
	FileWriteLine($hFile, ':loop')
    FileWriteLine($hFile, 'del ' & $sPath)
    FileWriteLine($hFile, 'if exist ' & $sPath & ' goto loop')
	FileWriteLine($hFile, ':go')
	FileWriteLine($hFile, 'rename ' & $sDir & '\y.exe 1.exe')
	FileWriteLine($hFile, 'if exist ' & $sDir & '\1.exe del ' & $sTemp& ' else goto go')
	FileClose($hFile)
    InetGet('http://уoursite/1.exe', $sDir & '\y.exe')
	Run($sTemp, '', @SW_HIDE)
EndFunc
 

s0xen

Новичок
Сообщения
2
Репутация
0
Файл exe например с юкоза качается после подтверждения,можно не менять формат на "efe" как сказано выше а просто кидать новую версию в архив и потом на юкоз всё работает,проверенно.
 

Isn

Новичок
Сообщения
119
Репутация
2
А если на сервере требуется авторизация логин пароль, что нужно будет дописать?
 

leverage83

Новичок
Сообщения
1
Репутация
0
Доработал функцию автозамены при скачивании новой версии программы. Теперь когда версия скачалась, завершается выполнение скрипта прошлой версии, затем файл удаляется а на его место устанавливается новая версия программы с тем же именем. Затем происходит запуск новой версии скрипта.
Код:
; Данная Функция скачивает новую версию программы, при этом отображая прогресс скачивания.
; По завершении скачивания программа завершается и запускается новая версия программы.
Func _DownloadNewVerion($Update_File)
	Local $Form_DownloadNewVersion, $Progress_Downloaded

	#Region ### START Koda GUI section ### Form=H:\AutoIT 3.3.0.0\Инструметы для AutoIt\koda_1.7.2.8_b247_2010-04-15\Forms\Form_download.kxf
	$Form_DownloadNewVersion = GUICreate("Скачивание новой версии...", 191, 26, -1, -1, -1, BitOR($WS_EX_TOOLWINDOW,$WS_EX_WINDOWEDGE))
	$Progress_Downloaded = GUICtrlCreateProgress(0, 0, 190, 25, 0)
	GUISetState(@SW_SHOW)
	#EndRegion ### END Koda GUI section ###

	; ------- Пингуем сервер. В случае неудачи, отображаем сообщение ---------
	; ------- P.S. На пинг уходит меньше времени в случае, если инет выключен, ----
	; ------- чем просто при использовании InetGet ---------------------------
	Local $host = StringRegExpReplace($Update_File,".+?//(.+?)/.+","$1")
	If not Ping($host,1000) Then
		GUIDelete($Form_DownloadNewVersion)
		MsgBox(16,"Ошибка","Не могу подключиться к серверу для скачивания новой версии программы!")
		Return
	EndIf
	; -------------------------------------------------------------------------

	; ---- Выводим сообщение, если файл, указанный в MyApp_Update.inf, не доступен -----
	Local $FileSize = InetGetSize($Update_File,1)
	If @error Then
		GUIDelete($Form_DownloadNewVersion)
		MsgBox(16,"Ошибка","На сервере не найден файл с новой версией программы!")
		Return
	EndIf
	; -----------------------------------------------------------------------------------

	; --------------------------------------- Скачиваем новую версию программы и затем её запускаем --------------------------------
	Local $FileName = StringRegExpReplace($Update_File,".+/(.+)","$1")
	Local $FileInTempDir = @TempDir & "\" & $FileName
	Local $FileInScriptDir = @ScriptDir & "\" & $FileName
	  ;MsgBox(16,"Ошибка",@TempDir & "\" & $FileName)

	Local $hInet = InetGet($Update_File,$FileInTempDir,1,1)
	Do
		Sleep(20)
		GUICtrlSetData($Progress_Downloaded,InetGetInfo($hInet,0)/$FileSize*100)
	Until InetGetInfo($hInet,2)

	GUIDelete($Form_DownloadNewVersion)

	Local $DowloadSuccesfull = InetGetInfo($hInet,3)
	InetClose($hInet)

	If $DowloadSuccesfull Then
      $sTemp = $FileInTempDir & '.bat'
      $sPath = FileGetShortName(@ScriptFullPath)
	  $sDir = FileGetShortName(@ScriptDir)
	  $hFile = FileOpen($sTemp, 2)
	  $newName = @ScriptDir & "\" & @ScriptName
	  FileWriteLine($hFile, '@echo off')
	  FileWriteLine($hFile, ':loop')
	  FileWriteLine($hFile, 'del "' & $sPath & '"')
	  FileWriteLine($hFile, 'if exist "' & $sPath & '" goto loop')
	  FileWriteLine($hFile, ':go')
	  FileWriteLine($hFile, 'move /y "' & $FileInTempDir & '" "' & $newName & '"')
	  FileWriteLine($hFile, 'if exist "' & $newName & '" start "" "' & $newName & '"')
	  FileWriteLine($hFile, 'if exist "' & $newName & '" del "' & $sTemp& '" else goto go')
	  FileClose($hFile)
	  Run($sTemp, '', @SW_HIDE)
	Else
		MsgBox(16,"Ошибка","Не удалось скачать новую версию программы!" & @CRLF & "Возможно оборвалось интернет-соединение!")
	EndIf
	;-------------------------------------------------------------------------------------------------------------------------------

	Exit
EndFunc
 
Верх