Уменьшаем размер программ на Делфи

Целью данной статьи был обзор и сравнение существующих технологий, средств, методов, позволяющих произвести уменьшения размера программ, написанных на Делфи. К статье прилагаются примеры с исходными кодами и всем необходимым для их компиляции.Целью данной статьи был обзор и сравнение существующих технологий, средств, методов, позволяющих произвести уменьшения размера программ, написанных на Делфи. К статье прилагаются примеры с исходными кодами и всем необходимым для их компиляции.

Статья рассчитана на читателей, освоивших работу в Delphi. Некоторые термины, применяемые здесь:
API – общее наименование для целого набора базовых интерфейсов программирования приложений операционных систем семейства Windows корпорации Майкрософт. Является самым прямым способом взаимодействия приложений с Windows.
UPX – (the Ultimate Packer for eXecutables) упаковщик исполняемых файлов, поддерживающий несколько различных платформ и форматов файлов. Является открытым программным обеспечением и распространяется по лицензии GNU GPL.
VCL – (Visual Component Library) библиотека визуальных компонентов, объектно-ориентированная библиотека для разработки программного обеспечения, разработанная компанией «Borland» по принципам визуального программирования.
KOL – (Key Objects Library) альтернативная VCL библиотека объектных типов для программирования в среде Delphi.

Создадим простейшее приложение в среде Делфи 7, используя его стандартные средства (VCL). Сделаем форму и на ней надпись “Hello world!” на Label. В опциях проекта отменим использование иконок, инф. о версии. Компилируем и получаем приложение размером 363 Кб. Конечно это многовато. Многие пытаются уменьшить размер, применив «Build with runtime packages», что действительно неплохо работает. Но тут следует учесть, что такой файл программы можно будет запускать только там, где установлен Делфи.

Не все знают, что вместо VCL можно использовать визуальные компоненты KOL. Та же программа, написанная на KOL, имеет размер всего 24,5 Кб. Почему так и суть технологии можно прочитать здесь .

Потом перейдём на уровень API, где нам придётся обойтись без технологии WYSIWYG. Начнём с того, что определимся: нам нужна только одна форма и на ней надпись. Это создаётся функциями CreateWindowEx. Естественно нужно организовать и работу с сообщениями (WndProc). Теперь размер программы всего 14 Кб. Но создать многофункциональное приложение так куда тяжелее, чем на KOL.

В тех 14 Кб ещё довольно много лишнего кода. Чтобы добиться минимума размера приложения на стандартных средствах Делфи придётся отказаться от всех используемых модулей (uses) и даже заменить system.dcu, sysinit.dcu на специальные версии, где всё «лишнее» убрано. Для замены просто положить их в каталог проекта. Но тогда все константы нужно будет обязательно назначить в своём коде, а также вызвать требуемые API-функции из dll. Работа с файлами, строками конечно только на API, потому уже забудем про AssignFile и тип string. Приложение уменьшается до 4 Кб.

А вот далее, для ещё большего эффекта по размеру, применим технологию от Ms-Rem`a. Что делаем в ходе неё? Сначала получаем obj-файл, компилируя исходник компилятором Делфи (версии 1997 года), и используя почти пустые модули system и sysinit. А после линкуем средством Link.exe (версии 1998 года) и получаем наше приложение на 1,37 Кб. Для этих действий предыдущий исходный код следует несколько изменить – файл проекта сделать файлом модуля (pas), добавив там стартовую процедуру, implementation и проч. Вызывать API из dll тоже по-особому: procedure PostQuitMessage(nExitCode: Integer); stdcall; external user32 name \’_PostQuitMessage@4\’;[/FONT]. Имя функции следует указывать так, как оно записано в соответствующем lib-файле, здесь – USER32.LIB (открываем блокнотом и ищем PostQuitMessage). LIB–файлы брать в комплекте Visual Studio. Обязательно указываем используемые lib в параметрах запуска линкера, которые выглядят, например так: ProjectAPIm.obj user32.lib /ALIGN:32 /incremental:yes /FORCE:UNRESOLVED /SUBSYSTEM:WINDOWS /ENTRY:Start$qqrv /out:ProjectAPIm.exe[/FONT]. Если хотим включить в приложение ресурсы, то добавляем /pdbtype:sept «FILENAME.RES»[/FONT].

Компрессия. Все программы, полученные вышеприведенными способами можно упаковать, что, порой значительно снижает размер.

Уменьшаем размер программ на Делфи

Здесь применялся пакер UPX 1.25. UPX не может сжимать программы win32, которые < 4 Кб. Потому для того, чтобы сжать меньшее приложение пришлось представить его пакеру как приложение DOS. В итоге размер 0,92 Кб, но висит окошко DOS, пока программа запущена, что сильно ограничивает применение метода.

Для всех описанных способов тут есть готовые примеры. Вы можете модифицировать их в своих целях. Для последнего способа, по Ms-Rem, приложены все нужные средства сборки такого приложения.

Заключение.
Данная статья является обзорной, то есть цель не научить, скажем, писать на API, а показать, что это даёт. Для понимания и применения указанных методов нужны определённые навыки программирования на Делфи. Особенно статья поможет тем, кто уже пишет программы на API, но не использует 2 последние методики. Ведь в случае создания, скажем, джоинера важен размер стаба. Стаб пишут на API, но куда лучше написать на API не 14Кб, а 4 или даже 1,4 — изменения уже существующих исходников программы тут потребуются минимальные.
Прилагающиеся исходные коды можно применять абсолютно свободно. Статью можно дополнять, переопубликовывать, ссылаясь на первоисточник и указывая автора.