Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Оптимизация размера программ (EXE)

Автор: vito333
Дата сообщения: 02.02.2005 12:16
Создание программ на чистом WIN32API в DELPHI
ГОТОВЫЕ БИБЛИОТЕКИ
http://lenininc.narod.ru/win32api.html
Автор: WELLROCK
Дата сообщения: 03.02.2005 03:21
Уроки Iczelion'а (пер. Aquila) - Win32 API на ассемблере.
http://wasm.ru/publist.php?list=1
Автор: Vicenzo
Дата сообщения: 03.02.2005 10:18
Здравствуйте. Очень заинтересовала эта тема.
Выше была полемика о смысле сжатия, смысл сжатия такой: чем меньше будет весить троян во вложении, тем быстрее и вероятнее его примет пользователь...

[Упаковщики]
Сжать UPXом или PECompactomом можно успеть всегда. Для начала я пытаюсь разобраться с остальными методами. Скорость работы в моём случае не важна, важен лишь размер.

[Компилятор]
Скомпилил простой HeloWorld (win32), где заюзан один единственный windows.h и 2 функции из него, в Debug прога получилась 109 Кб, в Release - 22 Кб. Весомое уменьшение. (использую Visual C++ .NET)
На VC++ перешёл недавно и еще не знаю всех тонкостей компилятора. Подскажите, пожалуйста, как его настроить для достижения минимального размера ехе на выходе (быстродействие не интересует). Может какие директивы специальные...

[Исходный код]
Есть идея: не юзать весь windows.h, а повыдёргивать из него только то, что используется, весьма трудоёмкое занятие, но стоит ли овчинка выделки? Это поможет?

[Другие методы]
Есть ли другие подходы к сжатию. Реально ли добиться 8 - 10 Кб на выходе (в простом HeloWorld32)?
Автор: WELLROCK
Дата сообщения: 03.02.2005 10:23
Реально прочитать Уроки Iczelion'а и получить троя весом килобайт в 5 (после упаковки).
P.S. На MS VC не пишу %)
Автор: vito333
Дата сообщения: 04.02.2005 09:41
Vicenzo
HelloWord32 может иметь размер 1кб.
для начала сходи по первой ссылке первого поста этой темы. после спрашивай.
-------------------------------------------

Кстати, обновился до 0.93 Peid.


-------------------------------------------

WCRT is a small C runtime library for Visual C++, which implements parts of its functionality through calls to the Win32API. It is meant as a replacement for the Visual C runtime library (libc.lib) for small projects. Source included.
http://www.ibsensoftware.com/download.html

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

Добавлено:
пишу на MSVC++
Автор: WELLROCK
Дата сообщения: 04.02.2005 09:49

Цитата:
использование подобных С-рантаймов позволяет легко и прозрачно уменьшить размер программы

Только вот mfc-шных либ на компе может и не быть. И тогда проги не запустятся.
А на асме прога запустится везде
Автор: Vicenzo
Дата сообщения: 04.02.2005 11:03
Вот к чему привели эксперементы:
Добился уменьшения размера ехе этой проги с 22 Кб до 2 Кб (!) (компилятором MSVC), что ~ приблизительно на 500 байт больше чем аналогичная, скомпиленая на MASM32 (8.2).

WELLROCK, MASM конечно вещь хорошая, но на С++ оно как-то всё быстерее пишется, и проще

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

Директивы:
#pragma comment(linker, "-merge:.rdata=.text")
#pragma comment(linker, "-merge:.data=.text")
#pragma comment(linker, "-nodefaultlib") // не кидать в мой ехе кучу хлама

Еще не тестил на других машинах. Будет ли работать мой ехе с такими параметрами сборки без сторонних либ и всяких там runtime librarys на других машинах?
Автор: vito333
Дата сообщения: 04.02.2005 11:04
эээ брат, не путай, эта библиотека не завязана на MFC, только на WinAPI.
Я ее уже посмотрел - супер, это улучшенная версия LIBCTINY.LIB от Мэтта Питрека, гораздо обширнее и мощнее, плюс не дает никаких warnings при компиляции. В общем я тут же из своего проекта libctiny.lib убрал и вставил эту.
Рекомендую, в общем.
Автор: WELLROCK
Дата сообщения: 04.02.2005 11:40
Хм. Надо будет попробовать.
Автор: vito333
Дата сообщения: 04.02.2005 13:42
Vicenzo
эта прога - будет. А вообще использование

Цитата:
#pragma comment(linker, "-nodefaultlib")

доставит много сложностей при более-менее развитой программе.
Но в целом - действуешь верно. Будут вопросы - спрашивай.
Автор: vito333
Дата сообщения: 08.02.2005 11:41
Сборка очень маленьких программ в Borland C++ Builder (06-май-2003)
http://devnvd.narod.ru/Files/LittleTask.htm


Добавлено:
Как пережить release-версию
-----------------------------------
Отлично, ваша программа работает. Вы протестировали все, что возможно. Пришло время выпускать продукт. И вы собираете финальную версию.
И тут все рассыпается в прах.
Вы получаете ошибки доступа к памяти, диалоги не появляются, контролы не работают, результаты выводятся неправильно - появляется либо часть, либо все эти проблемы. Плюс несколько дополнительных проблем, специфических для вашего приложения.
И что теперь?
Именно этому целиком посвящен данный обзор.
-----------------------------------
http://rsdn.ru/article/vcpp/survrls.xml?print


Добавлено:
Optimization: Your Worst Enemy
http://www.flounder.com/optimization.htm
Автор: vito333
Дата сообщения: 14.02.2005 07:17
WinAPI Wrapper Library
http://winapi.chris.dragan.name/winapi.web
набор классов-оболочек для WinAPI.
Всего один .Н файл. Но супер .
Очень тонкая оболочка над основными элементами апи - интерфейс (почти весь - окна, комбобоксы, прогрессбары и пр.) и некоторые другие вещи (file, time и пр.).
Не добавляет к возможностям винапи ничего своего, только "заворачивает" то что есть в удобную форму.
В отличие от других подобных библиотек при установке ставит также хелп и визардов для быстрого создания скелета приложения, причем скелет будет не стандартным для АПИ С-подобным, а "классовым" и очень понятным. Возможен режим PURE_WRAPPER - тогда к "классовому" стилю добавляется обработка сообщений почти в С-стиле.
Несмотря на АПИшность при сборке в МС студии цепляется CRT startup code (это нормально) - размер скелета - 25-50 кб, но код чисто АПИшный. Можно собрать крошечный код - от 4 кб (при установке ставятся несколько примеров, в т.ч. один - 4 кб).
Визард позволяет за минуту создать полноценное приложение, вставить в готовую процедуру свою обработку события и вуаля!
В общем, я еще не видел ничего подобного и сейчас активно тестирую.
Использую обрезание стартового кода CRT (библиотека выше - WCRT).
Скелет МДИ приложения с меню, работающими несколькими кнопками на тулбаре, ребаром (на котором тулбар и два комбобокса) в стиле ХР - получился 11 кб. Повозиться поначалу пришлось немного с парой ошибок из-за обрезания стартового кода.
Теперь на такой скелет уйдет минуты 3-4. Когда я делал МДИ интерфейс на винапи руками - потратил просто немерянно времени(не часы и не дни), и то он не дотягивает развитостью ребара.
Самое главное - библиотека не заменяет ни winapi, ни MFC, а может работать совместно с чем угодно!
Автор: vito333
Дата сообщения: 15.02.2005 08:11
интересный примерчик крошечной программы
-----------------------------

Код:

#define STRICT
#define WIN32_LEAN_AND_MEAN

#include <windows.h>
#include <tchar.h>
#include <assert.h>

void CenterText(HDC hDC, int x, int y, LPCTSTR szFace, LPCTSTR szMessage, int point)
{
HFONT hFont = CreateFont(- point * GetDeviceCaps(hDC, LOGPIXELSY) / 72,
0, 0, 0, FW_BOLD, TRUE, FALSE, FALSE,
ANSI_CHARSET, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS,
PROOF_QUALITY, VARIABLE_PITCH, szFace);
// assert(hFont);

HGDIOBJ hOld = SelectObject(hDC, hFont);

SetTextAlign(hDC, TA_CENTER | TA_BASELINE);

SetBkMode(hDC, TRANSPARENT);
SetTextColor(hDC, RGB(0, 0, 0xFF));
TextOut(hDC, x, y, szMessage, _tcslen(szMessage));

SelectObject(hDC, hOld);
DeleteObject(hFont);
}

const TCHAR szMessage[] = _T("Hello, World");
const TCHAR szFace[] = _T("Times New Roman");

#pragma comment(linker, "-merge:.rdata=.text")
#pragma comment(linker, "-align:512")

extern "C" void WinMainCRTStartup()
{
HDC hDC = GetDC(NULL);
// assert(hDC);

CenterText(hDC, GetSystemMetrics(SM_CXSCREEN) / 2,
GetSystemMetrics(SM_CYSCREEN) / 2,
szFace, szMessage, 72);

ReleaseDC(NULL, hDC);
ExitProcess(0);
}
Автор: vito333
Дата сообщения: 16.02.2005 14:53
кстати, может возникнуть вопрос - а зачем эта библиотека, если есть WTL, которая считается "тонкой" оболочкой над winapi.

так вот я попробовал применить "обрезание CRT" к аналогичной указанной выше проге (MDI, меню, тулбар(ребар), статусбар), скелет которой сбацал на WTL (wizard-ом) - ничего не вышло, слишком сложно, я не смог. Минимальный размер, которого я смог добиться - 66 кб. Против 16-17 на WinApi Wrapper Library.

Хотя конечно, все эти изыски - для маньяков

Добавлено:
надо отметить, что скелет на WTL выглядел чуть лучше за счет значков в меню.

Добавлено:
нда, на самом деле ситуация с размером скедета на WinApi Wrapper еще лучше ))) - размер 11 кб! Я не увидел, что по умолчанию вставляется набор иконок весом 4.5 - 5 кб.
Автор: vito333
Дата сообщения: 23.02.2005 15:51
возник у меня вопрос - возможно ли сейчас EXE сделанный например в VС++ .NET как нибудь перевести в формат COM? ранее вроде можно было чего-то такое учинить с помощью утилит EXE2BIN и т.п. А вот как сейчас с этим дело обстоит?
Автор: MoKC0DeR
Дата сообщения: 23.02.2005 16:12
vito333
Нет нельзя. В com можно перевести только файлы ориентированные на ДОС. Если ты на VC++ .NET пишешь для дос -> то возможность (пусть и не большая) перевести в COM есть.
Можно попробывать сменить расширение с exe на com, но при этом формат не изменится
Автор: Varenik
Дата сообщения: 24.02.2005 07:07
Более того, COM файлы могут быть только меньше 64k
Автор: vito333
Дата сообщения: 10.03.2005 15:19
в общем вопрос по СОМ-файлам под Win32 закрыт
Автор: vito333
Дата сообщения: 14.03.2005 05:41
по поводу WinAPI Wrapper Library - выше которая.
В процессе работы с ней малость подправляю, так что если кого заинтересует, пишите - исправления мелкие, но нужные.
Автор: vito333
Дата сообщения: 01.04.2005 11:40
попробовал Pelles C компилятор-IDE
интересный и легкий продукт.
Для мелких утилиток очень хорош.
Позволяет выравнивать ЕХЕ на любую величину, а не только на 0x200 - минимум для MS VC++ 7. Совместимость должна при этом страдать, но на вин2к такие проги у меня запустились.
Автор: vito333
Дата сообщения: 18.04.2005 02:22
недавно вышел новый китайский суперпакер WinUpack 0.25 beta
http://dwing.go.nease.net/
на текущий момент превосходит в целом все остальные пакеры ЕХЕ файлов, проигрывая только FSG и MEW на крошечных файлах 10-15 кб.

например на файле 78 кб выиграл 4 кб у UPX, 5 кб у FSG, ну и т.д.

но некоторые антивири пока ругаются на него. Каспер - молчит.
Автор: vito333
Дата сообщения: 29.04.2005 04:03
WinUpack обновился до 0.26 beta.
Необходимо отметить, что некоторые антивирусы ругаются или конфликтуют с программами, им упакованными.
Автор: vito333
Дата сообщения: 07.05.2005 13:22
необходимо учитывать, что библиотека WCRT сделана с целью минимизации кода, а некоторые функции, в ней реализованные, намного медленнее по скорости, при том, что размер совершенно не сэкономлен. Например реализованная в WCRT функция memcpy в 2.1 - 2.2 раза медленнее микрософтовской и в своей программе при использовании этой библиотеки лучше использовать M$ memcpy.
Автор: vito333
Дата сообщения: 14.05.2005 12:42
WinUpack обновился до 0.27 beta.

Добавлено:
DWinLib - A minimal Windows API wrapper

http://www.codeproject.com/library/DWinLib.asp



Велоспорт вчера, сегодня, завтра, или В поисках "Идеальной Библиотеки"
http://www.rsdn.ru/forum/Message.aspx?mid=1143827&only=1
Автор: vito333
Дата сообщения: 09.06.2005 12:06
How Big Is My Program?
http://www.flounder.com/howbig.htm
Автор: vito333
Дата сообщения: 10.06.2005 00:25
программа Hello World!, размер 560 байт, компилятор - Pelles C
http://vito.rbcmail.ru/Misc/Micro.exe
Автор: vladgri
Дата сообщения: 10.06.2005 07:22

http://rsdn.ru/File/41945/minidelphi.rar
Автор: vito333
Дата сообщения: 11.06.2005 12:22
vladgri
а готовый ЕХЕ можно сразу в архив добавить для наглядности?

Добавлено:
и заодно ссылка из этого архива - создание интро 4К на Delphi
http://scene.migeel.sk/intro4k.html
Автор: vladgri
Дата сообщения: 13.06.2005 06:01
http://rsdn.ru/File/41945/minidelphie.rar
Автор: vito333
Дата сообщения: 13.06.2005 06:25
com-файлы у меня не запускаются (ХР сп2)

Страницы: 1234567

Предыдущая тема: Интересные ИСХОДНИКИ на Delphi


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.