Отправляет email-рассылки с помощью сервиса Sendsay

Web-Мастеринг - с нуля до профи

  Все выпуски  

нет.


Информационный Канал Subscribe.Ru


Познавательное программирование



Выпуск 10


Здравствуйте, Уважаемые подписчики!

Если два сообщения, посылаемые к разным объектам, похожи, но не одинаковы,
то вам может подойти слегка более общее компромиссное, которое сможет работать и в том, и в другом месте.
- Ален И. Голуб.


Наши друзья:

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++ без потери функциональности вообще. Сразу скажу, что недостатки есть и у этого способа - их два:

  1. Программа будет требовать наличие на компьютере динамической библиотеки "msvcrt.dll".
  2. Размер программы будет несколько больше, чем в первом способе.

Про первый недостаток теоретически можно забыть, т.к. msvcrt.dll является стандартной библиотекой Windows и входит, например, в Service Pack 1 для Windows XP.

Второй недостаток неустраним, но размер программы не очень сильно увеличивается по сравнению с первый способом. Но тем не менее, именно из-за него эта статья не заменяет предыдущую, а является ее продолжением. Если у Вас когда-нибудь возникнет необходимость написать самую минимальную программу на VC++, какую только возможно или же там, где она будет работать, по каким-либо причинам нет msvcrt.dll, то первая часть статьи - это то, что Вам нужно.

Итак, начнем. Запускаем Visual C++ и выбираем тип проекта, который мы хотим создать. Пусть это будет "Win32 Application" типа "Hello World!". Когда проект будет готов выполним следующие действия:

  1. Выберем текущей версией Release (меню "Build", "Set Active Configuration").
  2. Откроем свойства проекта ("Project", "Settings...").
  3. Выберем закладку "Link" и категорию "Input" или "General".
  4. Установим пометку "Ignore all default libraries" и очистим строку "Object/library modules".
  5. Добавим в строку "Object/library modules" следующие библиотеки (разделяя имена пробелом): "kernel32.lib user32.lib msvcrt.lib". Первая и вторая содержат описания функций, находящихся в kernel32.dll и user32.dll, а вот третья и есть та самая msvcrt.dll, про которую было написано ранее.
  6. В поле ввода "Project Options", где показаны текущие параметры вызов линкера, в самый низ допишем следующую строку: "/ALIGN:4096" без кавычек, отделив ее от последнего символа уже имеющихся параметров пробелом.

Все. Программа готова к использованию. Компилируем (получаем сообщение "LINK : warning LNK4108: /ALIGN specified without /DRIVER or /VXD; image may not run", о котором написано в первой части статьи) и смотрим получаемый объем: 6656. Вот так - 6,5 кб для программы, которая создает главное окно и еще иногда диалог "О программе".

Да, забыл сказать, теперь вы можете использовать в программе как все функции ANSI C++, так и try .. catch, ну и все остальное!

Автор статьи:
Bob Johnson
BobJohn@NewMail.ru
http://www.bobjohnson.nm.ru/



Все вопросы и пожелания ведущему рассылки, прошу слать на e-mail: urisff@inbox.ru
Все статьи публикуются здесь только с разрешения (или рекомендации) автора.
В случае, если вы будете использовать приведённые в этой рассылке коды, не забудьте сделать ссылку.

Ведущий рассылки:
Набатников Иван (urisff@inbox.ru)
http://newff.narod.ru/


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное