Инструменты пользователя

Инструменты сайта


bbdevpackernohost

Это старая версия документа!


Герметизация DevPacker.

Проблема.

В эталоне Блэкбокса есть модуль DevPacker, он реализует функции упаковки в исполняемый файл произвольных ресурсов. Ресурсы размещаются внутри исполняемого файла по определенным правилам. Эти правила известны в модуле HostPackedFiles, который реализует фабрику Files.dir для работы с упакованными ранее файлами.

В процессе пересмотра внутренней структуры ББ в модуле DevPacker обнаружилась негерметичность. Она заключалась в прямой зависимости от HostFiles и HostPackedFiles. HostPackedFiles в свою очередь опирался на структуру данных, формируемую в DevPacker (имплицитная зависимоcть). Негерметичность мешала использовать модуль в новой сборке ББ.

Для использования DevPacker в новой сборке ББ необходимо провести герметизацию модуля.

Герметизация.

При анализе содержимого модуля DevPacker выяснилось, что модуль реализует две основные функции: взаимодействие с пользователем и запись структуры и содержимого упакованных файлов. Взаимодействие с пользователем приводит к формированию платформонезависимого списка файлов, который передается записывателю.

Все работы будут производиться над копией модулей в подсистеме Packed.

Выделим процедуры записи в модуль PackedExeWriter. Даже при отсутствии прямых зависимостей модуля от WinApi или хост-подсистемы этот модуль всё равно зависит от структуры исполняемого файла Windows. Значит, платформонезависимые модули не могут его импортировать напрямую.

Выделим процедуры взаимодействия с пользователем в модуль PackedCmds. Так как структура FileList теперь используется модулем PackedExeWriter, сделаем её экспортированной, а для отделения функций по взаимодействию с пользователем переместим FileList в модуль PackedCore.

Чтобы модуль Cmds мог передать список файлов на упаковку, опишем в модуле PackedCore интерфейс записывателя Writer с методом PackList, который будет реализован в PackedExeWriter. Переменная PackedCore.writer типа Writer будет доступна модулю Cmds.

Таким образом модуль DevPacker был изолирован от любых платформозависимых модулей при сохранении своих функций, а модуль PackedCore представляет для модуля PackedCmds герметичный прикладной слой.

bbdevpackernohost.1387196075.txt.gz · Последнее изменение: 2020/10/29 07:08 (внешнее изменение)