Найбільш частий питання, яке мені задають - як зробити свою програму інсталяції? А коли я розпитую докладніше мені пояснюють, що потрібна просто красива програмка, яка скопіює файли з одного місця в інше. Тому я вирішив написати статтю, де зберу багато з того, що писав раніше (і це є на 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
Все, після цього виводимо останній діалог з поздоровленнями.