Чтение онлайн

на главную

Жанры

Интернет-журнал "Домашняя лаборатория", 2007 №6
Шрифт:

Язык описания интерфейсов и библиотека типов

Теперь обратимся к вопросам о языковой независимости и прозрачности местоположения. Как уже ранее упоминалось, это принципиальные для СОМ требования.

Первое означает, что как компоненты, так и использующие их клиенты могут реализовываться на любом поддерживающем СОМ языке программирования (в частности, C++ и Visual Basic). Однако описанные ранее интерфейсы (файлы IPub.h, IBook.h и IJoumal.h) представлены на C++. Это означает, что любой разработчик, желающий реализовать эти интерфейсы

в своем коклассе, должен использовать именно C++. Более неприятно, что и любой клиент, желающий использовать построенные таким образом компоненты, также должен быть написан на C++.

Прозрачность местоположения означает, что код клиента не должен меняться в зависимости от того, где размещен используемый клиентом компонент (либо это dll, загружаемая в адресное пространство клиента, либо это ехе-сервер, исполняемый в другом процессе на той же машине, где исполняется клиент, либо компонент установлен на удаленном компьютере). Конечно, клиент может явно указать, какой тип сервера он желает использовать, но он может оставить выбор за системой, и тогда будет использоваться тот сервер, связь с которым для этого клиента будет наиболее быстрой. В случае исполнения сервера и клиента в разных процессах необходимо обеспечить передачу данных между этими процессами. Прозрачность местоположения означает, что СОМ берет это на себя.

Что нужно для обеспечения независимости от языка и прозрачности местоположения? Нужно описать все интерфейсы и классы некоторым стандартным образом, сделав эти описания доступными компиляторам со всех языков, поддерживающих СОМ. Это и обеспечит языковую независимость. Дня обеспечения прозрачности местоположения нужно иметь возможность автоматически формировать посредников, обеспечивающих взаимодействие клиента и сервера, выполняющихся в различных процессах. В СОМ такой посредник на стороне клиента называется прокси, а посредник на стороне сервера называется заглушкой. Они реализуются в виде компонент, загружаемых в адресные пространства клиента и сервера и обеспечивают для последних иллюзию непосредственного взаимодействия друг с другом (в одном адресном пространстве). В действительности прокси и заглушка реализуют удаленный вызов процедур, используя протокол LRPC или RPC соответственно при расположении на одной или различных машинах.

Итак, C++ не годится для описания интерфейсов в связи с тем, что в этом языке много неоднозначностей, которые, конечно, успешно разрешаются компилятором с C++, но в которых не смогут разобраться компиляторы с других языков. Нужен специальный язык, на котором можно однозначно описать все интерфейсы и классы. Это язык описания интерфейсов IDL–Interface Definition Language, первоначально описанный в спецификации DCE (Distributed Computing Environment — распределенная среда вычислений) от Open Software Foundation и далее расширенный Microsoft. На нем описываются все коклассы и все реализуемые в них интерфейсы, которые будут входить в создаваемый компонент. При этом нет необходимости описывать ранее описанные интерфейсы (например, стандартные). Достаточно включить их описания с помощью ключевого слова import. Наряду с описанием коклассов и интерфейсов надо описать так называемую библиотеку типов. Именно эта библиотека и будет решать проблему языковой независимости. Она будет в бинарном виде хранить информацию о всех интерфейсах и классах данного компонента в форме, доступной для чтения компиляторами со всех поддерживающих СОМ языков.

Далее idl-файл с описанием интерфейсов, классов и библиотеки типов транслируется транслятором MILD (Microsoft IDL) в совокупность файлов, содержащих объявления на С++/С всех интерфейсов, определения GUID для всех интерфейсов и классов, коды прокси и заглушки, а также формируется в бинарном виде библиотека типов. Используя эти файлы можно построить dll для прокси и заглушки. При реализации клиента или сервера на С++/С можно использовать полученные файлы с описаниями интерфейсов и определениями GUID, при использовании других языков программирования, будет использоваться библиотека типов.

Далее приведен файл PubinProcServerTypeInfo.idi, дающий описания на IDL интерфейсов, классов и библиотеки типов для проекта PubInProcServer.

import "oaidl.idl";

//IPub

[obj ect,

uuid(9A5DE9A0-7225-11d5-98C7-000001223694),

helpstring("Base publication")]

interface IPub: IUnknown

{

HRESULT SetTitle([in] BSTR bstrTitle);

HRESULT SetYear([in] int nYear);

HRESULT Getlnfo([out, retval] BSTR* pbstrlnfo);

};

//IBook

[object,

uuid(9A5DE9A1-7225-11d5-98C7-000001223694),

helpstring("Book")]

interface IBook: IPub

{

HRESULT SetAuthor([in] BSTR bstrAuthor);

}

//IJournal

[object,

uuid(9A5DE9A2-7225-11d5-98C7-000001223694),

helpstring("Journal")]

interface IJournal: IPub

{

HRESULT SetNumber([in] int nNumber);

}

[uuid(68A702C2-8283-11d5-98C7-000001223694),

version(1.0),

helpstring("PubinProcServer with TypeLib")]

library PubinProcServer

{

importlib("stdole32.tlb");

[uuid(49F00760-7238-11d5-98C7-000001223694)]

coclass CoBook

{

[default] interface IBook;

{;

[uuid(49F00761-7238-11d5-98C7-000001223694)]

coclass CoJournal

{

[default] interface IJournal;

};

};

Видно, что данный файл весьма похож на заголовочный файл в C++. Основное отличие — наличие атрибутов в квадратных скобках.

Конструкция import "oaidi. idi"; обеспечивает импорт ряда стандартных описаний (в том числе, интерфейса IUnknown). Далее идут описания всех реализуемых в компоненте пользовательских интерфейсов: IPub, IBook и IJournal.

Описанию каждого интерфейса предшествует совокупность атрибутов, начинающаяся с атрибута object. Именно этот атрибут говорит о том, что далее идет описание интерфейса СОМ, а не интерфейса RPC, для описаний которых и создавался первоначально IDL.

Атрибут uuid используется для задания GUID соответствующего интерфейса.

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

При описании методов интерфейсов используются атрибуты in, out, retval, позволяющие указать направление передачи значения параметра. Атрибут in назначается по умолчанию и означает, что значение данного параметра передается серверу. Напротив, атрибут out говорит о необходимости передачи значения параметра клиенту. Атрибут retval означает, что для данный параметр является возвращаемым значением для соответствующей функции при использовании, например, Visual Basic. Указание этих атрибутов (возможны их сочетания) оптимизирует трафик в сети при выполнении удаленного вызова процедур.

Поделиться:
Популярные книги

Внешняя Зона

Жгулёв Пётр Николаевич
8. Real-Rpg
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Внешняя Зона

Матабар

Клеванский Кирилл Сергеевич
1. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар

Титан империи 7

Артемов Александр Александрович
7. Титан Империи
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Титан империи 7

Инферно

Кретов Владимир Владимирович
2. Легенда
Фантастика:
фэнтези
8.57
рейтинг книги
Инферно

Кодекс Охотника. Книга XII

Винокуров Юрий
12. Кодекс Охотника
Фантастика:
боевая фантастика
городское фэнтези
аниме
7.50
рейтинг книги
Кодекс Охотника. Книга XII

Фараон

Распопов Дмитрий Викторович
1. Фараон
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Фараон

Отмороженный 8.0

Гарцевич Евгений Александрович
8. Отмороженный
Фантастика:
постапокалипсис
рпг
аниме
5.00
рейтинг книги
Отмороженный 8.0

Кодекс Охотника. Книга ХХ

Винокуров Юрий
20. Кодекс Охотника
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга ХХ

Элита элит

Злотников Роман Валерьевич
1. Элита элит
Фантастика:
боевая фантастика
8.93
рейтинг книги
Элита элит

Новый Рал 8

Северный Лис
8. Рал!
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Новый Рал 8

Возвышение Меркурия. Книга 4

Кронос Александр
4. Меркурий
Фантастика:
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Возвышение Меркурия. Книга 4

Смерть может танцевать 4

Вальтер Макс
4. Безликий
Фантастика:
боевая фантастика
5.85
рейтинг книги
Смерть может танцевать 4

Не ангел хранитель

Рам Янка
Любовные романы:
современные любовные романы
6.60
рейтинг книги
Не ангел хранитель

Релокант. Вестник

Ascold Flow
2. Релокант в другой мир
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Релокант. Вестник