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

UptoLike

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

23
причем в последнем случае переданное значение содержит код ошибки. Другие
данные, полученные в результате работы метода, возвращаются через выход -
ные параметры (с модификатором out). Таким образом , если бы Object Pascal
не предусматривал ключевое слово safecall, импортированное описание ме-
тода Get_Documents, например , выглядело бы так :
function Get_Documents(var Docs: Documents): HResult;
Вызывать такой метод было бы неудобно. Директива safecall, активирующая
соглашение о безопасном вызове, заставляет Delphi взять на себя ответствен-
ность за анализ возвращенного кода HResult. При этом генерируется исклю -
чение при получении кода ошибки. Программист же, со своей стороны , пишет
удобный код вызова, соответствующий импортированному описанию .
Управление Microsoft Word через импортированные интерфейсы
Здесь мы будем модифицировать код разработанного ранее генератора
отчетов по выборкам из базы данных. Напомним , что этот код использует ди-
намическое связывание, скрытое от программиста внутри встроенного типа
Variant. Выше сказано, что реализация программируемости через Variant
хотя и удобна, но малоэффективна. Теперь, изучив библиотеку типов сервера
Microsoft Word, мы получаем возможность использования одного из двух более
эффективных способов управления, задействующих механизм раннего связы -
вания. Наиболее эффективным из них является вызов методов COM-интер -
фейса напрямую через виртуальную таблицу. Этот способ рассматривается в
данном разделе. А в следующем рассмотрен второй способ обращение к свой -
ствам и методам диспинтерфейса через IDispatch:Invoke.
Итак , начнем с редактирования описаний предыдущего примера, исполь-
зовавших Variant. Теперь мы будем использовать либо типы интерфейсов,
описанные в импортированном модуле библиотеки типов, либо OleVariant
специальный тип Object Pascal, тоже представляющий вариант , но только лишь
для типов, совместимых с COM:
var W:_Application; D:_Document; S: Selection;
PosBeg,PosEnd: OleVariant;
Заметьте, мы будем использовать _Application и _Document, которые явля-
ются интерфейсами по умолчанию для соответствующих объектов автоматиза-
ции. Код , инициирующий связывание с сервером, преобразуем к виду:
try // если Word запущен - подключиться к нему
W := GetActiveOleObject(
ClassIDToProgID(CLASS_WordApplication))as _Application;
except // если нет - запустить
W:=CoWordApplication.Create;
end;
                                    23
причем в последнем случае переданное значение содержит код ошибки. Другие
данные, полученные в результате работы метода, возвращаются через выход-
ные параметры (с модификатором out). Таким образом, если бы Object Pascal
не предусматривал ключевое слово safecall, импортированное описание ме-
тода Get_Documents , например, выглядело бы так:
function    Get_Documents(var Docs: Documents): HResult;

Вызывать такой метод было бы неудобно. Директива safecall, активирующая
соглашение о безопасном вызове, заставляет Delphi взять на себя ответствен-
ность за анализ возвращенного кода HResult . При этом генерируется исклю-
чение при получении кода ошибки. Программист же, со своей стороны, пишет
удобный код вызова, соответствующий импортированному описанию.

      Управление Microsoft Word через импортированные интерфейсы
      Здесь мы будем модифицировать код разработанного ранее генератора
отчетов по выборкам из базы данных. Напомним, что этот код использует ди-
намическое связывание, скрытое от программиста внутри встроенного типа
Variant. Выше сказано, что реализация программируемости через Variant
хотя и удобна, но малоэффективна. Теперь, изучив библиотеку типов сервера
Microsoft Word, мы получаем возможность использования одного из двух более
эффективных способов управления, задействующих механизм раннего связы-
вания. Наиболее эффективным из них является вызов методов COM-интер-
фейса напрямую через виртуальную таблицу. Этот способ рассматривается в
данном разделе. А в следующем рассмотрен второй способ – обращение к свой-
ствам и методам диспинтерфейса через IDispatch:Invoke .
      Итак, начнем с редактирования описаний предыдущего примера, исполь-
зовавших Variant. Теперь мы будем использовать либо типы интерфейсов,
описанные в импортированном модуле библиотеки типов, либо OleVariant –
специальный тип Object Pascal, тоже представляющий вариант, но только лишь
для типов, совместимых с COM:
var W:_Application; D:_Document; S: Selection;
    PosBeg,PosEnd: OleVariant;

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