Пятая версия пакета для разработчиков, использующих язык Си++, включает в себя все возможности Delpi 5 и много чего еще:
- Теперь чтение и изменение данных стало возможным без использования морально устаревшего интерфейса Borland Database Engine (BDE), поскольку появился набор компонентов ADOExpress для работы с базами данных, использующий технологию Microsoft ActiveX Data Objects (ADO).
- Разработчики получили возможность напрямую использовать в своей работе программный интерфейс InterBase API благодаря InterBase Express (IBX) — палитре компонентов для прямого доступа к популярному серверу баз данных InterBase (в России продается под маркой IB DataBase).
- Изменена среда разработчика. Теперь можно создавать несколько различных вариантов рабочей среды и мгновенно переключаться между ними, а также вести список текущих задач (To-Do List). В окне инспектора объектов разбивка свойств по категориям, в раскрывающихся списках свойств помимо текста появились изображения, сохранение описания форм в виде текста, опции автоматического создания форм.
- Добавлен дизайнер модулей данных. И это лишь малая толика того, что ждет пользователей C++Builder 5.
Впрочем, имеет ли смысл пересказывать то, о чем уже писалось. Обратитесь к статье «Delphi: пятый виток вокруг рынка ИТ» («Мир ПК», № 11/99, с. 44—49). Практически все, что говорится о достоинствах Delphi 5, будет справедливо теперь и для C++Builder 5. Мы же познакомим вас с теми нововведениями и дополнениями, которые характерны только для C++Builder 5.
Работа с проектами
В C++Builder 5 упрощено и расширено управление проектами в окне Project Manager. Появилась уникальная возможность устанавливать для разных узлов проекта опции, отличающиеся от глобальных установок. Открыв локальное меню для узла, будь то .C, .CPP или .ASM, вы увидите новый пункт — Edit Local Options. Появляющаяся затем диалоговая панель настроек похожа на глобальные опции проекта, за исключением того, что локальных опций намного меньше, и они контекстно зависимы. К примеру, для исходных текстов на Си++ будут отображены только те опции, которые относятся к этому языку, и те, которые необходимы для полноценного сервиса.
Локальные опции сохраняются в самом конце файла проекта. Изменение настройки одного из файлов проекта привело к появлению следующей конструкции:
Специальный тег CFLAG1, определенный с помощью языка XML, отвечает за хранение перекрытых параметров.
Кстати, об XML. Разработчики C++Builder 5 пошли нетрадиционным путем и определили, что проектные файлы (.BPR и .BPK) должны храниться в формате языка XML, и теперь проектные файлы предыдущих версий C++Builder автоматически конвертируются во время загрузки.
Рис. 1 |
По-моему, это хорошая идея: библиотек для работы с документной объектной моделью XML сейчас пруд пруди, да и воспринимается XML программистами достаточно легко. В среде разработчика можно посмотреть файл проекта в XML-виде с помощью команды ProjectХEdit Option Source. Привыкшие пользоваться утилитой MAKE не обижены: для них в контекстном меню проектов появилась команда Export makefile, генерирующая файл проекта в привычном .MAK-виде.
Еще одно обновление Project Manager относится к зависимостям (dependencies) файлов исходных текстов на Си и Си++. Подобные узлы проектов после компиляции могут быть «раскрыты» мышью, и под ними пользователь увидит заголовочные и другие файлы, от которых зависит сам узел (рис. 1).
Следующий пункт нашего внимания — автоматическое создание проекта. Мы уже привыкли, что, создавая проект, получаем от C++Builder файл с точкой входа в придачу. Но при переносе ранее написанных программ он совершенно не нужен. Хотелось бы иметь пустой проект и добавлять в него свои файлы, как это было в старых компиляторах. C++Builder 5 решает эту проблему, правда, немножечко по-своему. При открытии файла на языке Си или Си++ любой точкой входа — main(), WinMain() или DllEntryPoint() — система обнаруживает функцию точки входа и спрашивает, создавать ли новый проект. Если вы ответите согласием, то получите новый проект, в который включен открытый вами файл. Любопытно, что C++Builder сам определяет тип создаваемого проекта. Поэтому можно не сомневаться, что для файла с DllEntryPoint() результатом будет проект создания динамической библиотеки, а для файла с main() — консольный проект.
Компиляция
Компилятор пакета C++Builder 5 научился делать много нового. Это касается и методов компиляции, и различных опций. В свете всеобщей тенденции увеличения размеров проектов фоновая компиляция должна быть встречена «на ура». Разве не стоит теплых слов возможность продолжать работать с исходными текстами и формами даже тогда, когда компилятор «перемалывает» исходники в готовый код?
Чтобы программист не мог вмешаться в сборку, компилятор перерабатывает файлы, которые попадаются ему под руку непосредственно во время работы, предварительно отметив их флагом «только для чтения». Любые изменения уже откомпилированного файла не влияют на генерацию кода. Если же изменения внесены в файл до того момента, как компилятор «взялся» за него, то код будет сгенерирован уже с учетом поправок.
Включение и отключение фоновой компиляции производится через опции среды (ToolsХEnvironment OptionsХPreferences). Кнопка Background Compilation находится в группе Compiling. Если данная опция отмечена, обращение к любому меню, относящемуся к сборке проекта, приведет к компиляции в фоновом режиме. Только пакеты не компилируются в фоне.
C++Builder 5 делает еще один шаг в сторону совместимости с Microsoft Visual C++. Появились два новых модификатора функций, полезных при вызовах из динамических библиотек производства Microsoft. Первый, __msreturn, вызывает возврат структур способом, характерным для продуктов Microsoft, т. е. с задействованием регистровой пары EAX/EDX. Второй, __msfastcall, заставляет функции использовать ключевое слово fastcall в режиме, совместимом с продуктами Microsoft.
Что касается описаний __declspec, то их стало на семь штук больше, чем в C++Builder 4 (см. таблицу).
Новые опции компиляции добавлены для того, чтобы управлять отображением расширенной информации об ошибке. Подобная информация выводится в виде древообразного списка и включает разбор компилятором исходных текстов, позволяющий видеть, как ошибка возникла. Управлять показом расширенной информации можно с помощью меню ProjectХOptionsХCompiler. Просмотреть же такого рода данные можно, щелкнув мышью на значке «плюс» слева от ошибки (рис. 2).
Рис. 2 |
Связывание
Связывание — не менее важная операция, чем компиляция. От связывания зависит вся сборка. C++Builder 5 предлагает некоторые усовершенствования и новинки, позволяющие управлять связыванием более тонко.
Для оптимизации использования редко нужных динамических библиотек в C++Builder 5 имеется опция отложенной их загрузки. Если применять ее, то отмеченные библиотеки DLL будут загружаться в память лишь тогда, когда система обращается к их точке входа. Конечно, это связано с определенными расходами, но зато в памяти не болтаются лишние модули. Включить отложенную загрузку DLL и указать их список можно с помощью новой закладки опций проекта — Advanced Linker. Там же дублируются и ключи редактора связей командной строки: включение связывания без учета регистра имен, вычисления контрольной суммы, замены ресурсов, пользовательской версии и т. д.
Новый редактор связей поддерживает импорт и экспорт по порядковому номеру (ordinal). Символы экспортируются и по имени, но если создать DEF-файл с порядковыми номерами, то экспорт будет производиться и по ним.
Отладка
Функции отладчика C++Builder 5 претерпели, как и в Delphi 5, огромные изменения. Но и здесь корпорация Borland отличилась: в пакет включен модуль CodeGuard, упрощающий отладку программ на Си++ за счет их внутреннего мониторинга времени исполнения. В его обязанности входит улавливать те скрытые ошибки, которые не нарушают синтаксические правила языка, а следовательно, не замечены компилятором. CodeGuard работает со стандартными библиотеками, Windows API, и поддерживает многопоточные приложения.
CodeGuard следит за двумя вещами: использованием памяти и ресурсов и вызовами функций. К первой категории относятся неверное использование пула памяти, неверное ее выделение и освобождение, обращение к недействительным потокам и файловым ссылкам. Ко второй категории можно причислить заведомо неверные аргументы функций, возвращаемые функциями ошибки и корявое использование ими ссылок Windows на ресурсы. Кроме того, CodeGuard пристально смотрит за неверными разыменовыванием и арифметикой указателей — обычно это самые трудноуловимые ошибки в программах. К тому же мимо него не проскочит такая проблема, как обращение приложения к уже освобожденному ресурсу, что почти всегда приводит к тому, что Windows просто снимает ее с выполнения, не говоря ничего вразумительного.
Чтобы выполнять свои функции, CodeGuard требует связывания либо со статической библиотекой CG32.LIB, либо с динамической библиотекой CG32.DLL, представляющими собой по большей части оболочки вокруг проверяемых функций Windows API. Эти «обертки» и занимаются проверкой аргументов функций и их возвращаемых значений.
Компоненты
Полезных компонентов в C++Builder 5 появилось весьма много. Хотелось бы обратить внимание всего на один из них — TCppWebBrowser. Данный компонент представляет собой ни много ни мало браузер Internet, использующий внутренние возможности Microsoft Internet Explorer версии 4.0 или новее. TCppWebBrowser во время работы обращается к хорошо известной Windows-программистам библиотеке SHDOCVW.DLL, являющейся интерфейсом многих полезных COM-объектов, используемых в операциях с Internet, при просмотре документов, а также в операциях с файлами. В частности, компонент TCppWebBrowser работает с интерфейсом COM под названием IWebBrowser2. Сколько статей было написано об управлении браузером благодаря автоматизации OLE, сколько профессиональных утилит использовали эту возможность! И вот наконец-то даже начинающий разработчик сможет «подергать» за скрытые ниточки Internet Explorer.
Мастера
В C++Builder 5 вошло несколько новых мастеров, управляющих созданием приложения панели управления, модулем панели управления и консольными программами.
Один из них создает специальную динамическую библиотеку аплетов контрольной панели с расширением CPL, которые применяются для конфигурирования каких-либо параметров среды Windows. Если выбрать команду FileХNewХControl Panel Application, C++Builder создает заготовку для нового приложения аплета и модуля по умолчанию для этого аплета, присваивает готовому приложению расширение .CPL, а в директивы компилятора добавляет опцию $E.
Другой мастер помогает создать дополнительные модули для аплетов панели управления, которые могут использоваться взамен модуля по умолчанию. Он вызывается командой FileХNewХControl Panel Module.
Оба мастера не только работают с исходными текстами, но и открывают разработчику дизайнер модуля данных, так что по сути своей аплет панели управления — наследник модуля данных, в чем можно убедиться, взглянув на иерархию классов. Это значит, что нет никаких ограничений доступа к СУБД через созданные CPL-модули. Весьма хорошо, что C++Builder 5 заодно берет на себя работу по добавлению готовых аплетов в панель управления и их удалению оттуда. Для этого достаточно открыть контекстное меню дизайнера модулей данных и воспользоваться командами Installing a Control Panel Applet (установить аплет), Uninstalling a Control Panel Applet (удалить аплет) или Launching the Control Panel (запустить панель управления). Иначе бы пришлось делать это руками.
Рис. 3 |
Мастер создания консольных приложений предлагает заготовку программы командной строки без интерфейса пользователя. Принципиально создание такого рода приложений не представляет труда — просто нужно написать исходный текст, в котором точкой входа была бы функция main(). Однако в C++Builder 5 достаточно указать, какой язык, Си или Си++, будет использован, будет ли приложение многопоточным и будет ли использоваться библиотека VCL (рис. 3). Можно даже указать имя файла, на основе которого будет строиться проект.
Весьма похож на мастер консольных приложений и новый мастер создания DLL. Отличия состоят лишь в последней опции — VC++ Style DLL. Если она включена, то точка входа в создаваемую библиотеку будет называться DLLMain(), как это принято в Microsoft Visual C++, а не DLLEntryPoint(), как принято в Windows API.
Изменения в поддержке CORBA
К сожалению, с поддержкой CORBA в C++Builder 5 еще не все понятно. Поскольку для обзора была представлена гамма-версия пакета (билд 12.24), нельзя ручаться за достоверность. Однако, по данным Inprise/Borland Enterprise, редакция пакета будет работать с брокером объектных запросов VisiBroker for C++ 3.32, хотя на диске обнаружилась бета-версия VisiBroker for C++ 4.0, да и различные косвенные признаки (скажем, примеры с использованием портируемого адаптера объектов) указывают на то, что это не описка. Тем не менее, запустив мастер создания CORBA-сервера, я убедился, что созданный каркас относится к VisiBroker версий 3.x, что и требовалось доказать. Возможно, Inprise/Borland будут в дальнейшем производить обновление приобретенных пакетов.
Поддержка COM+
Рис. 4 |
А теперь поговорим о наиболее ожидаемом — поддержке создания приложений COM+ для Windows 2000.
Как известно, COM+ — это продукт слияния уже опробованной компонентной технологии Microsoft COM и относительно недавно применяющегося сервера транзакций Microsoft (MTS). Поэтому в C++Builder 5 создание транзакционных MTS-объектов, объектов COM и COM+ тесно переплелось. Говоря точнее, старый MTS Object Wizard был заменен на Transactional Object Wizard (рис. 4), который создает автоматизированные объекты для систем, пользующихся сервисом распределенных приложений.
А чтобы соответствовать требованиям COM+, мастер Transactional Object Wizard позволяет создавать объекты, применяющие в своей работе новую поточную модель Neutral. Что касается новой модели генерации асинхронных событий COM+, то она нашла свое отражение в мастере Com+ Event Object, создающем событийные объекты.
Рис. 5 |
Для настройки специфических флагов COM+ в процессе создания транзакционных и событийных объектов редактор библиотек типов Type Library Editor был дополнен закладкой COM+ (рис. 5).
Рис. 6 |
Теперь программист может задавать некоторые полезные атрибуты объектов, как-то: разрешение активации, тип синхронизации вызовов и транзакционную модель. Установив эти опции, вы облегчаете работу администратору, который иначе вынужден был бы устанавливать атрибуты вручную. После компиляции проекта готовые объекты могут быть установлены на сервер непосредственно из среды разработчика командой RunХInstall Com+ Objects (рис. 6).
Вообще-то C++Builder 5 навевает воспоминания о компиляторе Borland C++, где также, помнится, был CodeGuard и возможность экспорта и импорта функций по порядковым номерам.
Похоже, в Borland решили вдохнуть в эти идеи новую жизнь, реализовав их в современной компонентно-ориентированной среде. Пусть программист сам выберет, нужно ли ему это.
Описание | Назначение |
__declspec( nothrow ) | Описываемая функция и функции, которые она вызывает, никогда не возбуждают исключительных ситуаций |
__declspec( naked ) | Компилятор генерирует код без пролога и эпилога |
__declspec( noreturn ) | Функция не имеет точки возврата, код после ее вызова недоступен |
__declspec( novtable ) | Дает команду компилятору не генерировать код инициализации виртуальной таблицы |
__declspec( selectany ) | Используется в инициализации глобальных данных, описываемых в заголовочных файлах, когда один и тот же заголовочный файл появляется в нескольких файлах с исходными текстами |
__declspec( property( get=get_func_name ) ) __declspec( property( put=put_func_name ) ) __declspec( property( get=get_func_name, put=put_func_name ) ) | Компилятор превращает обращения к таким «виртуальным членам данных» в вызовы указанных методов чтения и записи |
__declspec( uuid(«ComObjectGUID») ) | Присваивает уникальный COM-идентификатор GUID-структуре или классу, описанному с атрибутом uuid |