Dev/Docu/ru/Packer.odc

DevPacker

DEFINITION DevPacker;

	PROCEDURE ListFromSub (sdir: ARRAY OF CHAR);
	PROCEDURE ListLoadedModules;
	PROCEDURE PackThis;

END DevPacker.


Модуль DevPacker используется для упаковки файлов любого типа в существующий exe-файл. Эти файлы могут быть прочитаны с помощью HostPackedFiles. Нет прямой зависимости между DevPacker и HostPackedFiles, но поскольку один записывает в exe-файл, а другой читает оттуда, существует подразумеваемая зависимость, с форматом exe-файла.

DevDependencies.CreateTool может использоваться для создания команд упаковки для множества модулей.


PROCEDURE PackThis;
Используется вместе с DevCommander. Читает список имен файлов и пакует эти файлы в exe-файл. Имя exe-файла находится в начале списка перед символом ":=". Также возможно упаковать файл под другим именем, чем то, под которым он находится в текущей файловой системе. Для задания другого имени файла используется специальный символ "=>".

Таким образом, синтакс в расширенной НФБ-нотации таков:

<exeFileName> := <filename> [=> <filename>] {<filename> [=> <filename>]}

Как exeFileName, так и fileName могут быть заданы абсолютным путем (включая имя диска) или относительно директории BlackBox. Если какой-либо файл содержит в имени специальные символы, такие как пробелы, то имя следует заключать в кавычки ("filename"), чтобы оно было правильно разобрано. Разбор останавливается, как только он встретит любой нераспознанный символ, такой как запятую или тильду.

Перед тем, как начнется упаковка, список файлов проверяется. Если какие-то файлы не найдены, то команда упаковки останавливается и exe-файл остается нетронутым. Если имя файла встречается в списке более одного раза, выводится сообщение об этом, но упаковка продолжается, и файл упаковывается в exe-файл только один раз.

Необходимо, чтобы exe-файл не присутствовал в списке файлов для упаковки. Это может привести к тому, что exe-файл будет упакован сам в себя с непредсказуемыми результатами. Поэтому упаковка отменяется, если exe-файл присутствует в списке.

Пример: 
 DevPacker.PackThis exefilename.exe :=
Tour.odc "C:\Program files\BlackBox\License.txt" Test/Code/MyConfig.ocf => Code/Config.ocf

PROCEDURE ListFromSub (sdir: ARRAY OF CHAR);
Просматривает директорию sdir и все ее поддиректории. Если она находит файлы, то открывает новый документ и записывает команду упаковки для всех найденных файлов. sdir может быть абсолютным путем, включающим имя диска, или путем относительно директории BlackBox. Параметр также может быть пустой строкой, в таком случае будет обработана корневая директория BlackBox.

Пример:  "DevPacker.ListFromSub('Text')"

PROCEDURE ListLoadedModules;
Просматривает текущие загруженные модули и создает текст с командой упаковки для них. Это может быть использовано для быстрого поиска тех модулей, которые нужны запущенному приложению. Проблема может быть в том, что будут упакованы лишние модули и не будут включены такие файлы, как ресурсы и документация.

Пример:  DevPacker.ListLoadedModules


Абсолютные и относительные пути в именах файлов
Предположим, что BlackBox установлен в директории D:\BlackBox. Тогда, с точки зрения упаковщика, имя файла D:\BlackBox\Std\Code\Log.ocf (абсолютный путь) задает тот же файл, что и Std\Code\Log.ocf (относительный путь). Однако, упаковщик пакует файл в exe-файл c путем, заданным в команде. Это критично для модуля HostPackedFiles, который читает exe-файл. Если exe-файл, например, запускается в директории C:\temp, и программа делает вызов к StdLog, то эта команда будет работать, если файл упакован с использованием относительного пути, но не будет работать, если был использован абсолютный путь. С другой стороны, если файл упакован с использованием абсолютного пути, вызов на открытие D:\BlackBox\Std\Code\Log.ocf будет работать даже если на машине нет диска с именем D:.

Касательно exe-файлов
Упаковщик не может создать exe-файл, он может лишь упаковать файлы в существующий exe-файл. Это значит, что придется использовать компоновщик для создания минимального exe-файла для упаковки. Минимальный exe-файл должен иметь скомпонованный HostPackedFiles, так как это модуль, который позволяет извлекать файлы. Минимальная команда для компоновщика такова:

 DevLinker.Link exefilename.exe := Kernel$+ Files HostFiles HostPackedFiles StdLoader

Чтобы HostPackedFiles имел возможность найти файлы в exe-файле, он должен иметь тот же формат, какой был при упаковке файлов в него. Это значит, что после упаковки файлов в exe-файл невозможно добавить в него ресурсы, такие как значки или курсоры. Все подобные операции должны быть совершены до начала упаковки. (см. документациюDevLinker для подробностей о том, как добавлять значки сразу при компоновке). Однако можно изменять имя exe-файла после окончания упаковки.

Другое ограничение заключается в том, что упаковщик не может добавлять файлы. Он пакует целый список файлов и записывает таблицу этих файлов. Если PackThis вызывается вновь, это разрушает информацию о прежних файлах в exe-файле.