В качестве способов минимизации я предлагал использовать специальные программы для сжатия запускных файлов или отказываться от визуальных эффектов и применять только Win API. Первый способ имеет свои плюсы, но файлы не сильно теряют в размере. Во втором случае их размер уменьшается, но теряется визуальность. Существует способ создания небольшого кода с визуальными эффектами - это библиотека KOL+MCK.

KOL (Key Objects Library - библиотека ключевых объектов) содержит объекты, которые упрощают программирование на Win API и при этом не увеличивают код. МСК (Mirror Classes Kit - комплект зеркальных классов) - библиотека, позволяющая использовать KOL визуально. Это отличная надстройка, которая эффективно использует возможности KOL и при этом практически не влияет на размер исполняемого файла.

Так как визуальная среда Delphi плохо подходит для создания компактного кода и больше ориентирована на использование библиотек VCL и CLX, то при создании визуальных эффектов с использованием KOL разработчикам пришлось немало попотеть. Конечно же, реализация получилась слегка "неуклюжей" (чуть позже мы рассмотрим все недостатки), но другого выхода я не вижу и даже за такое решение им благодарен.

ПРИМЕЧАНИЕ -

Файлы библиотеки kol.zip и mck.zip находятся на компакт-диске в каталоге Additional.

В процессе установки разархивируйте содержимое архивов kol.zip и mck.zip в один каталог. Затем откройте файл MirrorKOI.PackageDX.clpk, где X - это номер версии вашего "дельфина". У меня версия 7, но даже при установке файла для версии 6 библиотека устанавливается без проблем. После открытия файла появится диалоговое окно установки компонентов пакета (рис. 2.12).

2.19. KOL and MCK

Рис. 2.12. Диалоговое окно установки компонентов пакета

После установки пакета становится доступной закладка KOL. Здесь расположены зеркальные компоненты для основных компонентов Delphi (рис. 2.13).

"L j ЛИ.

Рис. 2.13. Компоненты МСК

Чтобы код был компактным, нужно использовать именно их. Но перед этим нужно правильно создать проект.

Чтобы создать проекте использованием библиотеки KOL+MCK, нужно выполнить несколько операций. Для начала создайте стандартный проект простого приложения в Delphi и сохраните все файлы проекта в одном каталоге (это необходимо запомнить!). При сохранении проекта его название не имеет значения, потому что запускной файл будет иметь другое имя.

Поместите на форму компонент KOLProject и в свойстве projectDest напишите осмысленное название проекта, потому что это имя будет использовать запускной файл. Давайте укажем здесь название TestProject.

Поместите на форму компонент KOLForm. Этот компонент свидетельствует о том, что форма будет визуальная. Сохраните все.

Загляните в каталог, где сохранился проект. Обратите внимание, что здесь появились файлы с расширением Лпс и новый файл проекта с именем, которое мы указали в свойстве projectDest компонента KOLProject и расширением .dpr. В данном случае это будет файл TestProjectdpr. Это и есть проект МСК, с которым можно работать, как с любым другим проектом.

Приложение, которое мы создали первым, можно закрыть и больше не открывать. Оно необходимо только для размещения файлов KOLPro ject и KOLForm. Все остальные действия и компиляция должны происходить в автоматически созданном проекте TestProjectdpr.

Откройте созданный проект и откомпилируйте его. Посмотрите на размер запускного файла. Если пустой проект VCL занимает намного больше 200 Кбайт, то проект, использующий KOL+MCK, у меня занял чуть более 23 Кбайт.

Теперь можно расставлять на форме компоненты с закладки KOL и использовать их привычным образом. При этом размер файла будет увеличиваться очень медленно, пока вы не подключите какой-нибудь заголовочный файл из состава VCL.

Я долго не мог решить, какой пример использовать для иллюстрации возможностей KOL+MCK. Но тут я вспомнил одну маленькую утилиту, которая возникла с появлением Windows ХР. С ее использованием программы отображались в стиле Windows ХР, даже если это не было в них заложено. Изучим, как работает эта программа.

На форме нам понадобятся две кнопки KOLButton и поле ввода KOLEditBox (рис. 2.14).

2.19. KOL and MCK

Рис. 2.14. Форма программы

По нажатии первой кнопки будет отображаться окно выбора файла, а его имя будет указываться в поле ввода. Для отображения окна выбора файла на форму надо поместить компонент KOLOpenSaveDialog.

Итак, по нажатии первой кнопки запишем следующее:

procedure TForml.Button2Cli ck(Sender: PObj): begin
if OpenSaveDialogl Execute then EditBoxl.Text := OpenSaveDialogl Filename:
end.

Пользователь должен выбрать запускной файл программы, которую нужно "про-патчить". По нажатии второй кнопки должен быть создан файл манифеста Windows с таким же именем, как и у исполняемого файла, с расширением .manofest. Текст файла-манифеста приведен в листинге 2.10.

Листинг 2.10. Содержимое файла манифеста

<?xml version="1.0"
encoding="UTF-8"
standalone="yes"?>
ossembly xmlns="urn:schemas-microsoft-com:asm.vl"
manifestVersion="l 0">
<assemblyldentity
version="1.0.0 0"
processorArchitecture="X86"
name="Microsoft.Windows,Program"
type="Win32" />
<descnption>Your app description here</description>
<dependency>
<dependentAssembly>
<assemblyldentity
type="win32"
name="Mi crosoft.Wi ndows.Common-Control s"
version="6.0.0.0"
processorArchitecture="X86"
publicKeyToken="6595b64144ccfldf"
1anguage="*"
/>
</dependentAssembly>
</dependency>
</assembly>

Код патчинга приведен в листинге 2.11.

Листинг 2.11. Код патчинга

procedure TForml.ButtonlCliск(Sender: PObj): var
s: String;
f: TextFile: begin
AssignFile(f EditBoxl Text+'.manifest.);
Rewrite(f);
s:='<?xml version="1.0"
encoding="UTF-8"
standalone="yes"?>'+#13#10+ '<assembly xm1ns="urn.schemas-microsoft-com:asm.vl"
ma n 1 f es t Ve r s i on=" 1.0 " >1 +#13#10+ '<assemblyldentity'+#13#10+ ,version="1.0.0.0,,,+#13#10+ 'processorArchitecture="X86"'+#13#10+ 'name="Microsoft Windows.Program"'+#13#10+ ,type="win32",+#13#10+ 7>'+#13#10+
'<description>Your app description here</description>'+#13#10+
'<dependency>'+#13#10+
'<dependentAssembly>'+#13#10+
'<assemblyIdenti ty'+#13#10+
'type="win32"'+#13#10+
'name="Mi crosoft Wi ndows.Common-Control s"'+#13#10+
•version="6 0.0.0"1+#13#10+
'procès so rArch itecture="X86"'+#13#10+
•publ icKeyToken="6595b64144ccfldf"'+#13#10+
продолжение J>

Листинг 2.10 (продолжение) 'language="*"'+#13#10+ 7>'+#13#10+

'</dependentAssembly>'+#13#10+ '</dependency>'+#13#10+ '</assembly>':
writeln(f, s);
CloseFile(f):
end:

Самое сложное в создании необходимого файла - технология доступа. Я всегда рекомендую использовать объект TFi 1 eStream, потому что он удобен, универсален и легко адаптируется для будущего использования, например для перевода на .NET. Но в данном случае этот вариант не подходит, потому что нужно будет подключить модуль С! asses, и запускной файл увеличится с 23 Кбайт до 90 Кбайт, что не совсем рационально.

Можно было бы выбрать функции Win API типа CreateFile или более старые функции fopen, но это привяжет нас к старой платформе, и могут возникнуть проблемы с переходом на .NET.

Хорошие возможности предоставляет Delphi с помощью встроенных функций, для которых не надо подключать модули и они не увеличивают размер исполняемого файла. Рассмотрим некоторые встроенные функции.

• AssignFile(file, name) - связывает имя файла name с переменной file.

• Rewrite(file) - создает файл, заранее связанный с переменной file.

• Reset(file) - открывает файл, связанный с переменной file. Такой файл уже должен существовать.

• Writeln(file, str) - записывает строку str в файл.

• ReadLn(fil е, str) - читает строку, если файл открыт для чтения.

• CI oseFi 1 е( f i 1 е) - закрывает указанный файл

Несмотря на то что файл манифеста состоит из множества строк, мы сохраняем все сразу. Для этого создается переменная s типа String, в которой будут находиться все строки и переводы каретки. С помощью одного вызова функции writel п содержимое строки записывается в файл.

Диск - это одно из слабых мест компьютера. Старайтесь всегда оптимизировать доступ к файлам, считывать или записывать данные большими блоками.

Если вам не понравилось, как программа выглядит и работает в стиле Windows ХР, то можно все вернуть обратно, удалив файл манифеста. Для этого в программе добавим кнопку, по нажатии которой будет происходить удаление:

DeleteFi1е(PChaг(EditBoxl.Text+' mani fest'));

На рис. 2.15 показано окно программы The Bat после добавления файла манифеста. Эта версия не отображалась в стиле Windows ХР, и кнопки, и элементы управления были квадратными до моего вмешательства

Если вам нужна программа/утилита небольшого размера и не хочется "мучиться" с Win API, то выбирайте KOL+MCK. Это отличный способ оптимизации размера программы без потери скорости разработки. Лично я с этой библиотекой познакомился не так давно, но теперь все исполняемые файлы, которые должны будут пересылаться через Интернет, буду писать только с помощью этой технологии.

2.19. KOL and MCK

Рис. 2,15- The BAT в стиле Windows XP

ПРИМЕЧАНИЕ -

Исходный код примера, рассмотренного в данном разделе, находится на компакт-диске в каталоге 5оигсе5\сп02\КО1_-МСК.

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

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

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

Ищите новые алгоритмы. Если программа даже после оптимизации работает неудовлетворительно, то ошибка кроется в самом алгоритме вычисления. Подумайте, возможно, есть другой способ решить поставленную задачу и написать программу, которая будет работать намного быстрее.

2.18. Эффективное использование ресурсов || Оглавление || Шуточки


Delphi в шутку и всерьез: что умеют хакеры



Новости за месяц

  • Декабрь
    2021
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31