Как уменьшить размер исполняемого файла
Обновлено: 21.11.2024
Несмотря на то, что дисковое пространство и оперативная память в настоящее время стоят очень дешево, исполняемые файлы меньшего размера позволяют лучше использовать кеш и могут работать быстрее. Кроме того, пользователи могут скачивать файлы через медленные модемы, а для платного хостинга пропускная способность сервера может быть сведена к минимуму.
Содержание
Общие советы
Для Windows
Библиотеки выпуска Win32, созданные Visual Studio, занимают около 1,2 МБ места в исполняемом файле при компиляции в режиме выпуска с параметрами по умолчанию. Агрессивно удаляя параметры из setup.h, можно уменьшить размер библиотеки примерно до 400 КБ и при этом иметь довольно функциональную библиотеку.
При использовании Visual Studio 2005, бесплатного набора инструментов MSVC .NET 2003 Toolkit или более ранних профессиональных выпусков Visual C++, которые поставляются с оптимизирующим компилятором, можно задать для оптимизации значение "Минимизировать размер" вместо "Максимально ускорить" (см. свойства проекта) .
Кроме того, если у вас большой опыт работы с C/C++ и вы не прочь покопаться в черной магии, вы можете удалить заглушки среды выполнения C и удалить другие библиотеки. Не забывайте о внешнем "C" _fltused; при использовании поплавков. Вам нужно сделать функцию для создания больших массивов (это часть исходного кода в стандартной библиотеке c, которая поставляется с MSVC).
См. «Агрессивная обрезка wxWidgets», где приведены некоторые примечания и цифры об уменьшении размера исполняемого файла в Windows для wxWidgets 2.6 и 2.8
Особенности GCC
Примеры и результаты
В следующих тестах использовался wx2.9, но общая тенденция сохраняется для всех версий wxWidgets и вообще для любого программного обеспечения!
Теперь давайте проверим параметры -ffunctions-sections и co:
Теперь давайте проверим параметр -Os (вместе с параметром -ffunction-sections):
Выводы
Тесты показали, что:
- вы всегда должны запускать strip --strip-all для конечного исполняемого файла (при условии, что вам не нужна информация о символах): одно это обычно дает улучшение на 20-30%
- если возможно, скомпилируйте все библиотеки, которые вы собираетесь статически связать в своей программе, с параметрами -ffunction-sections -fdata-sections -Os и не забудьте связать с параметром - Wl,--gc-sections опция; это дает улучшение на 30–50 %.
Сегодня существует так много больших и раздутых приложений, что большинство людей считают это нормальным и довольно охотно мирятся с низкой производительностью и необходимостью покупать большие жесткие диски.
В этом уроке я представлю все методы, которые я знаю (и использую) для уменьшения размера исполняемых файлов. Некоторые из этих методов могут быть применены к любому проекту C/C++ Win32, в то время как другие методы весьма ограничены в отношении типа приложения, к которому вы можете их применить. Я регулярно использую методы, описанные на этой странице, для создания крошечных исполняемых файлов — иногда менее 1 КБ!
Описанные здесь методы сосредоточены на уменьшении размера файла исполняемого файла. Они лишь частично уменьшают объем памяти (ОЗУ), требуемый программе. Если ваша программа использует много памяти для загрузки растровых изображений или анимации, то это совершенно другая проблема, которую можете контролировать только вы, программист.
Зависимость от сторонних библиотек
Если вы используете MFC, то понимаете, о чем я говорю. MFC (и многие другие фреймворки или библиотеки) по самой своей природе приводят к раздуванию кода. Это потому, что библиотеки имеют тенденцию быть общего назначения. Таким образом, даже если вы используете только небольшую часть того, что предлагает библиотека, вам придется использовать всю библиотеку. Если вы действительно хотите создать небольшой исполняемый файл, вам нужно стиснуть зубы и держаться подальше от таких фреймворков. Вы должны иметь полный контроль над тем, что компилируется в ваш исполняемый файл, а MFC не дает вам такого контроля. Перейдите к разделу настроек компилятора и компоновщика, чтобы попытаться свести к минимуму ущерб, который ваш проект MFC наносит вашему жесткому диску!
Отладка и выпуск сборки
Меня постоянно поражает количество людей, которые не понимают разницы между отладочной и окончательной сборкой своего приложения. Всегда распространяйте релизную версию вашей программы. В отладочной сборке много лишнего, что, хотя и помогает отладчику правильно выполнять свою работу, не приносит вам никакой пользы, если вы пытаетесь сохранить размер своей программы. Сборка выпуска, с другой стороны, имеет минимальное раздувание и оптимизирована, что всегда уменьшает размер кода.
Если вы действительно хотите включить отладочную информацию в сборку выпуска, настройте параметры компоновщика Visual Studio для использования внешней базы данных отладки, на которую ссылается исполняемый файл.
Статическое и динамическое связывание файлов библиотеки
Первое, что вы можете сделать, чтобы уменьшить размер исполняемого файла, — это использовать DLL-версию ваших стандартных библиотек. Это может быть библиотека DLL MFC (mfc42.dll) или версия DLL среды выполнения C (MSVCRT.DLL). В любом случае вы получите исполняемый файл меньшего размера.Однако у этого подхода есть недостатки. В какой-то момент вам все равно может понадобиться распространять исполняемую DLL (например, Win9x не включает MSVCRT.DLL),
Раньше я говорил, что лучше всего использовать статическую ссылку на вашу библиотеку времени выполнения, однако, поскольку Windows 95/98/ME почти мертва, мало причин не связываться с MSVCRT.DLL. Ваш исполняемый файл будет очень маленьким, и вы получите все преимущества использования всей среды выполнения C.
Среда выполнения C и библиотеки по умолчанию
Среда выполнения C – это набор функций и служб, о существовании которых вы, вероятно, даже не подозревали. Среда выполнения выполняет множество задач, которые требуются для реализации C или C++.
Возможно, вы заметили, что самая маленькая программа на C, которую вы можете написать в Visual Studio, обычно составляет около 20–30 КБ. Даже у крошечной программы «Hello, world» размер исполняемого файла не такой уж и маленький.
Это не ошибка компилятора или компоновщика. Он делает только то, что вы ему говорите. Обычная стандартная программа на C получает собственную копию среды выполнения C. Если вы не скажете компоновщику иначе, это то, что вы всегда получите. Следующая программа иллюстрирует не только приведенный выше пример «hello world», но и очень упрощенную схему того, что происходит во время запуска программы:
Если мы написали собственную минимальную версию среды выполнения C, то мы можем удалить этот дополнительный код и положиться на то, что операционная система сделает большую часть работы за нас. Через мгновение я расскажу вам, как удалить библиотеки по умолчанию из вашей программы, но есть несколько правил, которым вы должны следовать, если вы хотите это сделать.
В следующем списке перечислены некоторые задачи, которые выполняются за кулисами программы на C или C++: вам необходимо знать об этих задачах и о том, как писать программное обеспечение, которое не зависит от предоставляемых ими функций.< /p>
Управление кучей
Каждый раз, когда вы вызываете malloc , new[] , free или delete[] , диспетчер кучи за кулисами резервирует память операционной системы и пытается снизить фрагментацию памяти. Менеджер кучи на самом деле представляет собой просто набор функций, которые вызываются malloc, free и т. д. Однако вам НЕ НУЖЕН менеджер кучи. Если вы замените диспетчер кучи небольшими функциями, которые вызывают функции памяти Win32, вы сможете сэкономить много места в своей программе. Вы немного теряете производительность, но во всем, что вы делаете, всегда есть компромисс.
Код запуска
Если вы еще не знали, main очень редко бывает первой функцией, вызываемой во время жизни вашего исполняемого файла. В Visual C стандартная точка входа в приложение Windows называется WinMainCRTStartup, тогда как консольное приложение начинает свою жизнь с функции mainCRTStartup.
Эти функции точки входа выполняют множество задач до того, как будет вызвана ваша основная функция. Инициализация диспетчера кучи. Получение аргументов командной строки и помещение их в массив argv[]. Вызов вашей основной функции. Последней работой функции запуска является вызов ExitProcess. Без этого Windows продолжит выполнять случайный код в конце вашей программы, что, вероятно, приведет к сбою вашего компьютера.
Математические операции
Каждый раз, когда вы используете определенные операции с плавающей запятой или 64-битные целочисленные арифметические операции, соответствующая функция CRT будет автоматически включаться для выполнения фактических арифметических операций, если запрошенная операция не существует как часть набора инструкций Intel. Это может быть что-то столь же простое, как целочисленное деление (например, int a=b / 5 ) — если вы посмотрите на ассемблер, который компилятор генерирует для некоторых операций, подобных этим, вы можете ясно увидеть результирующую функцию. звонки.
Стандартные вызовы библиотеки
Всякий раз, когда вы вызываете printf , atoi , strcpy или любую другую функцию библиотеки C, эта функция связывается с вашим исполняемым файлом. Некоторые функции небольшие (strcpy, atoi и т. д.), но сложные функции, такие как printf, всегда добавят несколько килобайт в вашу программу. Если вы можете найти другие способы выполнения этих задач, вы можете уменьшить объем дополнительного кода, связанного с вашим приложением. Существует множество эквивалентов Win32 стандартных вызовов библиотеки C, которые вы можете использовать вместо них.
Инициализация статического объекта
Любая переменная или структура, определенная в глобальной области видимости (т. е. вне какой-либо функции), должна быть инициализирована при запуске программы, чтобы, когда ваши функции используют эти переменные, вы знали, что они содержат правильные значения. Эти переменные должны быть каким-то образом инициализированы, и компоновщик добавляет необходимый код среды выполнения C, чтобы сделать это за вас.
Обработка исключений C++
Бог знает, сколько лишнего кода добавляется при использовании обработки исключений. Если вы используете эту функцию, вам придется сократить свою работу, пытаясь уменьшить размер исполняемого файла. Если вам нужны небольшие программы, отключите обработку исключений.
Если вы решили удалить среду выполнения C из своих приложений, вам нужно быть очень осторожным при написании кода.Вы больше не можете полагаться на инициализацию статического объекта. Вызовы библиотеки C следует использовать с осторожностью, поскольку многие библиотечные функции должны быть правильно инициализированы в стандартном коде запуска. Вы не можете использовать new, delete, malloc или new, если только вы сами их не напишете.
Использовать эквиваленты Win32
Есть несколько стандартных функций C, которые имеют прямые замены в Windows API. Поскольку эти вызовы API находятся внутри операционной системы, это освобождает место в вашем исполняемом файле, которое могло бы быть использовано в противном случае. Использование вместо этого функций win32, очевидно, приведет к невозможности переноса, поэтому вам нужно решить, насколько сильно вы хотите уменьшить размер исполняемого файла. Вот список функций C и эквивалентная функция win32.
Стандартная функция | Эквивалент Win32 |
malloc | HeapAlloc< /td> |
бесплатно | HeapFree |
strcpy | lstrcpy | < /tr>
strcat | lstrcat |
strncpy | lstrncpy | strncat | lstrncat |
strlen | lstrlen |
strcmp | lstrcmp |
strcmpi | lstrcmpi |
memcpy td> | CopyMemory |
memset | FillMemory или ZeroMemory |
memmove | MoveMemory |
toupper | CharUpper |
tolower | CharLower |
isalpha | IsCharAlpha |
isalnum | IsCharAlphaNumeric |
islower | IsCharLower |
isupper | IsCharUpper |
sprintf | wsprintf |
vsprin tf | wvsprint |
На сайте Microsoft также доступен полный список, в котором перечислены дополнительные функции:
Существует небольшая группа функций, которые всегда доступны вам, даже если вы удалите библиотеки по умолчанию. Они называются внутренними функциями. Эти встроенные функции могут отличаться от версий стандартных библиотек и могут быть не такими оптимизированными. Если вы хотите использовать эти функции, всегда лучше включать соответствующие заголовки.
- memcmp, memcpy, memset
- strcmp, strcpy, strlen, strcat, strset
Удаление библиотеки времени выполнения C (RTL)
Это довольно просто. Просто нажмите «Игнорировать все библиотеки по умолчанию» на вкладке «Ссылка» в настройках вашего проекта или используйте параметр компоновщика /NODEFAULTLIB. Однако вы, вероятно, больше не сможете скомпилировать свой проект.
Visual C++ требует наличия трех функций (для обычной программы на C): __purecall , new и delete . Программа C требует malloc и free . Очевидно, что если вы не выделяете НИКАКОЙ памяти, то они вам не нужны. Вот минимальные реализации этих функций:
Остается только функция точки входа. Определите, какой из них требуется для типа исполняемого файла, который вы создаете. По крайней мере, ваша функция точки входа должна вызывать либо main WinMain, либо DllMain .
Дополнительная информация в MSDN
Есть две важные статьи, которые вам следует прочитать, если вы хотите понять больше. Я настоятельно рекомендую вам прочитать статью «Под капотом» за октябрь 1996 года, написанную Мэттом Питреком в журнале Microsoft Systems Journal. Эта статья была недавно обновлена и опубликована в январе 2001 г. в колонке «Под капотом» журнала MSDN. Перейдите сюда, чтобы прочитать эту статью в Интернете.
Вторая статья, которую вы должны прочитать, называется «Удалите жировые отложения из приложений с помощью наших 32-разрядных инструментов липосакции». Она также опубликована в журнале MSJ за октябрь 1996 года. Перейдите сюда, чтобы прочитать эту статью в Интернете.
Перейдите на домашнюю страницу Мэтта здесь.
После прочтения этих статей вам не нужно ничего делать, кроме как загрузить LIBCTINY Мэтта и связать его со своим приложением. Вам вообще не нужно менять настройки ссылки. Эта классная маленькая библиотека заменяет среду выполнения C по умолчанию и дает вам крошечные программы без каких-либо усилий. Большинство программ на этом сайте были скомпилированы и связаны с использованием этой библиотеки. Пример программы на этой странице включает LIBCTINY и показывает, как создать небольшую программу.
Используйте правильные настройки компилятора
Если вы не хотите удалять среду выполнения C или хотите сделать ее еще меньше, читайте дальше. Внимательное использование настроек компилятора и компоновщика может существенно повлиять на размер вашего приложения.
Если вы выбрали сборку Release для своего проекта, значит, вы на правильном пути. Однако есть несколько важных параметров, которые следует установить для всех исходных файлов.
Переключатель | Состояние | Описание |
/Og td> | on | Глобальная оптимизация. |
/Os | on | Отдавать предпочтение небольшому коду . |
/Oy | on | Нет указателей кадров. |
/ Zl | on | Предотвращает вставку компилятором ссылки defaultlib в каждый объектный файл, что приводит к неявной компоновке среды выполнения C. | /Gy | on | Включает связывание на функциональном уровне. Предотвращает включение неиспользуемых функций. |
/GX | off | Включает обработку исключений C++. Вам действительно не нужен этот набор, если вы стремитесь к небольшим исполняемым файлам. |
/GZ | off | Enable run- проверка времени для проверки стека вызовов |
Используйте правильные настройки компоновщика
Существует несколько аспектов структуры исполняемого файла, которые можно настроить с помощью параметров компоновщика. Компоновщик, который поставляется с Visual C++, очень мощный, и с правильными параметрами вы можете получить из него несколько удивительно маленьких программ.
Переключатель | Состояние | Описание |
/FILEALIGN: < em>номер | на | Недокументировано (только VC 6). Указано выравнивание каждого раздела в исполняемом файле, так как он хранится на диске. число указывается в байтах и должно быть степенью 2. Значение по умолчанию — 4096, но меньшее число приводит к меньшему размеру исполняемого файла, поскольку между разделами будет меньше отступов. Хотя здесь можно использовать очень маленькие числа, иногда исполняемый файл загружается неправильно, если выравнивание раздела меньше «безопасного» 512. |
/ALIGN: число | Н/Д | Определяет выравнивание каждого раздела в исполняемом файле, когда он отображается в памяти. Не имеет отношения к выравниванию файла (см. выше), но очевидная ошибка в Visual Studio приводит к тому, что этот параметр также влияет на выравнивание раздела файла, а также предполагаемое выравнивание раздела изображения при определенных обстоятельствах. По умолчанию 4096, лучше оставить это значение в покое. |
/NODEFAULTLIB | on | Предотвращает использование компоновщиком стандартная библиотека C. |
/ENTRY: function | on | Сообщает компоновщику имя функция, которая будет использоваться в качестве исполняемой точки входа. |
/OPT:NOWIN98 | on | Недокументировано. По существу то же самое, что и опция FILEALIGN. Возврат к выравниванию файла по 512 байт вместо выравнивания по умолчанию по 4096 байт. Этот параметр вызывает немного более медленное время загрузки, но меньшие исполняемые файлы. |
/MERGE: from=to | on | Эта опция объединяет первый раздел со вторым разделом, часто уменьшая размер исполняемого файла. Будьте осторожны с атрибутами чтения/записи раздела. |
/OPT:REF | on | Предотвращает функции и данные, которые никогда не используются от включения. |
/INCREMENTAL | off | Этот параметр включает добавочное связывание. Хотя это ускоряет время сборки вашей программы, это увеличивает размер исполняемого файла. |
/FORCE:MULTIPLE | ?? | Иногда полезно, когда вы возитесь с удалением кода запуска C. |
Кратко о параметрах компоновщика /FILEALIGN и /ALIGN. Игра с этими настройками по отдельности часто бывает достаточно хорошей. Вы можете значительно уменьшить размер исполняемого файла, установив /FILEALIGN:512 . Однако можно добиться некоторого волшебства, установив для /ALIGN и /FILEALIGN одно и то же значение. (Обратите внимание, что настройка /ALIGN в диалоговом окне Project->Settings также ошибочно влияет на настройку /FILEALIGN). (об этом я расскажу позже).
Управляйте своим стеком
Это малоизвестный факт, что Visual C++ автоматически вставляет так называемые «пробы стека» в ваш исполняемый файл, если обнаруживает (во время компиляции), что размер стека вашей программы превышает 1 размер страницы (4 КБ). ).
Если вы храните слишком много данных (т. е. буферов/массивов) в качестве локальных переменных в своих функциях, это часто приводит к вставке стековых зондов. Это не имеет большого значения — код предназначен для того, чтобы убедиться, что в стеке достаточно памяти во время выполнения. Тем не менее, он по-прежнему добавляет небольшой объем кода (например, функцию _chkstk), поэтому внимательное отношение к объему локальных данных в функциях может помочь устранить эти проверки.
Использовать исполняемый упаковщик
Исполняемый упаковщик или компрессор — это инструмент, который сжимает программу до минимума. По сути, они работают, сжимая исполняемый файл, который добавляется в качестве «полезной нагрузки» в очень маленькую заглушку декомпрессора. Когда вы запускаете упакованный исполняемый файл, вы на самом деле запускаете небольшую программу-распаковщик. При выполнении заглушка распаковывает прикрепленный (сжатый) исполняемый файл и запускает это. Никаких других внешних программ распаковки не требуется.
Недостаток этого метода заключается в том, что несколько копий вашей программы не будут использовать одну и ту же ячейку памяти, поэтому при запуске нескольких экземпляров требуется больше оперативной памяти.Однако для небольших программ исполняемый упаковщик может творить чудеса, иногда уменьшая размер исполняемого файла на целых 50%.
Самый маленький исполняемый файл Win32
Хорошо, давайте соберем воедино все, что описано в этом руководстве, и посмотрим, насколько маленьким может быть исполняемый файл. Следующая программа на C компилируется до крошечных 480 байт с использованием Visual C++ 6.0!!
Это довольно маленькая программа! Хорошо, это не очень много делает, и также выполняется только под NT/2K, но это просто показывает, что с небольшим пониманием того, как работает программа C, вместе с тем, как ваш компилятор и компоновщик генерируют двоичный файл вашего приложения , вы можете получить довольно впечатляющие результаты. Я понимаю, что от этой программы можно избавиться, может быть, на 100 байт дальше, но вам придется прибегнуть к языку ассемблера и шестнадцатеричному редактору, чтобы иметь возможность превзойти это решение, полностью написанное на C.
Заключение
Я представил несколько приемов, которые можно использовать для уменьшения размера исполняемых файлов. Эта тема может быть довольно сложной, особенно когда вы начинаете использовать некоторые из более мощных настроек компилятора и компоновщика. Однако для создания небольших программ вам нужно выполнить всего два шага.
Выполняйте только эти две вещи, и вам не нужно беспокоиться о большей части того, что я представил. Я гарантирую, что вы получите результат! Загрузите образец приложения hello-world, чтобы узнать, как начать работу.
Я практически всегда использую его во всем, что делаю.
хотя я бы не рекомендовал вам менять точку входа "/ENTRY:main". Избегайте этого, если ваше приложение использует командные строки или использует параметры из WinMain или DllMain. Считайте это предупреждением.
Вы также должны использовать библиотеку LibcTiny Мэтта Питрека.
Во-первых, исполняемый файл встроенного выпуска зависит от msvrct.dll (сборка с vc++ 6.0) или msvcr71.dll (сборка с vc++ 2003) и т. д.
Во-вторых, исполняемый файл имеет размер около 3 КБ, но его все же можно уменьшить примерно до 1 КБ.
Итак, исходный код такой:
Создайте решение, тогда готовый исполняемый файл релиза будет иметь размер всего 1 КБ и не будет зависеть от библиотеки времени выполнения c.
Кстати, MFC немного уменьшает размер, но все же недостаточно хорошо.
Большое спасибо, мой исполняемый файл уменьшился до 24 с 56 КБ, иначе мой клиент был бы убит.
Еще раз спасибо, я очень счастлив.
Привет, Mazy,
И извините за опоздание, я получал уведомления, но не мог заняться вашей проблемой, так как был занят своей работой. Кажется, вам трудно уменьшить размер вашего exe-файла.
Ну, во-первых, эта статья написана для разработчиков studion 6.0. Я еще не пробовал эти варианты в ВК 7, поэтому ничего не могу сказать по этому поводу. Во-вторых, эти варианты не окажут существенного влияния на проекты МФЦ. В-третьих, эти параметры работают только для выпускных сборок, а не для отладочных сборок.
Пожалуйста, убедитесь, что вы не пытаетесь выполнить работу, выходящую за рамки этой статьи.
Я применил предложенные изменения к небольшой консольной программе из 50 строк для создания жестких ссылок NTFS 2000, и размер был уменьшен с 28 КБ (настройки выпуска по умолчанию) до 3 КБ.
Я просмотрел информацию о /ALINGN, и действительно, в документации указано, что по умолчанию установлено значение 4k. Однако удаление этой директивы увеличило размер исполняемого файла с 3 КБ до 16 КБ.
здесь вы можете найти очень хороший инструмент для сжатия исполняемых файлов, dll, ocxs и т. д.
Общие Новости Предложение Вопрос Ошибка Ответ Шутка Похвала Rant Admin
Используйте Ctrl+Влево/Вправо для переключения сообщений, Ctrl+Вверх/Вниз для переключения тем, Ctrl+Shift+Влево/Вправо для переключения страниц.
Дата присоединения к гиперактивному участнику: декабрь 2001 г. Местоположение In u'r Heart Posts 482
Как уменьшить размер исполняемого файла.
Привет,
Размер исполняемого файла в моем проекте составляет около 3 МБ. Я не думаю, что хорошо иметь такой большой exe-файл. Он подвержен сбоям. Я прав? Любые предложения, пожалуйста. Как уменьшить его размер?
Заранее спасибо,
Анита
Дата регистрации: сентябрь 2002 г. Местоположение: Китай Сообщений: 55
удалить вставку изображений в формы (gui)
удалить нежелательный код/комментарии
интегрировать свои циклы/функции/процедуры
сохранить изображения во внешних файлах / файле res также увеличить размер файла размер
полностью следовать стандартам кодирования
Наконец-то используйте утилиту сжатия exe для сжатия вашего exe! (это не нормальное сжатие
Дата присоединения к гиперактивному участнику: декабрь 2001 г. Местоположение In u'r Heart Posts 482
Первоначально опубликовано soothu kusu
удалить вставку изображений в формы (gui)
удалить нежелательный код/комментарии
интегрировать свои циклы/функции/процедуры
хранить изображения во внешних файлах / файле res, а также увеличивать размер файла
полностью следовать стандартам кодирования
Наконец-то используйте утилиту сжатия exe для сжатия вашего exe! (это не нормальное сжатие
Конечно, я сделал все это заранее. Но мой проект — большой проект, в котором много форм, данных, изображений и т. д. Ну… здесь я не использовал res-файлы.
В любом случае, я думаю, что могу сделать dll каждой формы, так что сторона значительно уменьшится. Может у кого есть идеи как это сделать?
Кроме того, как я могу сжать исполняемый файл, как сказал "soothu kusu"?
Дата присоединения к Addicted Member: июнь 2001 г. Место, Индия Сообщения 234
Что ж, один из способов уменьшить размер EXE-файла — сжать его с помощью упаковщиков EXE-файлов, таких как NeoLite, Armadillo и т. д. Вы можете найти их в Google.
Эти программы значительно сожмут ваш EXE-файл, и ваш EXE-файл будет выглядеть как обычный EXE-файл. Когда вы запустите его, произойдет распаковка в оперативной памяти, и ваша программа будет работать нормально.
Кроме того, чтобы уменьшить размер EXE-файла, вы выбрали для параметра проекта значение "Small Code", которое запрашивается непосредственно перед созданием EXE-файла в VB.
Читайте также: