Вход


Главная страница >> Учебный процесс >> Конспекты >> Delphi. Поддержка технологий COM >> Автоматизация >> Управление внешним сервером

[Назад]    [Содержание ]    [Вперед]

  


Управление внешним сервером


 

Проект Control представляет собой контроллер автоматизации, с помощью которого демонстрируются все три типа автоматизации (интерфейсы, dispinterface и Variant). Control-контроллер приложения сервера автоматизации Srv, создание которого описано ранее в этой главе. Главная форма этого проекта показана на рис. 8.


Рис. 8. Главная форма проекта Control

При щелчке на кнопке Connect приложение Control подключается к серверу несколькими различными способами:

FIntf := CoAutoTest.Create;
FDispintf := CreateComObject(Class_AutoTest) as lAutoTestDisp;
FVar := Create01e0bject('Srv.AutoTest');

Интересно то, что эти способы практически абсолютно взаимозаменяемы. Например, следующий код также верен:

FIntf := CreateComObject(Class_AutoTest) as lAutoTest;
FDispintf := Create01e0bject('Srv.AutoTest') as lAutoTestDisp;
FVar = CoAutoTest.Create;

В листинге показан код модуля Ctrl, который содержит остальную часть кода контроллера автоматизации. Заметьте, что приложение позволяет управлять сервером, используя один из вариантов ? interface, dispinterface или OleVariant.

Другая интересная особенность, иллюстрируемая в этом листинге, ? способ отключения от сервера автоматизации: интерфейсы и dispinterface устанавливаются в nil, a Variant ? в Unassigned. Естественно, сервер автоматизации также выгружается, если приложение Control вызывается обычным образом.

Использование интерфейсов практически всегда более производительно, чем dispinterface или Variant, поэтому всегда (если это возможно) для управления сервером автоматизации используйте интерфейсы.

Variant в смысле производительности хуже прочих методов, поскольку во время выполнения автоматизация, вызвав Variant, должна вызвать функцию GetIDsOfNames() для преобразования имени метода.

Производительность dispinterface ? между интерфейсом и Variant. Но почему такое различие в производительности, если оба ? Variant и dispinterface пользуют позднее связывание? Причина в следующем: dispinterface получает преимущества оптимизации, называемой идентификатор связывания (ID binding). Имеется в виду следующее: при компиляции dispinterface метод знает, что компилятору не нужно генерировать вызов метода GetIDsOfNames() во время выполнения перед вызовом метода Invoked(). Однако более заметно, что преимущество dispinterface над Variant: dispinterface позволяет использовать параметр CodeInsight, что невозможно при использовании Variant.

На рис. 9 показано приложение Control, управляющее сервером Srv.


Рис 9. Контроллер и сервер автоматизации



[Назад]    [Содержание ]    [Вперед]

  


  
За содержание страницы отвечает Гончарова М.Н.
©
Кафедра СПиКБ, 2002-2017