Программирование на Visual C++

Выпуск №20 от 22 октября 2000 г.

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

Тем, кто еще пребывает в блаженном неведении, спешу сообщить хорошую новость.

Рассылка в октябре приобрела статус "золотой"!

Что это значит? По определению Subscribe.Ru, это означает, в частности, что рассылка:

– содержит свежие, актуальные и исключительно полноценные материалы;

– соблюдает указанную в описании тематику и периодичность;

– выходит на грамотном русском языке.

Скромно хочу отметить, что "Программирование на VC++" сейчас единственная "золотая" рассылка в разделе "программирование". Будем надеяться, что этот статус теперь закрепится за ней надолго.

Поздравления принимаются по все тому же адресу ;)

НОВОСТИ

Судя по всему, новая концепция Microsoft – .NET – довольно сильно интересует всех программистов, и, соответственно, читателей рассылки. Сегодня я вам предлагаю статью, присланную Ярославом Говоруновым. Он ее решил оформить как продолжение моей публикации из выпуска №8.

Что дядя Билли нам готовит Часть вторая

Итак, NGWS SDK pre-beta вышла. Это немного развеяло туман, связанный с появлением на свет следующей версии Visual Studio и теперь можно более конкретно говорить о том, что нас ждет. Что же вызвало столько шума? Это не новый язык C#, и не новые инструментальные средства, по большому счету это даже не новая VS ;). Имя счастливчика – .NET.

Так что же такое .NET – технология, SDK или модель? На эту тему было много споров. Был даже спор, является ли .NET операционной системой. Лично я согласен с самим производителем и считаю что .NET – это платформа. Можно сказать, что .NET представляет собой этикетку, название, придуманное маркетологами, для целого набора технологий, как Windows DNA. Формально ее можно определить так:

.NET = COM+

 + дополнительные сервисы и технологии

 + Common Language Runtime (CLR)

 + набор спецификаций (в т.ч. Common Language Specification — CLS)

 + огромная библиотека объектов.

Концептуально .NET представляет собой единение основных идей, лежащих в основе Java и COM.

Теперь обо всем по порядку.

Ядром всей системы является Common Language Runtime (CLR) – это аналог JVM (Java Virtual Machine), но методы ее работы больше похожи на COM. Она контролирует всю основную работу по выделению и освобождению памяти, созданию и уничтожению объектов, вызову методов и многое другое. При этом на низком уровне используются хорошо известные концепции, такие как контексты объектов, перехват по необходимости, Proxy/Stub и т.д. Большая часть технологий не так нова, как кажется. Например, так рекламируемый 'garbage collection' представляет собой просто красивую оболочку механизма подсчета ссылок в COM, только теперь CLR берет на себя всю рутинную работу.

Однако есть ряд существенных отличий. Как и в случае с Java, .NET программы не компилируются в машинные коды. Вместо этого программа поставляется в виде Intermediate Language (IL). На выходе получается тот же самый exe или dll файл, но вместо машинных кодов он содержит IL. На вид IL очень похож на некий прообраз ассемблера, так что исходные тексты , возможно, останутся защищенными. В отличие от байт-кода, IL-код не может быть интерпретирован. Для выполнения программы используется Just-In-Time Compilation (JITting), когда куски кода компилируются и оптимизируются во время выполнения. Такой метод предположительно будет использоваться для WEB-приложений, так как приводит к потерям производительности. Для пользовательских программ будет использоваться другой – pre-JITing, когда компиляция происходит во время установки программы на пользовательскую машину. IL не зависит от языка программирования, теоретически его можно писать даже вручную, однако .NET предлагает лучшее решение.

Common Language Specification (CLS). Да, хорошо сформулированные спецификации являются, пожалуй, самой сильной стороной .NET. Как известно, ни одна технология или платформа не может стать стандартом без спецификаций. .NET, как и COM, является языконезависимой платформой. CLS определяет набор спецификаций, которым должен соответствовать язык программирования, чтобы стать частью .NET. Разумеется, язык должен быть объектно-ориентированным, он должен поддерживать пространства имен. Запрещается множественное наследование, вместо этого вводится концепция интерфейса и множественное наследование интерфейса. Все это делает разницу между языками достаточно тривиальной. В наши дни, для написания программ, программисты пользуются библиотеками объектов. .NET имеет одну большую библиотеку объектов для всех языков. Точнее библиотека является частью CLR, и соответственно доступна для всех языков в платформе. Библиотека эта очень велика. Она состоит из множества пространств имен, каждое из которых в свою очередь содержит классы или другие пространства имен. [Здесь мне почему-то приходит в голову высказывание Роберта Хайнлайна о том, что слон – это мышь, выполненная по государственным спецификациям ;) – AJ]

И наконец о месте VC в новой платформе. Хочу обрадовать читателей, что для VC была отведена особая роль. Так как сам язык C++ не очень соответствует спецификации CLS, то его пришлось немного изменить. Такой измененный язык называется VC managed extension. Однако это не главное! Главное то, что VC остается единственным средством для производства 'unmanaged code', т.е. – программа компилируется в машинные коды и работает не под управлением CLR, а сама по себе.

Итак, какие же преимущества мы получим с переходом на .NET? Первое, и главное – платформонезависимость. Хоть на данный момент доступна только одна платформа – Windows 2000, Microsoft обещает, что CLR будет доступна для всех основных платформ. Второе – языконезависимость. .NET программы могут разрабатываться на любых из более чем 40 уже доступных языков. При этом предоставляется очень высокий уровень интеграции. Облегчается задача разработчика, так как CLR берет на себя часть рутинных задач. А также большая и удобная в использовании библиотека объектов.

А недостатки? О недостатках пока говорить рано. Как говориться «знал бы, где упал».

Возможно, мне так и не удалось ответить на вопрос – что же такое .NET? Грандиозный успех, или грандиозный провал – время покажет. Ясно одно, .NET – это самый значительный шаг Microsoft за последнее время. Важнее даже чем Windows 2000 и X-Box. Грядет революция, и рано или поздно нам придется с этим считаться. Мое мнение – лучше рано, чем поздно.

Несколько полезных ссылок:

Тут можно скачать NGWS SDK

Сайт с кучей полезных ресурсов по .NET

Также сайт посвященный C#

И разумеется первоисточник

ОБРАТНАЯ СВЯЗЬ

Здраствуйте Алекс. Спасибо за Вашу рассылку, я с удовольствием читаю ее с первого выпуска. Прочитав выпуск №19 решил обратить Ваше внимание на, как мне кажется, более новый способ создания паналей инструментов различного внешнего вида (а'ля Internet Explorer и т.п.) Для этих целей в MFC появился класс CReBar позволяющий размещать на панели инструментов не только кнопки но и практически любые объекты произошедшие от CWnd и имеющие стиль WS_CHILD. Как правило в качестве таких объектов выступают экземпляры классов CToolBar и CDialogBar. Более подробно об этом можно прочитать в MSDN.

(D. Kosyrevsky.)

Использование CReBar действительно в некоторых случаях оправданно. Но необходимо знать, что у ReBar существует ряд существенных ограничений. В частности, они не могут быть "плавающими" и стыковаться с границами окна.

Что касается постановки вопроса: "сделать тулбар а'ля WinZip – большие иконки, с подписями…", так это можно сделать в редакторе ресурсов просто "растянув" изображение до нужного размера и написав все, что нужно (естественно, надписи будут статическими). Что же касается размещения элементов управления на панели инструментов за счет "расширения" сепараторов, то это действительно интересно и, главное, более гибко и удобно, чем создание DialogBar.

(Евгений Шмелев.)

Вряд ли статический (т.е. являющийся частью изображения ) текст кого-либо устроит. Это, конечно, можно сделать, но вообще-то это не принято.

ВОПРОС-ОТВЕТ

Q. Как создать такое окно (или это диалогбар?) как Workspace в Visual Studio? То есть, я представляю, что если это диалогбар со списком, то какие стили применить в Create, чтобы его можно было "переносить" и изменять размер?

(СашА)

На этот вопрос было получено удивительно мало ответов. Неужели этим почти никто не интересовался?

A1 Среди заголовочных файлов MFC есть заголовочный файл afxpriv.h, в котором объявлено несколько недокументированных классов, в том числе например класс CDockBar. По-моему именно он обеспечивает создание окон в стиле Visual Studio.

(Anton)

Я хотел бы предостеречь читателей: использование недокументированных классов чревато неприятностями. В том же MSDN написано, что члены и методы класса CDockBar, скорее всего, претерпят сильные изменения в будущем.

A2 Во время оно я боролся с этим вопросом. Вот краткие выводы: DialogBar – ДЕРЬМО. Проще сходить на сайт http://www.datamekanix.com и слить оттуда компонент CSizingControlBar написанный Crisite Posea. Он тоже не предел совершенства, но работает почти так же как и Workspace.

(Vassili Bourdo)

Хочу добавить (как еще один вариант), что я кажется видел класс с такой же функциональностью в Ultimate Toolbox от Dundas Software.

В ПОИСКАХ ИСТИНЫ

Q. У меня есть приложение MFC на базе диалога. Я решил организовать переключение некоторых режимов через главное меню, т.е. в меню присутствуют названия режимов и активный в данный момент режим помечен точкой. Для этого я создал обработчики ON_UPDATE_COMMAND_UI для соответствующих пунктов меню и в них вызов СCmdUI::SetRadio(). Например:

void CHeatDlg::OnUpdateSolve(CCmdUI* pCmdUI) {

 if (mode == 1) pCmdUI->SetRadio(TRUE);

 else pCmdUI->SetRadio(FALSE);

}

Это не сработало. Похоже, что сообщения ON_UPDATE_COMMAND_UI просто не посылаются. До этого я использовал такой же подход в приложениях SDI и MDI и все работало. Есть какие-нибудь мысли по этому поводу?

(Андрей Моисеев)

Успехов!

(Алекс Jenter jenter@mail.ru) (Красноярск, 2000.)







Главная | В избранное | Наш E-MAIL | Прислать материал | Нашёл ошибку | Наверх