- •Разработка объекта автоматизации в среде delphi.
- •6.6 Методические указания.
- •6.6.1 Расширения com
- •6.6.2 Мастера для создания сом-объектов
- •6.6.3 Технология автоматизации
- •6.6.4. Интерфейс iDispatch
- •6.6.5. Интерфейсы диспетчеризации
- •6.6.6 Создание серверов автоматизации в Delphi
- •6.6.6.1 Создание внешнего сервера автоматизации.
- •6.6.6.2 Разработка клиента автоматизации
- •7.6.7 Использование ole-документов в приложениях
- •6.6.7.1 Основные сведения об ole-документах
- •6 .6.7.2 Компонент tOleContainer.
- •6.6.7.3 Применение компонента tOleContainer для работы с ole-документами.
- •6.6.7.3.1 Простейший пример использования компонента tOleContainer.
- •6.6.7.3.2 Основные способы использование компонента tOleContainer.
- •6.6.7.3.3 Управление объектом внутри ole-контейнера
6.6.4. Интерфейс iDispatch
Базовый интерфейс автоматизации (интерфейс диспетчеризации) называется IDispatch и представляет собой интерфейс СОМ, являющийся наследником интерфейса IUnknown. Отличие интерфейса диспетчеризации от обычного интерфейса СОМ заключается в способе вызова методов интерфейса. Отличительной особенностью IDispatch является то обстоятельство, что методы объекта автоматизации никогда не вызываются напрямую, но всегда - с помощью специального метода Invoke интерфейса IDispatch. Объект автоматизации обязательно должен иметь дополнительный интерфейс, в котором указываются все методы, доступные через метод Invoke. Каждому методу этого интерфейса соответствует идентификатор, который называется диспетчерским (dispid). Реализация этого метода подобна оператору case: на основе указанного диспетчерского идентификатора выбирается метод, который должен быть выполнен. Благодаря такой организации объекту автоматизации требуется всего одна таблица виртуальных методов - для интерфейса IDispatch. Все остальные методы вызываются посредством метода Invoke этого интерфейса.
В
Delphi
6 интерфейс IDispatch
описан
в модуле system.pas
следующим образом (рис 6.2):
Помимо методов, унаследованных от интерфейса IUnknown, интерфейс IDispatch содержит четыре новых метода.
Oсновной функцией интерфейса IDispatch является функция Invoke(), предназначенная для вызова всех методов диспинтерфейса. Она имеет следующие параметры и свойства:
DispID - содержит диспетчерский идентификатор (dispatch ID), вызываемого метода. Он представляет собой число, которое показывает, какой метод должен быть вызван на сервере;
IID – GUID интерфейса вызываемого метода;
LocaleID – задает локализацию передаваемых значений;
Flags - определяет какого типа метод будет вызван в сервере: метод доступа к свойствам (чтение или запись) или обычный метод.
Params - содержит указатель на массив типа TDispParams, который содержит параметры, передаваемые этому методу.
VarResult - это указатель на переменную типа OleVariant, в которую будет записано возвращаемое значение вызываемого метода.
ExcepInfo - указатель на запись типа TExceptInfo, которая будет содержать информацию об ошибке, в случае, если метод Invoke() возвращает значение DISP_E_TYPEMISMATCH или DISP_E_PARAMNOTFOUND.
ArgErr - указатель на целое число (индекс некорректного параметра в массиве Params).
метод GetlDsOfNames() по заданным в массиве Names именам методов находит их диспетчерские идентификаторы и возвращает в параметре DispIDs указатель на массив их содержащий. Параметр IID данного метода не используется. Параметр Names - это указатель на массив имен методов, имеющий тип PWideChar. Параметр NameCount содержит число, показывающее количество строк в массиве (размерность массива), на который указывает параметр Names. Параметр LocalelD содержит информацию о локализации.
Метод GetTypelnfo() применяется для получения информации о типе объектов автоматизации. Он возвращает указатель на интерфейс библиотеки типов (если он есть). Параметр index описывает получаемую информацию о типе и должен (обычно) быть равен нулю. Параметр LocaleID содержит информацию о локализации. Если метод выполнился успешно, то параметр Typeinfo будет содержать указатель на структуру iTypeinfo содержащую информацию о типе объекта автоматизации.
Метод GetTypeinfoCount() используется для получения числа интерфейсов информации о типе, поддерживаемых объектом автоматизации. Число возвращается в параметре count. Он может содержать два возможных значения: 0, если объект автоматизации не поддерживает информацию о типе, и 1, если поддерживает.
