Глава 1. Компилятор Visual C++, версия 6

Новая версия VisualC++ позволит вам создавать любые приложения для Windows95, 98 и NT с использованием новейших программных технологий и методик. Пакет программ MicrosoftVisualC++ версии 6 поставляется в трех различных вариантах: стандартном, профессиональном и корпоративном.

Стандартный вариант

Стандартный вариант VisualC++ (ранее он назывался учебным) содержит почти все те же средства, что и профессиональный, но в отличие от последнего в нем отсутствуют модуль Profiler, несколько мастеров, возможности по оптимизации кода и статической компоновке библиотеки MFC, некоторые менее важные функции. Этот вариант в наибольшей мере подходит для студентов и иных категорий индивидуальных пользователей, чему, в частности, способствует и сравнительно низкая его цена. Лицензионное соглашение стандартного варианта программы в новой версии, в отличие от старой, разрешает ее использование для создания коммерческих программных продуктов.


Профессиональный вариант

В этом варианте программы можно создавать полнофункциональные графические и консольные приложения для всех платформ Win32, включая Windows95, 98 и NT.

Перечислим новые возможности профессионального варианта:

(без возможности модификации данных).

Корпоративный вариант

С помощью корпоративного варианта VisualC++ вы можете создавать приложения типа клиент/сервер для работы в Internet или в корпоративной среде (intranet). Приобретая корпоративный вариант программы, вы получаете в свое распоряжение не только все возможности профессионального варианта, но и ряд дополнительных средств, включая:

Компилятор MicrosoftVisualC++ содержит также средства, позволяющие в среде Windowsразрабатывать приложения для других платформ, в том числе для AppleMacintosh. Кроме того, программа снабжена редакторами растровых изображен™, значков, указателей мыши, меню и диалоговых окон, позволяющими работать с перечисленными ресурсами непосредственно в интегрированной среде. Коснувшись темы интеграции, следует упомянуть о мастере ClassWizard, помогающем в кратчайшие сроки создавать приложения OLEс использованием библиотеки MFC.

Инструменты разработчика

Новая версия компилятора MicrosoftVisualC++ содержит множество интегрированных средств визуального программирования. Ниже перечислены утилиты, которые вы можете использовать непосредственно из VisualC++.


Интегрированный отладчик

Разработчики компании Microsoftвстроили первоначальный отладчик CodeViewнепосредственно в среду VisualC++. Команды отладки вызываются из меню Debug. Встроенный отладчик позволяет пошагово выполнять программу, просматривать и изменять значения переменных и многое другое.

Встроенные редакторы ресурсов

Редакторы ресурсов позволяют создавать и модифицировать ресурсы Windows, такие как растровые изображения, указатели мыши, значки, меню, диалоговые окна и т.д.

Редактор диалоговых окон

Редактор диалоговых окон — это достаточно удобное средство, позволяющее легко и быстро создавать сложные диалоговые окна. С помощью этого редактора в разрабатываемое диалоговое окно можно включить любые элементы управления (например, надписи, кнопки, флажки, списки и т.д.). При этом вы можете изменять как внешний вид элементов управления, так и их свойства (наряду со свойствами самого диалогового окна).

Редактор изображений

Этот редактор позволяет быстро создавать и редактировать собственные растровые изображения, значки и указатели мыши. Пользовательские ресурсы данного типа сохраняются в файле с расширением RC и включаются в файлы сценариев ресурсов. Более подробно об использовании ресурсов в приложениях рассказывается в главах 16-19.

Редактор двоичных кодов

Данный редактор позволяет вносить изменения непосредственно в двоичный код ресурса. Редактор двоичных кодов следует использовать только для просмотра ресурсов или внесения мелких изменений в те из них, тип которых не поддерживается в VisualC++.

Редактор строк

Таблица строк представляет собой ресурс, содержащий список идентификаторов и значений всех строковых надписей, используемых в приложении. К примеру, в этой таблице могут храниться сообщения, отображаемые в строке состояния. Каждое приложение содержит единственную таблицу строк. Наличие единой таблицы позволяет легко менять язык интерфейса программы — для этого достаточно перевести на другой язык строки таблицы, не затрагивая код программы.

Дополнительные утилиты

ActiveX Control Test Container

С помощью этой утилиты, разработанной специалистами Microsoft, вы можете быстро протестировать созданные вами элементы управления. При этом можно изменять их свойства и характеристики.

APITextViewer

Данная утилита позволяет просматривать объявления констант, функций и типов данных Win32 API, а также копировать эти объявления в приложения VisualBasic или в буфер обмена.

AVIEditor

Эта утилита позволяет просматривать, редактировать и объединять AVI-файлы.

DataObjectViewer

Утилита DataObjectViewerотображает список форматов данных, предлагаемых объектами ActiveXи OLE, которые находятся в буфере обмена или участвуют в операции перетаскивания (drag-and-drop).

DDESpy

Эта утилита предназначена для отслеживания всех DDE-сообщений.

DocFileViewer

Эта утилита отображает содержимое составных OLE-документов.

ErrorLookup

Эта утилита позволяет просматривать и анализировать всевозможные сообщения об ошибках.

HeapWalkUtility

Эта утилита выводит список блоков памяти, размещенных в указанной динамической области (куче).

HelpWorkshop

Эта утилита позволяет создавать и редактировать файлы справки.

OLE Client/Server, Tools иView

Утилита OLEViewer отображает информацию об объектах ActiveX и OLE, инсталлированных на вашем компьютере. Эта утилита также позволяет редактировать реестр и просматривать библиотеки типов. Утилиты OLEClient и OLEServer предназначены для тестирования OLE-клиентов и серверов.

TheProcessViewer

Эта утилита позволяет следить за состоянием выполняющихся процессов и потоков.

ROTViewer

Эта утилита отображает информацию об объектах ActiveXи OLE, в данный момент загруженных в память.

Spy++

Эта утилита выводит сведения о выполняющихся процессах, потоках, сущест­вующих окнах и оконных сообщениях.

StressUtility

Эта утилита позволяет захватывать системные ресурсы и используется для тестирования системы в ситуациях, связанных с недостатком системных ресурсов. В число захватываемых ресурсов входят глобальная и пользовательская динамические области (кучи), динамическая область GDI, свободные области дисков и дескрипторы файлов. Утилита Stress может выделять фиксированное количество ресурсов, а также производить выделение в ответ на получение различных сообщений. Кроме того, утилита способна вести журнал событий, что помогает обнаруживать и воспроизводить аварийные ситуации в работе программы.

MFCTracer

Эта утилита позволяет устанавливать флаги трассировки в файле AFX.INI. С помощью данных флагов можно выбрать типы сообщений, которые будут посылаться приложением в окно отладки. Таким образом, утилита Tracer является средством отладки.

UUIDGenerator

Эта утилита предназначена для генерации универсального уникального идентификатора (UUID), который позволяет клиентским и серверным приложениям распознавать друг друга.

WinDiff

Эта утилита дает возможность сравнивать содержимое файлов и папок.

Zooming

Эту утилиту можно использовать для захвата и просмотра в увеличенном виде выбранной области на рабочем столе.

Возможности компилятора

Компилятор VisualC++ содержит много новых инструментальных средств и улучшенных возможностей. В следующих параграфах дается их краткий обзор.


Средства автоматизации и макросы

С помощью сценариев VisualBasicвы можете автоматизировать выполнение рутинных и повторяющихся задач. VisualC++ позволяет записывать в макрокомандах самые разные операции со своими компонентами, включая открытие, редактирование и закрытие документов, изменение размеров окон. Можно также создавать надстроечные модули, интегрируя их в среду с использованием объектной модели VisualC++.

ClassView

Вкладка ClassViewтеперь позволяет работать с классами Javaтак же, как с классами C++. Вы можете просматривать и редактировать интерфейсы СОМ-объектов, созданных на базе MFCили ALT, а также разбивать классы по папкам удобным для вас образом.

Настраиваемые панели инструментов и меню

В новой версии VisualC++ стало легче настраивать панели инструментов и меню в соответствии с вашими предпочтениями. В частности, вы можете выполнять следующие действия:

Рабочие пространства и файлы проектов

Файлы рабочего пространства теперь имеют расширение DSW(раньше использовалось расширение MDP). Создаваемые проекты записываются в файлы двух типов: внутренние (DSP) и внешние (МАК). Файлы с расширением DSP создаются при выборе нового проекта или при открытии файла проекта, созданного в ранней версии программы. (Обратите внимание, что DSP-файлы не совместимы с утилитой NMAKE.) Чтобы сохранить проект во внешнем файле с расширением МАК, используйте команду ExportMakefile из меню Project.

Проекты теперь могут содержать активные документы, например электронные таблицы или текстовые документы Word. Вы можете редактировать их, даже не покидая VisualStudio.

Когда создается новое рабочее пространство, VisualC++ создает файл имя_рабочегo_npocmpaнcmвa.DSW. Эти файлы больше не содержат данных, специфичных для вашего компьютера.

Предварительно скомпилированные файлы заголовков

VisualC++ помещает описания типов данных, прототипы функций, внешние ссылки и объявления функций-членов в специальные файлы, называемые файлами заголовков. Эти файлы содержат важные определения, необходимые во многих местах программы. Части файлов заголовков обычно повторно компилируются при компиляции каждого из включающих их модулей. К сожалению, повторная компиляция значительно замедляет работу компилятора.

VisualC++ позволяет существенно ускорить этот процесс за счет возможности предварительной компиляции файлов заголовков. Хотя идея не нова, для ее реализации специалисты Microsoft использовали принципиально новый подход. Предварительной компиляции может подвергнуться только "стабильная" часть файла; оставшаяся же часть, которая впоследствии может модифицироваться, будет компилироваться вместе с приложением.

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

Компилятор VisualC++ предполагает, что текущее состояние рабочей среды идентично тому, которое было при компиляции заголовков. В случае обнаружения каких-либо конфликтов будет выдано предупреждающее сообщение. Такие ситуации могут возникать при изменении модели использования памяти, значений предопре­деленных констант или опций отладки/компиляции.

В отличие от многих других компиляторов C++, VisualC++ не ограничивается предварительной компиляцией только файлов заголовков. Благодаря возможности проводить компиляцию до заданной точки программы вы можете предварительно скомпилировать даже какую-нибудь часть основного модуля. В целом, процедура предварительной компиляции используется для тех частей программного кода, которые вы считаете стабильными; таким образом значительно сокращается время компиляции частей программы, изменяемых в процессе работы над ней.

MFC

Приложения Windows просты в использовании, но создавать их довольно сложно. Программистам приходится изучать сотни различных API-функций.

Чтобы облегчить их труд, специалисты Microsoftразработали библиотеку MicrosoftFoundationClasses— MFC. Используя готовые классы C++, можно гораздо быстрее и проще решать многие задачи. Библиотека MFC существенно облегчает программирование в среде Windows. Те, кто обладает достаточным опытом программирования на C++, могут дорабатывать классы или создавать новые, производные от существующих.

Классы библиотеки MFCиспользуются как для управления объектами Windows, так и для решения определенных общесистемных задач. Например, в библиотеке имеются классы для управления файлами, строками, временем, обработкой исключений и другие.

По сути, в MFC представлены практически все функции WindowsAPI. В библиотеке имеются средства обработки сообщений, диагностики ошибок и другие средства, обычные для приложений Windows. MFC обладает следующими преимуществами.

Макроподстановка функций

Компилятор MicrosoftVisualC++ поддерживает возможность макроподстановки функций. Это означает, что вызов любой функции с любым набором инструкций может быть заменен непосредственной подстановкой тела функции. Многие компи­ляторы C++ разрешают производить макроподстановку только для функций, содержащих определенные операторы и выражения. Например, иногда оказывается невозможной макроподстановка функций, содержащих операторы switch, while и for. VisualC++ не накладывает ограничений на содержимое функций. Чтобы задать параметры макроподстановки, выберите в меню Project команду Settings, затем активизируйте вкладку C/C++ и, наконец, выберите элемент Optimizations из списка Category.

Опции компиляции

Компилятор MicrosoftVisualC++ предоставляет огромные возможности в плане оптимизации приложений, в результате чего вы можете получить выигрыш как в отношении размера программы, так и в отношении скорости ее выполнения, независимо от того, что представляет собой ваше приложение. Перечисленные ниже опции компиляции позволяют оптимизировать программный код, сокращая его размер, время выполнения и время компиляции. Чтобы получить к этим опциям доступ, нужно в меню Project выбрать команду Settings.

General

На вкладке General можно включить или отключить возможность использования библиотеки MFC(список MicrosoftFoundationClasses). Здесь также можно указать папки, в которые компилятор будет помещать промежуточные (поле Intermediatefiles) и выходные (поле Outputfiles) файлы.

Debug

На вкладке Debugможно указать местонахождение исполняемого файла и рабочей папки, задать аргументы командной строки, а также путь и имя удаленного исполняемого файла на сетевом диске. Кроме того, в списке Category можно выбрать элемент AdditionalDLLs, предназначенный для задания дополнительных библиотек динамической компоновки (DLL).


C/C++

Вкладка C/C++ содержитследующиекатегорииопций: General, C++ Language, Code Generation, Customize, Listing Files, Optimizations, Precompiled Headers иPrepro­cessor. В поле ProjectOptions отображается командная строка проекта.

General

Опции категории Generalпозволяют установить уровень контроля за ошибками (список Warninglevel), указать, какую отладочную информацию следует включать (список Debuginfo), выбрать тип оптимизации при компиляции (список Optimizations) и задать директивы препроцессора (поле Preprocessordefinitions).

C++ Language

Опции категории C++ Languageпозволяют выбрать способ представления ука­зателей на члены классов (группа Pbinter-to-memberrepresentation), включить обработку исключительных ситуаций (Enableexceptionhandling), разрешить проверку типов объектов на этапе выполнения (EnableRun-timeTypeInformation) и запретить замещение конструкторов при вызове виртуальных функций (Disableconstructiondisplacements).

CodeGeneration

Опции категории CodeGenerationпозволяют задать тип процессора, на который должен ориентироваться компилятор (список Processor), выбрать тип соглашения о вызовах функций (список Callingconvention), указать тип компоновки динамических библиотек (список Userun-timelibrary) и установить порядок выравнивания полей структурированных переменных (список Structmemberalignment).

Customize

В категории Customizeможно задать следующие опции:


ListingFiles

Опции категории ListingFiles позволяют задавать сведения, необходимые для создания SBR-файла (группа Generatebrowseinfo), который используется при построении специальной базы данных с информацией о всех классах, функциях, переменных и константах программы. Кроме того, в этой категории можно указать, следует ли создавать файл с ассемблерным кодом программы, какого он должен быть типа и где располагаться (список Listingfiletype и поле Listingfilename).

Optimizations

Опции категории Optimizationsпозволяют устанавливать различные параметры оптимизации программного кода (список Optimizations). Также можно указать, каким образом следует выполнять макроподстановку функций (список Inlinefunctionexpansion).

PrecompiledHeaders

Опции категории PrecompiledHeadersопределяют, следует ли использовать файлы предварительно скомпилированных заголовков (файлы с расширением РСН). Наличие таких файлов ускоряет процесс компиляции и компоновки. После компиляции всего приложения эти файлы следует удалить из папки проекта, поскольку они занимают очень много места.

Preprocessor

Опции категории Preprocessor позволяют задавать параметры работы препроцессора. Здесь же можно указать дополнительные папки для включаемых файлов заголовков (поле Additional #include directories), а также установить опцию Ignore standard include paths, которая служит указанием игнорировать папки, перечисленные в переменных среды PATHили INCLUDE.

Link

Вкладка Link содержит опции пяти категорий: General, Customize, Debug, Inputи Output.

General

В категории Generalв поле Outputfilename можно задать имя и расширение выходного файла. Как правило, для файла проекта используется расширение ЕХЕ. В поле Object/librarymodules указываются объектные и библиотечные файлы, компонуемые вместе с проектом. Также могут быть установлены следующие опции:


Customize

В категории Customizeможно установить такие опции:

Debug

Опции категории Debug позволяют указать, следует ли генерировать МАР-файл проекта, а также задают различные параметры отладки.

Input

Посредством опций категории Input приводится различная информация об объектных и библиотечных файлах, компонуемых вместе с проектом.

Output

Опции категории Output позволяют задать базовый адрес программы (Baseaddress), точку входа (Entry-pointsymbol), объем виртуальной и физической памяти, выделяемой для стека (группа Stackallocations), и номер версии проекта (группа Versioninformation).

Resources

Вкладка Resources позволяет указать имя файла ресурсов (обычно это файл с расширением RES) и задать некоторые дополнительные параметры, такие как язык представления ресурсов, папки включаемых файлов и макросы препроцессора.

MIDL

Вкладка MIDL предназначена для задания различных параметров генерации библиотеки типов.

BrowseInfo

На вкладке BrowseInfo можно указать имя файла базы данных, содержащей описания классов, функций, констант и переменных программы.

CustomBuild

Вкладка CustomBuild предназначена для задания дополнительных команд компиляции, которые будут выполняться над выходным файлом.