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

UptoLike

11
V: Variant;
...
V := CreateOleObject('MyServer.CalcSrv');
if VarType (V) = VarDispatch then
V.Calculate
else
ShowMessage ('Объект не найден!');
...
// Освобождаем интерфейс
V:=UnAssigned;
Объект создается функцией
function CreateOleObject(const ClassName: string): IDis-
patch;
Ее параметром ClassName является не идентификатор, а строковое имя
PROGID класса , зарегистрированное в системном реестре (оно соответствует
CLSID). PROGID составляется по правилу : Имя_сервера.Имя_сокласса.
Результатом функции является ссылка на интерфейс.
Заметим, что библиотека типов здесь не требуется. Переменная V не является
классом и , очевидно , не имеет ни одного из используемых свойств и методов ,
что , однако , не вызывает ошибки компиляции. Компилятор Delphi запоминает в
коде программы строковые описания обращений к серверу автоматизации, а на
этапе выполнения передает их его методам интерфейса IDispatch, которые и
производят синтаксический разбор и выполнение.
Для использования IDispatch требуется создать диспинтерфейс и запро -
граммировать метод Invoke. Но гораздо удобнее вместо интерфейса
IDispatch использовать его наследника , например,
ICalcSrv = interface(IDispatch)
['{EC007291-3A73-11D5-BCC6-444553540000}']
// Далее перечисляются методы диспинтерфейса
procedure Calculate; safecall;
...
end;
Программирование здесь требуется только для вновь объявленных методов .
Интерфейс, являющийся потомком IDispatch, называется дуальным. Дуаль -
ный интерфейс включает три метода IUnknown, четыре метода IDispatch и
все методы диспинтерфейса , следовательно , его виртуальная таблица содержит
семь и более строк.
К дуальному интерфейсу можно обратиться всеми упомянутыми выше спосо -
бами , а также - получением ссылки на диспинтерфейс:
var D: IMyDisp;
                                          11
  V: Variant;
...
  V := CreateOleObject('MyServer.CalcSrv');
  if VarType (V) = VarDispatch then
    V.Calculate
  else
    ShowMessage ('Объект не найден!');
...
  // Освобождаем интерфейс
   V:=UnAssigned;
О бъектсоз д аетсяфункци ей
function CreateOleObject(const ClassName: string): IDis-
patch;
Е е параметром ClassName яв ляется не и д енти фи катор, а строков ое и мя
PROGID класса, з ареги стри ров анное в си стемном реестре (оно соотв етств ует
CLSID). PROGID состав ляется по прав и лу: Имя_сервера.Имя_сокласса.
Рез ультатом функци и яв ляетсяссы лка на и нтерфей с.
Замети м, что би бли отека ти пов з д есь не требуется. Переменная V не яв ляется
классом и , очев и д но, не и меет ни од ного и з и спольз уемы х св ой ств и метод ов ,
что, од нако, нев ы з ы в аетош и бки компи ляци и . К омпи ляторDelphi з апоми наетв
код епрограммы строков ы еопи сани я обращ ени й ксерверу ав томати з аци и , а на
этапев ы полнени яперед аети х его метод ам и нтерфей са IDispatch, которы еи
прои з в од ятси нтакси чески й раз бори в ы полнени е.
Д ля и спольз ов ани я IDispatch требуется соз д ать д и спи нтерфей с и з апро-
грамми ров ать метод Invoke. Н о гораз д о уд обнее в место и нтерфей са
IDispatch и спольз ов ать его наслед ни ка, напри мер,
ICalcSrv = interface(IDispatch)
      ['{EC007291-3A73-11D5-BCC6-444553540000}']
      // Далее перечисляются методы диспинтерфейса
      procedure Calculate; safecall;
      ...
end;
Программи ров ани е з д есь требуется только д ля в нов ь объяв ленны х метод ов .
И нтерфей с, яв ляю щ и й ся потомком IDispatch, наз ы в ается дуальны м. Д уаль-
ны й и нтерфей св клю чаеттри метод а IUnknown, четы реметод а IDispatch и
в семетод ы д и спи нтерфей са, след ов ательно, его в и ртуальная табли ца сод ерж и т
семь и болеестрок.
К д уальному и нтерфей су мож но обрати ться в семи упомянуты ми в ы ш е спосо-
бами , а такж е- получени ем ссы лки на д и спи нтерфей с:
var D: IMyDisp;
…