siryksv
Участник форума
- Регистрация
- 5 Окт 2009
- Сообщения
- 567
- Благодарности
- 1
- Баллы
- 225
Хотел бы рассказать о построении полноценных инсталляторов с помощью подручных сред программирования. Обычно задача создания инсталлера сводится к использованию различных программ (типа Nsis, Inno и т.д.), в которых, как правило, есть свой встроенный скриптовый язык. Но: 1) специфические скрипты изучать нет особого желания; 2) функциональность инсталляторов все же несколько ограниченна в плане возможностей по управлению средствами ОС, хотя при распаковке очень большого количества файлов использование скриптовых систем может быть более выгодным.
Я расскажу об одном способе, который основан на использовании ресурсов, "подшиваемых" к исполняемому файлу. Хотя этот способ и известен в среде программистов, однако далеко не все им владеют.
Что такое ресурс? В том смысле, в котором это слово нам понадобится, ресурс – это совокупность данных, которые непосредственно не относятся к исполняемому коду, но включаются в файл и несут вспомогательные функции. Для ресурсов выделяется отдельная секция в исполняемом файле. Изображения, строки, звуки и анимации, пиктограммы – это все примеры ресурсов. Сведения о файле (имя программы, версия, разработчики, авторские права) – это тоже ресурсы (строкового типа). Для просмотра ресурсов исполнительных файлов можно воспользоваться программами типа ResHacker.
От теории переходим теперь к практике. Я покажу пример написания инсталлера в среде Borland Delphi. Суть данного способа – "засунуть" распаковываемые файлы в файл ресурсов (RES-файл), который затем подключается к программе на стадии компиляции в среде Delphi. В примере, описанном ниже, распаковывается пять JPEG-картинок (index1.jpeg, ..., index5.jpeg) в каталог, который выбирает пользователь. Процесс создания представлен совокупностью шагов.
Шаг 1. Надо создать файл (пусть это будет Install.rc), в котором специальным образом перечислены распаковываемые файлы. Файл этот выглядит следующим образом:
Тут первый идентификатор обозначает имя (псевдоним) для ресурса, под которым ресурс будет виден программе. Второй параметр – тип ресурса, у нас должно быть EXEFILE. Третий параметр обозначает имя файла.
Шаг 2. Созданный на предыдущем этапе файл Install.rc нужно теперь передать в качестве единственного параметра компилятору ресурсов brcc32.exe, который находится в папке <каталог_с_Delphi>\Bin – найти его не сложно. Желательно скопировать в одну папку сам brcc32.exe, скрипт Install.rc и файлы, которые будем паковать (у нас это JPEG-картинки). Затем запускаем в консоли команду
. На выходе получается файл Install.res. Это и есть нужный нам файл. Копируем его в папку с проектом инсталлятора на Delphi.
Шаг 3. Работаем с проектом на Delphi. Полученный ресурсный файл Install.res надо подключить к нашей программе, и делается это путем вставки директивы {$R Install.res} в главный файл проекта – у нас в примере это файл Project1.dpr.
Теперь пишем процедуру для извлечения исходных файлов из ресурсов программы. Возможная реализация такой процедуры может иметь следующий вид:
Формальные параметры этой процедуры имеют следующий смысл:
ResType – тип извлекаемого ресурса, для нас это EXEFILE;
ResName – идентификатор ресурса в программе, см. описание структуры файла Install.rc;
ResNewName – полный путь к файлу, в который и будет переписан этот ресурс.
Непосредственно для работы с ресурсом используется встроенный класс системы Delphi – TResourceStream, который и обеспечивает всю "грязную" и рутинную работу с ресурсом. В VC++, кстати, такой роскоши нет, и для работы с ресурсами пришлось бы использовать WinApi-функции. Извлечение файлов с помощью процедуры ExtractRes осуществляется примерно так:
Процедура Extract извлекает все файлы в папку пользователя. Подробности по визуальному оформлению проекта, естественно, здесь опускаются, так как, скорее всего, это дело личного вкуса.
Ниже в RAR-архиве приложен описанный проект в полностью рабочем состоянии. Пишите в случае возникновения вопросов. Также даю скриншот того, что получилось в результате (Screen.JPG).
(C) siryksv, 2009-2010.
Я расскажу об одном способе, который основан на использовании ресурсов, "подшиваемых" к исполняемому файлу. Хотя этот способ и известен в среде программистов, однако далеко не все им владеют.
Что такое ресурс? В том смысле, в котором это слово нам понадобится, ресурс – это совокупность данных, которые непосредственно не относятся к исполняемому коду, но включаются в файл и несут вспомогательные функции. Для ресурсов выделяется отдельная секция в исполняемом файле. Изображения, строки, звуки и анимации, пиктограммы – это все примеры ресурсов. Сведения о файле (имя программы, версия, разработчики, авторские права) – это тоже ресурсы (строкового типа). Для просмотра ресурсов исполнительных файлов можно воспользоваться программами типа ResHacker.
От теории переходим теперь к практике. Я покажу пример написания инсталлера в среде Borland Delphi. Суть данного способа – "засунуть" распаковываемые файлы в файл ресурсов (RES-файл), который затем подключается к программе на стадии компиляции в среде Delphi. В примере, описанном ниже, распаковывается пять JPEG-картинок (index1.jpeg, ..., index5.jpeg) в каталог, который выбирает пользователь. Процесс создания представлен совокупностью шагов.
Шаг 1. Надо создать файл (пусть это будет Install.rc), в котором специальным образом перечислены распаковываемые файлы. Файл этот выглядит следующим образом:
Код:
Index1 EXEFILE Index1.jpeg
Index2 EXEFILE Index2.jpeg
Index3 EXEFILE Index3.jpeg
Index4 EXEFILE Index4.jpeg
Index5 EXEFILE Index5.jpeg
Шаг 2. Созданный на предыдущем этапе файл Install.rc нужно теперь передать в качестве единственного параметра компилятору ресурсов brcc32.exe, который находится в папке <каталог_с_Delphi>\Bin – найти его не сложно. Желательно скопировать в одну папку сам brcc32.exe, скрипт Install.rc и файлы, которые будем паковать (у нас это JPEG-картинки). Затем запускаем в консоли команду
Код:
brcc32.exe Install.rc
Шаг 3. Работаем с проектом на Delphi. Полученный ресурсный файл Install.res надо подключить к нашей программе, и делается это путем вставки директивы {$R Install.res} в главный файл проекта – у нас в примере это файл Project1.dpr.
Теперь пишем процедуру для извлечения исходных файлов из ресурсов программы. Возможная реализация такой процедуры может иметь следующий вид:
Код:
procedure ExtractRes(ResType,ResName,ResNewName:String);
var Res:TResourceStream;
begin
Res:=TResourceStream.Create(hInstance,Resname,Pchar(ResType));
Res.SavetoFile(ResNewName);
Res.Free;
end;
ResType – тип извлекаемого ресурса, для нас это EXEFILE;
ResName – идентификатор ресурса в программе, см. описание структуры файла Install.rc;
ResNewName – полный путь к файлу, в который и будет переписан этот ресурс.
Непосредственно для работы с ресурсом используется встроенный класс системы Delphi – TResourceStream, который и обеспечивает всю "грязную" и рутинную работу с ресурсом. В VC++, кстати, такой роскоши нет, и для работы с ресурсами пришлось бы использовать WinApi-функции. Извлечение файлов с помощью процедуры ExtractRes осуществляется примерно так:
Код:
procedure Extract;
begin
with Form1 do begin
ExtractRes('EXEFILE','Index1',PathEdit.Text+'\Index1.jpeg');
ExtractRes('EXEFILE','Index2',PathEdit.Text+'\Index2.jpeg');
ExtractRes('EXEFILE','Index3',PathEdit.Text+'\Index3.jpeg');
ExtractRes('EXEFILE','Index4',PathEdit.Text+'\Index4.jpeg');
ExtractRes('EXEFILE','Index5',PathEdit.Text+'\Index5.jpeg');
end;
end;
Ниже в RAR-архиве приложен описанный проект в полностью рабочем состоянии. Пишите в случае возникновения вопросов. Также даю скриншот того, что получилось в результате (Screen.JPG).
(C) siryksv, 2009-2010.