Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
6_TKP_ObAvt.doc
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
341 Кб
Скачать
☆

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, если поддерживает.