- •Раздел 4. Разработка по Тема 4.1. Проектирование интерфейса с пользователем
- •4.1.1. Типы пользовательских интерфейсов.
- •4.1.2. Пользовательская и программная модели интерфейса.
- •4.1.3. Разработка диалогов.
- •4.1.4. Основные компоненты графических пользовательских интерфейсов.
- •Тема 4.2. Реализация графических пользовательских интерфейсов.
- •4.2.1. Диалоги, управляемые пользователем.
- •4.2.2. Диалоги, управляемые системой.
- •4.2.3. Использование метафор.
- •4.2.4. Технология Drag and Drop.
- •4.2.5. Интеллектуальные элементы.
- •4.3.1. Базовые типы данных.
- •Константы
- •Область действия имен
- •4.3.2. Указатели и адресная арифметика.
- •4.3.3. Составные типы данных. Структуры
- •Битовые поля
- •Определение типов
- •Перечислимые типы
- •4.3.4. Выражения и операции.
- •4.3.5. Управляющие конструкции. Условные операторы
- •Операторы циклов
- •4.4.1. Статические одномерные массивы.
- •4.4.2. Статические многомерные массивы.
- •4.4.3. Динамические массивы.
- •4.4.4. Массивы указателей.
- •4.5.1. Стеки.
- •4.5.2. Очереди.
- •4.5.3. Списки.
- •4.5.4. Бинарные деревья.
- •4.6.1. Объявление классов и экземпляров классов.
- •4.6.2. Инкапсуляция данных и методов.
- •4.6.3. Конструкторы классов.
- •Конструктор по умолчанию
- •Конструктор копирования
- •4.6.4. Деструкторы классов.
- •4.7.1. Разделы в описании класса.
- •4.7.2. Friend-конструкции.
- •4.7.3. Статические члены классов.
- •4.7.4. Использование описателя const в классах.
- •4.8.1. Вложенность классов.
- •4.8.2. Наследование данных и методов.
- •4.8.3. Типы наследования.
- •4.9.1. Полиморфизм раннего связывания.
- •4.9.2. Полиморфизм позднего связывания и виртуальные функции.
- •4.9.3. Абстрактные методы и классы.
- •4.10.1. Функции консольного ввода-вывода.
- •4.10.2. Функции файлового ввода-вывода.
- •4.10.3. Использование библиотеки классов потокового ввода-вывода.
- •4.11.1. Перегрузка операций.
- •4.11.2. Шаблоны функций.
- •4.11.3. Шаблоны классов.
- •4.11.4. Обработка исключений.
- •Тема 4.12. Com-технология.
- •4.12.1. Основные понятия.
- •4.12.2. Типы интерфейсов.
- •Свойства интерфейсов
- •Типы интерфейсов
- •4.12.3. Типы com-объектов.
- •4.12.4. Фабрика классов.
- •Тема 4.13. Построение com-сервера.
- •4.13.1. Язык idl.
- •Содержимое файла idl
- •4.13.2. Определение пользовательского интерфейса.
- •4.13.3. Реализация пользовательского интерфейса.
- •4.13.4. Создание тестового клиента.
- •Тема 4.14. Обзор платформы ms .Net.
- •4.14.1. Общая идея архитектуры .Net.
- •4.14.2. Достоинства и недостатки .Net.
- •4.14.3. Схема трансляции программ в .Net.
- •4.14.4. Язык msil.
- •4.14.5. Объектно-ориентированная модель .Net.
Тема 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.
Мы определили базовые элементы сервера СОМ. Но это всего лишь определение; в действительности, мы еще не реализовали ни одного интерфейса.