ВУЗ:
Составители:
Рубрика:
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
Страницы
- « первая
- ‹ предыдущая
- …
- 8
- 9
- 10
- 11
- 12
- …
- следующая ›
- последняя »