Самый большой недостаток в делфи, который я заметил на данный момент - это слишком большой вес скомпилированных EXE. Даже если код из 3-4 строк, весить это чудо будет 350-450 КБ.
Дело в том, что при визуальном программировании, в EXE толкается инфа из Forms.dcu и Windows.dcu (из других так же). Которые весят вместе 800~кб. Способа уменьшить их я пока не нашёл, при изменении их компилятор выдаёт ошибку: Read error.
Программировать на чистом WinAPI в делфи я не умею, поэтому приходится заморачиватся с чисткой данных из EXE и последующим сжатием.
Например на том же C++, асме, WinAPI получается буквально в сто раз меньше.
Ну чтож, попробуем сделать из *овна конфетку
Что нам потребуется из софта:
1. Для чистки:
Restorator, [Ссылки могут видеть только зарегистрированные пользователи. ]
Resource Hacker [Ссылки могут видеть только зарегистрированные пользователи. ]
или XN Resource Editor. [Ссылки могут видеть только зарегистрированные пользователи. ]
так же нужен StripReloc [Ссылки могут видеть только зарегистрированные пользователи. ]
Преимущества Restorator'а - самый новый, 2007-го года. В функциях различия не большие, по крайней мере я ими не пользуюсь. Один минус - 30 дней триала.
Преимущества Resource Hacker'а - старый, но в нём проще удалять лишнее, не перескакивает на прошлую директорию. Минус - не всё может открывать.
Преимущества XN Resource Editor'а - относительно новый, есть встроенный редактор картинок, курсоров. Минус - перескакивание на прошлую директорию при удалении ресурса. Очень напрягает, ведь вместо 30 кликов мыши надо сделать 90.
Я лично пользуюсь всеми сразу )) чищу сначала ResHacker'ом, потом уже XN Resource Editor. А ресторатором, когда ничем не откроешь.
Выбирайте сами)
Strip Reloc удаляет ненужную инфу (какую не знаю, я её не видел ни разу), которая не влияет на работу программы.
2. Для сжатия:
только PECompact. [Ссылки могут видеть только зарегистрированные пользователи. ]
Пробовал кучу разных пакеров.. большинство просто не работало. Сначала остановился на ASPack'е. примерно 40% от EXE остаётся. А у PECompact где-то 35%. И то, это смотря какие настройки (и иногда как повезёт )
Собственно, как это всё делается:
Имеем мы обычный прожект весом в 432 КБ.
Делаем бэкап!!!
Кидаем наш прожект в StripReloc.exe.
Фига сибе, смотрим мы. 407 КБ.
А всего то удалили какие-то таблицы релокаций.
Берём любой чистильщик.
Открываем нашу прогу (File->Open ... и ищем)
Вообще, для работы проги, нужна только RCData\TForm1. Ну или если форм больше, то и их оставлять.
Но если в программе используются некоторые окна создаваемые не ручками, например через команду InputQuery, где открывается окно с кнопками Ок\Отмена и текстовым полем. Если удалить определённый ресурс в String Table, то кнопки могут оказатся без текста. Поэтому нужно будет оставить некоторые стрингтэйблы, если вам так нужны подсказки на кнопках. Так же можно редактировать и сам текст. Просто измените нужный текст в стрингтэйбле и нажмите Compile Script.
Однако, чтобы редактировать формы, нужно удалять таблицы релокаций ПОСЛЕ ресхака. Т.к. в TForm обрезается кусок снизу и добавляется символ "@". С ним нельзя перекомпилить.
У меня осталось только RCData\TForm1 и TForm2.
[IMG]http://******.net/out.php/i76416_3.PNG[/IMG]
Сейчас вес моего прожекта 386 КБ.
Теперь самое главное! Юзаем PECompact.
Открываем его, выбираем нашу урезанную прогу.
У меня вот такие настройки:
[IMG]http://******.net/out.php/i76417_4.PNG[/IMG]
Эксперементируйте! Для чего вам и дана кнопка "Восстановить исходные".
Так же можно поменять "Подлежащие сжатию ресурсы".
Можно поставить все. НО! Иногда, когда он находит эти ресурсы, сжимает их, вставляет инфу для расжатия, и эта инфа для расжатия может весить больше, чем сжали исходное.
У меня получился прожект весом 149 КБ. Я особо не заморачивался с настройками, поэтому можно сделать ещё меньше.
Так же кто-то говорил, что можно как-то переконвертить EXE в COM, тогда он ещё и будет сжиматься UPX'ом.
К сожалению, такой софтины я не нашёл.
Где я ошибся, поправьте, пожалуйста.
Добавлено через 44 минуты
Хм.. я уже понимаю, что неправ. Достаточно сделать project1.dpr:
program project1
uses
Windows;
begin
end.
и оно будет весить 15 кб. После всех манипуляций со сжатием вес получится ещё меньше. Если говорит "Undeclared Identifier" то нужно в uses написать требуемую библиотеку.
Например если добавить SysUtils то вес уже будет 39 КБ. Но всё равно не так уж и много.
И кста, помоему PECompact годится только для больших файлов. Для <50 кб нужны другие компрессоры. Сейчас похимичу
зы: я люблю изобретать велосипеды
Последний раз редактировалось Leo_ня; 01.01.2009 в 20:02.
Причина: Добавлено сообщение
COM это формат только для DOS по сути это чистый обьектник. Конвертирование EXE в COM означает избавить исполняемый файл от PE Header-а. Это повлечет за собой полную неработоспособность программы. Короче того кто это говорил на мыло
Кстати сжать EXE можно еще одним способом. Дело в том что асмокод может генерится компилятором в двух режимах: оптимизация по скорости и по весу exe. Соответсвующая опция должна быть в свойствах/настройках проекта. Ну а сама по себе она такая большая потому что много мусора. Например MASM генерит минимальное окно размером с 2.5 кб, а VC++ 6 16 кб. При чем и там и там идет оптимизация по скорости. Хотя это вобщем то относительная вещь. Основной упор в методике оптимизации по скорости это то что вместо циклов типа
Это конечно не единственная методика которая применяется.
Кстати! Чуть не забыл, самый эффективный метод сжатия это компилить в релизной конфигурации )) Казалось бы а чем оно может отличатся но оно действительно отличается. Штука в том что компилятор очень много левых данных пишет в exe при debug - mode. Переключить с Debug на Release можно в меню Build. Там должен быть такой пункт.
Да кстати, чуть не забыл , самый радикальный метод. Можно сжать PE Header руками через Hex редактор. Я лично своими глазами видел PE Header длиной 32 байта. Как освою методику, напишу гайд.
PS: Вот вам кстати и ответ почему у нас мало гайдов - то что я не понимаю я не выкладываю
Последний раз редактировалось Ivan_32; 02.01.2009 в 13:59.
Причина: Добавлено сообщение
Добавлю чуть, но это для тех, кто хорошо себя ощущает в делфе и знает как устроены эти библиотеки... Слышал, но на практике не применял, что можно из библиотеки "выудить" только нужное для себя, или отредактировать саму библиотеку, естественно сделав её бэкап.
з.ы. как вариант борьбы с "весом" библиотек
________________ ГОНЯЮСЬ за СПАСИБО и за кол-вом сообщений, но получается плохо (( поможете!? ))
С уважением, ZeLiK
Пользуюсь [Ссылки могут видеть только зарегистрированные пользователи. ] особенно применимо к программам написанным на Delphi даже если вы используете создание окон на "чистом WinAPI" исходный размер получится минимальный ... говорят что защищает он от декомпиляции ... но я в это не верю [Ссылки могут видеть только зарегистрированные пользователи. ]
З.Ы. Кину и я каменюку в тот огород о котором говорит ZeLiK почти все миниатюрные программки делаю по моему шаблону (код как у сишного приложения получается ))) то размер получается минимальный, хотя если писать на асме то получится ещё меньше
Последний раз редактировалось Vo1T; 02.12.2009 в 10:21.
З.Ы. Кину и я каменюку в тот огород о котором говорит ZeLiK почти все миниатюрные программки делаю по моему шаблону (код как у сишного приложения получается ))) то размер получается минимальный, хотя если писать на асме то получится ещё меньше
Зачем вновь изобретать велосипед? Тратить время и писать прорисовку окна, када это можно сделать выпилив из ВЦЛ библиотек ненужное и оставить там только самое необходимое?! На крайняк многие советуют юзать КОЛ (сеня почитал об этом - там технология на много пе*дее чем у борланда - пруфлинки не выкладываю, инфы достаточно на луркморе и педивики).
Вот недавно писал троян_даунлоадер. С борлдандовскими ВЦЛ-ками вышло как обычно - около 300Кб, 200 из которых тупо мусор. Выпилил из библиотек всю ****ь что была не нужна. Файл получился размером в 100Кб. Не останавливаясь на достигнутом начал копать в строну виндовых библиотек (динамик линк либрари), дабы не трогать борландовские вообще. В итоге вылез файл размером в 4Кб (после удаления пакэйдж инфы стал 3Кб), который после сжатие FSG стал весить 933 байта! Да и по существу стал проги писать без интерфейса (подался в вирмейкеры ).
Последний раз редактировалось wellenstorm; 07.02.2010 в 17:55.
я не советую ... писать на чистом WinAPI приятнее (тем более если есть знания C++ именно там точно таким же методом создаётся окно) а кол ужас - у него несовместимость с процессором пентиум 200 и вин 7 с ним не стыкуется библиотека стара как веник - никто не обновлял уже тыщу лет
я не советую ... писать на чистом WinAPI приятнее (тем более если есть знания C++ именно там точно таким же методом создаётся окно) а кол ужас - у него несовместимость с процессором пентиум 200 и вин 7 с ним не стыкуется библиотека стара как веник - никто не обновлял уже тыщу лет
Хм, спасибо за просвещение. В данный момент стараюсь все проги писать на WinAPI функциях. Ведь именно таким образом я начинаю понимать как на самом деле работает винда и что делает та или другая функция! То что в дельфи можно написать пятнадцатью строчками (используя кривые компоненты которые похожи на снежные комы) на WinApi у меня займет всего строки две - вызов виндовой функции с нужними параметрами - всё! Ничего лишнего! И, повторюсь, пишу проги без интерфейса, меньше нагрузки и ошибок в работе программы. Ну а кто уж любит красивости, думаю всегда сообразит как безинтерфейсной проге написать визуализацию (как это было с upx пакером или пе компакт)
Последний раз редактировалось wellenstorm; 14.02.2010 в 15:30.
Вместо ASPack пробовал кто Upack? По-моему уровень сжатия выше.
Где-то в рунете была куча статей по сравнению пакеров. Вообще, лучше писать свой пакер. Ни один авир не сможет его распаковать на своей вирт машине и будет думать, что это и есть исходный экзешник.
имеем экзешник с тем же весом в 15 кбайт, без всяких дополнительных манипуляций
а после упаковки тем же аспаком, например, вес экзешника составляет 13 кб, так что автор помойму действительно изобретает велосипед..
у меня чистый кряк без защит и прибамбасов весил 512кб xD это при том что у него две иконки по 15кб каждая, меню и вцл трей иконка xD конечно не чистый вин апи, но все же.
кстати можно перекомпилировать файлы system, windows, forms и тд, вырезая все не нужное в данной проге и кидая рядом с проектом приготовленные файлы, компиляторы си и си++ языков это делают за программиста, а вот делфистам приходиться делать это в ручную
________________
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
компиляторы си и си++ языков это делают за программиста, а вот делфистам приходиться делать это в ручную
Это довольно спорный вопрос. Поскольку часть библиотек, используемых при создании проекта в С и С++ линкуется рантайм из пакета, поставляемого вместе с виндой.
А делфи все библиотеки компилирует вместе с файлом программы, что можно перенастроить, но тогда нужно будет передавать еще и библиотеки, поскольку микромягкие отказали борланду (а затем и новому хозяину) в размещении библиотек в поставке винды (собственно говоря их вполне можно понять).
________________
Ни одно доброе дело не остается безнаказанным.
Программы:
PW: Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). .
JD: Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). .
Статьи: Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Большой размер пустой формы?
Идем в Project > Options > Packages > Runtime Packages
Там меняем флаг с False, на True.
Эта опция говорит, что ненадо в проект пихать дельфичьи сурсы форм и компонентов, а использовать стандартные виндузные. Если у вас имеются сторонние комопоненты, то придется их включить отдельно в список поддерживаемых (таскать с собой и подключать самому)
Для уменьшения размера также подходит опция для компилятора(подробности в интернетах):
И не забываем что дебаг и релиз версии из панели Project Manadger по размеру отличаются, благов в последних дельфитинах есть предустановки и достаточно выбрать релиз как опции выдерут из екзешника инфу для дебага, что уменьшит размер еще на порядок.
Последний раз редактировалось Tr0y; 07.12.2012 в 18:57.