ЧАСТЬ 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, только на паскаль. ессно, всё надо доработать для начала как идейка?