ActiveX в Delphi

Подключение к серверу автоматизации



Рассмотрим процесс подключения к серверу автоматизации на примере таких программ, как Microsoft Word, Microsoft Excel и Microsoft Outlook, входящих в состав популярного программного пакета Microsoft Office. Подключение к другим серверам автоматизации может немного отличаться, но принцип работы везде одинаков.
Прежде чем переходить непосредственно к подключению к серверу автоматизации, рассмотрим объектную модель Microsoft Office.
В Microsoft Office нет понятия наследование, вместо него используется так называемое встраивание. Встраивание помогает получать новые классы. Итак, в любом приложении Microsoft Office всегда имеется центральный базовый объект. Для Microsoft Word это word.Application, для Microsoft Excel - Excel.Application. Microsoft Outlook сам является базовым объектом и называется outLookAppiication, однако, несмотря на это, в объект Application встраиваются все остальные объекты, которые, в свою очередь, являются свойствами базового объекта.
Различные объекты приложений Microsoft Office имеют самые разнообразные методы, но некоторые из них одинаковы для разных приложений. К числу совпадающих методов относятся Run, Activate и др.

Примечание
Разница в этих методах все же есть. В различных приложениях Microsoft Office они имеют разные параметры. Действия методов тоже могут отличаться.



Рис. 3.14 показывает небольшую часть структуры объекта Microsoft Word Object.Более полную информацию об объектной архитектуре Microsoft Office можно найти в справочных материалах по Microsoft Office.


Рис. 3.14. Фрагмент структуры объекта Microsoft Word Object
Как только открывается новый документ, приложения Microsoft Office, автоматически создается каркас нового документа, который представляет собой набор библиотек с классами. Объекты этих классов будут доступны в данном документе. Задачей разработчика диспетчера автоматизации является получить доступ к корневому объекту сервера, выстроить цепочку доступа к встроенным объектам и правильно передать параметры.
Итак, базовым объектом любого приложения Microsoft Office является объект Application. Попробуем получить к нему доступ средствами Delphi.

Примечание
Все написанное ниже, справедливо для пятой (или выше) версии Delphi.

Итак, выполним следующие шаги:
1. Создадим новый проект Delphi с помощью пункта главного меню File/New Application (Файл/Новое приложение).
2. Поместим на форму компонент wordApplication с вкладки Servers палитры компонентов Delphi.
3. Установим свойстваа AutoConnect И AutoQuit компонента WordAppiication
в значение true (эти свойства отвечают за автоматическую загрузку и выгрузку из памяти сервера автоматизации после запуска приложения).
4. Запустим приложение с помощью пункта главного меню Run/Run (Запуск/Запуск).
В результате, хотя визуально ничего не наблюдается, кроме отображения формы, приложение проделало большую работу. Наше приложение запустило сервер автоматизации Microsoft Word. Чтобы убедиться в этом, достаточно посмотреть список задач, выполняемых Windows во время работы нашего приложения. Нажмите комбинацию клавиш <Ctrl>+<Alt>+<Del> во время работы приложения и убедитесь, что среди задач, выполняемых Windows, появилась задача Winword.exe.
В общих чертах, наше приложение выполнило следующее:
- при запуске приложения, в системном реестре Windows был найден сервер автоматизации WordApplication при помощи идентификатора (CLSID);
- запустилось приложение, находящееся по адресу, указанному в системном реестре Windows;
- сервер автоматизации предоставил нашему приложению (простейшему диспетчеру автоматизации) интерфейс, через который приложение может получить доступ к базовому объекту Microsoft Word.
Теперь закройте приложение и посмотрите еще раз на задачи, выполняемые Windows. Сервер автоматизации выгружен из памяти компьютера при помощи интерфейса IDispatch (данный интерфейс имеет метод _ADDRef, при помощи которого можно определить число клиентов, которые в настоящий момент пользуются услугами сервера).
Тот же результат можно получить, если использовать код, приведенный на листинге 3.1. Для этого разместите на форме две кнопки Start и Finish.

Листинг 3.1
unit Unitl;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics', Controls, Forms, Dialogs, StdCtrls, COMObj;
type
TForml = class(TForm)
Start: TButton;
Finish: TButton;
procedure StartClickfSender: TObject);
procedure FinishClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Forml: TForml;
wd:01eVariant;
fileName:string;
implementation {$R *.DFM}
procedure TForml.StartClick(Sender: TObject);
begin
try
fileName:=ExtractFilePath(Application.EXEName)+'report.DOC';
// Создаем объект интерфейса для доступа к серверу СОМ
wd:=Create01eObject('Word.Application');
// Проверка наличия методов и правильность передачи параметров будет осуществляться на стадии выполнения приложения
wd.application.documents.add;
wd.application.activedocument.range.insertAfter(now);
wd.application.activedocument.saveas(fileName);
except
end;
end;

procedure TForml.FinishClick(Sender: TObject);
begin
// Выгружаем сервер из памяти компьютера
wd.application.quit(true,0);
end;
end.

Обратите внимание на необходимость добавления модуля coMObj в раздел Uses.
Как вы можете видеть, вкладка Servers палитры компонентов содержит много компонентов. Кроме базовых объектов серверов автоматизации, данная вкладка содержит несколько вложенных объектов, таких как документ Microsoft Word (WordDocument), рабочая Книга Excel (ExcelWorkbook) И Др.
Отметим, что все компоненты, содержащиеся на вкладке Servers, являются наследниками класса TOLEServer, который, в свою очередь, происходит от класса TComponent. Класс TOLEServer - базовый класс для всех СОМ-серверов, которые можно получить путем импортирования библиотек типов серверов автоматизации. Данный класс имеет несколько свойств и методов, позволяющих управлять связью с СОМ-сервером. Например, свойство Autoconnect, которое, в случае, если оно имеет значение true, автоматически запускает СОМ-сервер и производит извлечение интерфейса для связи сервера и диспетчера автоматизации.
Рассмотрим очень важное свойство данного класса ConnectKind (тип подключаемого процесса). Это свойство используется методом Connect, который вызывается автоматически при AutoConnect=true. В табл. 3.6 представлены значения свойства ConnectKind.
Таблица 3.6. Значения, принимаемые свойством ConnectKind
Значения свойства

ConnectKind

CkRunningOrNew

Описание

Диспетчер автоматизации подключается к уже существующему процессу. В случае, если процесс не запущен - запускает и подключается к нему. Этот вид взаимодействия между диспетчером и сервером автоматизации является наиболее часто применяемым. Данное значение свойства устанавливается по умолчанию

CkNewInstance

Диспетчер автоматизации в любом случае создает новый экземпляр сервера автоматизации

CkRunninglnstance

Соединение устанавливается только с уже запущенные сервером автоматизации, если такой, не обнаружен - генерируется ошибка

CkRemote

Применяется для установления соединения с сервером автоматизации, который располагается на удаленном компьютере в сети. При использовании данного значения свойства ConnectKind необходимо указать имя удаленного компьютера в свойстве RemoteMachineName

CkAttachToInterface

В данном случае соединение не создается, поэтому нельзя устанавливать значение true для свойства AutoConnect. Соединение с сервером в этом случае осуществляется при помощи метода ConnectTo



Примечание
При помощи последнего значения свойства ConnectKind - CkAttachToInterface- можно последовательно подключать к уже существующему интерфейсу несколько компонентов, таких как wordDocument или WordFont. Установка данного значения свойства необходима, когда диспетчер автоматизации должен отслеживать события, которые происходят в сервере автоматизации.

Свойство ConnectKind можно устанавливать в окне инспектора объектов при помощи выпадающего списка, который появляется при щелчке мышью на данном свойстве.

Содержание раздела