Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТП лекции Раздел 4.doc
Скачиваний:
16
Добавлен:
28.09.2019
Размер:
2.56 Mб
Скачать

Тема 4.13. Построение com-сервера.

4.13.1. Язык idl.

Для описания пользовательского интерфейса предназначен предложенный фирмой Microsoft язык опреде­ления интерфейса (MIDL - Microsoft Interface Definition Language).

Язык MIDL - это декларативный язык (declarative language), используемый для определения интерфейсов СОМ. Он основан на языке IDL фонда открытого программного обеспечения (OSF - Open Software Foundation) для вызова удален­ных процедур (RPC - Remote Procedure Call) в среде распределенных вычислений (DCE - Distributed Computing Environment). Язык MIDL предоставляет средства, позволяющие определять интерфейсы языково-независимым способом. Он ис­пользуется для генерирования программного кода процедур RPC, управляющих взаимодействием с сервером СОМ при реализации заданного интерфейса. Многое в этом языке заимствовано из синтаксиса языка C++.

Мы будем использовать аббревиатуру IDL для ссылок на язык определения интерфейса (Interface Definition Language), а аббревиатуру MIDL - для ссылок на компилятор Microsoft описаний на языке IDL.

Содержимое файла idl

Для исследования структуры файла IDL нужно проанализировать три ключевых элемента сервера СОМ.

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

CoClass. Это класс компонента (component class), обеспечивающий реализацию определенного интерфейса.

Библиотека типов. Это откомпилированная версия файла IDL, используемая для передачи информации об интерфейсе в окружение, поддерживающее СОМ (типа окружения VB).

В листинге приведено содержимое файла IDL из каталога <Visual Studio path>\VC98\lnc\ude. Этот файл определяет интерфейс IWPObj (часть библиоте­ки Microsoft Web Publishing API).

Листинг. Файл IDL, определяющий интерфейс iwpobj

/*———————————————————————————————————*\

*

* Copyright 1997 - 1998 Microsoft Corporation

*

* Module Name:

*

* wpobj.idl

*

* Назначение:

*

* Объявление интерфейса IWPObj

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

*

\*———————————————————————————————————*/

[

object,

uuid(EDD8BBCO-9240-llCF-9ED3-OOAA004Cl20C),

dual,

helpstring ("IWPObj Interface"),

pointer_default(unique)

]

interface IWPObj : IDispatch

{

import "oaidl.idl";

HRESULT WpPostFile(

[in] LONG hwnd,

[in, string] BSTR bsLocalPath,.

[in, out] LONG *plSiteNameBufLen,

[in, out, string] BSTR *pbsSiteName,

[in, out] LONG *plDestURLBufLen,

[in, out, string] BSTR *pbsDestURL,

[in] LONG lFlag,

[out] LONG *plRetCode);

};

[

uuid(336c8c70-a62b-lldO-ad5f-OOaaOOa219aa),

version(1.0),

helpstring ("WPObj 1.0 Type Library")

]

library WPObjLib

{

importlib("stdole2.tlb") ;

[

uuid(53DEFDEO-9222-HCF-9ED3-OOAA004Cl20C) ,

helpstring {"WPObj Class")

]

coclass WPObj

{

[default] interface IWPObj;

};

};

Этот файл начинается с раздела комментариев, фиксирующих его название и назначение. Следующий раздел начинается квадратной скобкой ([), означающей, что далее следует набор атрибутов.

Язык IDL позволяет определять атрибуты, перечисляя их в квадратных скобках, указанных перед элементом, к которому относятся атрибуты. Таким образом, атрибут helpstring (" IWPObj Interface") относится к интер­фейсу IWPObj. В листинге указаны следующие атрибуты.

• Первый атрибут (object) - это объект, который сообщает компилятору IDL, что эта информация является скорее определением интерфейса СОМ, чем определением интерфейса RPC.

• Идентификатор GUID, определенный с помощью атрибута uuid (EDD8BBCO-9240-11CF-9ED3-OOAA004C120C), является уникальным идентифика­тором интерфейса (IIP) IWPObj.

• Атрибут dual означает, что у клиента есть два способа доступа к свойствам и методам этого интерфейса.

• Атрибут helpstring добавляет строку, указанную в кавычках, к библиотеке типов в качестве подсказки разработчикам, использующим сервер СОМ.

• Наконец, атрибут pointer_default задает характеристики по умолчанию всем указателям, не вошедшим в списки параметров; unique означает, что указатель может быть равным NULL, но не поддерживает псевдонимов (aliasing).

Далее список атрибутов задается через уже существующий интерфейс. Здесь мы определяем интерфейс IWPObj, унаследованный из интерфейса IDispatch. Затем используем оператор import для импорта определений интерфейсов из файла oaidl.idl, содержащего интерфейс IDispatch. Оператор import подобен директиве #include, используемой в языке С, так как импортирует определения, содержащиеся в другом файле IDL, и делает их доступными для использования в вашем файле. Интерфейс предоставляет метод WpPostFile, у которого три входных параметра (обозначены как [in]), четыре параметра ввода/вывода (обозначены [in, out]) и один выходной параметр (обозначен [out]).

Оператор library определяет библиотеку типов WPObjLib, которая имеет собственный уникальный идентификатор, определенный в предшествующем разделе атрибутов директивой uuid(336c8c70-a62b-lldO-ad5f-OOaaOOa219aa). Дирек­тива importlib напоминает директиву import, но импортирует бинарные (откомпилированные) библиотеки типов. Всем библиотекам типов требуется директивой importlib импортировать библиотеку базовых типов, определенную в файле Stdole32.tdl. При импортировании библиотеки типов с помощью директивы importlib нужно убедиться, что библиотека будет доступна вашим клиентам (вы должны инсталлировать библиотеку типов вместе с сервером СОМ, если ее там еще нет).

Наконец, мы определяем наш класс компонента CoClass, названный WPObj, и указываем, что он реализует вышеопределенный интерфейс IWPobj.

Мы определили базовые элементы сервера СОМ. Но это всего лишь определение; в действительности, мы еще не реализовали ни одного интерфейса.