Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы Мартын 1(ComCorbaLab2004).doc
Скачиваний:
30
Добавлен:
10.02.2016
Размер:
1.81 Mб
Скачать

1.2. Методы встраивания компонентов

Чтобы понять целесообразностьиспользования MFC и директивы #import для внедрения компонентов, необходимознать возможные пути решения этой задачи.

Например, можно написать код, использующий только возможности C++ и COM, который создаст компонент и будет его использовать; в этом случае следует разобраться с концепцией COM-компонентов и написать фрагментповторяющегося и подверженного ошибкам кода.Возможно использовать и классы ATL, но помимо знания COM необходимознатьи ATL. Можно использовать и возможность работы с контейнерами ActiveX, заложенную в «мастер» создания MFC-приложений, но если не хватит возможностей, предлагаемых меню Insert Object, придется изучать код поддержки OLE в MFC. Более простой подход - использовать классы-оболочки компонентов, генерируемые библиотекой компонентов и элементов управления (Components and Controls Library). Но эти классы целиком зависят от поддержки автоматизации, которая есть не во всех компонентах. Интерфейсы автоматизации могут также понизить и производительность.

В лабораторной работе рассмотрен подход, требующий написания минимального кода и минимального знания COM. В нем используется комбинация возможностей MFC и директивы #import. Рассмотрено использование данного подхода для создания компонентов, программного взаимодействия с ними и организации взаимодействия одних компонентов с другими.

1.3. Основы com

Для эффективного использования COM-компонентов следует разобраться в механизме работы и программирования таких компонентов.

Ниже рассмотрены базовые положения. Возможности компонентов COM реализуются по схеме клиент-сервер. Приложение (или другой компонент) получают доступ к компоненту и используют его возможности в роли клиента, а сам компонент выступает в роли сервера. COM определяет правила взаимодействия клиента и сервера на уровне исполняемого кода, что и позволяет клиентам, написанным на одном языке, взаимодействовать с серверами, написанными на других языках. Клиент взаимодействует с компонентом только посредством интерфейса. Компонент может иметь любое количество интерфейсов, и каждый интерфейс может иметь любое количество определенных в нем методов. Возможности взаимодействия компонента полностью определяются методами его интерфейсов.

Все интерфейсы COM-компонента унаследованы от интерфейса IUnknown. Различие между интерфейсами заключается в том, поддерживают ли ониавтоматизацию или нет. Интерфейсы с поддержкой автоматизации унаследованы от интерфейса IDispatch, который, в свою очередь, унаследован от IUnknown. Такое наследование влияет на метод доступа к интерфейсу из C++ и других языков, а также определяет, доступен ли интерфейс из таких языков, как JScript или VBScript, которые не могут напрямую манипулировать указателями. Основное следствие наличия автоматизации у интерфейса при использовании C++ - механизм определения возможностей компонента (то есть, какие методы реализованы в данном интерфейсе) во время выполнения. Такая гибкость приводит к проигрышу в производительности, однако, она сильно расширяет совместимость компонента с приложениями, написанными на других языках.

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