- •6 Глава 1
- •12 Глава 1
- •14 Глава 1
- •16 Глава 1
- •18 Глава 1
- •20 Глава 1
- •22 Глава 1
- •24 Глава 1
- •26 Глава 1
- •31 Глава 1
- •34 Глава 2
- •36 Глава 2
- •Puc. 2.4. Дополнительные опции консольного приложения Win32
- •38 Глава 2
- •40 Глава 2
- •42 Глава 2
- •44 Глава 2
- •48 Глава 2
- •50 Глава 2
- •52 Глава 2
- •54 Глава 2
- •56 Глава 2
- •58 Глава 2
- •60 Глава 2
- •62 Глава 2
- •64 Глава 2
- •66 Глава 2
- •68 Глава 2
- •70 Глава 2
- •74 Глава 2
- •76 Глава 2
- •79 Глава 2
- •82 Глава 2
- •84 Глава 2
- •86 Глава 2
- •88 Глава 2
- •92 Глава 2
- •94 Глава 2
- •96 Глава 2
- •98 Глава 2
- •103 Глава 2
- •105 Глава 2
- •107 Глава 2
- •110 Глава 2
- •115 Глава 3
- •119 Глава 3
- •121 Глава 3
- •123 Глава 3
- •125 Глава 3
- •129 Глава 3
- •131 Глава 3
- •133 Глава 3
- •139 Глава 3
- •141 Глава 3
- •143 Глава 3
- •145 Глава 3
- •148 Глава 3
- •150 Глава 3
- •155 Глава 3
- •165 Глава 4
- •168 Глава 4
- •170 Глава 4
- •173 Глава 4
- •175 Глава 4
- •178 Глава 4
- •184 Глава 4
- •186 Глава 4
- •188 Глава 4
- •190 Глава 4
- •192 Глава 4
- •194 Глава 4
- •198 Глава 4
- •201 Глава 5
- •203 Глава 5
- •205 Глава 5
- •207 Глава 5
- •213 Глава 5
- •217 Глава 5
- •219 Глава 5
- •221 Глава 5
- •223 Глава 5
- •225 Глава 5
- •227 Глава 5
- •232 Глава 5
- •234 Глава 5
- •236 Глава 5
Программирование в Visual С++ 2005
Программировать под Windows вовсе не трудно. Фактически Microsoft Visual С++ 2005 делает этот процесс изумительно легким, и вы убедитесь в этом, прочитав эту книгу. Есть лишь одно препятствие на этом пути: прежде, чем обратиться к специ- фике программирования Windows, вы должны быть хорошо знакомы со средствами языка программирования С++, в частности, с его объектно-ориентированными аспек- тами. Техника объектно-ориентированного программирования является ключом к эф- фективности всех инструментов среды Visual С++ 2005, используемых при создании программ для Windows, поэтому очень важно, чтобы вы добились хорошего ее пони- мания. Именно на это и нацелена настоящая книга.
Данная глава предлагает обзор важнейших концепций, касающихся программиро- вания приложений на языке С++. Мы проведем для вас краткий экскурс в интегриро- ванную среду разработки (Integrated Development Environment — IDE), поставляемую вместе с Visual С++ 2005. Эта среда проста и интуитивно понятна во всех своих опера- циях, поэтому, начав ею пользоваться, вы сможете очень быстро овладеть большин- ством ее возможностей. Лучший подход к изучению среды разработки — пройти весь процесс создания, компиляции и исполнения простой программы. Прочитав эту гла- ву, вы изучите следующие вопросы.
-
Из каких основных компонентов состоит Visual С++ 2005?
-
Из чего состоит среда .NET Framework, и каковы ее преимущества?
-
Что такое решение и проект, и как их создавать?
-
Что собой представляют консольные программы?
-
Как создавать и редактировать программы?
-
Как компилировать, компоновать и исполнить консольную программу на С++?
-
Как создать и выполнить базовую программу Windows?
Итак, включайте свой ПК, запускайте Windows, загружайте могучий Visual С++ 2005 и начинайте путешествие.
Среда .NET Framework
.NET Framework — центральная часть Visual С++ 2005, как и всех прочих средств разработки .NET компании Microsoft. Среда .NET Framework состоит из двух эле- ментов: общеязыковой исполняющей среды (Common Language Runtime — CLR), в которой выполняются ваши программы, и набора библиотек, называемых библи- отеками классов .NET Framework. Библиотека классов .NET Framework обеспечивает функциональную поддержку, которая необходима вашему коду при выполнении под управлением CLR, независимо от применяемого языка программирования, поэтому программы .NET, написанные на С++,С# или любом другом языке, поддерживающем .NET Framework, используют одни и те же библиотеки .NET.
Существуют два принципиально отличающихся вида приложений С++, которые можно разрабатывать в Visual С++ 2005. Вы можете писать приложения, которые вы- полняются на вашем компьютере как "родные" (native). Эти программы будем назы- вать родными программами С++. Такие программы пишутся на версии языка С++, определенной стандартом ISO/ANSI. Вы также можете разрабатывать программы, выполняющиеся под управлением CLR и реализованные с помощью расширенной версии С++, которая носит название C++/CLI. Эти программы мы будем называть программами CLR, или программами C++/CLI.
.NET Framework не является частью Visual С++ 2005, а скорее компонентом опера- ционной системы Windows, который облегчает построение приложений и Web-служб. Каркас .NET Framework представляет ощутимые преимущества в отношении надеж- ности кода и безопасности, а также возможностей интегрирования вашего кода С++ с кодом, написанным на более чем 20 других языках программирования, ориентиро- ванных на .NET Framework. Некоторым недостатком ориентации на .NET Framework является незначительное снижение производительности, которое в большинстве слу- чаев вообще незаметно.
Общеязыковая исполняющая среда (CLR)
CLR — это стандартизованная среда выполнения программ, написанных на ши- роком диапазоне высокоуровневых языков, включая Visual Basic, С# и, разумеется, С++. Спецификации CLR в настоящее время встроены в стандарт ЕСМА (European Association for Standardizing Information and Computer Systems — Европейская ассоци- ация по стандартизации информационных и вычислительных систем) инфраструк- туры общего языка (Common Language Infrastructure — CLI) — ECMA-335, а также в аналогичный стандарт ISO — ISO/TEC 23271, поэтому CLR представляет собой реа- лизацию этого стандарта. Вы видите, почему С++ для CLR называется С++/CLI — это С++ для CLI, поэтому весьма вероятно, что со временем вы будете иметь дело с ком- пиляторами С++/CLI для других операционных систем, которые реализуют CLI.
Обратите внимание, что информация о стандартах ЕСМА доступна на сайте http: // www. ecma-international. org, а стандарт ECMA-335 в настоящее время доступен для бесплатной загрузки.
CLI — это, по сути, спецификация среды виртуальной машины, которая позволя- ет приложениям, написанным на разнообразных высокоуровневых языках програм-
мирования, выполняться в различных системах без изменения и перекомпиляции оригинального исходного кода. CLI специфицирует стандарт промежуточного языка виртуальной машины, в который компилируется исходный код высокоуровневого языка программирования. В .NET Framework этот промежуточный язык называется Microsoft Intermediate Language (MSIL). Код этого промежуточного языка в конеч- ном итоге при выполнении программы отображается на машинный код с помощью оперативного компилятора (just-in-time —JIT). Конечно, код на промежуточном язы- ке CLI может функционировать только в среде, для которой существует реализация CLI.
CLI также определяет общий набор типов данных, называемый общей системой типов (Common Туре System — CTS), который должен использоваться программами, написанными на любом языке, ориентированными на реализацию CLI. CTS специ- фицирует то, как применяются типы данных внутри CLR, и включает в себя набор предопределенных типов. Вы можете также определять собственные типы данных, но их определение должно подчиняться ряду правил, чтобы они были согласован- ными с CLR. Наличие стандартизованной системы типов для представления данных позволяет компонентам, написанным на разных языках, обрабатывать данные уни- фицированным способом и обеспечивает возможность интеграции компонентов, на- писанных на разных языках, в одно приложение.
Безопасность данных и надежность программ в значительной степени расширены CLR, отчасти благодаря тому, что динамическое выделение и освобождение памяти полностью автоматизированы, а отчасти потому, что код программ MSIL полностью верифицируется перед выполнением программы. CLR — это только одна из реализа- ций спецификации CLI, которая функционирует под управлением Microsoft Windows на ПК. Несомненно, появятся и другие реализации CLI для сред других операцион- ных систем и аппаратных платформ. Вы наверняка заметите, что иногда термины CLI и CLR используются взаимозаменяемо, хотя должно быть очевидным, что это не одно и то же. CLI — спецификация стандарта, a CLR — реализация CLI от Microsoft.
Написание приложений на С++
Visual С++ 2005 обеспечивает чрезвычайную гибкость в части разработки разно- образных типов приложений и программных компонентов. Как уже упоминалось в настоящей главе, существуют два основных варианта приложений Windows: вы може- те писать код, который выполняется под CLR, а можете писать код, компилируемый непосредственно в "родной" машинный код операционной системы. Для приложе- ний Windows, ориентированных на CLR, в качестве базы построения GUI (graphical user interface — графический интерфейс пользователя) используется каркас Windows Forms, представленный библиотекой базовых классов .NET Framework. Применение Windows Forms обеспечивает быструю разработку GUI, поскольку вы собираете его графически из стандартных компонентов и получаете полностью автоматически сге- нерированный код. Затем нужно будет лишь провести небольшую настройку сгенери- рованного кода, чтобы добиться необходимой функциональности.
Для получения "родного" исполняемого кода также имеется несколько способов. Один из них — использование библиотеки классов Microsoft Foundation Classes (MFC) для программирования графического интерфейса пользователя Windows-приложе- ния. MFC инкапсулирует программный интерфейс операционной системы Windows (Windows API) в части создания и управления GUI, и значительно облегчает процесс разработки программ. Windows API появился задолго до того, как на сцену вышел
6 Глава 1
язык С++, поэтому он не имел никаких объектно-ориентированных характеристик, которых следовало бы ожидать, если бы он разрабатывался в наши дни. Однако вы не обязаны применять MFC. Если вам нужен выигрыш в производительности, то вы можете из своего кода С++ обращаться к Windows API непосредственно.
Код С++, выполняемый под управлением CLR, называется управляемым С++, пото- му что данные и код находятся под контролем CLR. В программах CLR освобождение памяти, динамически выделенной для размещения данных, осуществляется автомати- чески, что позволяет исключить главный источник ошибок "родных" приложений С++. Код С++, который выполняется вне CLR, иногда называется в документации Microsoft неуправляемым С++, поскольку CLR в его выполнении не участвует. В неуправляемом С++ вы должны самостоятельно заботиться о выделении и очистке памяти во время выполнения программы, и вам придется самостоятельно обеспечивать безопасность, которая встроена в CLR. Мы также будем называть неуправляемый С++ родным С++, потому что он компилируется непосредственно в родной машинный код.
На рис. 1.1 показаны основные варианты выбора, которые у вас есть при разра- ботке приложений С++.
Рис. 1.1. Основные варианты выбора, доступные при разработке приложений на С++
На рис. 1.1 представлена не полная картина. Приложение может состоять частич- но из управляемого С++ и частично — из родного кода, то есть вы не привязаны к одной или другой среде. Конечно, смешивая разнородный код, вы кое-что теряете, поэтому поступать так нужно только при необходимости, например, когда вы со- бираетесь перенести существующие родное приложение С++ под управление CLR. Понятно, что вы не сможете получить выгоды, присущие управляемому С++ в родном коде С++, к тому же взаимодействие между управляемыми и неуправляемыми компо- нентами программы влечет за собой определенные накладные расходы. Однако воз- можность смешения управляемого и неуправляемого кода может оказаться чрезвычай- но полезной, когда нужно разработать или расширить существующий неуправляемый код, но при этом в некоторых местах использовать преимущества CLR. Конечно, при
разработке новых приложений нужно в самом начале решить, должен быть его код управляемым или нет.
Изучение программирования для Windows
С интерактивными приложениями, выполняемыми под Windows, всегда связаны два аспекта: необходим код для создания графического интерфейса (GUI), с которым взаимодействует пользователь, и необходим код для обработки этого взаимодействия и реализации полезной функциональности приложения. Visual С++ 2005 предоставля- ет вам великолепную поддержку в разработке обоих аспектов приложений Windows. Как вы увидите далее в настоящей главе, можно создать работающую программу Windows с GUI, не написав самостоятельно ни строчки кода. Весь базовый код по соз- данию GUI может быть сгенерирован автоматически Visual С++ 2005; однако важно понимать, как работает этот автоматически генерируемый код, поскольку вам потре- буется расширять и модифицировать его, чтобы заставить выполнять нужную вам ра- боту, а для этого понадобится всестороннее понимание С++.
По этой причине в этой книге вы сначала изучите сам С++ — как родной С++, так и версию С++/CLI — не погружаясь в рассмотрения программирования под Windows. Только после того, как почувствуете себя уверенно в С++, вы научитесь разрабатывать полноценные приложения Windows с помощью родного С++ и C++/CLI. Это значит, что, изучая С++, вы будете работать с программами, которые используют ввод и вы- вод командной строки. За счет ограничения этими простейшими средствами ввода и вывода, вы сможете сосредоточиться на специфике самого языка С++, избегая неиз- бежного усложнения, которое привносит построение и управление GUI. После того, как вы освоитесь с С++, вы будете в состоянии просто и естественно перейти к при- менению этого языка в разработке полноценных Windows-приложений.
Изучение С++
Visual С++ 2005 в полной мере поддерживает две версии С++, определенные двумя разными стандартами.
-
Стандарт С++ ISO/ANSI для реализации "родных" приложений — неуправляе- мый С++. Эта версия С++ поддерживается большинством компьютерных плат- форм.
-
Стандарт C++/CLI, разработанный специально для написания программ, ори- ентированных на CLR, и являющийся расширением ISO/ANSI С++.
Главы от 2 до 10 научат вас языку С++. Поскольку C++/CLI является расширением ISO/ANSI С++, первая часть каждой главы представляет элементы языка ISO/ANSI С++, а вторая часть — дополнительные средства C++/CLI.
Написание программ на C++/CLI позволит в полной мере воспользоваться пре- имуществами .NET Framework, которые зачастую недоступны программам, написан- ным на ISO/ANSI С++. Хотя C++/CLI— расширение ISO/ANSI С++, для того, чтобы программа полностью выполнялась под CLR, она должна отвечать определенным требованиям CLR. Это означает, что некоторые средства ISO/ANSI С++ нельзя при- менять в программах CLR. Как вы могли догадаться из сказанного выше, одним из примеров таких ограничений может быть запрет на использование средств ISO/ANSI С++ распределения и освобождения памяти. Они не совместимы с C++/CLI, и вместо них вы должны будете пользоваться механизмом управления памятью CLR, а это зна- чит, что вы должны работать с классами C++/CLI, а не родными классами С++.
Стандарты С++
Стандарт ISO/ANSI определен в документе ISO/IEC 14882, опубликованном Аме- риканским национальным институтом стандартизации (ANSI). Стандарт ISO/ANSI С++ описывает устойчивую версию С++, которая существует с 1998 года и поддержи- вается компиляторами большинства аппаратных компьютерных платформ и операци- онных систем. Программы, написанные на ISO/ANSI С++, относительно легко могут быть перенесены с одной платформы на другую, хотя используемые ими библиотеч- ные функции, в частности, связанные с построением графического интерфейса, явля- ются главным фактором, определяющим, насколько легко или трудно такой перенос осуществить. Стандарт С++ ISO/ANSI — это главный инструмент, который выбирают профессиональные разработчики программ, поскольку он широко поддерживается и потому, что на сегодняшний день он является одним из наиболее мощных доступных языков программирования.
Стандарт С++ ISO/ANSIможно приобрести наhttp://www. iso.org.
C++/CLI — версия С++, расширяющая стандарт С++ ISO/ANSI в целях лучшей под- держки общей инфраструктуры языка (CLI), определенной в стандарте ЕСМА-355. Первый набросок этого стандарта появился в 2003 году и был разработан на основе технических спецификаций, представленных Microsoft для поддержки программ С++ в среде .NET Framework. То есть, как CLI вообще, так и C++/CLI в частности, роди- лись в Microsoft и предназначены для поддержки .NET Framework. Конечно, стандар- тизация CLI и C++/CLI значительно повысила вероятность появления реализаций в средах, отличных от Windows. Важно оценить то, что хотя C++/CLI — это расши- рение ISO/ANSI С++, существуют такие средства ISO/ANSI С++, которые не следует использовать в программах, предназначенных полностью для выполнения под управ- лением CLR. Далее в книге вы узнаете об этом подробнее.
CLR представляет существенные преимущества перед "родным" окружением. Ориентируя ваши программы С++ на CLR, вы обеспечиваете их повышенную безо- пасность и снижаете уязвимость по отношению к потенциальным ошибкам, которые возможны при использовании всех средств ISO/ANSI С++. CLR также исключает не- совместимость между различными высокоуровневыми языками программирования за счет стандартизации целевой среды, для которой выполняется компиляция, что позволяет комбинировать модули, написанные на С++, с модулями, написанными на других языках, таких как С# или Visual Basic.
Консольные приложения
Наряду с разработкой приложений для Windows, Visual С++ 2005 также позволя- ет вам писать, компилировать и тестировать программы С++, которые не тащат за собой всего багажа, необходимого программам Windows — то есть символьно-ориен- тированные программы командной строки. Эти программы называются в Visual С++ 2005 консольными приложениями, потому что вы взаимодействуете с ними через клавиатуру и экран, работающий в символьном режиме.
Написание консольных приложений может показаться вам отклонением от основ- ной цели программирования Windows, но когда речь идет об изучении С++ (что совер- шенно необходимо перед тем, как погрузиться в программирование Windows) — это наилучший способ. Даже в самой простой Windows-программе присутствует слишком много кода, и очень важно, чтобы сложности, связанные с программированием под Windows не затмили для вас азы С++. Поэтому в начальных главах нашей книги, со-
средоточенных на основах работы С++, мы потратим некоторое время на рассмотре- ние нескольких "легковесных" консольных приложений, прежде чем перейдем к "тя- желовесному" коду мира Windows.
Таким образом, изучая С++, вы сможете сосредоточить внимание на языковых средствах, не заботясь о среде, в которой они работают. В консольных приложениях, которые вы разработаете в процессе изучения, вы будете иметь дело только с тек- стовым интерфейсом, но этого вполне достаточно для понимания С++, поскольку в определении языка отсутствует описание каких-либо средств графики. Естественно, я представлю всю необходимую информацию о программировании графического пользовательского интерфейса, когда очередь дойдет до написания программ под Windows с применением MFC на "родном" С++ и с применением Windows Forms — на C++/CLI.
Существует два вида консольных приложений, и вы будете иметь дело с обоими. Консольные приложения Win32 компилируются в родной код, и их мы будем рас- сматривать при изучении средств ISO/ANSI С++. Консольные приложения CLR ориентированы на CLR, поэтом)' их мы будем использовать для работы со средствами C++/CLI.
Концепции программирования для Windows
Наш подход к Windows-программированию будет основан на полном использо- вании инструментов, представленных Visual С++ 2005. Средства создания проек- та, встроенные в Visual С++ 2005, позволяют автоматически сгенерировать скелет кода для широкого диапазона различных прикладных программ, включая базовые Windows-программы. Создание проекта — это начальная точка при разработке всех приложений и компонентов в Visual С++ 2005, и для того, чтобы получить представ- ление о том, как это делается, в настоящей главе вы ознакомитесь с процессом созда- ния некоторых примеров, включая набросок программы для Windows.
Программы Windows имеют структуру, отличающуюся от обычных консольных программ, которые запускаются из командной строки, к тому же они значительно сложнее. В консольной программе вы можете получать ввод с клавиатуры и отправ- лять вывод непосредственно в командную строку, в то время как Windows-програм- ма может работать со средствами ввода и вывода компьютера только через функции, предоставленные операционной системой Windows; никакого прямого доступа к ап- паратным ресурсам не допускается. Поскольку в Windows могут быть активными од- новременно несколько программ, Windows определяет, какая из них должна получить ввод — щелчок мыши или нажатие клавиши — и соответственно оповещает нужную программу. То есть общее управлением всем взаимодействием с пользователем осу- ществляется операционной системой Windows.
К тому же природа интерфейса между пользователем и приложением Windows та- кова, что в любой момент времени возможно самое разнообразное воздействие на программу. Пользователь может выбрать любой из пунктов меню, щелкнуть на кноп- ке панели инструментов или же щелкнуть кнопкой мыши в любом месте окна при- ложения. Хорошо спроектированное приложение Windows должно быть готовым об- рабатывать ввод любого рода в любой момент времени, поскольку заранее не может быть известно, какое именно воздействие произойдет. Все эти действия пользователя принимаются в первой инстанции операционной системой, и рассматриваются ею как события (events). Событие, воспринятое пользовательским интерфейсом вашего приложения, обычно приводит к выполнению определенного кусочка кода програм- мы. Таким образом, что именно делает программа — определяется последовательное-
тью действий пользователя. Программы, работающие таким образом, называются программами, управляемыми событиями (event-driven programs), и отличаются от традиционных процедурных программ, которые имеют единственную последователь- ность выполнения. Ввод данных в процедурной программе управляется кодом самой программы и может выполняться только тогда, когда программа принимает его; в противоположность этому Windows-программа состоит, прежде всего, из фрагмен- тов кода, реагирующих на события, вызванные действиями пользователя либо самой Windows. Структура такого рода программ показана на рис. 1.2.
Каждый квадратный блок на рис. 1.2 представляет порцию кода, написанную спе- циально для обработки определенного события. Программа может выглядеть силь- но фрагментированной из-за множества не связанных между собой блоков кода, но основной фактор, связывающий ее в единое целое — это сама операционная система Windows. Вы можете считать свою программу индивидуальной подгонкой Windows для выполнения определенного набора действий.
Конечно, все модули, обслуживающие различные внешние события, такие как вы- бор пункта меню или щелчок мыши, имеют доступ к общему набору специфичных для приложения данных в конкретной программе. Эти данные приложения содержат информацию, имеющую отношение к тому, для чего программа предназначена, на- пример, блоки текста в редакторе или таблица рекордов игрока в программе, пред- назначенной для отслеживания результатов игры бейсбольной команды, а также информацию о некоторых событиях, которые произошли во время выполнения про- граммы. Эта общая коллекция данных позволяет разным частям программы, которые выглядят независимыми, взаимодействовать согласованным образом. Позднее в этой книге мы рассмотрим это более детально.
Даже самая элементарная Windows-программа включает несколько строк кода, а когда речь идет о программах Windows, сгенерированных автоматическими мастера- ми (wizards) из Visual С++ 2005, то "несколько" превращается в "много". Чтобы упро- стить процесс понимания работы С++, вам нужен контекст, упрощенный, насколько это возможно. К счастью, среда Visual С++ 2005 обеспечивает такую возможность.
Что такое интегрированная среда разработки?
Интегрированная среда разработки (Integrated Development Environment — IDE), которая поставляется вместе с Visual С++ 2005 — это полностью самодостаточная среда, предназначенная для создания, компиляции, компоновки и тестирования про- грамм на С++. Она также представляет собой великолепное учебное пособие по языку С++ (особенно в сочетании с хорошей книгой).
Visual С++ 2005 включает в себя множество полностью интегрированных инстру- ментов, предназначенных для облегчения написания программ на С++. С некоторыми из них вы познакомитесь в этой главе, но вместо скучного абстрактного перечисле- ния средств и опций, сначала будет дано общее представление о работе IDE, а затем постепенно будут раскрываться детали, в контексте изучаемого материала.
Программирование
в Visual
С++
2005
Рис. 1.2. Структура типичной Windows-программы
Компоненты системы
Список фундаментальных составляющих Visual С++ 2005, поставляемых как ча- сти IDE, включает в себя редактор, компилятор, компоновщик и библиотеки. Это — основные инструменты, необходимые для написания и исполнения программ С++. Их назначение описано ниже.
Редактор
Редактор представляет собой интерактивную среду, в которой вы можете созда- вать и редактировать исходный код С++. Наряду с обычными средствами вроде вы- резания и вставки фрагментов, с которыми вы наверняка знакомы, редактор также обеспечивает цветовое выделение различных элементов языка. Редактор автоматиче- ски распознает ключевые конструкции языка С++ и окрашивает их в соответствии с их значением. Это не только помогает сделать код более читабельным, но также ясно указывает на ошибки при вводе некоторых слов.