hinstlib и Компрессия исполняемого файла

Обсуждаются как существующие проекты (перевод документации, информационная система и т.п.), так и создание новых.

Модератор: Модераторы

hinstlib и Компрессия исполняемого файла

Сообщение hinst » 16.05.2010 16:52:11

Вот, решил поделиться своей библиотечкой.

ЧАСТЬ 1
hinst_lib
Задумывалось, как "библиотека для всего самого разного"
http://www.easy-share.com/1910227657/hinstlib_2010.05.14.rar

--- Что внутри ---
* константы: constness.pas
* некое усовершенствование строк: stringness
* универсальный запоминатель (не доделан) the_storage.pas
* некое усовершенствование xmlcfg (небольшое, но планируется расширить): xmlconfness.pas
* некое усовершенствование стримов: streamness.pas
# шаблонные списки (хранят что угодно, даже простые типы; в трёх вариантах, каждый заточен хранить что-то своё): listness.pas
* некое оборачивание потоков: threadness.pas
# супер-мега-усовершенствованный ЛОГ: logness.pas
# Матрицы: шаблонные! хранят что угодно, даже простые типы
# Скрипты: обёртка PascalScript по полной программе, позволяет делать со скриптами всё, что и RemObjects ПаскальСкрипт, но ещё более обёрнуто :3 scriptness.pas //ессно, требует пакет PascalScript
- arrayness.pas: сюда вообще не смотрим, тут что-то недоделанное и давно забытое мною
> Далее два модуля специально к библиотеке Andorra2D http://andorra.sourceforge.net/;; ессно, требуют эту библиотеку
* Усовершенствованный перерисовывальщик: ad_repainter.pas
* Консоль для ad2d : несложно догадаться, позволяет реализовывать юзерскую графическую консоль в движке ad2d :andorra_console.pas

Если вы не пользуетесь ни библиотекой PascalScript, ни движком Ad2D, ничего страшного, модули, не связанные с ними по смыслу, не требуют ничего, кроме RTL, FCL, ну и, маловероятно, LCL, так как я не припомню, чтобы я LCL заюзывал.

в папке также файлы с расширением lpk, там у них зависимости от неких пакетов, но кроме зависимостей и списка файлов они никакой экстра-информации не несут (т.е. какие-то особые опции сборки не требуются), то есть просто можите просто снести зависимости и вписать свои. то есть: если вы не очень вкурили этот абзац, не трогайте мои lpk, они опциональные. трогайте pas-ы

Код: Выделить всё
(* *** ПРИМЕРЫ *** *)

//Список из TTankSprite
 TCustomTankSpriteList = specialize TObjects<TTankSprite>;
//список чисел
 TIntegers = specialize TListness<integer>;

//объявляем матрицы из чисел и из record'ов
type
 TMyMatrix = specialize TGenericMatrix<integer>;
 TMyRecord = record a, b: integer;
 TMyRecordsMx = specialize TGenericMatrix<TMyRecord>;

//создаём матрицу
 mx:=TMyMatrix.Create(self, width, height); //где self - Owner

//создаём и пишем в лог
 fLog:=TFileLog.CreateLocal(self); // при таком создании лог будет в E:\Documents and Settings\hinst\Local Settings\Application Data\имя_приложения, которое берётся кое-откуда, долго бъяснять
 log.SubLogs.Add(TTextStream.Create(output)); //чтобы он ещё и в стд.output писал
 log - self + 'Я пишу всё что угодно: ' + 6 + '; ' + 9.13 + str_msg + true + endl; //self можно и не укзывать. это фича такая: чтобы было видно, какой объект пишет в лог


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

ЧАСТЬ 2
Библиотека для сжатия исполняемого файла!
Написан мною. Методом брутфорсного программирования.

При экспериментальной проверке эффективности было установлено, что исполняемый файл, полученный последним стабильным лазарусом с включённой отладочной информацией под виндой ужался с 11.8 мб до 3.8 мб. То есть, сжался на 68% Без отладочной информации пока не проверял.

Также существенным преимуществом библиотеки является то, что на время загрузки приложения показывается графический СПЛЭШ, приписанный на fpgui. (так что, для сборки надобится fpgui-0.7.rc2)
http://opensoft.homeip.net/fpgui/
:!: :!: :!: предусмотрены два варианта распаковки: с графическим сплешем или без. При безграфическом варианте fpgui не_нужен!
но в любом случае нужен hinst_lib.

Весь остальной алгоритм реализован стандартным функционалом fpc и Lazarus.

UPX В чём же приемущество перед upx? прежде всего, идейные соображения: использовав паскальную библиотеку вместо UPX вы можете смело сказать, что ваш проект абсолютно паскален.

Как пользоваться:
я хотел сделать полностью автоматизированную сборку, но посчитал, что сделаю её чуть позже, если возникнет такой интерес.
1. вводим compression -c sample.exe --lazres=D:\lazarus_0.9.28.2\tools\lazres.exe
где
sample.exe - то, что нужно сжать
D:\lazarus_0.9.28.2\tools\lazres.exe - путь к lazres
2. получаем sample.exe.lrs
3.1 для распаковки с консольным сплэшэм качаем lrs в папку decomp и заменяем в sample_decompression.lpr
{$I sample.exe.lrs} на {$I ваша_прога.exe.lrs} и a:=TExecutableArchive.Create('тут подставляем ваша_прога.exe');
И СоБиРаЕм.
м.б. кому-то такой алгоритм покажется сложным, но на самом деле тут всё элементарно
3.2 для создания самораспаковщика с Графическим сплэшэм качаем lrs в папку fpgui_decompresion и заменяем в fpgui_decomp.lpr то_же_самое, что и для консольного самораспаковщика.
строка 102: {$i sample.exe.lrs} => {$i наша_прога.exe.lrs}
там же, рядом a:=TExecutableArchive.Create('sample.exe'); => a:=TExecutableArchive.Create('наща_прога.exe');
И СоБиРаЕмЪ.

вроде бы, ничего не забыл. сорри, если что, это всё склероз

всё полностью кроссплатформенно! (теоретически)

Вот ещё пара примеров
Код: Выделить всё
// *** stringness.pas: ***
ShowMessage(AsString([12, ' bI ', 2.5, ' ', form1, x])) //то бишь, можно собирать строчку по куска из практически чего угодно
AsString(и тут указывается число, символ, строка, объект);
объект преобразуется в его ClassName, алсо если то был TComponent, то добавляется его name

// *** streamness.pas ***
//позволяет делать такую шнягу:
var s: TStream
s + 'bI' + 'bI' + 'bIrbI'; //что записывает в поток строки, как текст
//алсо:
var s: TTextStream; f: TextFile;
s:=TTextStream.Create(f); //что позволяет сделать TStream из текстового файла. только запись

// *** threadness.pas ***
var t: TThreadness;
t:=TThreadness.Create(@aObjectMethod); //что создаёт поток, исполняющий метод(aTh: TThreadness): boolean
//алсо все потоки хранятся в глобальном списке потоков



Ожидается: благодарность, критика, предложения
Думаю, не задвинуть ли что-то типа набора компонентов типа Boost для Cpp, только на паскаль. ессно, всё надо доработать для начала как идейка?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось hinst 16.05.2010 20:23:38, всего редактировалось 1 раз.
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Re: hinstlib и Компрессия исполняемого файла

Сообщение Odyssey » 16.05.2010 20:13:53

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

1. Для некоторые констант уже есть аналоги, причём по два -- один унаследован от Delphi, другой -- родной из FreePascal:
Код: Выделить всё
constness.const_fileslash = DirectorySeparator = PathDelim
constness.const_endl = LineEnding = sLineBreak


2. Довольно сложно понять, чем могут быть полезны конкретные модули. Про документацию понятно что долго, но вот примеры использования были бы очень кстати. Если со списками всё понятно, то например со скриптами и ad_repainter всё не так прозрачно.

3. "Библиотека для всего самого разного" становится особенно хороша, когда куски её функционала можно использовать ещё и по отдельности. Иногда это сложно, например, когда в библиотеке используются собственные строковые типы или базовые классы, типа списков. Но даже тогда уменьшение внутрибиблиотечных зависимостей может пойти на пользу. Например, лог -- функционал уровня приложения и странно, что модуль работы с тредами включает его в uses. Что если кто-то захочет использовать эти же треды с другим логгером?

4. Не хватает лицензии на код, и unrar под Linux любят не все :)

Вроде пока всё. И конечно же, всё вышесказанное -- имхо.
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24


Вернуться в Разное

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

Рейтинг@Mail.ru