Компьютерра інсталятор на асемблері

Створення простого установника на асемблері

В одній зі статей я розглядав створення програми-установника (setup.exe) за допомогою програми InstallShield. Так, навіть Express-версія програми InstallShield дозволяє за порівняно невеликий час створити гнучку програму установки. При використанні InstallShield вам буде потрібно більше часу для обмозгованія складу кожної програмної групи, ніж на створення самого установника.

Але що робити, якщо нам потрібно написати простий інсталятор для нашої невеликої програми? Нам не потрібні різні типи установки (Typical, Compact або Custom), наша програма не використовує BDE, у нас є всього лише три файли: сама програма, файл даних і файл довідки. Чи доцільно використовувати для цієї мети InstallShield? Я думаю що ні.

Для установки невеликих програм можна скористатися файлами Windows. Ви коли-небудь встановлювали драйвер для пристрою? Для додавання нового пристрою майстер визначення пристроїв запитує INF-файл, в якому знаходяться всі відомості про драйвер: найменування пристрою, його тип, версія драйвера, необхідні файли і інформація, яку потрібно додати до реєстру Windows. Ми можемо написати такий же INF-файл, який встановить нашу програму. На створення цього файлу вам буде потрібно кілька хвилин, тим більше, що ви можете скористатися наведеними нижче прикладом - тільки підставити свої значення.

Установчі INF-файли (якщо назва установки) дуже схожі на INI-файли. Вони складаються з секцій, в яких описані дії, які потрібно виконати при установці і видаленні програми, а також список файлів, які підлягають встановленню.

Отже, почнемо по порядку. Для визначеності скажімо, що нам потрібно встановити програму base.exe в каталог C: \ Program Files \ Base, скопіювати файли base.hlp і base.txt в каталог C: \ Program Files \ Base \ Help, створити для програми програмну групу в меню Windows, а також помістити відомості про програму в реєстр Windows, щоб її можна було видалити стандартними засобами Windows. Зрозуміло, назви каталогів можна буде змінити.

Для початку визначимо тип установки (він у нас буде один - базовий). Створіть файл base.inf (ім'я файлу не обов'язково має збігатися з ім'ям програми - я використовував імена base.exe і base.inf для наочності) і додайте в нього наступні рядки.

У секції Version ми визначаємо підпис і клас установки - "$ CHICAGO $" і BASE відповідно. Вам нічого не тут не треба змінювати. У другій секції Strings ми визначаємо константи, які будуть доступні в усьому INF-файлі. Ось тут вам буде що змінити. Всі ці змінні ми будемо використовувати у всьому INF-файлі. Секція Strings є зарезервованої і вона не може називатися по-іншому. Дана секція необов'язково повинна знаходиться на початку файлу - ви можете написати її хоч в середині, хоч в кінці.

Далі визначимо число настановних дисків, їх назви, а також список файлів:

Назва диска користувач побачить, коли установник запросить встановити інший диск. Ми назви дисків не використовували (зазвичай пишуть Disk # 1. Disk #N, але у нас всього один диск), тому користувач побачить тільки назва програми (% BASE%):

Компьютерра інсталятор на асемблері

Ви ж можете написати так (якщо у вас два або більше дисків):

Примітка. Мушу зазначити, що секція SourceDisksFiles необов'язкова (в разі, якщо один диск інсталяційний диск, але вельми бажана - так система відразу дізнається, якого файлу не вистачає).

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

Тепер визначимо групи установки. Вона у нас всього лише одна - DefaultInstall (Типова установка):

Відразу, щоб не забути, опишемо дії для видалення програми. Що ми зробили? Скопіювали файли, додали групи і інформацію до реєстру. Значить, для деінсталяції все це потрібно видалити, про що ми повідомляємо установника в секції DefaultUninstall:

Ми повідомили установника, що ми хочемо встановити групи Main.Files (містить наш exe-файл), Help.Files (файли base.hlp і base.txt) і Inf.Files (base.inf). Для чого нам потрібно встановлювати INF-файл? Для того, щоб Windows знала, що насамперед потрібно виконати для видалення програми. Адже вона ж повинна прочитати секцію DefaultUnInstall, а звідки вона її прочитає, якщо ми не встановимо INF-файл?

Повернемося до нашого установника: він знає, які групи файлів потрібно встановити, але не знає куди саме (:)). Ми забули вказати каталоги-призначення. исправимся:

Група Main.Files буде встановлена ​​в каталог% BASEDIR% (C: \ Program Files \ Base), група Help.Files - в% BASEDIR% \% HELPDIR% (C: \ Program Files \ Base \ Help), а INF-файл потрібно встановити в каталог \ INF (зазвичай C: \ WINDOWS \ INF). Всі системні каталоги WINDOWS пронумеровані: 17 - це каталог INF, 18 - HELP, 10 - WINDIR і так далі.

Наступна ступінь уточнення - це безпосередньо вказівку файлів, які входять до груп Main.Files, Help.Files і Inf.Files:

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

Тепер конкретизуємо інформацію, яку ми хочемо додати до реєстру:
; Додана до реєстру інформація
[Base.Registry]
HKLM,% REGKEY%.
HKLM,% REGKEY%, DisplayName ,,% BASE%
; C: \ WINDOWS \ rundll.exe setupx.dll, InstallHinfSection DefaultUninstall 4 C: \ WINDOWS \ INF \ base.inf
HKLM,% REGKEY%, UninstallString ,, "% 10% \ rundll.exe setupx.dll, InstallHinfSection DefaultUninstall 4% 17% \ base.inf"
HKCU,% SOFTKEY%.
HKCU,% SOFTKEY%, Config ,,

Спочатку ми додаємо% REGKEY% в HKLM (HKEY_LOCAL_MACHINE), а потім% SOFTKEY% в HKCU (HKEY_CURRENT_USER). рядок
HKLM,% REGKEY%, UninstallString ,, "% 10% \ rundll.exe setupx.dll, InstallHinfSection DefaultUninstall 4% 17% \ base.inf"

буде замінена на рядок:
C: \ WINDOWS \ rundll.exe setupx.dll, InstallHinfSection DefaultUninstall 4 C: \ WINDOWS \ INF \ base.inf

Команда InstallHinfSection вказує, яку секцію файла% 17% \ base.inf "потрібно прочитати для видалення програми - DefaultUninstall.

Додана до реєстру інформація буде використана не тільки для видалення програми, але і для її відображення в списку встановлених програм:

Компьютерра інсталятор на асемблері

Тепер опишемо дії для створення програмної групи DHSI Labs і її видалення: [Groups.Add]
setup.ini, progman.groups ,, "groupx = .HSILABS%"
setup.ini, groupx ,, "% BASE%," "% 24% \ Progra

[Groups.Del]
setup.ini, progman.groups ,, "groupx = .HSILABS%"
setup.ini, groupx ,, "% BASE%

Буде створена група DHSI Labs і ярлик BASE Program (% BASE%). Шлях - ""% 24% \ Progra

1 \ Base \ base.exe "", робочий каталог ""% 24% \ Progra

1 \ Base "", опис .ESC% ".

От і все. Якби не одне АЛЕ: дією за замовчуванням для INF-файлів є їх редагування в блокноті. Для установки потрібно клацнути на файлі правою кнопкою миші і вибрати команду «Встановити». Спробуйте пояснити це користувачеві, який все життя звик запускати SETUP.EXE.

Нам потрібно написати цей самий SETUP.EXE, який запускав б установку програми. Це можна зробити на Delphi (або CBuilde або за допомогою будь-якого іншого мови), але тоді простіше використовувати InastallShield - найпростіша програма на Delphi буде важити близько 300К. Виходить, що мета не виправдовує засоби. Ось зараз нам і знадобиться той самий Асемблер, який фігурує в назві статті. Вам лінь писати дві сотні рядків для запуску функції API на асемблері? Ви помиляєтеся, не 200, а всього лише 18, не враховуючи порожніх рядків:

Текст програми настільки прозорий, що не потребує пояснення. Але крім цього файлу нам будуть потрібні ще кілька: файл ресурсу (RC), файл визначень (DEF) і Makefile, в якому описуються дії по збірці програми. Ви можете не використовувати Makefile, а виконати знаходяться в ньому команди вручну, але з Makefil'ом набагато зручніше.

Спочатку створимо файл ресурсу (install.rc):

Думаю, що особливо пояснювати, що і до чого, не варто - просто замініть потрібні вам параметри. Файл install.def:

Останній файл - install.mk (або просто Makefile):
!if $ d (MAKEDIR)
IM = $ (MAKEDIR) \ .. \ lib \ import32
!else
IM = import32
!endif

install.exe: install.obj install.res
tlink32 / x / Tpe / aa / c /V4.0 install.obj. $ (IM), install.def, install.res
erase install.obj
erase install.res

install.obj: install.asm
tasm32 / m / ml / q install.asm

install.res: install.rc
brc32 -r install.rc

Для складання всього цього вам необхідний tasm32 (Borland TASM5). Для складання перейдіть в каталог, в якому розташовані всі файли і введіть:

якщо ви створили файл з ім'ям Makefile, а не install.mk.

В результаті вийшов файл INSTALL.EXE вагою в 6 144 (6 Кб!). Якщо ви напишіть такий же маленький файл на Delphi або CBuilder, я умиваю руки.

Ви можете задати цілком правомірне запитання: при створенні інсталятора за допомогою InstallShield все файли упаковуються, як вчинити тут? А хто вам заважає створити ZIP-файл, розпакувати його за допомогою Asm (виконати ще одну команду - запуск unzip) і потім вже встановлювати програму? Звичайно, якщо ваша програма не вміщується на одній дискеті навіть в архіві, виникнуть певні труднощі, але тоді ви вже перебуваєте за рамками поставленого завдання - нам потрібно створити інсталятор для маленької програми. Можна, звичайно, і BDE встановити, використовуючи наведений принцип, але чи варто?