пишемо інсталятор

Найбільш частий питання, яке мені задають - як зробити свою програму інсталяції? А коли я розпитую докладніше мені пояснюють, що потрібна просто красива програмка, яка скопіює файли з одного місця в інше. Тому я вирішив написати статтю, де зберу багато з того, що писав раніше (і це є на VBStreets). ми напишемо програму, яка буде встановлювати файли.

Відразу перепрошую за деяку сумбурність і непослідовність розповіді, просто у мене зараз ДУЖЕ мало часу. тому тут лежить приклад.

Чим мені подобається ідея написання власного інсталятора, так це тим. що ви не обмежені і можете засунути сюди безліч своїх функцій, і пишеться інсталятор як звичайна програма.

Тепер пояснюю ідею - треба написати програму, яка може витягувати, копіювати (додавати запис в system.ini і в реєстр і т.д.). Але все це дрібниці. Основна ідея - все файли тримати в ресурсах як бінарні, а потім витягувати їх куди треба.

Кількість форм програми може бути будь-яким, але я не рекомендую робити їх занадто багато, щоб не злити і без того злого юзверя. Для того, щоб форми з'являлися там, де треба, ми будемо їх налаштовувати так:

При натисканні кнопки Далі >> (або Next >>), можете назвати так, як хочете.

frmNext.Show
frmNext.Height = Me.Height
frmNext.Width = Me.Width
frmNext.Move Me.Left, Me.Top
Unload Me

Користувач може посунути форму, тому іншу потрібно відображати там же, де була попередня, тому що це буде дуже ефектно, як ніби це одна форма :-).

У код першої форми ми вставимо таку штуку (Form_Load):

If App.PrevInstance Then
End
MsgBox "Уже запущена одна версія програми установки!", 16, "Setup"
End If

Це для того, що б дуже розумний користувач не запустив два додатки одночасно.

Далі ви можете напхати як завгодно багато форм, але бажано зробити діалог вибору папки для установки. Тут стануть в нагоді такі речі: розміщуємо Dir1, List1, Label1, Label2, Command1. Пишемо код.

Private Declare Function GetDiskFreeSpace Lib "kernel32" Alias ​​"GetDiskFreeSpaceA" (ByVal lpRootPathName As String, lpSectorsPerCluster As Long, lpBytesPerSector As Long, lpNumberOfFreeClusters As Long, lpTtoalNumberOfClusters As Long) As Long

Private Sub Drive1_Change ()
Spaces = GetDiskFreeSpace (Mid $ (Drive1.Drive, 1, 2), secpercl, bytespersec, numoffreecl, AllCl)
Dim l As Long
l = 1024 ^ 2
ss = bytespersec / l
fs = secpercl * ss * numoffreecl
fs = Format (fs, "0")
label2.Caption = "Вільно на диску:" fs "MB"
Dir1.Path = Drive1.Drive
End Sub

Private Sub Dir1_Change ()
mDir = Dir1.Path
Label1.Caption = mDir 'Цю змінну заганяємо в модуль як Public InsDir as String, вона нам ще знадобиться.
End Sub

Private Sub Command1_Click ()
On Error GoTo ree_
nd = InputBox ( "Введіть ім'я директорії", "Нова папка.")
If nd = "" Then Exit Sub
MkDir Dir1.Path "" nd
Dir1.Refresh
Exit Sub
ree_:
MsgBox "Помилка, однако.", 16, "Setup"
End Sub

Можете додавати ще що-небудь. Це ж я так для прикладу.

Потім йде діалог, установка. Там робимо таку річ:

Private Sub Form_Load () 'Витягуємо з ресурсів файл, і створюємо ярлик.
ProgressBar1.Value = 20
Dim BinaryData () As Byte
BinaryData = LoadResData (101, "Files")
ProgressBar1.Value = 80
Open mDir "Wininfo.exe" For Binary Access Write As # 1
Put # 1, 1, BinaryData
Close # 1
ProgressBar1.Value = 98
lngresult = fCreateShellLink ( ". Desktop", "WinInfo", mDir "Wininfo.exe", "") 'В англійських кватирках працює.
ProgressBar1.Value = 100
Unload Me
frmFinish.Show
End Sub

Все, після цього виводимо останній діалог з поздоровленнями.

Схожі статті