Распределенные приложения: контроллеры автоматизации. Часть 2. Фертиков В.В. - 26 стр.

UptoLike

Составители: 

26
_ApplicationDisp = dispinterface
['{00020970-0000-0000-C000-000000000046}']
...
property Documents: Documents readonly dispid 6;
property Windows: Windows readonly dispid 2;
property ActiveDocument: WordDocument readonly dispid 3;
property ActiveWindow: Window readonly dispid 4;
property Selection: Selection readonly dispid 5;
property Visible: WordBool dispid 23;
...
procedure Move(Left: Integer; Top: Integer); dispid 360;
procedure Resize(Width: Integer; Height: Integer);
dispid 361;
function CheckGrammar(const String_:WideString):WordBool;
dispid 323;
...
end;
Отметим , что данный интерфейс идентифицирован тем же самым гло-
бальным идентификатором (IID), что и _Application. Кроме того, многие его
свойства и методы также дублируют соответствующие возможности «двой -
ника» _Application. Только в данном случае их описания вместо директив
safecall снабжены диспетчерскими идентификаторами (dispid), заимство-
ванными из библиотеки типов. Подобные двойники, описанные ключевым сло-
вом dispinterface, есть и у всех остальных дуальных интерфейсов :
_DocumentDisp, SelectionDisp и т.д . Именно они делают для клиента на
Object Pascal вызовы через IDispatch:Invoke прозрачными.
Используем рассмотренный прием для модификации нашего учебного
генератора отчетов. Вместо _Application задействуем его «двойника» :
var W:_ApplicationDisp;
При подключении к серверу требуются дополнительные операции приве-
дения к использованному типу интерфейса:
try // если Word запущен - подключиться к нему
W := GetActiveOleObject(
ClassIDToProgID(CLASS_WordApplication))
as _ApplicationDisp;
except // если нет - запустить
W:=CoWordApplication.Create as _ApplicationDisp;
end;
W.Visible := True;
Последняя строка иллюстрирует доступ к свойству объекта автоматиза-
ции через его диспинтерфейс.
                              26
_ApplicationDisp = dispinterface
  ['{00020970-0000-0000-C000-000000000046}']
...
  property Documents: Documents readonly dispid 6;
  property Windows: Windows readonly dispid 2;
  property ActiveDocument: WordDocument readonly dispid 3;
  property ActiveWindow: Window readonly dispid 4;
  property Selection: Selection readonly dispid 5;
  property Visible: WordBool dispid 23;
...
  procedure Move(Left: Integer; Top: Integer); dispid 360;
  procedure Resize(Width: Integer; Height: Integer);
     dispid 361;
  function CheckGrammar(const String_:WideString):WordBool;
     dispid 323;
...
end;

     Отметим, что данный интерфейс идентифицирован тем же самым гло-
бальным идентификатором (IID), что и _Application . Кроме того, многие его
свойства и методы – также дублируют соответствующие возможности «двой-
ника» _Application . Только в данном случае их описания вместо директив
safecall снабжены диспетчерскими идентификаторами (dispid ), заимство-
ванными из библиотеки типов. Подобные двойники, описанные ключевым сло-
вом dispinterface , есть и у всех остальных дуальных интерфейсов:
_DocumentDisp , SelectionDisp и т.д. Именно они делают для клиента на
Object Pascal вызовы через IDispatch:Invoke прозрачными.
     Используем рассмотренный прием для модификации нашего учебного
генератора отчетов. Вместо _Application задействуем его «двойника»:
var W:_ApplicationDisp;

     При подключении к серверу требуются дополнительные операции приве-
дения к использованному типу интерфейса:
  try    // если Word запущен - подключиться к нему
     W := GetActiveOleObject(
       ClassIDToProgID(CLASS_WordApplication))
         as _ApplicationDisp;
  except // если нет - запустить
     W:=CoWordApplication.Create as _ApplicationDisp;
  end;
  W.Visible := True;

     Последняя строка иллюстрирует доступ к свойству объекта автоматиза-
ции через его диспинтерфейс.