Если два сообщения, посылаемые к разным объектам, похожи, но не одинаковы,
то вам может подойти слегка более общее компромиссное, которое сможет работать и в том, и в другом месте. - Ален И. Голуб.
Наши друзья:
rest.interesting.znakomstvonew - Рассылка "Как познакомиться?" - обсуждаются различные проблемы взаимоотношений, имеется клуб знакомств и дискуссии с психологом.
Как написать программу
на Visual C++ размером 8 Кб? Часть 2.
by Bob Johnson.
Раньше я описал способ, с помощью которого можно
создавать программы размером 4 - 8 килобайт не только с помощью ассемблера,
но и с помощью достаточно популярной среды программирования Visual C++.
При этом сохраняются практически все преимущества языка С++ и получаются программы,
размер которых не уступает ассемблеру. Если Вы еще не знакомы с этим способом,
рекомендую прочитать его.
Но, как я уже сказал, сохраняются практически все достоинства языка С++.
Вот чем приходится жертвовать:
динамические переменные с использованием стандартных средств C++ таких как new и delete;
применение классов;
обработка исключений встроенными в VC++ средствами;
стандартные функции (printf и т.д.).
Т.е. мы оказываемся в ситуации близко сравнимой с программированием на ассемблере -
все, что мы можем использовать - это API функции + синтаксис языка С++.
Предположу, что многих (особенно тех, кто программировал на ассемблере под Windows)
такая ситуация вполне устроит, потому как если стоит задача написания простой
и небольшой программы, от которой не требуется сверхвысокой скорости,
то использование С++ вместо ассемблера позволит значительно сократить время
написания такой программы. Но если же программа должна совмещать в себе и
небольшой объем, и значительную функциональность, то ограничения,
накладываемые моим способом, могут быть уже неприемлемы (например,
использование классов - многие задачи рассчитаны на классы и динамические переменные,
и уже существуют алгоритмы такого их решения).
Казалось бы, придется мириться с завышенным объемом получаемой программы,
т.к. ничего другого не остается. Но! Я еще раз убедился, что все гениальное просто...
Когда около года назад я обнаружил способ создавать минимальные программы на VC++
отключая все стандартные библиотеки, я остался очень доволен. Настолько,
что перестал даже рассматривать какое-либо альтернативное решение этого вопроса.
Причиной этому было то, что изучение Windows API я начал не с Visual C++,
а с ассемблера, и первая (да и десятая, и двадцатая) программа под Windows
была написана именно на нем. Когда же я начал писать на С++, мне, конечно,
вполне хватало API функций и SEH Windows, чтобы решать все задачи,
которые возникали в то время.
Но в конце концов оказалось, что прекращать работать в направлении
минимизации программы без потери функциональности не стоило,
хотя пришел я к такому выводу только сейчас. Потому что теперь я обнаружил способ,
как создавать небольшие программы на VC++ без потери функциональности вообще.
Сразу скажу, что недостатки есть и у этого способа - их два:
Программа будет требовать наличие на компьютере динамической библиотеки "msvcrt.dll".
Размер программы будет несколько больше, чем в первом способе.
Про первый недостаток теоретически можно забыть, т.к. msvcrt.dll является
стандартной библиотекой Windows и входит, например, в Service Pack 1 для Windows XP.
Второй недостаток неустраним, но размер программы не очень сильно увеличивается
по сравнению с первый способом. Но тем не менее, именно из-за него эта статья
не заменяет предыдущую, а является ее продолжением. Если у Вас когда-нибудь
возникнет необходимость написать самую минимальную программу на VC++,
какую только возможно или же там, где она будет работать, по каким-либо причинам
нет msvcrt.dll, то первая часть статьи - это то, что Вам нужно.
Итак, начнем. Запускаем Visual C++ и выбираем тип проекта, который мы хотим создать.
Пусть это будет "Win32 Application" типа "Hello World!".
Когда проект будет готов выполним следующие действия:
Выберем текущей версией Release (меню "Build", "Set Active Configuration").
Откроем свойства проекта ("Project", "Settings...").
Выберем закладку "Link" и категорию "Input" или "General".
Установим пометку "Ignore all default libraries" и очистим строку "Object/library modules".
Добавим в строку "Object/library modules" следующие библиотеки (разделяя имена пробелом):
"kernel32.lib user32.lib msvcrt.lib". Первая и вторая содержат описания функций,
находящихся в kernel32.dll и user32.dll, а вот третья и есть та самая msvcrt.dll, про которую было написано ранее.
В поле ввода "Project Options", где показаны текущие параметры вызов линкера,
в самый низ допишем следующую строку: "/ALIGN:4096" без кавычек,
отделив ее от последнего символа уже имеющихся параметров пробелом.
Все. Программа готова к использованию. Компилируем (получаем сообщение
"LINK : warning LNK4108: /ALIGN specified without /DRIVER or /VXD; image may not run",
о котором написано в первой части статьи) и смотрим получаемый объем: 6656.
Вот так - 6,5 кб для программы, которая создает главное окно и еще иногда диалог "О программе".
Да, забыл сказать, теперь вы можете использовать в программе как все функции ANSI C++,
так и try .. catch, ну и все остальное!
Все вопросы и пожелания ведущему рассылки, прошу слать на e-mail: urisff@inbox.ru
Все статьи публикуются здесь только с разрешения (или рекомендации) автора.
В случае, если вы будете использовать приведённые в этой рассылке коды, не забудьте сделать ссылку.