Примечание:
Если для вас важен размер вашей инсталляции, вы можете взять только тот кусочек, который приведён выше, и сделать из него отдельную программу (которая будет очень небольшого объёма). Саму программу инсталляции вы предварительно сжимаете, а перед запуском распаковываете её во временный каталог (а не копируете, как это сделано здесь).
Обратите внимание, что в этом случае программа должна распаковываться в любом случае, а не только если она запущена с дискеты.
Запугивание пользователя законами об авторских правах
Да, есть и такой этап. Если вы пишете программу, которая будет распространяться как freeware, вам всё равно придётся вывести небольшое окно и поставить пользователя в известность о том, что вы не отвечаете за все неприятности, которые могут с ним произойти во время использования вашей программы.
Как это делается? Если вы не знаете, как сделать диалоговое окно, то, по моему, вам ещё рано писать инсталляции. Если знаете, то выведите окно и поместите в нём нужный текст.
Примечание:
Поместить несколько строк текста можно разными способами. Во-первых, вы можете обрабатывать событие OnPaint диалоговой формы и рисовать многострочный текст на ней с помощью функции Windows API, которя называется DrawText. Во-вторых, вы можете вывести текст через компонент TRichEdit, предварительно установив у него свойство Border в bsNone, свойство Color — в clBtnFace,а свойство Enabled — в False. Запрещённый (disabled) компонент TRichEdit выглядит не так, как запрещённый компонент TMemo; и отличие заключается в том, что он не меняет цвет текста на серый (что нам, собственно, и нужно).
Зачем делать компонент запрещённым? Дело в том, что в этом случае он выглядит просто как многострочный TLabel, например, его нельзя редактировать, из него нельзя выделить текст, ему не передаётся фокус, если вы пробегаете по компонентам с помощью клавиши TAB — несомненно, это то, что нам нужно.
Получение важных системных данных
На этом этапе нам потребуются некоторые системные данные: имя пользователя и организация, путь, куда потребуется инсталлировать программу и некоторые другие. Сейчас мы разберёмся, как и откуда эти данные можно получить.
Имя пользователя и организация
Во время инсталляции, программы иногда запрашивают имя пользователя и его организацию. Возможно, для работы вашей программы эти данные не понадобятся, но если они вам нужны, вы должны их запросить.
Как правило, программа инсталляции берёт эти данные из Windows (поскольку при установке Windows пользователь их уже вводил) и просит всего лишь изменить их, если это необходимо.
Наш вопрос звучит так: где Windows хранит имя пользователя и организацию? В реестре есть всего два местп, где записаны эти данные:
Код:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\
RegisteredOwner = 'Имя'
RegisteredOrganization = 'Организация'
В "обычных" версиях Windows, эти значения хранятся в ключе Windows, а в Windows NT — Windows NT.
Поскольку "единства" здесь нет, можно проверить версию Windows с помощью функции GetVersionEx или проверять оба вышеописанных ключа.
Куда копировать программу
Можно сформулировать наш вопрос и по другому: где находиться каталог Program Files? Некоторые инсталляции считают, что это C:\Program Files . В действительности, конечно, он может находиться на другом диске, поэтому мы попробуем поискать его по другому... в реестре.
Код:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\
ProgramFilesDir = 'D:\Program Files'
Можно воспользоваться функцией SHGetSpecialFolderLocation (это даже более корректно с точки зрения Microsoft).
Для изменения каталога вы можете вызывать функции SelectDirectory или SHBrowseForFolder . Можно также создать собственное окно диалога "Выбор каталога" с помощью компонента DirectoryListBox . Подробнее о выборе каталога мы поговорим позднее, когда будем рассматривать тонкости процесса инсталляции.
Сколько осталось свободного места на диске
Программа инсталляции перед копированием файлов обязана проверить, сколько на целевом диске осталось свободного дискового пространства. Это делается при помощью функции GetDiskFreeSpace (из модуля Windows ) или функции DiskFree (из модуля SysUtils ). Вторая функция — это надстройка Delphi над Win API (в смысле, она вызывает GetDiskFreeSpace ), но у неё значительно меньше параметров.
Группы программ
Обычно программа инсталляции создаёт для новой программы новую группу. Как правило, когда вы вводите название группы, рядом присутствует список, в котром перечислены все существующие группы. Получить такой список можно двумя способами. Один из них — работа с DDE-сервером, который называется Program Manager . Этот способ мы подробно рассмотрим чуть позже . Второй способ не очень сложен и основан на том факте, что всё меню "Программы" находиться в одном из каталогов вашего диска. Все подменю являются на самом деле подкаталогами, а пукнты — обычными ссылками (файлами с расширением .lnk).
Путь к папке, содержащей меню "Программы", вы можете найти в реестре:
Код:
HKEY_CURRENT_USER\Software\Microsoft\Windows\ CurrentVersion\Explorer\Shell Folders\
Programs = 'D:\WINNT\Profiles\Mark\Главное меню\Программы'
Не очень сложно прочитать содержимое этого каталога с помощью функций FindFirst / FindNext . Далее мы и об этом поговорим подробнее, поскольку чтение содержимое каталогов потребуется нам при написании универсальной процедуры копирования файлов.
Продолжение в следующей части .
Если для вас важен размер вашей инсталляции, вы можете взять только тот кусочек, который приведён выше, и сделать из него отдельную программу (которая будет очень небольшого объёма). Саму программу инсталляции вы предварительно сжимаете, а перед запуском распаковываете её во временный каталог (а не копируете, как это сделано здесь).
Обратите внимание, что в этом случае программа должна распаковываться в любом случае, а не только если она запущена с дискеты.
Запугивание пользователя законами об авторских правах
Да, есть и такой этап. Если вы пишете программу, которая будет распространяться как freeware, вам всё равно придётся вывести небольшое окно и поставить пользователя в известность о том, что вы не отвечаете за все неприятности, которые могут с ним произойти во время использования вашей программы.
Как это делается? Если вы не знаете, как сделать диалоговое окно, то, по моему, вам ещё рано писать инсталляции. Если знаете, то выведите окно и поместите в нём нужный текст.
Примечание:
Поместить несколько строк текста можно разными способами. Во-первых, вы можете обрабатывать событие OnPaint диалоговой формы и рисовать многострочный текст на ней с помощью функции Windows API, которя называется DrawText. Во-вторых, вы можете вывести текст через компонент TRichEdit, предварительно установив у него свойство Border в bsNone, свойство Color — в clBtnFace,а свойство Enabled — в False. Запрещённый (disabled) компонент TRichEdit выглядит не так, как запрещённый компонент TMemo; и отличие заключается в том, что он не меняет цвет текста на серый (что нам, собственно, и нужно).
Зачем делать компонент запрещённым? Дело в том, что в этом случае он выглядит просто как многострочный TLabel, например, его нельзя редактировать, из него нельзя выделить текст, ему не передаётся фокус, если вы пробегаете по компонентам с помощью клавиши TAB — несомненно, это то, что нам нужно.
Получение важных системных данных
На этом этапе нам потребуются некоторые системные данные: имя пользователя и организация, путь, куда потребуется инсталлировать программу и некоторые другие. Сейчас мы разберёмся, как и откуда эти данные можно получить.
Имя пользователя и организация
Во время инсталляции, программы иногда запрашивают имя пользователя и его организацию. Возможно, для работы вашей программы эти данные не понадобятся, но если они вам нужны, вы должны их запросить.
Как правило, программа инсталляции берёт эти данные из Windows (поскольку при установке Windows пользователь их уже вводил) и просит всего лишь изменить их, если это необходимо.
Наш вопрос звучит так: где Windows хранит имя пользователя и организацию? В реестре есть всего два местп, где записаны эти данные:
Код:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\
RegisteredOwner = 'Имя'
RegisteredOrganization = 'Организация'
В "обычных" версиях Windows, эти значения хранятся в ключе Windows, а в Windows NT — Windows NT.
Поскольку "единства" здесь нет, можно проверить версию Windows с помощью функции GetVersionEx или проверять оба вышеописанных ключа.
Куда копировать программу
Можно сформулировать наш вопрос и по другому: где находиться каталог Program Files? Некоторые инсталляции считают, что это C:\Program Files . В действительности, конечно, он может находиться на другом диске, поэтому мы попробуем поискать его по другому... в реестре.
Код:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\
ProgramFilesDir = 'D:\Program Files'
Можно воспользоваться функцией SHGetSpecialFolderLocation (это даже более корректно с точки зрения Microsoft).
Для изменения каталога вы можете вызывать функции SelectDirectory или SHBrowseForFolder . Можно также создать собственное окно диалога "Выбор каталога" с помощью компонента DirectoryListBox . Подробнее о выборе каталога мы поговорим позднее, когда будем рассматривать тонкости процесса инсталляции.
Сколько осталось свободного места на диске
Программа инсталляции перед копированием файлов обязана проверить, сколько на целевом диске осталось свободного дискового пространства. Это делается при помощью функции GetDiskFreeSpace (из модуля Windows ) или функции DiskFree (из модуля SysUtils ). Вторая функция — это надстройка Delphi над Win API (в смысле, она вызывает GetDiskFreeSpace ), но у неё значительно меньше параметров.
Группы программ
Обычно программа инсталляции создаёт для новой программы новую группу. Как правило, когда вы вводите название группы, рядом присутствует список, в котром перечислены все существующие группы. Получить такой список можно двумя способами. Один из них — работа с DDE-сервером, который называется Program Manager . Этот способ мы подробно рассмотрим чуть позже . Второй способ не очень сложен и основан на том факте, что всё меню "Программы" находиться в одном из каталогов вашего диска. Все подменю являются на самом деле подкаталогами, а пукнты — обычными ссылками (файлами с расширением .lnk).
Путь к папке, содержащей меню "Программы", вы можете найти в реестре:
Код:
HKEY_CURRENT_USER\Software\Microsoft\Windows\ CurrentVersion\Explorer\Shell Folders\
Programs = 'D:\WINNT\Profiles\Mark\Главное меню\Программы'
Не очень сложно прочитать содержимое этого каталога с помощью функций FindFirst / FindNext . Далее мы и об этом поговорим подробнее, поскольку чтение содержимое каталогов потребуется нам при написании универсальной процедуры копирования файлов.
Продолжение в следующей части .