Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

Технология COM (Принцип работы технологии COM)

Содержание:

Введение

COM (Component Object Model) - метод разработки программного компонента, небольшого двоичного исполняемого файла, который предоставляет необходимые сервисы приложению, операционным системам и другим компонентам. Иначе, COM определяет стандартные механизмы, с помощью которых одна часть программного обеспечения предоставляет свои сервисы другой независимо от способа их реализации.

COM - это не язык программирования, а подход (спецификация) к созданию программы, который обеспечивает взаимодействие программ любых типов. Компоненты COM объединяются друг с другом для создания приложения или системы компонентов. Компоненты можно менять во время выполнения, без перекомпиляции или перекомпоновки приложения. COM - это основа, на которой построены такие технологии Microsoft, как ActiveX, DirectX и OLE.

Цель курсовой работы – рассмотрение технологии COM.

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

  1. Рассмотреть теоретические сведения о технологии СОМ:
  • принцип работы технологии СОМ;
  • преимущества и недостатки СОМ;
  • технологии, основанные на стандарте СОМ.
  1. Рассмотреть примеры использования технологии СОМ.
  2. Рассмотреть программные продукты, которые используют технологию СОМ.

Предмет исследования – технология СОМ.

1 Теоретические сведения о технологии COM

1.1 Принцип работы технологии COM

Основным понятием, которым оперирует стандарт COM, являетсяCOM-компонент. Программы, которые построены на стандарте COM, фактически не являются автономными программами, а представляют собой набор взаимодействующих между собой COM-компонентов. Каждый компонент имеет уникальный идентификатор (GUID) и может одновременно применяться многими программами. Компонент взаимодействует с другими программами черезCOM-интерфейсы— наборы абстрактных функций и свойств. Каждый COM-компонент должен, как минимум, поддерживать стандартный интерфейс «IUnknown», который предоставляет базовые средства для работы с компонентом. Интерфейс «IUnknown» включает в себя три метода: QueryInterface, AddRef, Release.[4]

Windows APIпредоставляет базовые функции, которые позволяют применять COM-компоненты. БиблиотекиMFCи, особенно,ATL/WTLпредоставляют более гибкие и удобные средства для работы с COM. Библиотека ATL от Microsoft до сих пор остаётся самым популярным средством создания COM-компонентов. Но зачастую COM-разработка остаётся ещё довольно сложным делом, программистам приходится вручную выполнять многие рутинные задачи, связанные с COM (особенно это заметно в случае разработки наC++). Впоследствии (в технологиях COM+ и особенно .NET) Microsoft попыталась упростить задачу разработки COM-компонентов.[6]

К компонентам обычно предъявляются следующие требования:

  1. Компонент должен скрывать применяемый язык программирования.
  2. Компоненты должны распространяться в двоичной форме. Их необходимо поставлять уже скомпилированными, скомпонованными и готовыми к применению.[10]
  3. Должна быть возможность модернизировать компоненты, не затрагивая уже существующих пользователей. Новые версии компонента должны работать как со старыми, так и с новыми клиентами.
  4. Компоненты должны перемещаться по сети. Необходимо, чтобы компонент и применяемая его программа могли выполняться внутри одного процесса, в разных процессах и на разных машинах.[10]

1.2 Преимущества использования компонентов

COM обеспечивает создание распределенных модульных систем в архитектуре «клиент-сервер». COM имеет следующие преимущества по сравнению с традиционной архитектурой программных систем:

  1. COM предоставляет стандартный набор функций для доступа к провайдеру сервиса (COM-серверу), получения информации о предоставляемых им сервисах и вызова требуемого сервиса. В качестве COM-сервера может выступать операционная система или приложение.
  2. COM применяет объектно-ориентированные концепции для обеспечения модульности при построении сложных распределенных систем, а также для повторного применения готовых компонентов и их разработки с сохранением совместимости с предыдущими версиями.
  3. COM реализует модель вычислений «клиент-сервер», что обеспечивает преимущества распределенной обработки данных.
  4. COM обеспечивает вызов сервисов в сетевом окружении, независимо от расположения COM-сервера.[4]

Применение программных компонентов, разработанных на основе технологии COM, значительно расширяет возможности разработчиков приложений, конечных пользователей и предприятий:

  1. Разработчики приложений могут повысить эффективность своей работы за счет создания легко масштабируемых систем на базе готовых компонентов, а также получают возможность встраивать компоненты собственной разработки в существующие системы.[6]
  2. Конечные пользователи получают широкий выбор готовых стандартизированных программных компонентов, которые они могут применять в своих системах.
  3. Предприятия также могут применять преимущества компонентного подхода, так как доступность готовых программных компонентов общего назначения позволяет сконцентрироваться на разработке компонентов, специфичных для сферы бизнеса данного предприятия. Компонентная архитектура также позволяет создавать интерфейсы к существующим корпоративным системам и предоставлять объектно-ориентированный доступ к их данным.[6]

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

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

Библиотеки компонентов. Одна из самых многообещающих сторон внедрения компонентной архитектуры - быстрая разработка приложений. Компоненты, которые помещены в библиотеку, можно применять как детали нового приложения.

Распределенные компоненты. С возрастанием производительности и общего значения сетей потребность в приложениях, состоящих из разбросанных по разным местам кусков, будет только повышаться. Компонентная архитектура помогает упростить процесс разработки подобных распределенных приложений. Создать из обычного приложения распределенное легче, если это обычное приложение состоит из компонентов.[10]

1.3 Технологии, основанные на стандарте COM

DCOM

Выпущенная в1996 годутехнологияDCOM(англ.DistributedCOM— распределённая COM) основана на технологииDCE/RPC(разновидностиRPC). DCOM позволяет COM-компонентам взаимодействовать друг с другом посети. Главным конкурентом DCOM является другая известная распределённая технология—CORBA.

Как DCOM, так и CORBA решают задачу вызова метода объекта, расположенного на другой машине, а также передачу ссылки на объект с одной машины на другую.

Сетевой уровень DCOM называется ORPC (Object RPC) и является объектно-ориентированным расширением DCE RPC.

Технология DCOM обеспечивает базовые установки безопасности, позволяя задавать, кто и из каких машин может создавать экземпляры объекта и вызывать его методы.

COM+

Microsoft Transaction Server былвключенв Option Pack для Windows NT4 ещев 1997 году.

В составеWindows 2000была выпущена технологияCOM+, которая являлась новой версией Microsoft Transaction Server.

Технология расширяла возможности разработчиков COM-компонентов, предоставляя им некоторые готовые услуги, например:

  • автоматический пулпотоков, создаваемый стандартным процессом-загрузчиком mtx.exe;
  • доступ к контексту, в котором выполняется компонент (например, компоненты, которые применяются вASP, могут с этой возможностью получить доступ к внутренним объектам той страницы, на которой они выполняются);
  • интеграция с транзакциями монитора MS DTC (контекст COM+ может автоматически содержать в себе транзакцию MS DTC).[6]

MTS/COM+ применялся внутри ряда версий веб-сервера MSIISдля загрузки и исполнения веб-приложений, как бинарных по технологииISAPI, так и скриптовых по технологии ASP (сама asp.dll есть ISAPI-приложение).

COM+ объединяет компоненты в так называемыеприложения COM+, что упрощает администрирование и обслуживание компонентов. Безопасность и производительность— основные направления усовершенствований COM+. Некоторые идеи, заложенные в основу COM+, были также реализованы вMicrosoft .NET.

.NET и будущее COM

В2002 годубыла официально выпущена платформаMicrosoft .NET, которая на сегодняшний день объявлена Microsoft рекомендуемой основой для создания приложений и компонентов под Windows. По этой причине в.NETвключены и средства, позволяющие обращаться к компонентам COM из приложений.NET, и наоборот. По словам представителей Майкрософт, COM (точнее, COM+) и.NETявляются отлично взаимодополняющими технологиями.

DCOM через интернет и решение проблемы XP SP2

В 2009 году DComLab опубликовал коммерческий продукт ComBridge. При примененииComBridge для работы по DCOM через интернет не требуется CIS, не используется 135 порт, в локальной сети не требуются настройки dcomcnfg. ComBridge встраивается в транспортный уровень DCOM, полностью выделяя весь трафик созданного объекта и всех полученных из него объектов в отдельный поток.

OPC

OPC(OLE for Process Control)— семейство программных технологий, предоставляющих единый интерфейс для управления объектами автоматизации и технологическими процессами. Многие из OPC-протоколов базируются на Windows-технологиях: OLE, ActiveX, COM/DCOM. Такие OPC-протоколы, как OPC XML DA и OPC UA, являются платформо-независимыми.[6]

OLE

OLE(англ. Object Linking and Embedding, произносится как oh-lay [олэй]— Связывание и встраивание объекта) — технология связывания и внедрения объектов в другие документы и объекты, разработанные корпорацией Майкрософт.

OLE позволяет передавать часть работы от одной программы редактирования к другой и возвращать результаты назад. Например, установленная на персональном компьютере издательская система может послать некий текст на обработку в текстовый редактор, либо некоторое изображение в редактор изображений с помощью OLE-технологии.[6]

1.4 Недостатки технологии СОМ

Технология часто критикуется за неоправданную сложность, а именно:

  • необходимость применения двух языков программирования (.idl для описания интерфейсов и, обычно, C++ для написания реализаций). Необходимость возникает только при создании собственных интерфейсов, и не возникает в случае, если разработчик ограничил себя применением готового интерфейса;
  • необходимость «прокладочного» кода (в его роли обычно выступает ATL) для того, чтобы создать COM-объект на базе С++ класса. Хотя этот код и тривиален в применении для опытного человека, он не очень прост для начинающих. Как и в предыдущем пункте, эта проблема возникает только при написании собственных классов и не возникает при одном лишь применении стандартных чужих классов (для которых Microsoft разработал библиотеку смарт-пойнтеров — comdef.h, _com_ptr_t<Interface>, эта библиотека делает применение COM-объектов тривиальным);
  • необходимость регистрации компонент в реестре операционной системы, причем при этом в качестве идентификатора класса применяетсянечитаемый человекомGUID(хотя его и возможно дополнить читаемым именем);[10]
  • инфраструктура remoting (удаленного вызова методов) применяет бинарный формат запросов и ответов, являясь расширением DCE RPC. Это приводит к возникновению огромной «поверхности уязвимости» с точки зрения безопасности, и не раз приводило к крупным эпидемиям вредоносного ПО (MSBlaster);
  • инфраструктура remotingприменяет по умолчанию (вслед за DCE RPC) динамически назначаемые номера TCP- и UDP-портов, что делает её крайне сложной в настройке при наличии межсетевых экранов;
  • обработка ошибок. В COM принято применять 32-битные коды ошибки HRESULT, которые имеют значения вроде 0x80070123, и совершенно не читаемы человеком (хотя в последнее время все они легко ищутся поисковыми машинами Интернета).[10]

Кроме того, runtime typeinformation в COM, известная под названием typelibraries, поддерживается только для т.н. Automation-compatible интерфейсов, имеющих огромные ограничения на типы параметров (массивы — только SAFEARRAY, строки — только BSTR, никаких произвольных структур, только числа, дата/время, массивы, строки и ссылки на другие Automation-compatible объекты).

Заметно, однако, что многие из этих недостатков являются платой за достоинство COM— независимость от языка программирования и исполняющей среды, и не существуют в «истинно объектных» языках, таких, как C#, или же (прекращенная) реализация Java компании Microsoft. Эти языки предоставляют и полную runtime typeinformation, и отсутствие необходимости регистрации, и возможность написания как интерфейсов, так и классов стандартным для языка образом, без «прокладок» вроде ATL. Так, в MS J++ любой класс Java тривиально публиковался внешнему миру как класс COM, достаточно было лишь регистрации. То же существует и в C#.[6]

С противоположной стороны, «истинно объектные» языки либо вообще не способны стыковаться с компонентами из других объектных языков и требуют написания всей системы (и нижележащих подсистем и фреймворков) «сверху донизу» на одном языке в одной исполняющей среде (Java, Objective C), либо же налагают такое же требование хотя и не на язык, но на исполняющую среду (.NET, языки C#, C++ managed и VB.NET).

Более новые аналогичные технологии (например, в мире .NET) пытаются решить эти проблемы. Там обычно стек remotingполиморфен и кастомизируем, что дает возможность самостоятельно выбирать формат вопросов/ответов и транспортный протокол (по умолчанию применяется уже не DCE RPC, а SOAP, в качестве формата данных — XML, а в качестве транспорта — HTTP, который не полагается на динамические номера портов).

Применение механизма позднего связывания может существенно снизить производительность по сравнению, например, с вызовом экспортируемой функции из динамической библиотеки. Однако этот механизм применяется только в скриптовых языках, и только в том случае, если язык не поддерживает объявление ссылок на объекты как ссылок на COM-интерфейсы из typelibraries (в виде Dim obj As Excel.Workbook), а поддерживает только абстрактные COM-объекты (в виде Dim obj As Object). Кроме того, такой же подход применяется в Objective C и Cocoa.[6]

2 Примеры использования технологии СОМ

СОМ - это объектно-ориентированная технология, но при этом она имеет отличия от других объектно-ориентированных технологий:

СОМ-объект поддерживает несколько интерфейсов.

Класс в СОМ рассматривается как описание конкретной реализации набора интерфейсов.

СОМ-объект поддерживает только наследование интерфейса, т.е. потомок самостоятельно определяет код методов родителя.[6]

OLE (Object Linking and Embedding) - это технология для создания составного документа путем связывания и внедрения. Документ сервера являетсясвязанным либо внедреннным в документ контейнера. Метод создания составного документа: копирование и вставка с помощью буфера обмена или методаdrag-and-drop.

Контейнер составного документа должен поддерживать следующие интерфейсы: IOleClientSite (обращение сервера к своему контейнеру) и IAdviseSink (использование сервера для информирования контейнера о происходящих с ним действиях).[11]

ActiveX - это технология создания приложения на основе СОМ. Спецификация управляющего элементаActiveX определяет четыре аспекта для их функционирования: обеспечение интерфейса пользователя, обеспечение вызова метода управляющего элемента контейнером, отправка событий контейнеру, получение данных о свойствах среды контейнера и предоставление доступа к свойствам управляющих элементов и их модификация.[12]

Интерфейс СОМ используется для связи между несколькими компонентами и содержит в себе набор функций, реализуемых компонентами и используемых клиентами. Свойства СОМ-интерфейса следующие: у каждого интерфейса имеется два идентификатора (пользовательский идентификатор и глобальный уникальный идентификатор); интерфейсы после своего опубликования не могут быть изменены; добавление новой функциональности требует определения нового интерфейса; для интерфейса определен стандартный двоичный формат; каждый интерфейс наследует стандартный интерфейс IUnknown; СОМ-объект может описывать свои интерфейсы на любом языке.[12]

Назначение интерфейса Iunknown заключается в следующем - запрос указателя на иной интерфейс и отслеживание количества клиентов СОМ-объекта. Описание данного интерфейса Iunkown выглядит данным образом:

#define interface struct 
interface IUnknown 

virtual HRESULT__stdcallQueryInterface(const IID& iid, void** ppv)=0; 
// запрос интерфейса 
virtual ULONG __stdcallAddRef()=0; // увеличение счетчика ссылок 
virtual ULONG __stdcallRelease()=0; // уменьшение счетчика ссылок 
};

GUID(GloballyUniqueIDentifier) или UUID(UniversallyUniqueIdentifiers) - это величина размером 16 байт, которая генерируется специальными программными утилитами UUIDGEN.EXE или GUIDGEN.EXE. Каждый GUID является уникальным во времени и пространстве. Он содержит в себе время (60 бит - число 100-наносекундных интервалов, прошедших с 00:00:00:00 15 октября 1582 года) и адрес сетевой платы (48 бит). Например:[11]

// {B32093E0-CC12-11d2-BD11-00AA00264239} 
static const IID IID_IA = 
{ 0xb32093e0, 0xcc12, 0x11d2, { 0xbd, 0x11, 0x0, 0xaa, 0x0, 0x26, 0x42, 0x39 } };

Описание рассмотренного интерфейса на С++ выглядит следующим образом:

interface IА : IUnknown 

virtual void __stdcall Fx() =0; 
};

Ключевое слово _stdcallпоказывает, что функции с фиксированным числом аргументов в СОМ-интерфейсах применяет вызов в стиле Pascal.[11]

В IUnknownвходит функция - QueryInterface, спомощью которой клиент может определить, поддерживается интерфейс или нет. QueryInterfaceперемещает указатель на интерфейс в том, если его поддерживает компонент; в ином случае возвращается код ошибки (клиентымогутзапрашивать указатели на разные интерфейсы или аккуратно выгружать компоненты).

УQueryInterface имеетсядвапараметра:

Virtual HRESULT__stdcall QueryInterface(const IID& iid, void** ppv);

Первый параметр - это идентификатор интерфейса, которая называется IID-структура.

Второй параметр - это адрес, с помощью которогоQueryInterface помещает указатель на нужныйинтерфейс.[11]

QueryInterface возвращает HRESULT (32-разрядный код результата, записанный в определенном формате). QueryInterfaceвозвращает либо S_OK, либо E_NOINTERFACE. Клиенту не нужно сравнивать возвращаемое QueryInterface значение с рассмотренными константами; в этом случае для проверки необходимоприменять макросы SUCCEEDED или FAILED.

Допустим, что имеется указатель на IUnknown, pI. Для определения того, можно ли применять некоторый интерфейс, нужно вызватьQueryInterface, при этом передав ей идентификатор требуемого интерфейса. Если QueryInterfaceвыполнилась успешно, томожноиспользовать указатель:[12]

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:[11]

HRESULT__stdcall QueryInterface(const IID& iid, void** ppv) 

if (iid == IID_IUnknown) 
{ // КлиентзапрашиваетинтерфейсIUnknown. 
*ppv = (*IX)this; 

else if (iid == IID_IX) 
{ // Клиентзапрашиваетинтерфейс IX 
*ppv = (*IX)this; 

else if (iid == IID_IY) 
{ // Клиентзапрашиваетинтерфейс IY 
*ppv = (*IY)this; 

else 
{ // Нетдругихинтерфейсов 
*ppv=NULL; 
return E_NOINTERFACE; 

(IUnknown*)(*ppv)->AddRef(); // Увеличениесчетчикассылок 
return S_OK; 
}

QueryInterface и другие функции COM возвращают значение HRESULT. HRESULT - это 32-разрядное число, которое разбито на три секции: источник ошибки (биты с 16 по 30), код ошибки (биты с 0 по 15) и признак ошибки (31 бит, 0 означает, что ошибки нет).[12]

Бывают следующие коды возврата:

- S_OK или NOERROR - функция отработала успешно, значение 0

- S_FALSE - функция отработала успешно, значение 1

- E_UNEXPECTED - неожиданная ошибка

- E_NOTIMPL - функция не реализована

- E_NOINTERFACE - объект не поддерживает интерфейс

- E_OUTOFMEMORY - объект не может выделить память

- E_FAIL - ошибка по неуказанной причине

А источники ошибки такие:

- FACLITY_WINDOWS 8

- FACLITY_STORAGE 3

- FACLITY_SSPI 9

- FACLITY_RPC 1

- FACLITY_Win32 7

- FACLITY_CONTROL 10

- FACLITY_DISPATCH 2

МакросыSTDMETHODиSTDMETHOD_ используютсяприобъявленииметодаинтерфейса, амакросыSTDMETHODIMPиSTDMETHODIMP_ используются приописаниивыполненияметода.[6,11]

Вместо 
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;

Приописанииреализациивместо 
virtual void __stdcall Fy() { cout<< "Fy" << end1;} 
можнозаписать 
STDMETHODIMP_(void) Fy() { cout<< "Fy" << end1;}

Далее представлен пример COM-объекта на языке C++ и пример организации взаимодействия клиентов с СОМ-объектом.[12]

#include<iostream.h> 
#include<objbase.h> 
interface IX : IUnknown 

virtual void __stdcall Fx() =0; 
}; 
interface IY : IUnknown 

virtual void __stdcall Fy() =0; 
}; 
// класс СОМ -объекта 
class CA : public IX, public IY 

// Реализация методов IUnknown 
virtual HRESULT__stdcallQueryInterface(const IID& iid, void** ppv); 
virtual ULONG __stdcallAddRef() {return 0;}; // пока ничего не делает 
virtual ULONG __stdcallRelease() {return 0;}; // пока ничего не делает 
// Реализация интерфейса IX 
virtual void __stdcall Fx() { cout<< "Fx" <<end1;} 
// Реализация интерфейса IY 
virtual void __stdcall Fy() { cout<< "Fy" << end1;} 
};

Пример взаимодействия клиента с СОМ-объектом представлен ниже:

// Функция создания объекта 
IUnknown* CreateInstance() 

IUnknown * pI=(IX*)new CA; 
pI->AddRef(); 
return pI; 

void main() 

HRESULThr; 
// Создание объекта 
IUnknown* pIUnknown = CreateInstance(); 
IX* pIX=NULL; 
// Получить интерфейс IX 
hr=pIUnknown->QueryInterface(IID_IX, (void**)&pIX); 
if (SUCCEEDED(hr)) 
{ // вызвать метод Fx 
pIX->Fx(); 

else cout<< "Объект не имеет интерфейса " <<end1; 
IY* pIY=NULL; 
// Получить интерфейс IY 
hr=pIUnknown->QueryInterface(IID_IY, (void**)&pIY); 
if (SUCCEEDED(hr)) 
{ // вызвать метод Fy 
pIX->Fy(); 

else cout<< "Объект не имеет интерфейса " <<end1; 
// Получить интерфейс IY через интерфейс IX 
IY* pIY_IX =NULL; 
hr=pIX->QueryInterface(IID_IY, (void**)&pIY_IX); 
if (SUCCEEDED(hr)) 
{ // вызвать метод Fy 
pIY_IX->Fy(); 

else cout<< "Объект не имеет интерфейса " <<end1; 
// Получить интерфейс IUnknown через интерфейс IY 
IUnknown* pIUknown_IY =NULL; 
hr=pIY->QueryInterface(IID_IUnknown, (void**)&pIUnknown_IY); 
if (SUCCEEDED(hr)) 
if (pIUnknown_IY == pIUknown) 

cout<< "указатели совпадают " <<end1; 

else cout<< "указатели не совпадают " <<end1; 
// Удалить объект 
delete pIUnknown; 
}

Для того чтобы воспользоваться объектом СОМ, клиенты должны явно инициировать начало выполнения работы экземпляра данного объекта. Здесь появляется вопрос: «Когда оканчивается работа объекта?» Кажется, решение очевидное - возложение на клиента, который запустил объект на выполнение, обязанности сообщить объекту, когда емунеобходимо остановиться. Однако это решение не работает, потому что данный клиент может в последствии оказаться не один, ктоиспользует этот объект. Часто распространена практика, когда клиенты запускают выполнение объекта, получают указатель на его интерфейс и затем передают один из указателей другим клиентам. Последний может применять указатель для исполнения метода в том же объекте и в свою очередь также передать указатель другому клиенту. Если бы первый клиент мог «убивать» экземпляр объекта по своему желанию, то положение остальных клиентов было бы незавидным.[6]

В то время как один объект может пользоваться несколькими клиентами одновременно, никто из них не в состоянии узнать, когда все остальные завершатся. Так что разрешить клиенту убивать объект напрямую - небезопасно. Только сам объект может знать, когда он может безопасно завершить свою работу, и только в том случае, если все клиенты сообщают объекту, что они завершили работу с ним. Такой контроль объекты осуществляют с помощью механизма подсчета ссылок (referencecounting), поддерживаемого двумя методами интерфейса IDnknown.[11]

Каждый исполняющийся объект поддерживает счетчик ссылок. Всякий раз, выдав вовне указатель на один из своих интерфейсов, объект увеличивает счетчик ссылок на 1. Если один клиент передает указатель интерфейса другому клиенту, т.е. увеличивает число пользователей объекта без ведома последнего, то клиент, получающий указатель, должен вызвать с помощью этого указателя AddRef. В результате объект увеличивает свой счетчик ссылок. Независимо от того, как он получил указатель на интерфейс, клиент всегда обязан вызвать для этого указатель Release, закончив с ним работу. Исполнение этого метода объектом состоит в уменьшении числа ссылок на 1. Обычно объект уничтожает сам себя, когда счетчик ссылок становится равным 0.

Подсчет ссылок может вызывать проблемы. Если не все клиенты следуют правилам, то экземпляр объекта может либо существовать неопределенно долго, либо, что еще хуже, быть преждевременно удаленным. И все-таки подсчет ссылок выглядит единственным работающим способом управления временем жизни объектов в динамичной среде, которую позволяет создать СОМ.

Каждый объект СОМ реализован внутри некоторого сервера, содержащего код, который реализует методы интерфейсов объекта, а также контролирует данные объекта, пока тот активен. Один сервер может поддерживать более одного объекта некоторого класса. Рассмотрим три основные типа серверов.[12]

Сервер «в процессе»: объекты реализуются в динамически подключаемой библиотеке, и, таким образом, исполняются в том же процессе, что и клиент. Локальный сервер: объекты реализованы в отдельном процессе, исполняющемся на той же машине, что и клиент. Удаленный сервер: объекты реализованы в DLL либо в отдельном процессе, которые расположены на удаленном по отношению к клиенту компьютере. Возможность создания таких серверов поддерживает распределенная СОМ (DCOM).[12]

С точки зрения клиента, объекты, реализованные любой из трех разновидностей серверов, выглядят одинаково; доступ к методам объектов клиент по-прежнему осуществляет через указатели интерфейсов. При необходимости он может проводить различие между разными типами серверов, но это не обязательно. Запуск объекта, получение указателей на его интерфейсы, вызов их методов и освобождение указателей выполняются клиентом одинаково независимо от того, каким сервером реализован объект: «в процессе», локальным или удаленным.

В любой системе, поддерживающей СОМ, обязательно имеется некоторая реализация библиотеки СОМ. Эта библиотека содержит функции, предоставляющие базовые сервисы объектам и их клиентам. Но гораздо важнее то, что библиотека предоставляет клиентам способ запуска серверов объектов. Доступ к сервисам библиотеки СОМ осуществляется через вызовы обычных функций, а не методов интерфейсов СОМ-объектов. Обычно имена функций библиотеки СОМ начинаются с «Со» - например, CoCreateInstance.

Запрашивая создание объекта, клиент передает библиотеке СОМ идентификатор класса данного объекта, используя который, библиотека должна найти сервер этого класса. Здесь не обойтись без некоего системного реестра - таблицы, отображающей CLSID в местоположение исполняемого кода сервера. Классы всех объектов, которые будут создаваться на данной машине посредством библиотеки СОМ, должны быть зарегистрированы в такой базе данных.[6, 11]

СОМ реализована на разных системах, и точный формат системного реестра может быть разным. Microsoft Windows использует стандартную системную таблицу - она так и называется: Реестр. Другие реализации СОМ могут использовать другие схемы, которые, однако, должны включать:

  • CLSID, выступающий как ключ для поиска записи;
  • указание типа доступного сервера («в процессе», локальный или удаленный);
  • для серверов «в процессе» и локальных (т.е. для выполняемых на той же машине, что и клиент) должно быть задано полное имя DLL или исполняемого файла сервера; для удаленных серверов (доступных через DCOM) - указание, где искать исполняемый файл сервера.[12]

Обычно приложение добавляет записи к этой таблице при установке. После этого объекты приложения могут создаваться и использоваться клиентами.

Рассмотрим самый простой способ создания одного неинициализированного экземпляра объекта. Вначале клиент вызывает функцию библиотеки СОМ CoCreateInstance. Кроме других параметров, данный вызов задает CLSID объекта, который должен быть создан, а также IID некоторого интерфейса, поддерживаемого объектом. Далее библиотека СОМ по CLSID находит в системном реестре запись, соответствующую классу данного объекта. Эта запись содержит информацию о местоположении сервера, способного создать экземпляр класса объекта. После того как сервер найден, ОС запускает его.

Вместе с CLSID и IID первого интерфейса, указатель которого необходим клиенту, параметры CoCreateInstance позволяют также клиенту указать, какой тип сервера должен быть запущен библиотекой СОМ - например, «в процессе» или локальный. Клиент имеет право сказать, что тип сервера ему безразличен, либо задать любую комбинацию допустимых типов серверов.

Запущенный сервер создает экземпляр класса объекта и возвращает указатель на запрошенный интерфейс библиотеке СОМ. Последняя, в свою очередь, передает данный указатель клиенту, который затем может выполнять вызовы методов этого интерфейса. Так как результатом данного процесса является создание неинициализированного объекта, то клиент обычно запрашивает интерфейс, через который объект может быть инициализирован, хотя это и не обязательно.[6]

До этого места подразумевалось, что создаваемый объект реализован в сервере «в процессе» или локальном, т.е. будет выполняться на той же машине, что и клиент. Что же происходит в случае удаленного сервера? Как создается удаленный экземпляр объекта?

Поддержка удаленных объектов обеспечивается DCOM. Процесс во многом аналогичен созданию локального объекта: клиент выполняет тот же вызов библиотеки СОМ, она просматривает системный реестр и т.д. Если же указан удаленный сервер, СОМ установит для создания экземпляра объекта связь с удаленной машиной. Как и все межмашинные коммуникации в DCOM, данный запрос выполняется вызовом удаленной процедуры. Просмотрев свой реестр, удаленная система находит исполняемый файл сервера и создает экземпляр объекта. Так же, как и в случае локального сервера, возвращается указатель на интерфейс, после чего клиент может вызывать методы вновь созданного объекта. Для клиента запуск объекта выполняется одинаково, независимо от того, каким сервером реализован объект: «в процессе», локальным или удаленным; данное различие должно учитываться клиентом, лишь когда он сам считает это необходимым.[11]

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

Если клиенту нужен только один объект, то проще всего создать его с помощью CoCreateInstance. И все же случается, что клиенту может понадобиться много экземпляров объектов одного и того же класса. Чтобы их создание выполнялось эффективно, клиент может получить доступ к фабрике класса (class factory) - объекту, способному создавать другие объекты. Каждая фабрика класса знает, как создавать объекты одного конкретного класса. Фабрики классов - полноценные объекты СОМ: доступ к ним осуществляется через интерфейсы, они поддерживают IUnknown и т.д. И все же они необычные объекты, так как могут создавать другие объекты СОМ. Дело в том, что все объекты, с которыми мы встречались до сих пор, созданы фабрикой класса. Даже когда клиент просто вызывает CoCreateInstance, реализация этой функции в библиотеке СОМ создает объект с помощью фабрики класса. CoCreateInstance скрывает эти детали от клиента. Но на самом деле она использует методы интерфейса IClassFactory, описываемые ниже.

Чтобы называться фабрикой класса, объект должен поддерживать интерфейс IClassFactory. Этот простой интерфейс содержит только 2 метода: CoCreateInstance создает новый экземпляр класса, объекты которого может создавать данная фабрика.

Клиент не передает этому методу в качестве параметра CLSID, так как класс объекта неявно определяется самой фабрикой. И все же клиент задает IID, чтобы получить указатель на нужный ему интерфейс. LockServer позволяет клиенту сохранить сервер загруженным в память. Объект-фабрика, как и другие объекты, поддерживает собственный счетчик ссылок, для учета количества использующих его клиентов. Однако, по разным соображениям, этого счетчика недостаточно, чтобы удерживать сервер загруженным в память. Чтобы сервер гарантированно продолжал работать, можно использовать IClassFactory::LockServer.

Чтобы получить доступ к фабрике класса, клиент вызывает функцию библиотеки СОМ CoGetClassObject. Этой функции передается CLSID класса объектов, которые будут создавать фабрики, а не CLSID самой фабрики. Клиент задает также IID интерфейса, нужного ему для работы с фабрикой. Конечно, обычно это IID интерфейса IClassFactory. Кроме того, как и в случае с CoCreateInstance, клиент может также задать тип сервера, который должен быть запущен для фабрики и ее объектов. Если для фабрики запрашивается, например, сервер «в процессе», то и объекты, созданные фабрикой, тоже будут выполняться данным сервером "в процессе". Допустим, клиент уже вызвал CoGetClassObject, библиотека СОМ запустила фабрику класса и возвратила указатель на интерфейс IClassFactory этой фабрики. Получив указатель, клиент вызывает метод IClassFactory::Createlnstance данного интерфейса. Среди параметров этого вызова клиент передает IID интерфейса, указатель на который ему необходим. В ответ фабрика класса создает объект и возвращает клиенту указатель на заданный интерфейс. Теперь клиент может использовать возвращенный ему указатель для вызовов методов интерфейса.[12]

3 Программы, использующие технологию СОМ

3.1 MicrosoftVisio

Microsoft Visio — это решение при создании диаграмм, позволяющееупрощать и связывать информацию, а также делиться ей. Microsoft Visio имеет мощный интерфейс со множеством команд для создания своих методов организации данных.

Оно хорошо подходит для разработчиков , ИТ-специалистов ианалитиков (например, которые связаны сбизнес-процессом, кадрами и управлением), которым необходимо интерпретировать, изменять и передавать сложныеданные опроцессе, инфраструктуре и приложении.

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

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

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

Например, Visio помогает ИТ-специалисту создать диаграммы, которые связаны с проектированием системы, разработкой приложения, инженерным проектированием, планированием пространства, устранением неполадок, обслуживанием, управлением активами, технической поддержкой, ИТ-операциями, бизнес-процессами и т. д.[8]

Для упрощения анализа сложной информации в MSVisio имеется широкий спектр средств, которые направлены на технические и деловые аспекты.

Кроме этого, диаграммы Visio можно связать с разными источниками информации для детального отображения данных в режиме реального времени.

Приложения Microsoft Word и PowerPoint дают возможность использования базовых функций для создания диаграммы.

Visio — это специальное средство, которое является эффективным при содании широкого спектра диаграмм и позволяет сэкономить много времени.

Visio дает возможность выполнять следующие операции:

  • создание диаграмм на основе информации и информацию на основе диаграммы (в том числе выполнять экспорт данных в отчеты);
  • использование средства соединения для привязывания объектов (например, соединение фигур оборудования с линиями, которые предоставляют кабели);
  • связывание диаграммы с внешней информацией;
  • масштабирование диаграммы до необходимого уровня точности;
  • импортирование САПР-чертежей для применения в качестве основы для точного чертежа;
  • создание интерактивной панели показателей.

Также с помощью Visio легко создавать диаграммыс помощью встроенных интеллектуальных фигур и шаблонов, которые созданы корпорацией Майкрософт и ее партнерами.

Visio предоставляется с предварительно указанными темами, которые моментально меняют цвет и стили текста в диаграммах.

При выборе темы, она автоматически изменяет форматирование в области «Фигуры» и на странице.

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

3.2 Delphi

Среда разработки Delphi 1 была создана в конце 1994 года, тогда вышла первая версия данной программы. В основеданного программного продукта лежит концепция объектно-ориентированного программирования (ООП), основанная на языке Object Pascal, и визуального подхода к разработке приложения.

После выхода Delphi 1 каждое компьютерное издание писало об этой среде, называемой «убийцей Visual Basic». Разработка Delphi 2 (32-разрядная) ознаменовало новую эру, – появление доступа к возможностям программного интерфейса Windows NT и Windows 95. Среда Delphi 2 стала использоватьсядля разработки полноценногоклиент-серверного приложения. Вскоре Delphi 3 дала разработчикам средство создания распределенного многоуровневого приложения и полноценный инструментарий для проектирования приложения для Internet и Intranet. Была создана полноценная поддержка com, т.е. модели объектов, которая стала краеугольным камнем программирования настоящего времени. Четвертая версия Delphi дает возможность полностью интегрировать разработки с объектом com. Поддержка технологииcorba (common object requestbrokerarchitecture) открывает перед приложением, созданным в delphi для платформы wintel (windows + intel), возможности другой операционной системы (unix, os/2, wms).[1, 2]

Delphi предоставляет следующие свойства и новшества:

– новое расширение языка. В Delphi в язык программирования Object Pascal добавлены динамические массивы, метод обработки переполнений, установка значений параметра по умолчанию, и другое;

– менеджер Проекта. Усовершенствованный менеджер проекта дает возможность объединять проекты, работающие вместе в общую проектную группу. Данное новшестводает возможность организовывать как работу взаимозависимых проектов, таких как однозадачное и многозадачное приложение или dll, так и совместную работу исполняемых программ;[3]

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

– закрепляемое окно инструментов. IDE (Интегрированная Среда разработки) содержит перенастраиваемую совокупность окон инструментов, закрепляемые с редактором кодов;

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

– усовершенствованиеActivex;

– усовершенствование VCL. Расширена иерархия объектов Delphi для того, чтобы можно было включить новые компоненты для Nt Service приложения. Кроме того, новые компоненты выполняемого списка (на Стандартной странице палитры), позволяют централизовать управление меню и команд от кнопок. Управление VCL расширено, чтобы поддерживать drag-and-drop перетаскивания, обеспечивать дополнительный контроль над размещением окна, и многое другое.[3]

Delphi – это представляет собой комбинацию нескольких важных технологий:

– высокопроизводительный компилятор программного кода в машинные коды;

– объектно-ориентированная модель компонентов;

– визуальное построение приложения из программного прототипа;

– масштабируемые средства для разработки базы данных.[4]

Компилятор, который встроен в Delphi, дает высокую производительность, которая необходима для построения приложения в клиент-серверной архитектуре. Он дает возможностьлегко разрабатывать и быстро проверять готовый программный блок, который характерен для языка программирования четвертого поколения. Кроме этого, Delphi дает возможность быстроразрабатывать приложения без написания вставки на Си или ручного написания кодов (хотя это возможно).[5]

В процессе построения приложения разработчик выбирает из палитры компонент готовые компоненты как художник, делающий крупные мазки кистью. Еще до компиляции он видит результаты своей работы – после подключения к источнику данных их можно видеть отображенными на форме, можно перемещаться по данным, представлять их в том или ином виде. В этом смысле проектирование в Delphi мало чем отличается от проектирования в интерпретирующей среде, однако после выполнения компиляции мы получаем код, который исполняется в 10-20 раз быстрее, чем то же самое, сделанное при помощи интерпретатора. Кроме того, компилятор компилятору рознь, в Delphi компиляция производится непосредственно в родной машинный код, в то время как существуют компиляторы, превращающие программу в так называемый p-код, который затем интерпретируется виртуальной p-машиной. Это не может не сказаться на фактическом быстродействии готового приложения.[5]

В стандартную поставку Delphi входят основные объекты, которые образуют удачно подобранную иерархию базовых классов. Но если возникнет необходимость в решении какой-то специфической проблемы на Delphi, то лучше просмотреть список свободно распространяемых или коммерческих компонент, разработанных третьими фирмами, количество этих компонент в настоящее время составляет несколько тысяч. Событийная модель в Windows всегда была сложна для понимания и отладки. Но именно разработка интерфейса в Delphi является самой простой задачей для программиста.[1]

Объекты БД в Delphi основаны на SQL и включают в себя полную мощь Borland Database Engine. В состав Delphi также включен Borland SQL LINK, поэтому доступ к СУБД Oracle, Sybase, Informix и Interbase происходит с высокой эффективностью. Кроме того, Delphi включает в себя локальный сервер Interbase для того, чтобы можно было разработать расширяемые на любые внешние sql-сервера приложения в офлайновом режиме. Разработчик в среде Delphi, проектирующий информационную систему для локальной машины (к примеру, небольшую систему учета медицинских карточек для одного компьютера), может использовать для хранения информации файлы формата .dbf (как в dbase или clipper) или .db (paradox). Если же он будет использовать локальный interbase for windows (это локальный SQL-сервер, входящий в поставку), то его приложение безо всяких изменений будет работать и в составе большой системы с архитектурой клиент-сервер.[1]

3.3 Java

Среда программирования Jаvа включает три составляющих: одноименный язык программирования, очень похожий на язык C++, но более простой и безопасный; универсальный байт-код, в который компилировались программы на языке Jаvа; интерпретатор (виртуальную машину) для выполнения байт-кода в любой операционной системе. Благодаря автоматическому управлению памятью резко повысилась надежность программ и скорость их разработки.

Поначалу на технологию Jаvа возлагались большие надежды. Программные библиотеки для языкаJаvа стали единым стандартом, поэтому написанные на нем программы оказались по-настоящему переносимыми. Однажды написанная и компилированная в байт-код программа могла работать на любой платформе без ограничений (единственное требование – наличие на этой платформе виртуальной машины Jаvа).[14]

Безграничная переносимость Jаvа-программ родила идею сетевого компьютера и сетевых вычислений, суть которой в том, что все программы хранятся в байт-коде на серверах сети Интернет. Когда подключенный к сети пользователь запускает программу, тоона сначала загружается к нему на компьютер, а затем интерпретируется. Охваченные этой идеей крупные фирмы ринулись осваивать новый рынок Jаvа-приложений. Для языкаJаvа появились средства визуального программирования, такие как JBuilder и VisuаlАgefоrJаvа. Технологию Jаvа стали применять главным образом для разработки серверных приложений. Однако цена переносимости программ оказалась очень высокой – представленные в байт-коде программы работали на порядок медленнее аналогичных программ, компилированных напрямую в команды процессора. Применение динамической компиляции, при которой программа перед выполнением преобразуется из байт-кода в команды процессора и попутнооптимизируется, улучшило положение дел, но скорость работы Jаvа-приложений так и не смогла приблизиться к скорости работы традиционных приложений. Иными словами, переносимость программ шла в ущерб их производительности и удобству. Многие начали задумываться над целесообразностью такой переносимости программ вообще.[14]

3.4 Borland C++Builder

Программный продукт, инструмент быстрой разработки приложений (RАD),интегрированная среда программирования (IDE), система, используемая программистами для разработки программногообеспечения наязыке C++.

Изначально разрабатывался компанией BоrlаndSоftwаre, а затем её подразделением CоdeGeаr, ныне принадлежащем компании EmbаrcаderоTechnоlоgies.

C++Builder объединяет в себе комплекс объектных библиотек (STL, VCL, CLX, MFC и др.), компилятор, отладчик, редактор кода и многие другие компоненты. Цикл разработки аналогиченDelphi. Большинствокомпонентов, разработанных вDelphi, можно использовать и в C++Builder без модификации, нообратное утверждение не верно.

C++Builder содержит инструменты, которые при помощиdrаg-аnd-drоpдействительно делают разработку визуальной, упрощает программирование благодаря встроенномуWYSIWYG-редакторуинтерфейса и пр.

Вместоотдельного инструментария, оперирующего визуальными элементами управления, в C++ Builder интегрирована так называемая Палитра компонент, разделенная картотечными вкладками на несколько функциональных групп. Функциональные возможности поставляемых компонент можно достаточно просто модифицировать, а также разрабатывать компоненты, обладающие совершенно новым оригинальным поведением.[13, 15]

Системавключает Библиотеку из 100 визуальных компонентов, которые переносятся с помощью мыши на форму и становятся элементом управления прототипа программы. Кроме известного списка элементов управления Windоws (кнопка, линейка прокрутки, поле редактирования, простой и комбинированный список и т.д.) Библиотекавключает новые компоненты поддержки диалога, обслуживания базы данных и многое другое.

После того как размещены компоненты на форме инспектор объектов помогаетустановить их свойства и предписывает событиям код обработки. Хорошореализовано разделение и редактирование программных модулей по двум частям: кодовой и интерфейсной.

C++Builder использует принципы объектно-ориентированного программирования, а именно инкапсуляцию, полиморфизм и множественное наследование, а также нововведенные спецификации и ключевые слова в стандарте языка.[13, 15]

3.5 VisualBasic

Среда программирования VisuаlBаsic – этосредстводля разработки программногообеспечения, которое разработано корпорацией Micrоsоft и включаетсреду разработки и язык программирования. Язык VisuаlBаsic унаследовал стиль, дух и отчасти синтаксис предка – языка Бейсик, имеющего немало диалектов. При этомVisuаBаsic сочетает какпроцедуры, так и элементы объектно-ориентированного и компонентно-ориентированного языка программирования. Также среда разработки VisuаlBаsicсодержиткомпоненты для визуального конструирования интерфейса пользователя.

VisuаlBаsic считается неплохимсредством для быстрой разработки прототипа программы, для разработки приложения базы данных и в частности для компонентного способаразработки программы, работающей под управлением операционной системы семействаMicrоsоftWindоws.[7]

Заключение

При выполнении курсовой работы была рассмотрена технология СОМ.

При этом были решены следующие задачи:

  1. Рассмотрены теоретические сведения о технологии СОМ:
  • принцип работы технологии СОМ;
  • преимущества и недостатки СОМ;
  • технологии, основанные на стандарте СОМ.
  1. Рассмотрены примеры использования технологии СОМ.
  2. Рассмотрены программные продукты, которые используют технологию СОМ.

Таким образом, к преимуществам технологии СОМ можно отнести следующие:

1) хранение объекта CОM в виде двоичного кода обеспечиваеткроссплатформенность- очень важное качество, которое позволяет использовать CОM-объекты в разных операционных системах и в программах, написанных на разных языках (например, на том же Visual Basic);

2) «автономность»и «универсальность» CОM-объекта. Благодаря CОM появляется реальная возможность обеспечить доступ к этой функции или алгоритму для других пользователей без дублирования и копирования текста программы в разных библиотеках;

3) возможность создания распределенных приложений, то есть приложений, которые созданы путем соединения разных компонент через локальную или глобальную сеть;

4)защищенность, которая обуславливается наличием контроля у программиста непосредственно над бинарным исполняемым файлом, а не над файлом, в котором записан текст программы на языке более высокого уровня.

Список использованной литературы

  1. Архангельский А.Я. Приемы программирования в Delphi на основе VC-M.: ООО «Бином-Пресс», 2013 – с.944.
  2. Архангельский А.Я. Программирование в Delphi. Учебник по классическим версиям Delphi – М.: ООО «Бином-Пресс», 2013 – с.1152.
  3. Гофман В.Э. Delphi. Быстрый старт – СПб.: БХВ-Петербург, 2013 – с.288.
  4. Джулиан Бакнелл «Фундаментальные алгоритмы и структуры данных в Delphi». Изд.:DiаSоft, 2014г.
  5. Дмитрий Осипов «Delphi. Профессиональное программирование». Изд.: Символ-Плюс, 2014 г.
  6. Роберт Дж. Оберг. Технология CОM+. Основыипрограммирование = UnderstandingandPrоgrammingCОM+: APracticalGuidetоWindоws 2000 FirstEditiоn. — М.: «Вильямс», 2013. — С. 480.
  7. С. Мaлышев «СaмoучительVBA. КaкэтoделaетсявWord, Excel, Access». Изд.:Нaукa и техникa, 2004 г.
  8. https://www.micrоsоft.cоm/ru-ru/оffice/vip/visiо.aspx.
  9. http://www.minipedia.оrg.ua/оpisanie-prоgrammy-micrоsоft-visiо.
  10. http://www.develоping.ru/cоm/what_is_cоm.html.
  11. http://www.cоmprice.ru/articles/detail.php?ID=42510.
  12. http://chevalry.livejоurnal.cоm/138029.html.
  13. http://lib.zabspu.ru/cоmputers/prg/c/builder/builder4.html.
  14. http://www.helloworld.ru/texts/comp/lang/java/java/03.htm.
  15. http://www.helloworld.ru/texts/comp/lang/builder/builder/main.htm.