Ето кода, описанието е след него...
'
' Add in Form_Load or Sub Main procedure this code:
'
' If Right(App.EXEName, 4) = "_new" Then CheckVersion 1 Else CheckVersion 2
'
'
'
' In "CheckVersion" procedure add:
'
' CheckVersion
'
'
' Enjoy ;o)
'
Option Explicit
Public Sub CheckVersion(Optional UpdateOption As Integer)
On Error GoTo ErrHandle
Dim intTim As Long, http, s As String, strFile As String, strServer As String
strFile = Replace(App.Path & "\" & App.EXEName & ".exe", "\\", "\")
' !!! Server address !!!
strServer = "http://store1.data.bg/user/"
Select Case UpdateOption
Case 0
Set http = CreateObject("MSXML2.XMLHTTP")
http.Open "GET", strServer & App.EXEName & ".exe_version.txt", False
http.send
'Check version
s = http.responseText
If Val(s) > Val(App.Revision) Then
If MsgBox("New version found. Do you want download and install it?", vbYesNo, _
"New version") = vbYes Then
'Update program
Dim b() As Byte
http.Open "GET", strServer & App.EXEName & ".exe_install.bin", False
http.send
b = http.responseBody
If Dir(strFile & "_new.exe") <> "" Then Kill strFile & "_new.exe"
Open strFile & "_new.exe" For Binary As #1: DoEvents: Put #1, , b: Close
intTim = Timer
Do Until Timer > intTim + 3 Or Timer = 3
DoEvents
Loop
Shell strFile & "_new.exe", vbMinimizedFocus
End
End If
Else
MsgBox "No new version found.", vbInformation
End If
Exit Sub
Case 1
intTim = Timer
Do Until Timer > intTim + 3 Or Timer = 3
DoEvents
Loop
If Dir(Left(strFile, Len(strFile) - 8)) <> "" Then Kill Left(strFile, Len(strFile) - 8)
FileCopy strFile, Left(strFile, Len(strFile) - 8)
Shell Left(strFile, Len(strFile) - 8), vbNormalFocus
End
Exit Sub
Case 2
If Dir(strFile & "_new.exe") <> "" Then
intTim = Timer
Do Until Timer > intTim + 3 Or Timer = 3
DoEvents
Loop
Kill strFile & "_new.exe"
End If
Exit Sub
End Select
Exit Sub
ErrHandle:
MsgBox "Error " & Err & ". " & Err.Description
End Sub
Та значи, в началото на функцията има ред "ServerAddress", където трябва да сложите линка към сървъра, където ще се качва обновлението. Евентуално, ако искате да ползвате домашния си компютър за сървър - е възможно да ползвате акаунт в No-ip.com където с безплатна регистрация можете да получите пренасочване към избран от вас IP адрес, и да си сложите някаква програмка за WEB страница, а потребителите ще си теглят на воля.
И така, модула съм го спретнал така, че да бъде универсален, и трябва единствено да се съобразяваме с името на приложението. Ако програмата се казва MyApp, тогава на сървъра за обновление слагаме преименувано ЕХЕ, с име MyApp.exe_install.bin и модула ще си го търси. За да може да сравнява версията на сървъра дали е по-нова от самия себе си - ползвам обикновен текстов файл с име MyApp.exe_version.txt качен в същия сървър. В този текстов файл записвам число равно на App.Revision на програмата, и с всяка компилация увеличавам това число, за да може работещия при клиенти софтуер да разбере, че има по-нова от него версия.
И така, на сървъра имаме файлове:
MyApp.exe_version.txt - съдържа версията
MyApp.exe_install.bin - съдържа по-нова версия на ЕХЕ-то
Модула отваря ТХТ-то, вижда, че има нова версия, тегли BIN файла, като го записва с друго име, и го стартира, след което спира автоматично, а новостартирания файл пък "вижда", че е обновление, и изтрива стария, като заема неговото място. В кода съм сложил изчакване по 3 секунди, за да е сигурно, че програмата е спряла, преди да се трие стария файл.
Аз слагам на сървъра и дистрибутив в саморазпакетиращ се RAR-ски архив, който разопакова в предварително зададена директория, и стартира Setup.bat, който регистрира външните контроли. Евентуално при по-големи обновления за BIN файл може да се сложи също такъв саморазпакетиращ се архив, и той ще си стартира ЕХЕ-то след като го извади (прави се в настройките на архива).
Модула е подходящ за малки приложения. Можем да доразработим идеята, ако на някой му се занимава.
Щирлиц
|