Использование com технологий в современных приложениях windows
Технология COM
Введение
1. Компонент должен скрывать используемый язык программирования.
2. Компоненты должны распространяться в двоичной форме. Их необходимо поставлять уже скомпилированными, скомпонованными и готовыми к использованию.
3. Должна быть возможность модернизировать компоненты, не затрагивая уже существующих пользователей. Новые версии компонента должны работать как со старыми, так и с новыми клиентами.
4. Компоненты должны перемещаться по сети. Необходимо, чтобы компонент и использующая его программа могли выполняться внутри одного процесса, в разных процессах и на разных машинах.
Как вы, вероятно, догадались, компоненты COM удовлетворяют всем этим требованиям.
Преимущества использования компонентов
COM обеспечивает создание распределенных модульных систем в архитектуре «клиент-сервер». COM имеет следующие преимущества по сравнению с традиционной архитектурой программных систем:
1. COM предоставляет стандартный набор функций для доступа к провайдеру сервиса (COM-серверу), получения информации о предоставляемых им сервисах и вызова требуемого сервиса. В качестве COM-сервера может выступать операционная система или приложение.
2. COM использует объектно-ориентированные концепции для обеспечения модульности при построении сложных распределенных систем, а также для повторного использования готовых компонентов и их разработки с сохранением совместимости с предыдущими версиями.
3. COM реализует модель вычислений «клиент-сервер», что обеспечивает преимущества распределенной обработки данных.
4. COM обеспечивает вызов сервисов в сетевом окружении, независимо от расположения COM-сервера.
Использование программных компонентов, разработанных на основе технологии COM, значительно расширяет возможности разработчиков приложений, конечных пользователей и предприятий:
1. Разработчики приложений могут повысить эффективность своей работы за счет создания легко масштабируемых систем на базе готовых компонентов, а также получают возможность встраивать компоненты собственной разработки в существующие системы.
2. Конечные пользователи получают широкий выбор готовых стандартизированных программных компонентов, которые они могут использовать в своих системах.
3. Предприятия также могут использовать преимущества компонентного подхода, так как доступность готовых программных компонентов общего назначения позволяет сконцентрироваться на разработке компонентов, специфичных для сферы бизнеса данного предприятия. Компонентная архитектура также позволяет создавать интерфейсы к существующим корпоративным системам и предоставлять объектно-ориентированный доступ к их данным.
Кроме очевидных способности приложения эволюционировать с течением времени, удобства и гибкости при модернизации существующих приложений, создание программ из компонентов имеет другие достоинства.
Адаптация приложений. Пользователи часто хотят подстроить приложения к своим нуждам. Конечные пользователи предпочитают, чтобы приложение работало так, как они привыкли. Компонентные архитектуры хорошо приспособлены для адаптации, так как любой компонент можно заменить другим, более соответствующим потребностям пользователя.
Распределенные компоненты. С возрастанием производительности и общего значения сетей потребность в приложениях, состоящих из разбросанных по разным местам кусков, будет только повышаться. Компонентная архитектура помогает упростить процесс разработки подобных распределенных приложений. Создать из обычного приложения распределенное легче, если это обычное приложение состоит из компонентов.
СОМ и объектно-ориентированный подход
СОМ является объектно-ориентированной технологией, но она отличается от других объектно-ориентированных технологий:
— СОМ-объект поддерживает более одного интерфейса
— Класс в СОМ понимается как описание конкретной реализации набора интерфейсов
— СОМ-объекты поддерживают только наследование интерфейса, т.е. потомок должен самостоятельно определить код методов родителя.
Понятие OLE и ActiveX
Контейнер составных документов должен поддерживать интерфейсы: IOleClientSite (позволяет серверу обращаться к своему контейнеру) и IAdviseSink (сервер использует для того, чтобы информировать контейнер о том, что происходит с ним).
Интерфейсы СОМ-объекта
Интерфейс СОМ предназначен для связи между компонентами и включает в себя набор функций, которые реализуются компонентами и используются клиентами. Свойства СОМ-интерфейса такие: у каждого интерфейса имеется два идентификатора (пользовательский идентификатор и глобальный уникальный идентификатор); интерфейсы после своего опубликования не могут быть изменены; добавление новой функциональности требует определения нового интерфейса; для интерфейса определен стандартный двоичный формат; каждый интерфейс наследует стандартный интерфейс IUnknown; СОМ-объект может описывать свои интерфейсы на любом языке.
#define interface struct
interface IUnknown
<
virtual HRESULT __stdcall QueryInterface(const IID& iid, void** ppv)=0;
// запрос интерфейса
virtual ULONG __stdcall AddRef()=0; // увеличение счетчика ссылок
virtual ULONG __stdcall Release()=0; // уменьшение счетчика ссылок
>;
Глобальный уникальный идентификатор
Описание интерфейса на С++ будет таким:
interface IА : IUnknown
<
virtual void __stdcall Fx() =0;
>;
Ключевое слово _stdcall указывает, что функция с фиксированным числом аргументов в СОМ-интерфейсах использует вызов в стиле Pascal.
QueryInterface
У QueryInterface два параметра :
Virtual HRESULT __stdcall QueryInterface(const IID& iid, void** ppv);
QueryInterface возвращает HRESULT (32-разрядный код результата, записанный в определенном формате). QueryInterface может возвратить либо S_OK, либо E_NOINTERFACE. Клиент не должен прямо сравнивать возвращаемое QueryInterface значение с этими константами; для проверки надо использовать макросы SUCCEEDED или FAILED.
Предположим, что у нас есть указатель на IUnknown, pI. Чтобы определить, можно ли использовать некоторый другой интерфейс, мы вызываем QueryInterface, передавая ей идентификатор нужного нам интерфейса. Если QueryInterface отработала успешно, мы можем пользоваться указателем:
void foo(IUnknown* pI)
<
// Определить указатель на интерфейс IX* pIX = NULL;
// Запросить интерфейс IX
HRESULT hr = pI->QueryInterface(IID_IX, (void**)&pIX);
// Проверить значение результата if (SUCCEEDED(hr))
<
// Использовать интерфейс pIX->Fx();
>
>
В этом фрагменте кода мы запрашиваем у pI интерфейс, идентифицируемый с помощью IID_IX. Определение IID_IX содержится в заголовочном файле, предоставляемом компонентом (или извлекается из библиотеки типа). Для неудачного запроса
QueryInterface должна устанавливать возвращаемый указатель в NULL. Однако, поскольку QueryInterface реализуется программистом компонента, в некоторых реализациях это наверняка не будет сделано. Для безопасности следует установить указатель в NULL самостоятельно. Ниже приведен пример реализации QueryInterface:
Тип данных HRESULT
Коды возврата бывают такие:
А источники ошибки такие:
Макросы STDMETHOD и STDMETHODIMP
Макросы STDMETHOD и STDMETHOD_ применяются при объявлении методов интерфейса, а макросы STDMETHODIMP и STDMETHODIMP_ при описании реализации метода.
Вместо
virtual HRESULT __stdcall QueryInterface(const IID& iid, void** ppv);
можно записать
STDMETHOD(QueryInterface(const IID& iid, void** ppv));
Вместо
virtual void __stdcall Fy() =0;
можно записать
STDMETHOD_(void, Fy()) PURE;
Функции и технологии для приложений для Windows Features and technologies for Windows apps
Вне зависимости от типа создаваемого приложения или применяемого устройства Windows поддерживает множество функций, которые являются основными компонентами для важных сценариев приложений. No matter what type of app you are building or device you are targeting, Windows supports many features that are key building blocks for important app scenarios. Некоторые из этих функций по-разному доступны для среды выполнения Windows (WinRT), универсальной платформы Windows (UWP), Win32 (API Windows) и других платформ приложений. Some of these features are exposed to the Windows Runtime (WinRT) and the Universal Windows Platform (UWP), Win32 (Windows API), and other app platforms in different ways. Приведенные ниже статьи помогут понять, как определенные функции Windows поддерживаются на различных платформах приложений и как приступить к использованию этих функций в коде. The following articles help you understand how certain Windows features are supported in different app platforms and how to get started using the features in your code.
Эта статья содержит адаптированный список статей с подробными сведениями о том, как получить доступ к важным функциям и технологиям Windows на платформах приложений WinRT, Win32 (API Windows), WPF и Windows Forms. This article provides a tailored list of articles to read more about how you can access important Windows features and technologies in WinRT, Win32 (Windows API), WPF, and Windows Forms app platforms. Полные сведения о функциях разработки каждой платформы см. в следующих ресурсах: For complete information about the development features of each platform, see the following resources:
Основные функции и технологии Windows Key Windows features and technologies
В следующих разделах приводятся некоторые важные функции и технологии Windows, которые позволяют создавать современные и привлекательные возможности для клиентов. The following sections highlight several important Windows features and technologies that enable you to deliver modern and deliver compelling experiences to your customers.
Windows Ink Windows Ink
Платформа Windows Ink — наряду с пером — обеспечивает естественный способ создания цифровых рукописных примечаний, рисунков и заметок. The Windows Ink platform, together with a pen device, provides a natural way to create digital handwritten notes, drawings, and annotations. Платформа поддерживает получение входных данных дигитайзера в виде рукописных данных, создание рукописных данных, управление этими данными, отображение их в виде росчерков пера на устройстве вывода и преобразование этих росчерков в текст с помощью функции распознавания рукописного ввода. The platform supports capturing digitizer input as ink data, generating ink data, managing ink data, rendering ink data as ink strokes on the output device, and converting ink to text through handwriting recognition.
Дополнительные сведения о различных способах использования платформы Windows Ink в приложениях для Windows см. в статье Взаимодействие с пером и Windows Ink в приложениях UWP. For more information about the different ways to use Windows Ink in Windows apps, see Windows Ink.
Взаимодействие с помощью голосовых функций Speech interactions
Windows предоставляет множество способов для интеграции функций распознавания речи и преобразования текста в речь (также известную как TTS или синтез речи) непосредственно в приложение. Windows provides many ways to integrate speech recognition and text-to-speech (also known as TTS, or speech synthesis) directly into the user experience of your app. Речь может быть надежным и приятным способом взаимодействия пользователя с вашим приложением, который сможет дополнить или даже заменить взаимодействие с помощью клавиатуры, мыши, сенсорного ввода и жестов. Speech can be a robust and enjoyable way for people to interact with your app, complementing, or even replacing, keyboard, mouse, touch, and gestures.
Дополнительные сведения о различных способах применения взаимодействия с помощью речи в приложениях для Windows 10 см. в этой статье. For more information about the different ways to use speech interactions in Windows apps, see Speech, voice, and conversation in Windows 10.
ИИ Windows Windows AI
Мы предлагаем несколько разных решений искусственного интеллекта, которые можно использовать для улучшения приложений Windows. We offer several different AI solutions that you can use to enhance your Windows applications. С помощью машинного обучения Windows вы можете интегрировать обученные модели машинного обучения в приложения и локально запускать их на устройстве. With Windows Machine Learning, you can integrate trained machine learning models into your apps and run them locally on the device. Навыки компьютерного зрения Windows позволяют использовать готовые библиотеки для выполнения общих задач обработки изображений или создания собственных решений. Windows Vision Skills allows you to use pre-built libraries to accomplish common image processing tasks, or create your own custom solutions. DirectML предоставляет низкоуровневые интерфейсы API типа DirectX, которые позволяют использовать все возможности оборудования. DirectML provides low-level, DirectX-style APIs that let you take full advantage of the hardware.
Дополнительные сведения о различных способах интеграции искусственного интеллекта в приложения для Windows см. в статье ИИ Windows. For more information about the different ways to integrate AI in Windows apps, see Windows AI.
Функции и технологии по платформам Features and technologies by platform
В следующих разделах приведены полезные ссылки для получения дополнительных сведений о том, как выполнять интеграцию с основными функциями и технологиями Windows из наших основных платформ приложений: WinRT/UWP, Win32 (Windows API), WPF и Windows Forms. The following sections provides useful links to learn more about how to integrate with core Windows features and technologies from our main app platforms: WinRT/UWP, Win32 (Windows API), WPF, and Windows Forms.
Использование технологии COM
Технология СОМ реализуется с помощью СОМ-библиотек (в число которых входят такие файлы операционной системы, как OLE32.DLL и OLE-Aut32.DLL). СОМ-библиотеки содержат набор стандартных интерфейсов, которые обеспечивают функциональность СОМ-объекта, а также небольшой набор функций API, отвечающих за создание и управление СОМ-объектов.
Клиенты не знают, как СОМ-объект выполняет свои действия. СОМ-объект предоставляет свои услуги при помощи интерфейсов. В дополнение, приложению-клиенту не нужно знать, где находится СОМ-объект. Технология СОМ обеспечивает прозрачный доступ независимо от местонахождения СОМ-объекта.
В общих чертах, СОМ-сервер должен выполнять следующие действия :
— регистрировать данные в системном реестре Windows для связывания модуля сервера с идентификатором класса (CLSID);
— предоставлять фабрику СОМ-класса, создающую экземпляры СОМ-объектов;
— обеспечивать механизм, который выгружает из памяти серверы СОМ, которые в текущий момент времени не предоставляют услуг клиентам.
Достоинствами технологии СОМ является то, что, во-первых, создание СОМ-объектов не зависит от языка программирования. Таким образом, СОМ-объекты могут быть написаны на различных языках. Во вторых, СОМ-объекты могут быть использованы в любой среде программирования под Windows. В число этих сред входят Delphi, Visual C++, C++Builder, Visual Basic, и многие другие. Эти достоинства позволяют легко обеспечить интеграцию самых разнообразных приложений в рамках СОМ-технологии.
Компоненты СОМ состоят из исполняемого кода, распространяемого в виде динамически компонуемых библиотек (DLL) или ЕХЕ-файлов Win32. Один такой файл может содержать как одиночный СОМ-объект, так и несколько СОМ-объектов. Компоненты, написанные в соответствии со стандартом СОМ, удовлетворяют всем требованиям компонентной архитектуры.
C точки зрения разработчика, возможны два класса задач, связанных с использованием технологии COM:
· создание собственных COM-объектов;
· применение уже имеющихся COM-объектов.
Первый класс задач более сложен и требует от разработчика достаточно глубокого знакомства с технологией COM и ее компонентами. В рамках данной работы мы не будем рассматривать эти задачи. Задачи же второго класса значительно проще, ибо применение уже имеющихся COM-объектов, по сути, мало чем отличается от работы с обычными объектами. Поскольку в состав самой Windows входят многочисленные COM-объекты, а многие приложения имеют хорошо документированные соответствующие иерархии COM-объектов (объектные модели), то создание таких приложений обычно не представляет особых трудностей.
В процессе выполнения заданий по второй учебной практике вы познакомились с двумя технологиями, базирующимися на технологии COM –OLE Automation, широко применяющейся в рамках пакета Microsoft Office, и технологиейActiveX, представляющих собой общее название ряда близких технологий фирмы Microsoft, таких как ActiveX-Controls, ActiveX-Documents и ActiveScripting. технологияActiveXпредназначена, в первую очередь, для работы в распределенных компьютерных системах (локальные и глобальные сети). Однако она может быть использована и для интеграции приложений и на локальных компьютерах, так как позволяет создавать и использовать программные компоненты, предоставляющие различные сервисы другим приложениям и операционной системе.
Для выполнения базовых функций и использования интерфейсов, в ОС Windows существует специальная библиотека COM. Набор ее функций можно рассматривать как подмножество функций Windows API, поэтому к ним всегда возможен доступ стандартным способом – вызовом соответствующих функций. Согласно спецификации СОМ, имена всех функций этой библиотеки начинаются с приставки “Co” (например, CoCreateInstance, CoGetClassObject и т. п.).
С помощью этой библиотеки можно осуществлять запуск серверов объектов.
На рис. 2.6 показан процесс создания первого экземпляра объекта с помощью библиотеки COM и системного реестра. Допустим, что клиент пытается обратиться к объекту COM, который до этого момента не использовался. Следовательно, клиент не имеет указателя на нужный объект и интерфейс. Для получения этих данных, ему необходимо обратиться к библиотеке COM для вызова (1) специального метода CoCreateInstance, передавая ему в качестве параметра CLSID нужного класса (CLSID_2), IID интерфейса (IID2_A) и требуемый тип сервера. Здесь (и далее) числовой номер в скобках соответствует номеру в последовательности выполнения операций, который на рис. 2.6 указывается в кружках на стрелках.
В общих чертах, СОМ-сервер должен выполнять следующие действия:
— регистрировать данные в системном реестре Windows для связывания модуля сервера с идентификатором класса (CLSID);
— предоставлять фабрику СОМ-класса, создающую экземпляры СОМ-объектов;
— обеспечивать механизм, который выгружает из памяти серверы СОМ, которые в текущий момент времени не предоставляют услуг клиентам.
Согласно спецификации СОМ фабрика класса также является объектом СОМ. Объект СОМ имеет право называться фабрикой класса, если он поддерживает интерфейс iclassFactory. В нем реализованы всего два метода:
—CoCreatelnstance— создает новый экземпляр класса. Все необходимые параметры, кроме iid, метод получает от фабрики класса. В этом его отличие от одноименной общей функции Windows API;
—LockServer— оставляет сервер функционировать после создания объекта.
Для вызова фабрики класса существует специальная функция библиотеки классовcoGetclassObject:
|
В качестве параметра ей передается clsid нужного класса и iid интерфейса (iclassFactory). Функция ищет требуемую фабрику и возвращает указатель на интерфейс. С его помощью, используя методCoCreatelnstance, клиент заставляет фабрику класса создать объект.
Расширения COM
Технология СОМ изначально разрабатывалась как ядро для осуществления межпрограммного взаимодействия. Уже на этапе разработки предполагалось расширять возможности технологии при помощи так называемых расширений СОМ. СОМ расширяет собственную функциональность, благодаря созданию специализированных наборов интерфейсов для решения конкретных задач.
Примером могут служить ранее упоминавшиеся технология автоматизации (automation) и технология ActiveX. Однако, на этом список возможных расширений СОМ далеко не исчерпывается. Постоянно идет доработка старых и создание новых, более совершенных технологий межпрограммного взаимодействия. В табл. 2.1 представлены некоторые из наиболее часто используемых в настоящее время (но далеко не все!) расширений СОМ.
В табл. 2.2 приведены основные особенности объектов для каждого из вышеприведенных расширений СОМ.
Если не считать простейшего COM-объекта (COM-сервера), содержащего один базовый интерфейс Iunknown и, один или несколько пользовательских интерфейсов, то наиболее простым из указанных в таблице 2.1 расширений СОМ является сервер автоматизации. По сути, он представляет собой простейший COM-сервер, дополненный еще одним интерфейсом – Idispatch.
Технология автоматизации (OLE Automation)разработана на основе технологии СОМ. Так же как и СОМ, автоматизация позволяет использовать функции одних приложений в других приложениях.Автоматизация— это механизм обмена информацией между процессами в операционной системе Windows, с помощью которого одна прикладная программа может управлять другой. Технология OLE Automation обеспечивает выполнение базовых функций, позволяющих обособленным программным модулям связываться и обмениваться информацией. Многие используемые в технологии автоматизации термины подобны тем, которые применяются при описании технологии СОМ.
Объект автоматизации не имеет принципиальных отличий от объекта СОМ и представляет собой отдельный, самодостаточный объект, разработанный для выполнения специфической задачи или функции. Отличие от объекта СОМ заключается только в том, что доступ к объектам автоматизации осуществляется через специальные интерфейсы, называемые интерфейсамидиспетчеризации(dispinterface). Интерфейсы диспетчеризации похожи на обычные интерфейсы СОМ, но позволяют упростить обращение к объекту автоматизации. Приложение, предоставляющее те или иные сервисы и применяющее для этой цели интерфейсы содержащихся внутри него адресного пространства COM-объектов, называется сервером автоматизации. Приложение, использующее эти сервисы, называется контроллером автоматизации и может быть создано с помощью подавляющего большинства современных средств разработки программного обеспечения.
Сервер автоматизациипредставляет собой исполняемый модуль, который может включать в себя несколько объектов автоматизации.
Контроллером (диспетчером) автоматизациипринято называть клиентское приложение, управляющее объектом автоматизации. Контроллер автоматизации для управления объектом автоматизации использует методы интерфейсов этого объекта. Для получения информации об интерфейсах служат библиотеки типов.
Обычно, в состав современных сред разработки включаются т. н.мастера (Wizards) для создания разнообразных объектов СОМ. Они позволяют создавать СОМ-объекты при помощи мастера, а также регистрировать и тестировать созданные объекты.
Мастера СОМ-объектов выполняют следующие действия:
Общие сведения о технологии COM
технология СОМ+ появилась в конце 1998 года, и, представляет собой дальнейшее развитие компанией Microsoft новой генерации технологии СОМ для корпоративной ОС Windows 2000. Ее можно рассматривать как дальнейшее развитие DCOM, предоставляющее множество новых возможностей, включая управление объектами во время выполнения и основанный на языках программирования инструментарий.
2.3 Основы COM-технологии
Основные понятия COM-технологии
Технология СОМ работает с так называемымиСОМ-объектами. СОМ-объекты похожи на обычные «классические» объекты использующиеся в современном программировании, однако отличаются от них тем, чтово-первых, вдобавок ко всем обычным свойствам имеетидентификатор класса (CLSID), аво-вторых— это полностью закрытые данные, которые могут быть полученытолько через некую функцию-метод. Набор таких методов, позволяющий работать с данными объекта, носит названиеинтерфейса. Клиенты могут получитьдоступ к сервисам объекта СОМ только через вызовы методов интерфейсов объекта— у них нет непосредственного доступа к данным объекта. Обычный СОМ-объект включает в себя один или несколькоинтерфейсов. Каждый из этих интерфейсов имеет собственный указатель.
5.3.2 Структура компонентов COM
В СОМ любая часть программного обеспечения реализует свои сервисы как один или несколько объектов СОМ. Компонент, соответствующий модели COM, состоит из собственно объекта COM и интерфейсов COM. Каждый такой объект поддерживает один или несколько интерфейсов, состоящих из методов.
Интерфейс— это набор методов, позволяющий работать с данными объекта. Согласно венгерской нотации, имена всех интерфейсов начинаются с буквы I.Все интерфейсы строятся (наследуются) от базового интерфейса, который называется lUnknown («неизвестный»). Несмотря на такое название, это единственный интерфейс, о котором знают все клиенты и компоненты, а такое название объясняется тем, что поскольку все интерфейсы COM являются его наследниками, то при наличии у клиента указателя на lUnknown, он может запросить через него другие интерфейсы даже в том случае, если он не знает указателями на какой именно интерфейс обладает данный объект. Интерфейс lUnknown имеет всего три метода:AddRef, прибавляющий единицу к счетчику блокировок объекта,Release, вычитающий единицу из счетчика блокировок, иQuerylnterface, который позволяет найти указатель на другой интерфейс объекта, если таковой имеется.Querylnterfaceнаходит указатель натаблицу виртуальных методов, которая хранит указатели на методы интерфейса.
На практике такая схема не применяется, а сворачивается до вида, показанного на рис. 2.1б Интерфейс на ней изображен кружком, который называется гнездом (Jack).
Большинство объектов СОМ поддерживают более одного интерфейса. Например, если некоторый объект СОМ, представляетВаш счет в банке, то к одному из интерфейсов вы можете иметь непосредственный доступ, и он содержит методы Deposit (Положить-НаСчет), Withdrawal (СнятьСоСчета) и CheckBalance (ПроверитьОстаток). Однако тот же объект может поддерживать и другой интерфейс, содержащий методы вроде ChangeAccountNumber (ИзменитьНомерСчета) и CloseAccount (ЗакрытьСчет), которые могут вызываться только сотрудниками банка. При этом, каждый интерфейс может содержать методы, связанные друг с другом.
На рис 2.2 показан объект COM. Сам объект всегда реализуется внутри некоторого сервера (прямоугольник вокруг объекта). Сервер может быть либо динамически подключаемой библиотекой (DDL), подгружаемой во время работы приложения, либо отдельным самостоятельным процессом.
Что бы вызвать методы интерфейса COM, клиент должен получить указатель на этот интерфейс. Обычно COM-объект предоставляет свои сервисы посредством нескольких интерфейсов, и клиенту требуется отдельный указатель для каждого интерфейса, методы которого он намерен вызывать.
5.3.3 Основные принципы построения COM-объектов
1. Нахождение объекта COM. Любой COM-объект не может существовать независимо. Он может быть реализован только сервером объектов COM. Сервер отвечает за создание, существование и уничтожение своих объектов COM. Каждый COM-объект «живет» в адресном пространстве своего сервера.
2. Фундаментальный интерфейс. Любой COM-объект всегда содержит интерфейс IUnknown. Так же этот интерфейс является предком (может быть и не прямым) любого интерфейса. При создании COM-объекта чаще всего возвращается ссылка именно на этот интерфейс. Этот интерфейс содержит всего три метода:
Так как IUnknown является предком всех интерфейсов, то все интерфейсы содержат эти три метода, и, следовательно, имея ссылку на любой интерфейс COM-объекта можно получить ссылку на любой другой интерфейс этого же объекта.
3. Наследование. Объекты COM поддерживают наследование, но лишь на уровне интерфейсов. Данное ограничение вполне уместно, если вспомнить, что COM-объект представляет собой некий черный ящик, детали реализации которого известны лишь его создателю. В связи с этим если бы существовало наследование на уровне реализации, то могла бы возникнуть ситуация, когда объект, а именно его наследуема часть, поведет себя совсем не так, как ожидает программист, что может привести к сбою или краху системы. Один интерфейс может быть предком для нескольких других интерфейсов. При этом создается как бы дерево наследования, но корнем этого дерева всегда является интерфейс IUnknown. Следует отметить, что на самом деле существует способ создать иллюзию наследования реализации путем включения или путем агрегирования объекта.
|
4. Неизменность интерфейсов. В создании COM-объектов есть одно «железное» правило, соблюдать которое обязан каждый программист, создающий и, главное, поддерживающий свой объект COM:
Возможно создание в новой версии объекта нового интерфейса с дополнительными методами. Допустим, если есть некий интерфейс IInterface, то можно создать новый интерфейс IInterface2 путем наследования IInterface и добавления к нему новых методов. Это правило связано, отчасти, с тем, что к моменту модификации вашего объекта уже, возможно, будут существовать десятки или даже сотни (если повезет) приложений-клиентов, использующих этот объект со старыми интерфейсами. Естественно так же не должен меняться IID существующих интерфейсов.
2.3.4 Основные принципы организации интерфейсов.
— как идентифицировать интерфейс в системе;
— об общем способе описания интерфейса;
— о конкретной его реализации.
Реализация интерфейсаопределяет двоичный формат, поддерживаемый COM-объектом для каждого интерфейса. Наличие такого стандарта позволяет осуществить вызов методов интерфейса независимо от языка, на котором написаны COM-объект и клиент. Вызов методов производится посредством использования v-table, отвечающей стандартам языка C++.
2.4 Использовании COM-объектов для разработки интегрированных средств программного обеспечения.