Полезное в сети

Всегда в теме

Статистика


Яндекс.Метрика


Онлайн всего: 1
Гостей: 1
Пользователей: 0

Рекомендуем



Главная » Статьи » Образовательные » Программирование

Минимизация и невидимость
Что самое главное при написании программ-приколов? Ну конечно же, невидимость. Программы, созданные в этой и следующих главах, будут незаметно сидеть в системе и выполнять нужные действия при наступлении определенного события. Это значит, что программа не должна появляться на
панели задач или в списке запущенных программ в окне, выдаваемом при нажатии <Ctrl>+<Alt>+<Del>. Так что прежде чем начать что-то писать,
нужно узнать, как спрятать свое творение от чужого глаза. Помимо этого, программы-при колы должны иметь маленький размер. При-
ложения, создаваемые Delphi, достаточно "весомые". Даже простейшая программа, выводящая одно окно, отнимет более 200 Кбайт на диске. Если
вы захотите отослать такую шутку по электронной почте, то отправка и получение письма с вашей программой отнимет лишнее время у вас и получателя. Это не очень приятно, поэтому в этой главе я познакомлю вас с тем, как можно уменьшить размер программ, создаваемых в Delphi,

Самый простой способ уменьшить размер приложения — использование программы для сжатия файлов. Лично я очень люблю ASPack, которую вы
можете скачать с адреса www.cydsoft.com/vr-online/download.htm или скопировать с компакт-диска из директории программы (файл установки называется
ASPack.exe). Она прекрасно сжимает исполняемые файлы *.ехе и динамиче-
ские библиотеки *.dll. Я не буду подробно описывать процесс установки ASPack, потому что там абсолютно нет ничего сложного. Только одно нажатие на кнопке Next, и все
готово! Теперь запустите установленную программу, и вы увидите окно, изображенное на рис. 1.1. Главное окно имеет нескольких вкладок:
• Open File;
О Compress;
14 Глава 1
П Options;
• About;
• Help.

На вкладке Open File есть только одна кнопка — Open. Нажмите на нее и выберите файл, который вы хотите сжать. Как только вы выберете файл,
программа перейдет на вкладку Compress и начнет сжатие Сжатый файл сразу перезаписывает существующий, а старая несжатая версия сохраняется на всякий случай под тем же именем, но с расширением bak. Настроек у ASPack не так уж много (рис. 1.3), и с ними вы сможете разобраться без моей подсказки. Лучше я расскажу вам, как это работает.
Давайте разберемся, как работает сжатие. Сначала весь код программы сжимается архиватором. Если вы думаете, что он какой-то "навороченный", то
сильно ошибаетесь. Для сжатия используется обычный архиватор, только оптимизированный для сжатия двоичного кода. После этого в конец сжа-
того кода добавляется код разархиватора, который будет программу разжимать обратно. И в самом конце ASPack изменяет заголовок исполняемого
файла так, чтобы при старте сначала запускался разархиватор. Теперь, когда вы запускаете сжатую программу, сначала заработает разархиватор, который разожмет бинарный код программы и аккуратно разместит его в памяти компьютера. Как только этот процесс закончится, разархиватор
передаст управление вашей программе. Некоторые считают, что из-за расходов на распаковку программа будет работать медленней!!! Я бы сказал, что вы не заметите разницу. Даже если и будут какие-то потери, то они будут неощутимы (по крайней мере, на современных компьютерах). Это происходит потому, что архивация хорошо
оптимизирована под двоичный код. И по сути дела, распаковка происходит только один раз и в дальнейшем никакого влияния на работу программы не
оказывает. В результате потери в скорости из-за сжатия будут неощутимы. При нормальном программировании с использованием всех "навороченных" возможностей типа визуальности и объектного программирования код получается большим, но его можно сжать на 60-70% специальным архива-
тором. А писать такой код намного легче и быстрее. Еще одно "за" использование сжатия — заархивированный код труднее
взломать, потому что не каждый disassembler сможет прочитать упакованные команды. Так что помимо уменьшения размера вы получаете защиту, способную отпугнуть большинство взломщиков. Конечно же, профессионала не отпугнешь даже этим, но взломщик средней руки не будет мучиться со сжатым двоичным кодом.
На компакт-диске в директории \Примеры\Глава l\Screensl вы можете найти файлы приведенных цветных рисунков.

Без окон, без дверей...
Следующий способ уменьшить размер программы заключается в ответе на
вопрос: "Из-за чего программа, созданная Delphi, получается большой?" От-
вет очень прост: Delphi является объектным языком. В нем каждый элемент
выглядит как объект, который обладает своими свойствами, методами и со-
бытиями. Любой объект вполне автономен и многое умеет делать без ваших
указаний. Это значит, что вам нужно только подключить его к своей форме,
изменить нужным образом свойства, и приложение готово! И оно будет ра-
ботать без какого-либо прописывания его деятельности.
Но в объектном программировании есть и свои недостатки. В объектах реа-
лизовано большое количество действий, которые вы и пользователь сможете
производить с ним. Но реально в любой программе мы используем два-три
из всех этих свойств. Все остальное — для программы лишний груз, кото-
рый никому не нужен.
Но как же тогда создать компактный код, чтобы программа занимала мини-
мум места на винчестере и в оперативной памяти? Тут есть несколько вари-
антов.
1. Не использовать VCL (для любителей Visual C++ — это библиотека
MFC), которая упрощает программирование. В этом случае весь код при-
дется набирать вручную и работать только с WinAPI. Программа в таком
случае получается очень маленькой и быстрой. Но таким образом вы ли-
шаетесь простоты визуального программирования и можете ощутить все
неудобства программирования с помощью чистого WinAPI.
2. Сжимать готовые программы с помощью компрессоров. Объектный код
сжимается в несколько раз, и программа, созданная с использованием
VCL, может превратиться из монстра в 300 Кбайт в скромного по разме-
рам "зверя", весящего всего 30—50 Кбайт. Главное преимущество состоит
в том, что вы не лишаетесь возможностей объектного программирования
и можете спокойно забыть про неудобства WinAPI.
Второй метод мы уже обсудили выше, поэтому стается только описать пер-
вый вариант.
Если вы хотите создать программу действительно маленького размера, то
должны забыть про все удобства. Вы не сможете подключать визуальные
формы или другие удобные модули, написанные фирмой Borland для упро-
щения жизни программиста. Только API-функции самого Windows и ничего
больше.
Для того чтобы создать маленькую программу в Delphi, нужно создать но-
вый проект (по умолчанию Delphi при открытии сама создаст новый файл
проекта, но вы всегда можете создать новое приложение, выбрав File\New\
Application), и зайти в менеджер проектов (меню View\Project Manager).
Здесь нужно удалить все модули и формы (пункт Unit, он выделен на
рис. 1.4), чтобы остался только файл самого проекта (по умолчанию его имя
Projectl.exe). Никаких модулей в проекте не должно быть. Теперь нужно щелкнуть правой кнопкой мыши на имени проекта и выбрать
из появившегося контекстного меню пункт View Source или в главном меню
Project выбрать пункт View Source. В редакторе кода откроется файл проекта
Projectl.dpr. Если вы уже удалили все модули, то его содержимое должно
быть таким:
program Project1;
uses
Forms;
($R *.res}
begin
Application.Initialize;
Application-Run;
end.
Теперь можно скомпилировать абсолютно пустой проект. Для этого надо
выбрать в меню Project пункт Compile Project или нажать сочетание клавиш
<Ctrl>+<F9>. После компиляции выберите в меню Project команду
Information for Projectl. Появится окно с информацией о проекте.
В правой части окна должны быть описаны используемые пакеты. Так как
вы все удалили, значит, там должна красоваться надпись None. А вот с ле-
вой стороны должна быть описана информация о скомпилированном коде.
Самая последняя строка показывает размер файла, и у меня он равен
370 688 байт. Ничего себе "пустая программа"!!! Мы же ничего еще не напи-
сали. Откуда же тогда такой большой код?
Давайте разберемся, что осталось в нашем проекте, чтобы обрезать все то,
что еще не обрезано. Сразу обратите внимание, что в разделе uses подклю-
чен модуль Forms. Это объектный модуль, написанный "дядей Борландом",
а значит, его использовать нельзя, потому что именно он увеличивает раз-
мер нашей программы. Между командами begin и end используется объект
Application. Этот объект тоже использовать не надо, так как он не заботит-
ся о "фигуре" программы.
Большой объем, который появляется даже у пустой программы, как раз и
связан с объектом Application, который объявлен в модуле Forms. Хотя мы использовали только два метода i n i t i a l i z e и Run, при компиляции в ехе-
файл попадает весь объект Triplication, а он состоит из сотен, а может и
тысяч строчек кода.
Чтобы избавиться от накладных расходов, нужно заменить модуль Forms на
windows, который описывает только WinAPI. Этот модуль связан с объекта-
ми Delphi, и его подключение является обязательным, иначе вы не сможете
вызвать ни одной функции из набора WinAPI. А между begin и end вообще
все можно удалить. В итоге самый минимальный (с учетом использования
модуля windows) код программы будет выглядеть так:
program Projectl;
uses Windows;
begin
end.
Снова откомпилируйте проект. Откройте окно информации и посмотрите
на размер получившегося файла. У меня получилось 8 192 байта (рис. 1.6).
Вот это уже по-человечески.
Заготовка минимальной программы с использованием WinAPI готова. Те-
перь вы можете смело добавлять свой код. Мне нужно только объяснить
вам, какие модули можно подключать к своему проекту в раздел uses. Тут
все очень просто и не займет много времени.
Если при установке Delphi вы не отключали копирование исходников биб-
лиотек, то перейдите в директорию, куда вы установили Delphi. Здесь
перейдите в папку Source, затем в Rtl и, наконец, Win. Если вы отключили
копирование исходников, то вставьте компакт-диск с Delphi и ищите эти директории там. В них расположены исходники модулей, в которых описа-
ны все API-функции Windows. Именно эти модули вы должны подключать
к своим проектам, если хотите получить маленький код. Если вы подключи-
те что-то другое, то я уже не гарантирую минимум размера вашей програм-
мы (хотя есть и исключения).
Сразу же рассмотрим пример. Если вы хотите, чтобы в вашей программе
были возможности работы с сетью, то вам нужно подключить к проекту
библиотеку сокетов. Среди модулей WinAPI есть файл с именем winsock.pas.
Значит, вы должны в разделе uses написать winsock (расширение писать не
надо), и ваша программа сможет работать с сетью.
Пока что я описал минимальный проект, в который можно добавлять свой
код. Но код, который вы вставите, выполнится один раз, и программа вы-
грузится из памяти. А что, если вам надо, чтобы программа постоянно висе-
ла в памяти и что-то делала? Для этого нужно использовать следующий
шаблон для своих программ:
program Projectl;
uses
var
Msg
Begin
Windows;
: TMsg;
//Сюда можно добавлять свой код
//Дальше идет код, который заставит программу висеть в
//памяти вечно и не будет сильно загружать систему
while GetMessagef Msg, HInstance, 0, 0) do
begin
TranslateMessage(msg);
DispatchMessage(msg);
end;
end.
Сейчас я не буду описывать этот шаблон, потому что дальше мы подробно
обсудим написание полноценного шаблона минимального приложения. Там
и будут описаны функции, которые используются в этом примере.
Самое интересное, что такое минимальное приложение будет не видно
в системе. Мы не создавали никаких окон, значит, на экране ничего ото-
бражаться не будет. Программа не будет иметь фокуса ввода, поэтому в па-
нели задач тоже незачем что-то отображать.
У нас получилась не программа, а процесс. Именно поэтому его можно за-
метить в Windows 2000/XP только с помощью программ, которые умеют
отображать все процессы, запущенные в системе. В Windows 2000/XP при
нажатии <Ctrl>+<Alt>+<Del> появляется Диспетчер задач Windows
(рис. 1.7). В Диспетчере есть вкладка Процессы, где и можно найти такую
программу. Вообще-то на этой вкладке можно найти любую работающую
программу, и от ее инспекторского взора спрятаться очень тяжело. Так что
достаточно только назвать исполняемый файл не сильно вызывающе, и
простой пользователь ничего не заподозрит, потому что список процессов
достаточно большой, и я не думаю, что он знает хотя бы половину из них.
В Windows Эх при нажатии кнопок <Ctrl>+<Alt>+<Del> такая программа
пока еще будет видна. Чтобы окончательно скрыть ее из виду, нужно доба-
вить следующий код:
procedure RegisterServiceProcess; external 'kernel32.dll'
name 'RegisterServiceProcess';
Здесь Объявлена недокументированная процедура RegisterServiceProcess,
которая есть в ядре kernel32.dll. Эта процедура делает нашу программу про-
цессом в системе Windows 9x. Строку с описанием процедуры нужно доба-
вить сразу после раздела uses.
Чтобы вызвать эту процедуру, нужно написать следующий код в любом мес-
те программы (желательно в начале):
asm
push I
push 0
call RegisterServiceProcess;
end;
В Delphi есть встроенный ассемблер, вы можете прямо среди кода на Пас-
кале писать код на ассемблере. В примере, показанном выше, использован
ассемблер для вызова процедуры RegisterServiceProcess. Инструкции
языка ассемблера нужно заключать между словами asm и and;. В примере
используется три инструкции. В первой в стек поднимается число i с по-
мощью операции push. Во второй строке в стек поднимается значение о.
Эти два числа, поднятые в стек, являются переменными для процедуры
RegisterServiceProcess. To же самое можно было бы сделать и с помощью
вызова функции Паскаля RegisterServiceProcess (О, 1), но мне захотелось
показать вам, как работает встроенный ассемблер. Да и тогда пришлось бы
изменить описание процедуры RegisterServiceProcess, которая регистри-
рует программу как процесс и в Windows 9x делает программу невидимой
в списке запущенных программ, который вы вызываете нажатием
<Ctrl>+<Alt>+<Del>. В последней инструкции ассемблера вызывается про-
цедура RegisterServiceProcess С ПОМОЩЬЮ оператора call.
Теперь наша программа не будет видна и в Windows 9x Только вы долж-
ны учитывать, что этот код прекрасно работает в Windows 9x, но выдаст
ошибку в Windows 2000/XP, потому что в его ядре нет функции
RegisterServiceProcess. Поэтому вы должны знать, в какой системе будет
запускаться программа и можно ли использовать процедуру
RegisterServiceProcess.
Категория: Программирование | Добавил: Wrecker (19.05.2012)
Просмотров: 1107 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

Поиск

Вход

Гость
  • Вход
  • Регистрация
  • Читаемое

    Заходи не жди