Минимальная программа на delphi

Почему код большой?

В рубрике кодинг мы рассказываем тебе про язык программирования Delphi .
Программы, созданные им, получаются достаточно большого размера. С чем это
связано? А с тем, что Delphi является объектным языком. В нем каждый элемент
выглядит как объект, который обладает своими свойствами, методами и событиями.

Любой объект вполне автономен и может работать без твоего ведома. Это значит,
что тебе нужно только подключить его к своей форме, изменить нужные свойства, и
все готово. После этого все будет работать без какого-либо внешнего
вмешательства.

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

Как же тогда быть?

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

Программа на Delphi


винте и как можно меньше светился в памяти? У тебя есть несколько вариантов:

1. Не использовать визуальную библиотеку VCL (для любителей Visual C++ это
библиотека MFC), которая упрощает программирование. В этом случае придется все
делать вручную и работать только с WinAPI. Код в этом случае получается очень
маленьким и быстрым. Но тут ты лишаешься визуальности и можешь ощутить весь
гемор программирования на чистом WinAPI.

Если ты регулярно читаешь Х, то в ноябре 2001 года ты должен был увидеть пример
проги на чистом WinAPI в рубрике кодинг. Там наш запускной файл получился
размером всего в 8 кило. И это притом, что при использовании VCL он
увеличивается до 300 кило.

2. Сжимать программы с помощью компрессоров. Такой код сжимается в несколько
раз, и программа с использованием VCL может превратиться из 300 кило в 30-50.
Главное преимущество тут в том, что ты не лишаешься возможностей объектности и
можешь спокойно забыть про пятна.

В этой статье я постараюсь как можно подробнее рассмотреть оба этих метода.

Ручной кодинг (программирование без использования объектов и визуальности) похож
на ручной секс (это когда ты удовлетворяешь себя вручную в отсутствии очаровашки).
В обоих случаях эффект есть, но его приходится добиваться очень долго, и
удовольствия от ручного метода намного меньше :). Но что поделать, иногда
приходится идти на такие извращения ради создания компактных примочек.

Если ты хочешь создать программу маленького размера, то ты должен забыть про все
удобства. Ты не сможешь подключать визуальные формы или другие примочки,
написанные дядей Борманом для упрощения жизни программера. Только API

Ручной кодиг в Delphi

Для того чтобы создать маленькую прогу в Delphi, нужно создать новый проект и
зайти в менеджер проектов (меню View->Project Manager). Здесь нужно удалить все

Создание меню программы | Программирование на Delphi


формы, чтобы остался только файл самого проекта (по умолчанию его имя
Project1.exe). Никаких модулей в проекте не должно быть.

Теперь щелкни правой кнопкой по имени проекта и выбери из появившегося меню
пункт «View Source» (или из главного меню Project выбери View Source). В
редакторе кода откроется для редактирования файл проекта Project1.dpr. Если ты
уже удалил все модули, то его содержимое должно быть таким:

Я удалил все визуальные формы и теперь могу скомпилировать абсолютно пустой
проект. Я решил попробовать сделать это. После компиляции я выбрал из меню
Project пункт «Information for Project1». Передо мной появилось окно с
информацией о проекте.

В правой части окна должны быть описаны используемые пакеты. Мы все удалили,
значит там точно должна красоваться надпись «None». А вот с левой стороны должна
быть описана информация о скомпилированном коде. Самая последняя строка
показывает размер файла, и у меня он равен 370688 байт. Ничего себе пельмень.
Мы же ничего еще не писали. Откуда же тогда такой большой код?

Откуда ноги растут?

Давай разберем, что осталось в нашем проекте, чтобы обрезать все, что еще не
обрезано. Сразу обрати внимание, что в разделе uses подключен модуль Forms. Это
объектный модуль, написанный дядей Борманом, а значит его использовать нельзя.
Между begin и end используется объект Application. Его тоже использовать нельзя.

Все накладки большого кода, даже у пустой проги, как раз и связаны с объектом
Application. Хотя мы используем только два метода Initialize и Run, при
компиляции в запускной файл попадает весь объект TApplication, а он состоит из
сотен, а может и тысяч строчек кода.

Читайте также:
Как установить программу егаис

Чтобы избавиться от накладных расходов, нужно заменить модуль Forms на Windows.
А между begin и end вообще все можно удалять. Самый минимальный код проги будет
выглядеть так:

Снова откомпилируй проект. Зайди в окно информации и посмотри на размер
получившегося файла. У меня получилось 8192 байта. Вот это уже по-человечески.

Кодинг на WinAPI

Заготовка минимальной программы с использованием WinAPI готова. Теперь ты можешь
смело добавлять свой код. Мне только надо объяснить тебе, какие модули можно
подключать к своему проекту в раздел uses. Тут все очень просто и не займет
много времени.

Если при установке Delphi ты не отключал копирование исходников библиотек, то
перейди в диру, куда ты засандалил Delphi. Здесь перейди в папку «Source», затем
в «Rtl» и, наконец, «Win». Вот здесь расположены исходники модулей, в которых
описаны все API функции Windows. Именно эти модули ты можешь подключать к своим
проектам, если хочешь получить маленький код. Если ты подключишь что-то другое,
то я уже не гарантирую тебе минимум размера твоей проги (хотя есть и
исключения).

Сразу лови пример. Если ты хочешь, чтобы в твоей программе были возможности
работы с сетью, то тебе нужно подключить к нему библиотеку сокетов. Среди
модулей WinAPI есть файл с именем winsock.pas. Значит, ты должен в раздел uses
написать winsock (расширение писать не надо), и твоя программа сможет работать с
сетью.

Пусть всегда будет.

Пока что я описал минимальный проект, в который можно добавлять свой код. Но
код, который ты вставишь, выполнится один раз, и программа выгрузится из памяти.
А что если тебе надо, чтобы твоя программа постоянно висела в окнах? Для этого
используй следующий шаблон для своих прог:

//Сюда можешь добавлять свой код

// Дальше идет код, который заставит прогу висеть в

// памяти вечно и не будет сильно грузить систему.

while GetMessage( Msg, HInstance, 0, 0) do

Маленький код в Visual C++

Многие заблуждаются, говоря, что программы, созданные в Visual С++, уже
получаются маленькими. Это действительно на 90% заблуждение. Сам язык С++
является объектным и страдает теми же недостатками, что и Delphi. Это значит,
что именно на С++ код будет получаться очень большим.

Даже если ты создал новый проект и, откомпилировав его, получил очень маленький
код, то это не значит, что программа получилась компактной. Реально твоя прога
использует динамические библиотеки mfcХХ.dll. Здесь ХХ — это номер версии MFC (Microsoft
Foundation Classes). Вся библиотека занимает около 2 мегов на диске. В
результате твоя прога будет состоять из размера запускного файла плюс размер
библиотеки MFC. Нехило? В Delphi тоже можно так мухлевать, если установить в
свойствах проекта компиляцию с динамической загрузкой bpl (Borland Pascal
Library) библиотек.

Чтобы реально создать маленький код на Visual C++, нужно также использовать
только WinAPI и никаких объектов. Для этого при создании нового проекта ты
должен выбрать тип «Win32 Application». В этом случае ты, как и в Delphi,
ощутишь все прелести и корявости кодинга на WinAPI. Если ты до этого момента
относился к Биллу параллельно, то после пары часов кодинга на WinAPI ты вступишь
в партию ненавистников M$ :).

Если тебя не устраивает кодинг на чистом WinAPI, то твоим лучшим другом должна
стать какая-нибудь прога для сжатия размера файлов. Я очень люблю ASPack,
которую ты можешь забрать по адресу www.cydsoft.com/vr-online/download.htm. Она
прекрасно сжимает запускные файлы .exe и динамические библиотеки .dll.

Я не буду объяснять установку ASPack, потому что там абсолютно ничего сложного
нет. Только одно нажатие на кнопке «Next», и все готово. Теперь запусти
установленную прогу и ты увидишь окно. Главное окно состоит из нескольких
закладок:

На закладке «Open File» есть только одна кнопка — «Оpen». Нажми на нее и выбери
файл, который ты хочешь сжать. Как только ты выберешь файл, программа перескочит
на закладку «Compress» и начнет сжатие.

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

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

Aspack под ножом патологоанатома

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

Читайте также:
Программа которая показывает какие игры пойдут на ПК

После этого в конец сжатого кода добавляется код разархиватора, который будет
все это дело разжимать обратно. И в самом конце ASPack изменяет заголовок
запускного файла так, чтобы при старте сначала запускался разархиватор.

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

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

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

При нормальном кодинге с использованием всех навороченных фишек типа
визуальности и объектности код получается большим, но его можно сжать на 60-70%
спецархиватором. К тому же такой код писать намного легче и быстрее.

В любом случае архивирование — необходимая любому хакеру фишка. Сжатый код
труднее взломать, потому что не каждый disassembler сможет прочитать упакованные
команды. Так что, помимо уменьшения размера, ты получаешь защиту, способную
отпугнуть большинство крякеров. Конечно же, профи не отпугнешь даже большим
Билом :), но крякер средней паршивости не будет мучиться со сжатым байт-кодом.

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

Ссылки по теме

  • Купить программу Delphi XE2 Professional
  • Задать вопрос ONLine по покупке программ в интернет магазине ITShop

08.2012

Источник: www.interface.ru

Работа с OpenGL — Минимальная программа

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

То есть схема здесь такая — приложение отдает команды машине OpenGL, получая результат на поверхности своего окна. Такая архитектура называется «клиент — серверной», в роли клиента выступает наше приложение, в роли сервера — система OpenGL. Задача сервера — отрабатывать команды клиента.

В принципе, сервер может располагаться и не на нашем компьютере, а удаленно, возможно и за тысячи километров от нас. Наше приложение должно передать серверу требуемые для работы данные — контексты и команды на языке сервера. Также важно понимать, что основную работу выполняет не наше приложение, а сервер.

Наше приложение лишь создает окно — платформу для работы сервера, и передает команды серверу. При грамотном подходе нет разницы, какими средствами мы спроектировали приложение — С или Delphi, скорость воспроизведения целиком зависит от производительности сервера — машины OpenGL. Мы выбрали в качестве средства разработки приложений именно Delphi за выдающуюся скорость компиляции и обаятельность концепций.

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

Сверхмалые приложения на Delphi

Многие начинающие программисты и даже некоторые взрослые «солидные» люди, программирующие на C++, Asm’е или других языках упорно считают, что на Delphi можно создавать только программы огромного размера и жрущие много памяти. Более продвинутые и менее упрямые люди знают, что на Delphi, если отказаться от использования VCL можно добиться от минимальной программы размера 8 кб. Ещё более продвинутые знают, что сделав программу используя Runtime Packages можно уменьшить её до 3,5 Кб, но при этом она будет работать только на компьютерах с той же версией Delphi, что и на компьютере создателя. Сегодня нам предстоит сломать стереотипы и рассказать всем о секрете, который знали только избранные.

Сегодня мы создадим на Delphi программу, занимающую всего 2,5 Кб и работающую на любом компьютере. Все знают, что программа с формой на Delphi занимает 300-400 Кб из за VCL, в частности из-за модулей Forms и Classes. Удалив форму и всё из uses, и откомпилировав программу мы получаем приложение размером 8 Кб. В чём же дело?

А дело в том, что к каждой программе на Delphi неявно подключены два базовых модуля: System.pas и SysInit.pas. В них содержатся функции для работы со строками (Copy, Pos, Length и т.д.), функции для работы с файлами (AssignFile, WriteLn, Reset и т.д.) и прочее.

Создайте пустую программу и откомпилируйте её. Она будет размером 8 кб. Теперь добавьте переменную var f: file и после begin напишите: AssignFile(f, ‘c:text.txt’). После компиляции программа стала занимать 15 кб. Дело в том, что ф-ция AssignFile оказалась включена в проект.

Но так как разработчики Delphi делали ставку не на эффективность кода, а на простоту написания, то в пустую программу по умолчанию добавляется много лишнего. Итак, приступаем к удалению всего лишнего. Предупреждение: после удаления вышеописанные функции (работа со строками, и т.д.) будут недоступны. В вашем арсенале останутся только WinAPI функции, которые самому придётся объявлять и ассемблерные вставки. Вот листинг модуля System.pas нашего нового Delphi:

[code=delphi]
unit System;

procedure _InitExe; //Без комментариев
procedure _HandleFinally;
procedure _halt0;
procedure ExitProcess(Code: LongWord); stdcall; external ‘kernel32.dll’ name ‘ExitProcess’;
//Здесь мы описываем процедуру ExitProcess, о предназначении которой говорится ниже

type
TGUID = record
D1: LongWord;
D2: Word;
D3: Word;
D4: array[0..7] of Byte;
end;
//Вообще-то эта запись не нужна, но по какой-то причине компилятор Delphi требует её наличия

procedure _InitExe;
asm
end;
//Компилятор Delphi требует наличия этой процедуры. Это точка входа программы. Сюда можно
//поместить то, что вы хотите сделать ещё до выполнения основного кода, записанного в dpr
//файле (файле проекта). В нашем минимальном приложении оставим её пустой.

procedure _HandleFinally;
asm
end;

procedure _halt0;
begin
ExitProcess(0);
end;
//Эта процедура вызывается при нормальном завершении работы программы. Обязателен вызов
//ExitProcess, без него возникнет серьёзная ошибка. Весь свой код, который вы хотите
//выполнить при завершении надо писать до ExitProcess.

Теперь содержимое второго важнейшего файла SysInit.pas:

unit SysInit;
interface
implementation
end.
[/code=delphi]

То есть он просто пустой. Итак, сохраним эти исходники с соответствующими именами в какой-нибудь папке. Теперь в той же папке создадим .bat файл, для тех кто в танке — он служит для последовательного исполнения ms-dos команд и запуска консольных приложений. Запишем в него следующую строку:

dcc32 -q system sysinit -m -y -z -$D-

Она скомпилирует модули System.pas и SysInit.pas, которые мы только что создали, и создаст два .dcu файла. Теперь перенесём эти .dcu файлы в папку с нашим проектом, назовём его, например, Project.dpr. Запишем туда код:

[code=delphi]
program Project;

procedure Sleep(milliseconds: Cardinal); stdcall; external ‘kernel32.dll’ name ‘Sleep’;
begin
Sleep(10000);
end.
[/code=delphi]

Это означает, что программа запустится, 10 секунд повисит в памяти и завершится. Как я уже говорил, в программах такого вида описывать WinAPI функции надо самим. Теперь создадим в папке с проектом и .dcu файлами ещё один .bat файл, в который напишем:
dcc32 project.dpr

Если вы всё сделали правильно, то после запуска этого файла вы получите программу размером 3,5 кб. Но мы обещали 2,5 кб, и своё обещание сдержим. Программу необходимо сжать архиватором upx, который есть в интернете. Вот в принципе и всё. Заметка: старайтесь использовать WinAPI функции из как можно меньшего числа системных dll файлов. Например, если бы я в dpr файле вместо Sleep вызвал бы MessageBox (user32.dll), то программа занимала бы в памяти 1,5 мб из-за загрузки 2-х dll (kernel32.dll — ExitProcess
и user32.dll — MessageBox), а потому как функция Sleep находится в kernel32.dll, то загружать надо всего лишь одну библиотеку и программа будет в памяти занимать только 500-600 кб.

Заметка: при компиляции будет выдаваться 2-3 ошибки. 2 — обязательно, выглядеть будут вроде такого: Cannot find TIsList, а третья будет выдаваться, если вы будете компилировать программы на компьютере, где нет Delphi. Она будет выглядеть вот так: Cannot load library TLINK32.DLL. Игнорируйте эти ошибки, они процессу создания программы не повредят.

Заметка: при создании таких программ на компьютере, где нет Delphi рекомендуется во избежание ошибок для описывания WinAPI функций использовать MSDN.

  • Добавить комментарий
  • 7058 просмотров

Источник: www.vr-online.ru

Читайте также:
Программа для просмотра кто подключен к Wi-Fi
Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru