Деінсталяція - інсталятор власними руками - статті по Делфі - персональний сайт

Отже, поговоримо трохи про деінсталяції.

В ідеалі, деінсталяція повинна привести комп'ютер до виду, в якому він був до інсталяції. На практиці, це можливо не для всіх додатків, особливо, якщо вони поділяють ресурси з іншими програмами.

Програма деінсталяції може, грунтуючись на цьому журналі, зробити деінсталяцію продукту.

Але це все речі очевидні, як і багато іншого в деінсталяції. Ми можемо для кожної дії програми інсталяції вказати дію, яке має відбуватися при деінсталяції. Створити каталог Directory. Видалити каталог Directory.
Копіювати файл Sourcr в Target. Видалити файл Target.
Копіювати розділяється файл Sourcr в Target. Збільшити лічильник інсталяцій на 1, якщо він вже існує або привласнити йому 1 в іншому випадку. Зменшити лічильник інсталяцій на 1. Якщо він дорівнює 0, то видалити файл Target
Створити розділ Key в реєстрі. Видалити розділ Key в реєстрі.
Створити параметр Value в реєстрі. Видалити параметр Value в реєстрі.
Змінити значення параметра Value з Old на New. Записати в Value значення Old.
Створити новий INI-файл. Видалити INI-файл.
Створити секцію в INI-файлі. Видалити секцію в INI-файлі.
Записати параметр в секцію INI-файлу. Якщо параметр вже існує, зберегти його вміст. Якщо в журналі збережено попередній вміст параметра - записуємо його. В іншому випадку видаляємо параметр з секції.

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

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

У статті, присвяченій системного реєстру, розказано, як помістити свою програму в список програм деінсталяції (Панель управління / Установка і видалення програм).

Що ще? Найголовніше - ви намучиться з видаленням самої програми деінсталяції з жёткого диска. Справа в тому, що програму неможливо видалити до тих пір, поки вона запущена - Windows закриває доступ до неї. Що робити? Якщо ми подивимося, як з цією ситуацією справляються поширені інсталятори (наприклад, InstallShield та Wise), то побачимо, що вони залишають програму деінсталяції на диску. Вона стає ресурсом, частиною операційної системи (поміщається в каталог Windows). Наприклад, у мене на диску знаходяться C: WINDOWSUNINST16.EXE, C: WINDOWSUNINST.EXE (InstallShield) і C: WINDOWSUNWISE.EXE (Wise). Це досить коректне рішення, оскільки цими інсталяторами користуються багато програм. Ми можемо зробити те ж саме, змінивши ім'я програми деінсталяції (uninst і unwise вже зайняті :)

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

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

Нарешті, ми можемо видалити-таки наш єдиний EXE-файл автоматично. Для того, щоб зрозуміти, як це робиться, досить згадати про розподіл RunOnce системного реєстру.
[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows CurrentVersionRunOnce]
SomeName = "C: WINDOWSCOMMAND.COM / C DEL C: TEMPDEINST.EXE"
При наступному перезавантаженні комп'ютера буде викликати команду процесор, який і видалить непотрібний EXE-файл. Потім параметр SomeName буде автоматично видалений з розділу RunOnce.

Командним процесором може бути не тільки command.com, а й cmd.exe (в NT), 4dos.com, 4nt.exe і інші програми. Мінлива оточення COMSPEC містить повний шлях до поточного командному процесору
function GetCommand: String; var szCommandPath: array [0..MAX_PATH - 1] of Char; begin GetEnvironmentVariable ( 'COMSPEC', szCommandPath, MAX_PATH); Result: = String (szCommandPath); end;

Ось, мабуть, і все

Схожі статті