Файл: Технология COM ( С++ ).pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 04.04.2023

Просмотров: 130

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

/* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject)=0 ;

virtual ULONG STDMETHODCALLTYPE AddRef( void) =0;

virtual ULONG STDMETHODCALLTYPE Release( void) =0;

};

Смысл использованных макросов:

HRESULT – long;

STDMETHODCALLTYPE – _stdcall

REFIID – const GUID &

В файле Unknwn.h можно найти также много других описаний, определяющих структуру таблицы vtable, заголовки функций для вызова proxy и stub и т.д.

Описание (базового) класса IAccount – наследника IUnknown – как абстрактного класса:

class IAccount : public IUnknown

{

public:

// IAccount methods

STDMETHOD(GetBalance)(int* pBalance) = 0;

STDMETHOD(Deposit)(int amount) = 0;

};

8. Здесь STDMETHOD – virtual HRESULT _stdcall.

Описание (конкретного) класса СAccount:

class CAccount : public IAccount

{

public:

CAccount() // конструктор

{

m_nRef = 0;

m_nBalance = 100;

}

// методы IUnknown

STDMETHOD(QueryInterface)(REFIID, void**);

STDMETHOD_(ULONG, AddRef)();

STDMETHOD_(ULONG, Release)();

// IAccount methods

STDMETHOD(GetBalance)(int* pBalance);

STDMETHOD(Deposit)(int amount);

protected:

ULONG m_nRef; // число ссылок

int m_nBalance; // счет в банке

};

Использованные макросы:

9. REFIID – GUID (структура из 16 байт);

10. STDMETHODIMP – HRESULT _stdcall.

11.

Реализация методов класса CAccount:

STDMETHODIMP

CAccount::QueryInterface(REFIID iid, void** ppv)

{

if (iid == IID_IUnknown)

*ppv = (IAccount*) this;

else if (iid == IID_IAccount)

*ppv = (IAccount*) this;

else

{

*ppv = NULL;

return E_NOINTERFACE;

}

AddRef();

return NOERROR;

}

Метод QueryInterface в конечном итоге возвращает ссылку на таблицу vtable, которая создается компилятором С++ автоматически, если в классе определены виртуальные функции.

STDMETHODIMP_(ULONG) CAccount :: AddRef()

{

return ++m_nRef;

}

STDMETHODIMP_(ULONG) CAccount :: Release()

{

if(--m_nRef == 0)

{

delete this; // уничтожение экземпляра класса

// Trace("Object destroyed", "CAccount");

return 0;

}

return m_nRef;

}

STDMETHODIMP CAccount :: Deposit(int amount)

{

m_nBalance += amount;

return S_OK;

}

STDMETHODIMP CAccount::GetBalance(int* pBalance)

{

*pBalance = m_nBalance;

return S_OK;

}

Для практического использования класса CAccount требуется описать экземпляр класса IAccount:

IAccount * m_pAccount=NULL;

и получить ссылку на интерфейс. Эту задачу решает (обычная) функция CreateAccount.

BOOL CreateAccount(IAccount ** ppAccount)

{

HRESULT hr;

if (ppAccount == NULL)

return FALSE;

// Create object

CAccount* pAccount = new CAccount;

if (pAccount == NULL)

return FALSE;

// получить интерфейс. При этом в QueryInterface вызывается метод AddRef

hr = pAccount->QueryInterface(IID_IAccount, (void**) ppAccount);

if (SUCCEEDED(hr))

{

Trace("Object created", "CAccount");

return TRUE;

}

else

{

delete pAccount;

return FALSE;

}

}

Идентификатор интерфейса можно получить с помощью GuidGen и описать его как константу, например:

static const IID IID_IDisplay =

{ 0x5723b700, 0x2878, 0x11d1, { 0xa0, 0x1b, 0x0, 0xa0, 0x24, 0xd0, 0x66, 0x32 } };

Идентификатор для интерфейса IUnknown предопределен.


Невзирая на то, что в функции CreateAccount указатель pAccount на экземпляр класса создается локально, объект может быть разрушен, так как ссылка на него сохраняется в параметре ppAccount. Экземпляр СОМ класса уничтожается в методе Release.

Вызов этой функции целесообразно выполнить следующим образом:

if (m_pAccount)

{

m_pAccount->Release();

m_pAccount = NULL;

}

// создание экземпляра СОМ класса

if (!CreateAccount(&m_pAccount))

{

MessageBox("CreateAccount failed");

return;

}

После получения ссылки на интерфейс ею можно пользоваться для вызова методов класса, например, так:

int balance;

HRESULT hr = m_pAccount->GetBalance(&balance);

if (FAILED(hr))

{

MessageBox("GetBalance failed");

return;

}

Добавление других интерфейсов.

Для реализации дополнительных интерфейсов необходимо проделать следующие шаги:

  • объявить новый (абстрактный) класс как производный от IUnknown;
  • сгенерировать для него идентификатор IID с помощью GuidGen.exe;
  • объявить конкретный класс как производный от всех поддерживаемых объектом СОМ интерфейсов.

Например:

class IDisplay : public IUnknown

{

public:

// IDisplay methods

STDMETHOD(Show)() = 0;

};

Теперь используем множественное наследование и описываем класс конкретный:

class NewCAccount : public IAccount, IDisplay

{

}

Так как появился дополнительный интерфейс, необходимо изменить реализацию QueryInterface так, чтобы он позволял получать любой из интерфейсов IAccount и IDisplay. Пример реализации этого метода:

STDMETHODIMP

CAccount::QueryInterface(REFIID iid, void** ppv)

{

if (iid == IID_IUnknown)

*ppv = (IAccount*) this;

else if (iid == IID_IAccount)

*ppv = (IAccount*) this;

else if (iid == IID_IDisplay)

*ppv = (IDisplay*) this;

else

{

*ppv = NULL;

return E_NOINTERFACE;

}

AddRef();

return NOERROR;

}

Глава 3. Расширения COM

COM с самого начала проектировалась для того, чтобы обеспечить функциональность взаимодействия приложений и предоставить возможность дальнейшего развития этой функциональности за счет расширений[44]. Основной идеей, заложенной в COM, является использование наборов интерфейсов, предназначенных для достижения специфических целей.

Расширения COM продолжают развиваться. OLE технологии и сервисы были разработаны для предоставления различных сервисов приложениям Windows. Далее, Microsoft объединила технологии OLE и OCX, назвав их компонентами ActiveX[45]. Технология ActiveX делает объекты COM более компактными и эффективными, что крайне необходимо для приложений, функционирующих в больших сетях.


Вскоре, возможно, Microsoft включит некоторые MTS технологии для разработки комплексных Intranet и Internet приложений на основе COM технологии. Список реализованных в настоящее время расширений приведен в таблице 3.

Таблица 3

Список расширений

Серверыавтоматизации(Automation servers)

Автоматизация – это способность приложения управлять объектами другого приложения программным образом. Серверы автоматизации – это объекты, которые могут программироваться на этапе выполнения

Контролерыавтоматизации

(Automation controllers)

Это клиенты серверов автоматизации, предоставляющие среду, в которой разработчик или пользователь может писать сценарии (scripts) управления серверами автоматизации

Элементы ActiveX

(ActiveX controls)

Это специализированные COM объекты для компонентов Windows. Они более компактны по сравнению с устаревшими серверами OLE документов, что обеспечивает эффективность их применения в таких масштабных сетевых средах, как Internet или сети Intranet больших предприятий. Элементы ActiveX должны находиться в библиотеке

Библиотекитипов

(Type libraries)

Представляет собой набор структурированных данных, часто сохраняемый как ресурс, содержащий подробную информацию об объекте и его интерфейсах.

Клиенты серверов автоматизации и элементов ActiveX получают из этой библиотеки информацию о типах

Активные документы (Active Documents)

Это объекты, которые поддерживают связывание и внедрение, перемещение, визуальное редактирование и активизацию на месте. Документы Word и таблицы Excel являются примерами активных документов

Визуальные межпроцессные объекты

(Visual cross-process objects)

Объекты, которыми можно управлять из различных процессов

На рисунке 7 показана взаимосвязь расширений COM.

Рис. 7. Взаимосвязь расширений COM

Серверы и контролеры автоматизации.

Термин "автоматизация" означает способность приложения управлять объектами другого приложения программным образом, подобно макросам, способным манипулировать несколькими приложениями одновременно[46]. Клиента объекта автоматизации называют контроллером автоматизации (Automation controller), а объект сервера – объектом автоматизации (Automation object) .

Автоматизация может использоваться для всех трех видов серверов[47]. Для нее характерны два ключевых момента:


  • объект автоматизации должен иметь возможность определить множество (набор) свойств и команд и описать их возможности посредством описаний типа. Для того чтобы это (описание) реализовать на практике, должен быть способ провести его через описания интерфейсов, методов и их параметров. Обычно эта информация содержится в библиотеках типов (type libraries)[48]. В Delphi сервер автоматизации может также генерировать информацию о типах оперативно – "на лету" – когда она будет затребована;
  • объекты автоматизации должны так реализовать свои методы, чтобы другие приложения могли их использовать. Для этого объекты должны реализовать интерфейс IDispatch. Посредством этого интерфейса объект показывает все свои методы и свойства. Теперь посредством первичного метода этого интерфейса можно вызывать другие методы, которые идентифицируются информацией о типах[49].

Разработчики, которые хотят создавать и использовать не визуальные OLE объекты, которые могут выполняться в любом адресном пространстве, могут использовать объекты автоматизации. Одной из причин для такого решения является то, что интерфейс IDispatch обеспечивает маршалинг. Однако, автоматизация накладывает некоторые ограничения на доступные для использования типы.

ЗАКЛЮЧЕНИЕ

COM – это метод разработки программных компонентов – небольших двоичных исполняемых файлов, которые предоставляют необходимые сервисы приложениям, операционным системам и другим интерфейсам.

COM – это спецификация. Она указывает как создавать динамически взаимозаменяемые компоненты.

На основе COM построены технологии Active X,DirectX, OLE (2 версия). OLE 1 была реализована с использованием DDE (динамический обмен данными). DDE в свою очередь построен на основе архитектуры передачи сообщений Windows.

Технология Com позволяет выполнить разделение монолитного приложения на отдельные компоненты, что делает приложение

  • более динамичным;
  • облегчает обновление частей приложения;
  • позволяет собирать новые приложения из имеющихся частей – библиотеки компонентов;
  • легче выполнить адаптацию приложения к уонкретным требованиям;
  • позволяет заменять компоненты во время работы приложения;
  • упрощает процесс разработки распределенных приложений.

Компоненты COM должны:

  • подключаться динамически;
  • инкапсулировать (скрывать) детали своей реализации.

Клиент – это программа или компонент, использующий другой компонент.

Клиент подсоединяется к компоненту через интерфейс.

Если компонент изменяется без изменения интерфейса, то изменения в клиенте не требуются.

Изоляция клиента (предоставляемого ему интерфейса) от реализации накладывает на компоненты следeдующие ограничения:

1. Компонент должен скрывать используемый язык программирования.

2. Компонент должен распространятся в двоичной форме.

3. Новые версии компонента должны работать как с новыми, так и со старыми клиентами.

4. Компоненты должны быть (прозрачно) перемещаемы по сети. Удаленный компонент для клиента рассматривается также, как и локальный (иначе это бы вызывало перекомпиляцию клиента при перемещении компонента).

5. Компонент должен одинаково выполняться :

– внутри одного процесса

– в разных процессах – на разных машинах.

СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ

  1. Акперов И. Г. Информационные технологии в менеджменте : учебник : [для студентов высших учебных заведений, обучающихся по направлению "Менеджмент" и по специальности "Менеджмент организаций"] : соответствует Федеральному государственному образовательному стандарту 3-го поколения / И. Г. Акперов, А. В. Сметанин, И. А. Коноплева. - Москва : ИНФРА-М, 2013. – 399 с.
  2. Бокс Дональд. Сущность технологии СОМ / Д. Бокс ; [Пер. с англ. А.Шкадова]. - СПб. и др. : Питер: Питер Бук, 2001. - 397 с.
  3. Гагарина Л. Г. Введение в архитектуру программного обеспечения : учебное пособие : [для студентов, обучающихся по направлениям подготовки 09.03.04 "Программная инженерия" (профиль бакалавриата "Программные технологии распределенной обработки информации"), 09.04.04 "Программная инженерия" (программа магистратуры "Программное обеспечение автоматизированных систем и вычислительных комплексов")] / Л. Г. Гагарина, А. Р. Федоров, П. А. Федоров. - Москва : ФОРУМ : ИНФРА-М, 2017. - 319 с.
  4. Гвоздева В. А. Базовые и прикладные информационные технологиих : [учебник для студентов высших учебных заведений, обучающихся по техническим специальностям] : соответствует Федеральному государственному образовательному стандарту 3-го поколения / В. А. Гвоздева. - Москва : Форум : ИНФРА-М, 2014. - 382 с.
  5. Ездаков А. Л. Функциональное и логическое программирование : учебное пособие / А. Л. Ездаков. - 2-е изд. - Москва : БИНОМ. Лаборатория знаний, 2017. – 118 с.
  6. Лазарева И. М. Теория языков программирования и методы трансляции : учебное пособие : [по дисциплине "Теория языков программирования и методы трансляции" по направлению подготовки 01.03.02 "Прикладная математика и информатика: Системное программирование и компьютерные технологии"] / И. М. Лазарева ; М-во образования и науки Рос. Федерации, Мурм. аркт. гос. ун-т. - Мурманск : Мурманский арктический государственный университет, 2018. – 97 с.
  7. Одинцов Б. Е. Современные информационные технологии в управлении экономической деятельностью : теория и практика : учебное пособие : [для студентов высших учебных заведений, обучающихся по экономическим направлениям и специальностям] / Б. Е. Одинцов, А. Н. Романов, С. М. Догучаева ; Финансовый ун-т при Правительстве Рос. Федерации. - Москва : Вузовский учебник : ИНФРА-М, 2017. – 371 с.
  8. Онокой Л. С. Компьютерные технологии в науке и образовании : [учебное пособие для студентов высших учебных заведений, обучающихся в магистратуре по направлению подготовки ВПО 040100 "Социология"] : соответствует Федеральному государственному образовательному стандарту 3-го поколения / Л. С. Онокой, В. М. Титов. - Москва : ФОРУМ : ИНФРА-М, 2014. - 223 с.
  9. Черпаков И. В. Основы программирования : учебник и практикум для СПО : [для студентов образовательных учреждений среднего профессионального образования] / И. В. Черпаков ; Финансовый ун-т при Правительстве Рос. Федерации. - Москва : Юрайт, 2017. – 218 с.
  10. Шишов О. В. Современные технологии и технические средства информатизации : учебник : [для студентов вузов, обучающихся по направлению "Сервис"] : соответствует Федеральному государственному образовательному стандарту 3-го поколения / О. В. Шишов. - Москва : ИНФРА-М, 2014. – 460 с.