Если вы хотя бы однажды инсталлировали какую-нибудь программу под Windows, то, вероятно, заметили, что процесс инсталляции происходит поэтапно. Поэтапно — это ключевое слово, поскольку именно оно подводит нас к этапам инсталляции. Если мы подумаем ещё чуть-чуть, то обнаружим, что сложность реализации различных этапов очень и очень неодинакова.
Из всех статей цикла есть один практический вывод: не все этапы инсталляции будут описаны в этом руководстве подробно. Почему? Потому что реализация этих этапов тривиальна или, по крайней мере, не очень сложна.
По большому счёту, здесь вы не встретите реализации, здесь вы найдёте информацию: много и на русском языке
Поскольку информации действительно много, она будет выкладываться небольшими порциями...
Сначала определим основные этапы построения инсталлятора:
Обзор основных этапов
Запомните одно важное правило: инсталлировать программу можно с человеческих носителей (винчестеры, компакт-диски, ZIP-диски) и с дискет Если вы собираетесь написать инсталляцию с дискет, которая явно не поместится на одну дискету, то у вас есть шанс хорошо провести время
Как вы знаете, Windows сбрасывает ненужную ей в данный момент информацию на диск. Это правильно, но это касается данных. Программы никогда на диск не сбрасываются, поскольку в Windows сегмент кода программы не может быть изменён. Когда Windows нужна память и ей под руку подворачивается ваша программа, она её просто выкидывает — и всё. Когда ваша программа снова становится нужна, Windows снова загружает её из выполняемого файла.
Эта в высшей степени корректная техника перестаёт работать при инсталляции с дискет. Ваша программа, например, копирует четвёртую дискету и тут выясняется, что у неё (у программы) пропал кусок кода. Какие проблемы? — Windows пытается прочитать файл a:\setup.exe и естественно его не находит (на четвёртой-то дискете? откуда?).
Только не паникуйте! Эта проблема давно решена, иначе вы не могли бы установить на свой компьютер ни одной программы! Всё очень просто — программа инсталляции копирует себя и все необходимые файлы во временный каталог на жёсткий диск и перезапускает себя с жёсткого диска. Это и есть первый этап инсталляции. В зарубежных программах он обычно называется "Prepare to install". Ещё раз обратите внимание на то, что совсем не обязательно выполнять этот этап, если вы инсталлируетесь не с дискет, или если ваша инсталляция умещается на одну дискету.
На втором этапе программа инсталляции обычно показывает пользователю несколько страшных предупреждений; что-то типа "если вы не заплатите за эту программу, то сидеть вам в тюрьме три пожизненных срока". Я слышал, что некоторые пользователи со слабым сердецем даже умирали за компьютером от таких угроз
Реализация этого этапа до идиотизма тривиальна, поэтому мы и не будем на нём останавливаться подробно.
Следущий этап — третий. Здесь программа установки дотошно выспрашивает у пользователя кучу всяких важных данных: имя пользователя и его огранизацию, тип установки, куда будем ставить, как будет называться группа программ и так далее. На этом этапе нам встретятся некоторые технические трудности, но их несложно обойти.
Четвёртый этап — копирование. Конечно, это не очень сложно, но некоторые проблемы у нас всё-таки возникнут. Во-первых, надо проверить наличие свободного места на целевом диске. Во-вторых, надо удостовериться, что у нас есть доступ к нужному каталогу. В-третьих, надо проверять, нет ли уже такого файла... Вы ещё не передумали писать программу инсталляции?
Следующий, пятый, этап — настройка системного реестра (registry). Достаточно тривиальная процедура, правда, при инсталляции большого продукта, записывать придётся очень много.
Предпоследний, шестой, этап, заключается в создании группы программ в меню "Пуск". Или, возможно, вы захотите вынести ярлык на рабочий стол.
Наконец, финальная часть включает демонстрацию нескольких файлов (например, readme), затем онлайновую регистрацию (подробно на ней я останавливаться не буду) и последнее сообщение "Инсталляция успешно завершена".
Теперь мы можем перейти к подробному рассмотрению этапов.
Копирование программы во временный каталог
Чтобы не смущать высокое собрание подробным рассмотрением алгоритма, приведу конкретный пример исходника.
Код:
program Setup;
uses
Windows,
SysUtils;
const
ReRunParameter = '/install_from_temp_directory';
var
TempPath: array [0..MAX_PATH] of Char;
SrcPath: String ;
begin
if ParamStr(1) = ReRunParameter then
SrcPath := ParamStr(2)
else
if GetDriveType(PChar(ParamStr(0)[1] + ':\')) = DRIVE_REMOVABLE then
begin
// Если программа была запущена без ключа и с дискеты, то
// копируем её во временный каталог и перезапускам
// Текущее приложение завершаем.
GetTempPath(MAX_PATH, TempPath);
// Добавлям к пути временного каталога символ '\', если его там нет
if (StrLen(TempPath) > 0) and (TempPath[StrLen(TempPath)] <> '\') then
StrCat(TempPath, '\');
// Копируем файл через вызов функции CopyFile из WinAPI
CopyFile(PChar(ParamStr(0)), PChar(String(TempPath) + ExtractFileName(ParamStr(0))), False );
// Запускаем файл с двумя параметрами
WinExec(PChar(String(TempPath) + ExtractFileName(ParamStr(0)) + ' ' +
ReRunParameter + ' ' + ExtractFilePath(ParamStr(0))), CmdShow);
Exit;
end
else
SrcPath := ExtractFilePath(ParamStr(0));
// Здесь начинается программа инсталляции
// Переменная SrcPath показывает нам, откуда надо копировать файлы
end.
Есть две грабли, на которые можно наступить в приведённом примере. Первые лежат в вызове функции GetTempPath . Если у вас нет переменных окружения TMP и TEMP , то временным каталогом станет текущий каталог программы , то есть, фактически, ваша дискета.
Вы можете проверять, не находится ли временный каталог на сменном диске (с помощью вызова GetDriveType ), и, если находиться, считать временным каталогом C:\TEMP (если его нет — создайте самостоятельно).
Вторые грабли заключаются в том, что после завершения инсталляции программу из временного каталога желательно удалить, но сделать этого вы не сможете, поскольку программа в этот момент выполняется. Вспомните, что в Windows выполняющуся программу удалять нельзя.
В общем случае, решения этой проблемы я не знаю. Собственно, поскольку файл останется во временном каталоге, он будет одним из первых кандидатов на удаление (если пользователь хоть когда-нибудь чистит свой временный каталог Тем не менее, есть один хитрый способ удаления этого файла, о котором я расскажу ниже, в параграфе о деинсталляции.
Из всех статей цикла есть один практический вывод: не все этапы инсталляции будут описаны в этом руководстве подробно. Почему? Потому что реализация этих этапов тривиальна или, по крайней мере, не очень сложна.
По большому счёту, здесь вы не встретите реализации, здесь вы найдёте информацию: много и на русском языке
Поскольку информации действительно много, она будет выкладываться небольшими порциями...
Сначала определим основные этапы построения инсталлятора:
- Копирование программы во временный каталог
- Запугивание пользователя законами об авторских правах
- Как получить важные системные данные
- Копирование
- Копирование (продолжение)
- Системный реестр
- Создание группы программ
- Создание группы программ (продолжение)
- Деинсталляция
Обзор основных этапов
Запомните одно важное правило: инсталлировать программу можно с человеческих носителей (винчестеры, компакт-диски, ZIP-диски) и с дискет Если вы собираетесь написать инсталляцию с дискет, которая явно не поместится на одну дискету, то у вас есть шанс хорошо провести время
Как вы знаете, Windows сбрасывает ненужную ей в данный момент информацию на диск. Это правильно, но это касается данных. Программы никогда на диск не сбрасываются, поскольку в Windows сегмент кода программы не может быть изменён. Когда Windows нужна память и ей под руку подворачивается ваша программа, она её просто выкидывает — и всё. Когда ваша программа снова становится нужна, Windows снова загружает её из выполняемого файла.
Эта в высшей степени корректная техника перестаёт работать при инсталляции с дискет. Ваша программа, например, копирует четвёртую дискету и тут выясняется, что у неё (у программы) пропал кусок кода. Какие проблемы? — Windows пытается прочитать файл a:\setup.exe и естественно его не находит (на четвёртой-то дискете? откуда?).
Только не паникуйте! Эта проблема давно решена, иначе вы не могли бы установить на свой компьютер ни одной программы! Всё очень просто — программа инсталляции копирует себя и все необходимые файлы во временный каталог на жёсткий диск и перезапускает себя с жёсткого диска. Это и есть первый этап инсталляции. В зарубежных программах он обычно называется "Prepare to install". Ещё раз обратите внимание на то, что совсем не обязательно выполнять этот этап, если вы инсталлируетесь не с дискет, или если ваша инсталляция умещается на одну дискету.
На втором этапе программа инсталляции обычно показывает пользователю несколько страшных предупреждений; что-то типа "если вы не заплатите за эту программу, то сидеть вам в тюрьме три пожизненных срока". Я слышал, что некоторые пользователи со слабым сердецем даже умирали за компьютером от таких угроз
Реализация этого этапа до идиотизма тривиальна, поэтому мы и не будем на нём останавливаться подробно.
Следущий этап — третий. Здесь программа установки дотошно выспрашивает у пользователя кучу всяких важных данных: имя пользователя и его огранизацию, тип установки, куда будем ставить, как будет называться группа программ и так далее. На этом этапе нам встретятся некоторые технические трудности, но их несложно обойти.
Четвёртый этап — копирование. Конечно, это не очень сложно, но некоторые проблемы у нас всё-таки возникнут. Во-первых, надо проверить наличие свободного места на целевом диске. Во-вторых, надо удостовериться, что у нас есть доступ к нужному каталогу. В-третьих, надо проверять, нет ли уже такого файла... Вы ещё не передумали писать программу инсталляции?
Следующий, пятый, этап — настройка системного реестра (registry). Достаточно тривиальная процедура, правда, при инсталляции большого продукта, записывать придётся очень много.
Предпоследний, шестой, этап, заключается в создании группы программ в меню "Пуск". Или, возможно, вы захотите вынести ярлык на рабочий стол.
Наконец, финальная часть включает демонстрацию нескольких файлов (например, readme), затем онлайновую регистрацию (подробно на ней я останавливаться не буду) и последнее сообщение "Инсталляция успешно завершена".
Теперь мы можем перейти к подробному рассмотрению этапов.
Копирование программы во временный каталог
Чтобы не смущать высокое собрание подробным рассмотрением алгоритма, приведу конкретный пример исходника.
Код:
program Setup;
uses
Windows,
SysUtils;
const
ReRunParameter = '/install_from_temp_directory';
var
TempPath: array [0..MAX_PATH] of Char;
SrcPath: String ;
begin
if ParamStr(1) = ReRunParameter then
SrcPath := ParamStr(2)
else
if GetDriveType(PChar(ParamStr(0)[1] + ':\')) = DRIVE_REMOVABLE then
begin
// Если программа была запущена без ключа и с дискеты, то
// копируем её во временный каталог и перезапускам
// Текущее приложение завершаем.
GetTempPath(MAX_PATH, TempPath);
// Добавлям к пути временного каталога символ '\', если его там нет
if (StrLen(TempPath) > 0) and (TempPath[StrLen(TempPath)] <> '\') then
StrCat(TempPath, '\');
// Копируем файл через вызов функции CopyFile из WinAPI
CopyFile(PChar(ParamStr(0)), PChar(String(TempPath) + ExtractFileName(ParamStr(0))), False );
// Запускаем файл с двумя параметрами
WinExec(PChar(String(TempPath) + ExtractFileName(ParamStr(0)) + ' ' +
ReRunParameter + ' ' + ExtractFilePath(ParamStr(0))), CmdShow);
Exit;
end
else
SrcPath := ExtractFilePath(ParamStr(0));
// Здесь начинается программа инсталляции
// Переменная SrcPath показывает нам, откуда надо копировать файлы
end.
Есть две грабли, на которые можно наступить в приведённом примере. Первые лежат в вызове функции GetTempPath . Если у вас нет переменных окружения TMP и TEMP , то временным каталогом станет текущий каталог программы , то есть, фактически, ваша дискета.
Вы можете проверять, не находится ли временный каталог на сменном диске (с помощью вызова GetDriveType ), и, если находиться, считать временным каталогом C:\TEMP (если его нет — создайте самостоятельно).
Вторые грабли заключаются в том, что после завершения инсталляции программу из временного каталога желательно удалить, но сделать этого вы не сможете, поскольку программа в этот момент выполняется. Вспомните, что в Windows выполняющуся программу удалять нельзя.
В общем случае, решения этой проблемы я не знаю. Собственно, поскольку файл останется во временном каталоге, он будет одним из первых кандидатов на удаление (если пользователь хоть когда-нибудь чистит свой временный каталог Тем не менее, есть один хитрый способ удаления этого файла, о котором я расскажу ниже, в параграфе о деинсталляции.