Главная » Delphi » Интерфейс IDispatch

0

Объекты автоматизации — это, в сущности, просто объекты COM, в которых реализо ван интерфейс IDispatch. определен в модуле System следую щим образом:

type

IDispatch = interface(IUnknown)

[‘{00020400-0000-0000-C000-000000000046}’]

function GetTypeInfoCount(out Count: Integer): Integer;

stdcall;

function GetTypeInfo(Index, LocaleID: Integer;

out TypeInfo): Integer; stdcall;

function GetIDsOfNames(const IID: TGUID; Names: Pointer;

NameCount, LocaleID: Integer;

DispIDs: Pointer): Integer; stdcall;

function Invoke(DispID: Integer; const IID: TGUID;

LocaleID: Integer; Flags: Word;

var Params; VarResult, ExcepInfo,

ArgErr: Pointer): Integer;

end;

Прежде всего следует отметить, что,  для того чтобы  воспользоваться преимущест вами автоматизации в Delphi, вовсе не обязательно вникать во все детали  интерфейса IDispatch. Поэтому  не стоит  “сушить мозги”,  пытаясь разобраться во всех его слож ностях. Вообще  то,  напрямую с этим  интерфейсом вряд  ли  придется работать,  по скольку  Delphi  предлагает весьма  элегантное решение —  инкапсуляцию автоматиза ции.  Описание интерфейса IDispatch в настоящем разделе рассматривается только в качестве хорошей основы для понимания сути автоматизации.Основной функцией интерфейса IDispatch является метод Invoke(). Когда клиент получает указатель  IDispatch на сервер автоматизации, он  может  вызвать метод  In- voke() для выполнения определенных методов на сервере. Параметр DispID этого мето да содержит число,  называемое диспетчерским идентификатором (dispatch ID), который ука зывает, какой именно метод должен быть вызван на сервере. Параметр IID не использует ся. Параметр LocaleID содержит информацию о языке.  Параметр Flags определяет, какого  вида метод будет вызван:  обычный или метод доступа к свойствам. Свойство Par- ams содержит указатель  на массив  TDispParams, который содержит параметры, переда ваемые этому методу. Параметр VarResult — это указатель на переменную типа OleVari- ant, в которую  будет записано возвращаемое значение вызываемого метода.  Параметр ExcepInfo является указателем  на запись  типа TExcepInfo, которая будет содержать ин формацию об ошибке, если метод Invoke() возвратит значение DISP_E_EXCEPTION. И, наконец,  если   метод   Invoke() возвращает  значение  DISP_E_TYPEMISMATCH или DISP_E_PARAMNOTFOUND, то параметр ArgError (указатель на целое  число) будет содер жать индекс некорректного параметра в массиве Params.

Метод  GetIDsOfNames() интерфейса IDispatch вызывается для получения дис петчерского идентификатора одного  или нескольких имен  методов, заданных в виде строк.  Параметр IID этого  метода  не используется, параметр Names указывает на мас сив имен методов типа PWideChar. Параметр NameCount содержит количество строк в массиве  Names, а параметр LocaleID — информацию о языке.  Последний параметр, DispIDs, является указателем  на массив целых  чисел  NameCount, который метод GetIDsOfNames() заполнит диспетчерскими идентификаторами для методов, пере численных в параметре Names.

Метод  GetTypeInfo() возвращает информацию о типе  объектов автоматизации (описываемую в настоящей главе далее).  Параметр Index определяет тип возвращае мой информации и обычно равен  0. Параметр LCID содержит информацию о языке. При  успешном  выполнении параметр TypeInfo будет содержать указатель  Itype- Info на информацию о типе объекта автоматизации.

Метод  GetTypeInfoCount() в параметре Count возвращает количество типов информации об интерфейсах,  поддерживаемых объектом автоматизации. В настоя щее время  параметр Count может  содержать только  одно  из двух возможных значе ний: 0, если объект автоматизации не поддерживает информацию о типе,  и 1, если он ее поддерживает.

Информация о типе

Затратив много  времени и усилий  на создание сервера автоматизации, было  бы большим  разочарованием  обнаружить, что  потенциальный пользователь не  сможет полностью реализовать все его возможности из за недостаточного описания свойств и методов сервера в прилагаемой документации. К счастью, автоматизация предлага ет средство для решения этих  проблем и позволяет разработчикам ассоциировать с объектом автоматизации информацию о его типе.  Информация о типе хранится в так называемых библиотеках типов (type  library).  Библиотека типов  сервера автоматиза ции  может  быть  добавлена к приложению серверу  или к его библиотеке DLL как ре сурс либо  храниться во внешнем файле. Библиотеки типов  содержат информацию о классах,  интерфейсах, типах  данных  и других компонентах сервера. Эта информация предлагается клиентам сервера автоматизации  наряду  с  другой информацией,  необ ходимой для создания экземпляров каждого  из классов  и корректного вызова  методов каждого  интерфейса.

Delphi  самостоятельно создает  библиотеки типов  при  добавлении объектов авто матизации в разрабатываемое приложение или библиотеку. Кроме  того,  Delphi  знает, каким  образом преобразовать  информацию из  библиотеки типов   в  данные Object Pascal так,  чтобы  можно  было  легко  управлять сервером автоматизации из приложе ния Delphi.

Источник: Тейксейра, Стив, Пачеко, Ксавье.   Borland Delphi 6. Руководство разработчика. : Пер.  с англ. — М. : Издательский дом “Вильямс”, 2002. —  1120 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии