Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall; //Object Pascal




HRESULT QueryInterface( REFIID iid, void ** ppvObject);          // C++

 

возвращает клиенту указатель на запрошенный интерфейс IID. С помощью полученного указателя клиент может вызвать любой из реализованных методов интерфейса. В качестве IID клиент может указать идентификатор типа класса интерфейс (в Delphi) – в этом случае компилятор самостоятельно извлекает соответствующий GUID.

Методы AddRef и Release используются для того, чтобы объект COM мог самостоятельно отслеживать продолжительность своего существования. Эти методы просто изменяют число ссылок на объект. Когда число ссылок на объект становится равным нулю, объект удаляется из памяти COM сервером. 

Указатели на интерфейсы COM объекта. Указатель на интерфейс является 32-битным указателем, который ссылается на указатель на таблицу vtable (см. рис.34.2). Эта таблица является массивом указателей, каждый из которых, в свою очередь, указывает на реализацию метода. Таблица vtable является общей для всех экземпляров объекта, но каждый из объектов имеет свой набор данных.

Рис. 34.2. Связь интерфейса с методами объекта

 

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

Когда клиент запрашивает сервис у объекта COM, он (клиент) должен передать идентификатор класса CLSID (class identifier). Идентификатор класса CLSID является GUID и создается на основе GUID интерфейса объекта COM.

По идентификатору класса CLSID COM находит, через реестр Windows, соответствующий сервер, загружает его в память и сервер создает экземпляр объекта COM. Экземпляры объектов COM создает фабрика классов (class factory), к которой обращается сервер. Фабрика классов имеет свой собственный интерфейс IClassFactory.

 

Замечание. На самом деле клиент может использовать, вместо CLSID, еще и так называемый идентификатор программы ProgID, значением которого является строка символов. Например, в реестре Windows вы можете найти ProgID=’Word.Application’ для Microsoft Office Word как сервера.

 

Фабрика классов и класс CoClass. COM объект является экземпляром класса CoClass, в котором реализованы один или более интерфейсов COM. Объект COM предоставляет те сервисы, которые определены в интерфейсах класса CoClass.

Вот пример описания сокласса на языке ODL (Object Description Language – язык описания объектов) из MSDN:

[ uuid(BFB73347-822A-1068-8849-00DD011087E8), version(1.0), helpstring("A class"), helpcontext(2481), appobject]

coclass myapp {

[source] interface IMydocfuncs;

dispinterface DMydocfuncs;

};

 

Экземпляры класса CoClass создаются специальным типом объекта, который называется фабрикой класса. Когда клиент обращается к COM объекту, фабрика класса создает экземпляр объекта и регистрирует его для этого конкретного клиента. Если в это время другой клиент обращается к объекту, фабрика классов создает и для него экземпляр объекта.

 

Замечание. В принципе с фабрикой классов и созданием экземпляров СОМ-объектов дело обстоит гораздо сложнее. Например, один СОМ-объект может обслуживать нескольких клиентов. Для более полного изучения механизма взаимодействия клиентов и серверов СОМ надо разобраться с апартаментами (apartment) и многопоточностью в СОМ.

 

Любой класс CoClass должен иметь фабрику классов и идентификатор класса CLSID, так что экземпляр COM объекта этого класса может быть создан извне, т.е. из другого модуля. Благодаря наличию у классов CoClass уникального идентификатора CLSID, они могут быть обновлены в любое время, как только для класса разработан новый интерфейс. Новый интерфейс может использовать модифицированные или новые методы и это не окажет никакого влияния на прежние версии. В случае использования обычных библиотек DLL подобная ситуация прежде была типичной проблемой.

Мастера Delphi или Visual C++ на самом деле избавляют программиста от необходимости заниматься созданием объектов, которые обеспечивают функционирование фабрики классов. Однако программист может создавать объекты и самостоятельно, если на то есть веские основания.

Библиотека типов Type Library. В этой библиотеке хранится информация об интерфейсах и методах СОМ объектов, которой могут воспользоваться разработчики для получения информации о сервисах, предоставляемых объектом. Библиотека типов может сохраняться и распространяться в различных форматах:

· входить в состав СОМ серверов, т.е. сохраняться в соответствующих приложениях или библиотеках;

· в виде двоичных файлов .tlb;

· в формате текстовых файлов .odl и т.д.

 

При регистрации сервера, имеющего библиотеку типов, она также записывается в реестр. Просматривать библиотеки типов и извлекать их из реестра удобно с помощью утилиты Ole View, входящей в состав Microsoft Visual Studio 6.0.

Утилита OLE View позволяет, помимо просмотра реестра, экспортировать зарегистрированные библиотеки типов в любом из следующих форматов:

· на языке описания интерфейсов IDL (Interface Definition Language), т.е. в файле с расширением .idl;

· на языке С (.c) с идентификаторами UUID;

· в формате заголовочного файла (.h).

 

Visual C++ также предоставляет компилятор (MIDL.exe), который и используется утилитой OLE View для генерации файлов двух последних типов (.c, .h).

Ниже приведено содержимое библиотеки типов для внутрипроцессного сервера DLLMathServer (см. л.р. «Разработка внутрипроцессного сервера и клиентского приложения с использованием ATL»), полученное с помощью утилиты OLE View:

// typelib filename: DLLMathServer.dll

[

uuid(DB27FCC4-5A23-4004-9B71-75D82E588DF8),

version(1.0),

helpstring("DLLMathServer 1.0 Type Library")

]

library DLLMathServerLib

{

// TLib : // TLib : OLE Automation : {00020430-0000-0000-C000-000000000046}

importlib("stdole2.tlb");

 

// Forward declare all types defined in this typelib

interface IMathem;

interface IMathem2;

[

uuid(75AA61DC-61F9-4D67-AA7B-12717A85D4A5),

helpstring("Mathem Class")

]

coclass Mathem {

   [default] interface IMathem;

   interface IMathem2;

 };

[

odl,

uuid(2CB07C07-F24C-4997-9BB3-F9436D291049),

helpstring("IMathem Interface")

]

interface IMathem : IUnknown {

   [helpstring("method Cube")]

   HRESULT _stdcall Cube(

                   [in] double Arg,

                   [out] double* Res);

};

[

odl,

uuid(60A322B4-F137-4F88-BC8A-EF45B977A99B),

helpstring("IMathem2 Interface")

]

interface IMathem2 : IUnknown {

   [helpstring("method Summa")]

   HRESULT _stdcall Summa(

                   [in] double* Arr,

                   [in] long Num,

                   [out] double* Res);

   [propget, helpstring("property Number")]

   HRESULT _stdcall Number([out, retval] long* pVal);

  [propput, helpstring("property Number")]

   HRESULT _stdcall Number([in] long pVal);

};

};










Последнее изменение этой страницы: 2018-04-12; просмотров: 382.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...