Основы COM. Рудалев В.Г - 10 стр.

UptoLike

10
function GetIDsOfNames(const IID: TGUID; Names:
Pointer; NameCount, LocaleID: Integer; DispIDs:
Pointer): HResult; stdcall;
function Invoke(DispID: Integer; const IID: TGUID;
LocaleID: Integer; Flags: Word; var Params;
VarResult, ExcepInfo, ArgErr: Pointer): HResult;
stdcall;
end;
Задача интерфейса поиск метода по его текстовому имени во время выполне-
ния программы . Ключевыми методами интерфейса являются методы
GetIdsOfNames и Invoke. Сначала вызывается метод GetIdsOfNames,
которому передается имя запрошенного метода. Если сервер поддерживает та -
кой метод , он возвращает его идентификатор DispID целое число, уникаль -
ное для каждого метода. После этого клиент упаковывает параметры метода в
массив переменных типа OleVariant и вызывает Invoke, передавая ему
массив параметров и идентификатор DispID метода. Методы GetTypeInfo и
GetTypeInfoCount являются вспомогательными и обеспечивают поддержку
библиотеки типов объекта . Таким образом, все , что должен знать клиент, это
строковое имя метода.
Следует отметить , что в реальности метода с указанным именем , например
method1, может и не существовать . Все действия, выполняемые методами ,
выполняются по номеру DispID внутри Invoke, типичная реализация кото -
рого содержит оператор
case DispID of
1: действие1;//Блок «действие1» выполняет роль метода 1
2: method2;
...
end;
Соответствие между идентификаторами DispID и именами методов устанав -
ливается внутри специальной структуры , называемой диспинтерфейсом. Дис-
пинтерфейс описывается следующим образом:
type
IMyDisp = dispinterface
['{EE05DFE2-5549-11D0-9EA9-0020AF3D82DA}']
procedure Method1; dispid 1;
procedure Method2; dispid 2;
...
end;
Delphi имеет встроенную поддержку работы в качестве клиента Automation.
Тип данных Variant может содержать ссылку на интерфейс IDispatch и
использоваться для вызова его методов . Пример:
uses ComObj;
...
var
                                          10
     function GetIDsOfNames(const IID: TGUID; Names:
       Pointer; NameCount, LocaleID: Integer; DispIDs:
       Pointer): HResult; stdcall;
     function Invoke(DispID: Integer; const IID: TGUID;
       LocaleID: Integer; Flags: Word; var Params;
       VarResult, ExcepInfo, ArgErr: Pointer): HResult;
       stdcall;
  end;
Зад ача и нтерфей са –пои ск метод а по его текстов ому и мени в о в ремяв ы полне-
ни я программы . К лю чев ы ми метод ами и нтерфей са яв ляю тся метод ы
GetIdsOfNames и Invoke. Сначала в ы з ы в ается метод GetIdsOfNames,
которому перед ается и мя з апрош енного метод а. Е сли серверпод д ерж и в аетта-
кой метод , он в оз в ращ ает его и д енти фи каторDispID – целое чи сло, уни каль-
ное д ля каж д ого метод а. После этого кли ент упаков ы в ает параметры метод а в
масси в переменны х ти па OleVariant и в ы з ы в ает Invoke, перед ав ая ему
масси в параметров и и д енти фи каторDispID метод а. М етод ы GetTypeInfo и
GetTypeInfoCount яв ляю тсяв спомогательны ми и обеспечи в аю тпод д ерж ку
би бли отеки ти пов объекта. Т аки м образ ом, в се, что д олж ен з нать кли ент, – это
строков оеи мяметод а.
След ует отмети ть, что в реальности метод а с указ анны м и менем, напри мер
method1, мож ет и не сущ еств ов ать. В се д ей ств и я, в ы полняемы е метод ами ,
в ы полняю тся п о номе ру DispID в нутри Invoke, ти пи чная реали з аци я кото-
рого сод ерж и топератор
case DispID of
  1: действие1;//Блок «действие1» выполняет роль метода 1
  2: method2;
  ...
end;
Соотв етств и е меж д у и д енти фи каторами DispID и и менами метод ов устанав -
ли в ается в нутри специ альной структуры , наз ы в аемой ди сп и нте рф е йсом. Д и с-
пи нтерфей сопи сы в аетсяслед ую щ и м образ ом:
type
   IMyDisp = dispinterface
       ['{EE05DFE2-5549-11D0-9EA9-0020AF3D82DA}']
       procedure Method1; dispid 1;
       procedure Method2; dispid 2;
       ...
   end;
Delphi и меет в строенную под д ерж ку работы в качеств е кли ента Automation.
Т и п д анны х Variant мож ет сод ерж ать ссы лку на и нтерфей с IDispatch и
и спольз ов атьсяд ляв ы з ов а его метод ов . При мер:
uses ComObj;
...
var