Скачать презентацию СОМ -ТЕХНОЛОГИЯ COM Component Object Model Model Скачать презентацию СОМ -ТЕХНОЛОГИЯ COM Component Object Model Model

ИМЕНОВАНИЕ COM-ОБЪЕКТОВ1часть.ppt

  • Количество слайдов: 43

СОМ -ТЕХНОЛОГИЯ COM (Component Object Model) – Model) модель компонентных объектов Microsoft. Является основой СОМ -ТЕХНОЛОГИЯ COM (Component Object Model) – Model) модель компонентных объектов Microsoft. Является основой многих объектных технологий, в том числе OLE и Active. X.

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

непосредственно исполняемые файлы, которые никак не надо «связывать» со своим проектом - их достаточно непосредственно исполняемые файлы, которые никак не надо «связывать» со своим проектом - их достаточно зарегистрировать в операционной системе и они будут доступны любой программе исполняющейся на данной машине. Т. е. их использование в своей программе производится «без использования операций сборки модуля» . Такая технология называется «динамическая загрузка» А модули, которые позволяют загружать себя таким образом, называются DLL(Dynamic Link Library)

ОСОБЕННОСТИ СОМ § вызов СОМ из своей программы осуществляется без знания того, где они ОСОБЕННОСТИ СОМ § вызов СОМ из своей программы осуществляется без знания того, где они расположены; § объекты СОМ действительно существуют в двоичном виде как объекты и могут использоваться теми, кому они нужны; § Объекты СОМ позволяют разделить проект на отдельные, повторно используемые и двоичные компоненты.

Итак, COM-объект, это объект, который доступен так же, как и «локальный» объект данного проекта, Итак, COM-объект, это объект, который доступен так же, как и «локальный» объект данного проекта, хотя, фактически, он не располагается в данном проекте, а есть уже готовый двоичный исполняемый ресурс. COM может располагаться в DLL-модуле или внутри EXE-модуля, который может исполняться независимо (параллельно!) от модуля, который использует этот объект, и даже - этот самый модуль может исполняться совсем на другом компьютере!

ПРЕИМУЩЕСТВА СОМ 1). Простота организации доступа к СОМ. 2). Используется суммарная мощность процессоров. 3). ПРЕИМУЩЕСТВА СОМ 1). Простота организации доступа к СОМ. 2). Используется суммарная мощность процессоров. 3). Позволяют разрабатывать распределенные приложения. 4). Простота переконфигурирования при изменении проекта. 5). Обеспечена кроссплатформенная совместимость.

НЕДОСТАТКИ СОМ 1). Сложность технологии. 2). Замкнутость технологии. 3). Технология СОМ неполна. НЕДОСТАТКИ СОМ 1). Сложность технологии. 2). Замкнутость технологии. 3). Технология СОМ неполна.

БАЗОВЫЕ ПОНЯТИЯ СОМ 1. Концепция «Клиент-Сервер» При взаимодействии сторона, которая умеет совершать действие, но БАЗОВЫЕ ПОНЯТИЯ СОМ 1. Концепция «Клиент-Сервер» При взаимодействии сторона, которая умеет совершать действие, но не имеет никакой инициативы его совершения называется «сервером» , а сторона, которая состоит только из инициативы - называется «клиентом» . В этом взаимодействии «клиент» запрашивает, а «сервер» предоставляет «сервис» .

2. Объект - это абстракция (сущность) прямо отражающаяся в окружающей реальности. У любой сущности 2. Объект - это абстракция (сущность) прямо отражающаяся в окружающей реальности. У любой сущности видимого мира есть состояние и поведение. В computer sciences состояние описывается данными, а поведение - процедурами.

ВЗАИМОДЕСТВИЕ ОБЪЕКТОВ Операционная система Исполняемый модуль C S Конфигурация модуля, сконструированного в ООП ВЗАИМОДЕСТВИЕ ОБЪЕКТОВ Операционная система Исполняемый модуль C S Конфигурация модуля, сконструированного в ООП

ВЗАИМОДЕСТВИЕ ОБЪЕКТОВ Операционная система MC MS C S Конфигурация разделенных модулей ВЗАИМОДЕСТВИЕ ОБЪЕКТОВ Операционная система MC MS C S Конфигурация разделенных модулей

ТРЕБОВАНИЯ ВЗАИМОДЕЙСТВИЯ 1. Все потенциально доступные объекты должны быть уникально поименованы в системе, чтобы ТРЕБОВАНИЯ ВЗАИМОДЕЙСТВИЯ 1. Все потенциально доступные объекты должны быть уникально поименованы в системе, чтобы можно было отличать один объект от другого. 2. Система должна знать, в каком исполняемом модуле «обитает» объект, так, чтобы по имени объекта можно было запустить модуль, его реализующий. 3. В системе должна быть специальная, доступная всем желающим функция «дать адрес «живого» объекта по его имени» и эта функция должна делать сравнительно много работы! 4. Исполняемые модули, реализующие объекты должны иметь особый «стандартный вход» , посредством которого от операционной системы они будут получать запросы на создание объектов, ими реализуемых. 5. Объекты должны заранее знать, каким образом они взаимодействуют между собой - система не вмешивается в этот процесс.

ИМЕНОВАНИЕ COM-ОБЪЕКТОВ ИМЕНОВАНИЕ COM-ОБЪЕКТОВ

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

Мнемонически значимых идентификаторов в языке очень немного, а пространство имён в котором они должны Мнемонически значимых идентификаторов в языке очень немного, а пространство имён в котором они должны быть применимы, неограниченно. Программисты Open Software Foundation придумали UUID - universally unique identifier, вселенски уникальный идентификатор. UUID -- длинное двоичное 128 -разрядное число и определённый к нему алгоритм вычисления хэшфункции. Компания Microsoft взяла на вооружение эту идею и этот объект без изменения, только назвала его немного по другому - GUID, т. е. globally unique identifier, глобально уникальный идентификатор.

GUID применяются там, где в модели COM требуется уникально обозначить объект. Разделяют два понятия GUID применяются там, где в модели COM требуется уникально обозначить объект. Разделяют два понятия : -- идентификатор класса CLSID -- идентификатор интерфейса IID.

Для вычисления UUID/GUID платформа Win 32 имеет функции API Uuid. Create и Co. Create. Для вычисления UUID/GUID платформа Win 32 имеет функции API Uuid. Create и Co. Create. Guid, которые вычисляют значение и предоставляют его вызвавшей программе, т. е. этим сервисом может воспользоваться любая программа исполняющаяся в операционной системе. GUID (и, соответственно, CLSID, IID и т. д) имеет несколько нотаций записи и форм представления, поскольку длинное 128 -битовое число в существующих системах не может быть представлено как одна простая сущность.

Внутри программы GUID канонически определяется как структура: typedef struct _GUID { unsigned long Data Внутри программы GUID канонически определяется как структура: typedef struct _GUID { unsigned long Data 1; unsigned short Data 2; unsigned short Data 3; unsigned char Data 4[8]; } GUID; т. е. последовательность long-short-char-char-char-char.

Примеры символьной записи GUID: 22 F 55881 -280 B-11 d 0 -A 8 A Примеры символьной записи GUID: 22 F 55881 -280 B-11 d 0 -A 8 A 9 -00 A 0 C 90 C 2004 0 c 733 a 60 -2 a 1 c-11 ce-ade 5 -00 aa 0044773 d B 502 D 1 BE-9 A 57 -11 d 0 -8 FDE-00 C 04 FD 9189 D в записи допускаются символы и верхнего и нижнего регистров в произвольном сочетании. Существует и еще одна символьная форма GUID, в которой подчеркнуто единство всех групп цифр: {B 502 D 1 BE-9 A 57 -11 d 0 -8 FDE-00 C 04 FD 9189 D}

В стандартной поставке средства разработчика Visual Studio существуют две программы uuidgen. exe и guidgen. В стандартной поставке средства разработчика Visual Studio существуют две программы uuidgen. exe и guidgen. exe, которые представляют собой программную оболочку на фунцию API Co. Create. Guid. Располагаются обе в каталоге "…Program FilesMicrosoft Visual Studio CommonTools"

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

Где СОМ хранит имена статических типов Для этой цели в MS Windows используется специальный Где СОМ хранит имена статических типов Для этой цели в MS Windows используется специальный системный сервис, называемый системный реестр. Системный реестр – база данных специального назначения и средства доступа к ней. База данных реестра имеет иерархическую организацию

Единицами хранения в нем являются Единицами хранения в нем являются "разделы" (keys) и "параметры" (values) - разделы могут содержать в себе другие разделы и параметры, а параметры – не могут. И разделы, и параметры могут иметь значения - числа или строки, так что эти числа или строки адресуемы при помощи указания цепочки разделов и параметра.

Существует набор функций Win 32 API, позволяющий читать, искать, записывать и удалять информацию и Существует набор функций Win 32 API, позволяющий читать, искать, записывать и удалять информацию и существует специальная программа regedit. exe, которая представляет собой графический редактор реестра. Запущенная программа показывает окно, разделенное по вертикали на две неравные части. В левой части окна показывается пиктограмма "Мой компьютер" и значок "плюс", означающий, что на самом деле мы имеем внутри скрытое дерево (см. рис. 1)

Рис. 1. Окно графического редактора реестра Рис. 1. Окно графического редактора реестра

Развернув дерево мы увидим строки: HKEY_CLASSES_ROOT HKEY_CURRENT_USER HKEY_LOCAL_MACHINE … Например, часть HKEY_LOCAL_MACHINE содержит в Развернув дерево мы увидим строки: HKEY_CLASSES_ROOT HKEY_CURRENT_USER HKEY_LOCAL_MACHINE … Например, часть HKEY_LOCAL_MACHINE содержит в себе информацию, относящуюся к конфигурации данного локального компьютера, а раздел HKEY_CLASSES_ROOT является корневым для информации о классах (статических типах) объектов, известных операционной системе.

Раскрыв раздел HKEY_LOCAL_MACHINE, мы увидим: HARDWARE … SOFTWARE которые так же являются деревьями. В Раскрыв раздел HKEY_LOCAL_MACHINE, мы увидим: HARDWARE … SOFTWARE которые так же являются деревьями. В разделе HARDWARE-- раздел DESCRIPTION, а в нём - раздел System. Правое окно изменится - оно покажет строки типа Identifier, Video. Bios. Date и другие. Разделы HKEY_… HARDWARE и т. д. являются разделами реестра, а строки Identifier и Video. Bios. Date - параметрами.

Таким образом, программа редактора системного реестра вызывается на исполнение командой С: WINDOWSregedit. exe (если Таким образом, программа редактора системного реестра вызывается на исполнение командой С: WINDOWSregedit. exe (если операционная система у вас расположена по адресу С: WINDOWS)

Рис. 2. Окно редактора реестра: отображение разделов Рис. 2. Окно редактора реестра: отображение разделов

Для Для "использования технологией COM" в системном реестре зарезервировано несколько подразделов, основной из них: HKEY_CLASSES_ROOTCLSID. Например, HKCRCLSID{00000010 -0000 -0010 -800000 AA 006 D 2 EA 4} = DAO. DBEngine. 35 Внутри этого раздела располагаются еще два раздела: HKCRCLSID{00000010 -0000 -0010 -800000 AA 006 D 2 EA 4}Prog. ID HKCRCLSID{00000010 -0000 -0010 -800000 AA 006 D 2 EA 4}Inproc. Server 32 (см. рис. 2. )

Раздел Inproc. Server 32: его значением (параметр Default) является строка: C: Program FilesCommon FilesMicrosoft Раздел Inproc. Server 32: его значением (параметр Default) является строка: C: Program FilesCommon FilesMicrosoft SharedDAO 350. DLL -- ссылка на исполняемый модуль, в котором обитает означенный COM-объект. Если мы знаем GUID именующий требуемый нам объект, то нам достаточно посмотреть в системном реестре раздел: HKCRCLSID<наш GUID>Inproc. Server 32 присвоенное ему значение определяет какой исполняемый модуль необходимо загрузить

Модуль, реализующий COM-объекты называется Модуль, реализующий COM-объекты называется "COM-сервер".

Внутри некоторых GUID-разделов находится раздел с именем Local. Server 32. Например, HKCRCLSID{00020800 -0000 -C Внутри некоторых GUID-разделов находится раздел с именем Local. Server 32. Например, HKCRCLSID{00020800 -0000 -C 000000046}Local. Server 32 А его значением оказалась ссылка на EXE-модуль: D: OfficeGRAPH 9. EXE /automation который, очевидно, должна запустить система когда от нее клиент потребует предоставить ссылку на объект 00020800 -0000 -C 000 -0000046

В разделе Local. Server 32 имеется еще и параметр Threading. Model, значением которого является В разделе Local. Server 32 имеется еще и параметр Threading. Model, значением которого является слово Apartment. Этот параметр описывает потоковую модель в которой может работать компонент.

Раздел Prog. ID связанный со статическим типом -- это - Раздел Prog. ID связанный со статическим типом -- это - "человеческое имя" данного статического типа. Раздел Prog. ID связывает мнемоническое имя с GUID. Мнемонические имена могут повторяться у различных пользователей, но GUID уникален.

как добиться получения COMобъекта как взаимодействуют операционная система и COMсервер, когда клиент запросил адрес как добиться получения COMобъекта как взаимодействуют операционная система и COMсервер, когда клиент запросил адрес объекта рассмотрим самый простой случай - взаимодействие системы и DLL-сервера DLL - не просто кусок кода. Внутри DLL существуют специальные таблицы, которые описывают функции, "внешние" с точки зрения границы этой DLL. - Первая таблица называется IMPORTS - это функции, которые требуются DLL, но которые в самой DLL не реализованы. - Вторая таблица называется EXPORTS, она описывает функции, которые реализованы в DLL и предлагаются всем желающим.

В поставке Visual Studio существует полезный инструмент исследования двоичных файлов - программа dumpbin. exe. В поставке Visual Studio существует полезный инструмент исследования двоичных файлов - программа dumpbin. exe. Она управляется интерфейсом командной строки. Назначение этой программы - выдавать содержимое таблиц, содержащихся в двоичных файлах в человекочитаемом виде. Если применить ее к COM-серверу, к DAO 350. DLL, то получим следующую информацию:

Microsoft (R) COFF Binary File Dumper Version 6. 00. 8447 Copyright (C) Microsoft Corp Microsoft (R) COFF Binary File Dumper Version 6. 00. 8447 Copyright (C) Microsoft Corp 1992 -1998. All rights reserved. Dump of file DAO 350. DLL File Type: DLL Section contains the following exports for DAO 350. dll ordinal hint RVA name 2 0 00008 D 28 Dll. Can. Unload. Now 1 1 00008 A 31 Dll. Get. Class. Object 3 2 00009199 5 3 000090 DB Dll. Register. Server. Ex 4 4 00008 E 51 Dll. Unregister. Server Dll. Register. Server

Рассмотрим функцию Dll. Get. Class. Object. Это функция, вызывая которую система сообщает серверу ссылку Рассмотрим функцию Dll. Get. Class. Object. Это функция, вызывая которую система сообщает серверу ссылку на какой объект сервер должен изготовить и предоставить системе. Обращение к MSDN дает следующий прототип этой функции: STDAPI Dll. Get. Class. Object ( REFCLSID rclsid, //CLSID объекта класса REFIID riid, //Ссылка на идентификатор интерфейса, (riid есть идентификатор интерфейса) //который взаимодействует с объектом LPVOID * ppv //Адрес выходной переменной, которая принимает //указатель на интерфейс, указанный riid );

система при вызове данной функции готовит список аргументов <CLSID>-<ссылка на интерфейс>-<адрес переменной, куда вернуть система при вызове данной функции готовит список аргументов -<ссылка на интерфейс>-<адрес переменной, куда вернуть результат> Эти параметры приходят от COM-клиента, который захотел получить экземпляр объекта, именуемого данным CLSID. Для того, чтобы система выяснила какой сервер необходимо активизировать (просмотрев системный реестр), загрузила его, и вызвала у этого сервера функцию Dll. Get. Class. Object клиент вызывает функцию Win 32 API Co. Create. Instance - создать экземпляр объекта.

MSDN дает следующую справку: STDAPI Co. Create. Instance ( REFCLSID rclsid, //CLSID объекта класса MSDN дает следующую справку: STDAPI Co. Create. Instance ( REFCLSID rclsid, //CLSID объекта класса LPUNKNOWN p. Unk. Outer, DWORD dw. Cls. Context, REFIID riid //Ссылка на идентификатор интерфейса, //который взаимодействует с объектом LPVOID * ppv //Адрес выходной переменной, которая принимает //указатель на интерфейс, указанный riid );

Аргументы p. Unk. Outer и dw. Cls. Context -- указывают системе среди DLL или Аргументы p. Unk. Outer и dw. Cls. Context -- указывают системе среди DLL или EXE-серверов искать интересующий нас объект и агрегировать ли его. Три других аргумента - те, которые передаются системой функции сервера Dll. Get. Class. Object. И - функцию Co. Create. Instance клиент вызывает из своего кода. Т. е. , вызов клиентом функции Co. Create. Instance "транслируется" системой в вызов функции Dll. Get. Class. Object на стороне сервера. Dll. Get. Class. Object возвращает адрес объекта, система передает его Co. Create. Instance, которая возвращает его клиенту.

ПРОДОЛЖЕНИЕ СЛЕДУЕТ… ПРОДОЛЖЕНИЕ СЛЕДУЕТ…