- •Понятие визуального программирования.
- •Типы приложений (оконное приложение, консольное, сервис, драйвер).
- •Программирование, основанное на ресурсах. Редакторы ресурсов. Компилятор ресурсов. Функции для работы с ресурсами.
- •Работа с документами и окнами просмотра документов.
- •Структура оконного приложения.
- •Разработка однодокументных приложений. Использование AppWizard.
- •Назначение и методы классов приложения, главного окна, документа и вида.
- •Обработка сообщений. Работа с clAssWizard.
- •Обработка сообщений. Сообщение Windows. Обработка сообщений мыши и клавиатуры.
- •Панели элементов управления и каркас приложения. Панель инструментов. Строка состояния.
- •Модальные и немодальные диалоговые окна. Работа с модальным диалоговым окном.
- •Модальные и немодальные диалоговые окна. Работа с немодальными диалоговыми окнами.
- •Архитектура Document-View.
- •Управление gdi объектами. .Стандартные gdi-объекты .
- •Создание и уничтожение gdi-объектов.
- •Распределенные приложения. Технология dcom.
- •Многодокументный интерфейс mdi.
- •Рисование с помощью cdc.
- •Обзор основных классов mfc.
- •Классы для программирования графического интерфейса Windows.
- •Классы для обработки списков, массивов, коллекций.
- •Выполнение стандартных файловых операций с помощью класса cFile.
- •Сериализация данных приложения.
- •Многодокументный интерфейс mdi.
- •Понятие процесса и потока. Программирование многопоточных приложений.
- •Управление памятью в mfc.
- •Технологии связывание и внедрения объектов ActiveX.
- •Назначение и преимущества использования технологии ActiveX.
- •Установка элементов управления ActiveX.
- •Использование управляющих элементов ActiveX.
- •Понятие технологии com.
- •Создание объектов сом
- •Повторное применение объектов сом
- •Поддержка баз данных в mfc.
- •Технология ado
- •Обзор технологий odbc, dao, rdo, ole db. Интерфейсы доступа к данным.
- •Создание экранной формы для отображения содержимого бд.
- •Классы mfc для работы с сетью.
- •Программирование приложений для Интернета.
- •Динамически подключаемые библиотеки на mfc.
Повторное применение объектов сом
Известно, что основным средством повторного использования существующего кода является наследование реализации (новый класс наследует реализацию операций существующего класса). СОМ не поддерживает это средство. Причина — в типовой СОМ-среде базовые объекты и объекты-наследники создаются, выпускаются и обновляются независимо. В этих условиях изменения базовых объектов могут вызвать непредсказуемые последствия в объектах-наследниках их реализации. СОМ предлагает другие средства повторного использования — включение и агрегирование.
Применяются следующие термины:
внутренний объект — это базовый объект;
внешний объект — это объект, повторно использующий услуги внутреннего объекта.
При включении (делегировании) внешний объект является обычным клиентом внутреннего объекта. Когда клиент вызывает операцию внешнего объекта, эта операция, в свою очередь, вызывает операцию внутреннего объекта.
При этом внутренний объект ничего не замечает.
Достоинство включения — простота. Недостаток — низкая эффективность при длинной цепочке «делегирующих» объектов.
Недостаток включения устраняет агрегирование. Оно позволяет внешнему объекту обманывать клиентов — представлять в качестве собственных интерфейсы, реализованные внутренним объектом. Когда клиент запрашивает у внешнего объекта указатель на такой интерфейс, ему возвращается указатель на внутренний, агрегированный интерфейс. Клиент об агрегировании ничего не знает, зато внутренний объект обязательно должен знать о том, что он агрегирован.
Зачем требуется такое знание? В чем причина? Ответ состоит в необходимости особой реализации внутреннего объекта. Она должна обеспечить правильный подсчет ссылок и корректную работу операции Querylnterface.
Представим две практические задачи:
запрос клиентом у внутреннего объекта (с помощью операции Querylnterface) указателя на интерфейс внешнего объекта;
изменение клиентом счетчика ссылок внутреннего объекта (с помощью операции AddRef) и информирование об этом внешнего объекта.
Ясно, что при автономном и независимом внутреннем объекте их решить нельзя. В противном же случае решение элементарно — внутренний объект должен отказаться от собственного интерфейса IUnknown и применять только операции IUnknown внешнего объекта. Иными словами, адрес собственного IUnknown должен быть замещен адресом IUnknown агрегирующего объекта. Это указывается при создании внутреннего объекта (за счет добавления адреса как параметра операции CoCreatelnstance или операции IClassFactory::CreateInstance).
СOM-серверы и их клиенты.
Каждый СОМ-объект существует внутри конкретного сервера. Этот сервер содержит программный код реализации операций, а также данные активного СОМ-объекта. Один сервер может обеспечивать несколько объектов и даже несколько СОМ-классов. Используются три типа серверов:
Сервер «в процессе» (in-process) — объекты находятся в динамически подключаемой библиотеке и, следовательно, выполняются в том же процессе, что и клиент;
Локальный сервер (out-process) — объекты находятся в отдельном процессе, выполняющемся на том же компьютере, что и клиент;
Удаленный сервер — объекты находятся в DLL или в отдельном процессе, которые расположены на удаленном от клиента компьютере.
С точки зрения логики, клиенту безразлично, в сервере какого типа находится СОМ-объект — создание объекта, получение указателя на его интерфейсы, вызов его операций и финализация выполняются всегда одинаково. Хотя временные затраты на организацию взаимодействия в каждом из трех случаев, конечно, отличаются друг от друга.
В качестве кратких выводов отметим основные преимущества СОМ.
1. СОМ обеспечивает удобный способ фиксации услуг, предоставляемых разными фрагментами ПО.
2. Общий подход к созданию всех типов программных услуг в СОМ упрощает проблемы разработки.
3. СОМ безразличен язык программирования, на котором пишутся СОМ-объекты и клиенты.
4. СОМ обеспечивает эффективное управление изменением программ — замену текущей версии компонента на новую версию с дополнительными возможностями.
Доступ к данным в Visual C++.
Количество доступных Windows-приложениям интерфейсов доступа к данным может показаться чрезмерным. Какую же из технологий - DAO, ODBC, RDO, UDA, OLE DB или ADO - выбрать для построения конкретного приложения?
Проделаем небольшой экскурс в историю. Раньше в Microsoft ключевыми технологиями доступа к данным считались Data Access Objects (DAO) для настольных систем и Remote Data Objects (RDO), основанная на Open Database Connectivity (ODBC), - для клиент-серверных баз данных. Но на смену им пришла единая модель Universal Data Access (UDA), поддерживающая данные любых типов.
Цель UDA - обеспечить высокопроизводительный доступ как нереляционным, так и к реляционным источникам данных, предоставив удобный, независимый от инструментальных средств и языка интерфейс программирования. UDA базируется на объектах АDO, которые предоставляют высокоуровневый интерфейс для работы с OLE DB - технологией Microsoft для доступа к базам данных на основе СОМ.
Хотя нет никаких ограничений в применении старых технологий для доступа к данным, при создании новых приложений лучше пользоваться UDA. Эта технология проста в обращении, характеризуется широким спектром возможностей и достаточной производительностью. Опытные разработчики программ на базе СОМ могут напрямую обращаться к интерфейсам OLE DB, получая выигрыш в скорости и эффективности. В Visual C++ 6.0 есть OLE DB Templates - набор шаблонных классов, облегчающих применение этой технологии путем предоставления большинства популярных интерфейсов OLE DB. Планируя перенос существующих DAO/ODBC-приложений на ADO, Вам обязательно надо оценить, покроют ли преимущества от использования этой технологии издержки на ее внедрение, ведь код, написанный для DAO или RDO, напрямую не переносим на ADO. Тем не менее в подавляющем большинстве случаев решения, основанные на других моделях, можно с равным успехом реализовать на основе ADO. Нужно стремиться к преобразованию всего кода в стандарты ADO, объектная модель которой существенно проще и гибче
