Совместная работа нескольких приложений. Технология DDE. Технология OLE. Динамически подключаемые библиотеки (DLL). Работа с потоками.

Принципы обмена информацией между приложениями Windows

Совместная работа нескольких приложений

Система Windows исходно задумывалась как многозадачная. Это означает, что в ней одновременно могут работать несколько задач. Это действительно так. Например, на ПК с процессором Pentium/233 и достаточным объемом ОЗУ (64 Мбайт) можно запустить интенсивную вычислительную задачу и одновременно продолжать работу в редакторе Word или электронной таблице Excel, ожидая результаты расчетов, выполняющихся в фоновом режиме. А в системе Windows NT такие возможности значительно расширены и к ним добавлены специальные средства управления выполняющимися программами.

Однако запускать несколько задач одновременно не всегда имеет смысл. Чаще всего требуется, чтобы такие задачи взаимодействовали между собой, обменивались информацией, причем на основе стандартного механизма, не требующего от программиста дополнительных усилий по определению способа такого взаимодействия.

Программы, обменивающиеся информацией, как правило, не равноправны. Одна из них выступает в роли сервера, рассылающего обработанную информацию (по аналогии с сервером баз данных), другая (или несколько других) — в роли клиента (по аналогии с клиентской программой, получающей наборы данных по запросу к СУБД). Однако в большинстве случаев приложения Windows могут работать и как серверы, и как клиенты.

 

Технология DDE

В Windows имеется несколько технологий, позволяющих организовать эффективное взаимодействие группы приложений. Еще в первых 16-разрядных версиях Windows была реализована технология DDE (Dynamic Data Exchange, динамический обмен данными). С ее помощью программа-сервер может обмениваться информацией  (текстовыми строками) с программами-клиентами, подключенными к этому серверу с помощью протокола DDE, Абсолютное большинство приложений корпорации Microsoft поддерживают этот протокол, что позволяет обращаться к ним из других программ, передавать и получать информацию.

В системе Delphi 7 для поддержки технологии DDE созданы четыре компонента, расположенные на панели System (Системные).

TDdeClientConv     Устанавливает связь с серверам DDE

TDdeClientltem        Конкретный объект, содержимое которого передается (или  принимается) за один сеанс связи с сервером DDE. Обеспечивает транэакционную работу по обмену информацией

TDdeServerConv  Сервер DDE

TDdeServerltem       Объект стороны сервера, содержимое которого предназначено для обмена

 

Компонент TDdetLientConv обладает двумя важнейшими свойствами, лежащими в основе протокола DDE. Свойство DdeService описывает серверное приложение, с которым устанавливается связь, а свойство DdeTopic — так называемый «топик» (topic), хараЕстеризует имя серверного объекта, непосредственно участвующего в обмене информацией.

С помощью компонентов TDdeServerConv/TDdeServerltem можно включить в свою программу богатые возможности обмена данными, хотя для этих целей компания Microsoft предлагает значительно более мощную и гибкую технологию OLE. Тем не менее поддержка механизма DDE в продуктах корпорации сохраняется, и в некоторых случаях использовать этот протокол обмена значительно проще, чем вес остальные.

Сервером DDE является, например, электронная таблица Excel. Написав несколько строк кода, можно организовать простой обмен содержимым между программой и ячейками страниц Excel 97.

Разместим на форме текстовое поле, две кнопки (Поспатьи Принять) — и компонентTDdeQientConv.

Основная задача при использовании компонентов DDE — установить связь между сервером

и клиентом и, вообще, выяснить, поддерживает ли некоторое приложение этот протокол. Проще

всего сделать это так. Запустите программу-сервер (в нашем случае — Excel 97), выберите

произвольную ячейку и скопируйте ее содержимое в буфер обмена Windows. Затем перейдите к Инспектору объектов и для любого из свойств DdeService/DdeTopIc вызовите редактор

связи с сервером DDE Info, щелкнув на кнопке  вызова в соответствующей строке Инспектора.

Если программа, данные из которой были скопированы в буфер, способна работать как сервер DDE, то кнопка Paste Link (Установить связь) доступна. В противном случае она окажется в сером «отключенном» состоянии.

После щелчка на этой кнопке в поля DdeServke/QdeTopic будут внесены названия сервера (Excel) и объекта — первого листа таблицы [Книга1]Лист1, если в программе Excel был открыт новый файл. Теперь надо подтвердить связь щелчком на кнопке ОК.

Обмен данными может происходить в обе стороны: как в сторону электронной таблицы, так и от нее к клиентскому приложению. Это приложение управляет работой сервера, отдавая ему соответствующие команды.

Чтобы послать данные серверной программе, используется следующий метод,

function PokeData (Item; string,- Data: PChar) : Boolean;

Первый параметр описывает принимающий объект стороны сервера (этот объект обычно выделен или имеет фокус). Для некоторых программ можно указать принимающий элемент явно. В частности, для программы Excel можно указать номер ячейки в формате ≪RnCm≫. Здесь где п — номер строки, начиная с 1, a m — номер столбца, начиная с 1. Например, ячейка с координатами (5,12) обозначается как R5C12.

Второй параметр — передаваемая строка в формате PChar.

Сделаем так, чтобы по щелчку на кнопке Послать с помощью этого метода в ячейку электронной таблицы с координатами (2,3) (программа Excel должна быть запущена заранее) записывалось содержимое поля Editl нашей программы (рис. 8.1):

procedure TForml.ButtonlClick(Sender: TObjecti;

var ToExcel: array [0 .. 100] of char;

begin

StrPCopy(ToExcel, Editl.Text);

DDEClientConvl.PokeDatal 'R2C3' , ToExcel) ,-

end;

Puc. 8.1. Содержимое ячейки электронной таблицы передано из внешнего приложения

Чтобы принять информацию от программы-сервера, надо воспользоваться следующим методом.

function RequestData(const Item: string]: PChar;

Единственный параметр — объект сервера, содержащий принимаемые данные (в нашем случае — ячейка таблицы).

Функция возвращает в формате PChar указатель на строку, которая хранит данные, полученные от сервера.

Для отображения в поле Editl нашей программы содержимого ячейки (1,1) надо сформировав следующий обработчик щелчка на кнопке Принять.

procedure TForml.Button2ClickfSender: TObject);

var FromExcel: PChar;

begin

FromExcel := DDEClientConvl.ReguestData('R1C1') ;

Editl.Text := StrPas(FromExcel);

end;

Как видим, использование технологии DDE не вызывает особых сложностей.

С помощью компонентов TDdeServerConv и TOdeServerltem можно расширить возможности своего приложения, чтобы оно также было способно работать как сервер DDE. К недостаткам технологии D/M: надо отнести отсутствие единого подхода к работе с различными серверами DDE. Например, чтобы узнать, как обращаться к ячейкам электронной таблицы Excel, надо основательно покопаться в документации. То же относится и ко многим другим стандартным программам.

 

 

Технология OLE

Технология Object Linking and Embedding (Связывание и внедрение объектов) обладает значительно большими возможностями, нежели механизм DDE. Типичный пример использования этой технологии — добавление рисунка в документ текстового процессора Word (Вставка > Рисунок > Из файла). Это действие можно выполнить двумя способами.

1. В ходе выбора рисунка в диалоговом окне устанавливается флажок Связать с файлом. В этом случае в документ физически добавляется только ссылка на рисунок (место его хранения и используемый графический формат). При внесении изменений в исходный файл с рисунком эти изменения отображаются в документе, а если этот файл удалить, то программа Wordue сможет ничего отобразить. Такой способ объединения двух объектов называется связыванием,

2. Если флажок Связать с файлом сброшен, то рисунок копируется из исходного файла и вставляется в документ. Теперь, если оригинальный файл изменен или удален, копия рисунка останется в документе в неизменном виде. Такой подход называется внедрением.

В случае связывания объем документа Word увеличивается незначительно, но требуется контролировать наличие файла с рисунком и следить за его изменениями.

В случае внедрения существенно увеличивается объем документа, так как изображение хранится внутри него.

Объект, который встраивается в документ или связывается с ним, называется контейнером OLE (OLE Container). В нашем случае это рисунок. В системе Delphi 7 на панели System (Системные) имеется компонент TDleContainer, позволяющий встраивать объекты в программу или связывать их с ней.

Технология OLE обладает и множеством других возможностей. В частности, это автоматизация OLE (OLE Automation), позволяющая программно управлять другими приложениями, вызывая их методы, доступные через интерфейс OLE. При этом, конечно, требуется, чтобы приложение поддерживало автоматизацию OLE.

Технология OLE расширяет технологию DDE. Если ранее можно было только обмениваться данными и понятия «объект» не существовало, то в рамках технологии

OLE программист работает с программами и данными как с полноценными объектами, обладающими не только свойствами, но и методами, к которым можно обращаться.

Практически все офисные приложения Windows поддерживают автоматизацию OLE. Например, к таковым относится браузер Internet Explorer, работой которого несложно управлять программно.

Основные недостатки при использовании технологии OLE — необходимость знать (как и в случае DDE) описание доступных свойств и методов обрабатываемых объектов, которые в браузере и редакторе отличаются, и отсутствие общего программного интерфейса.

Эта проблема была полностью снята в технологии COM (Component Object Model, объектная модель компонента), основанной на технологии OLE. Технология СОМ подробно рассматривается в последующих главах.

Однако вернемся к объектам OLE и посмотрим, как можно использовать компонент TOleContainer. После размещения компонента на форме в его контекстном меню доступны, в частности, два пункта: Insert Object (Вставить объект) и Paste Special (Специальная вставка). С помощью первого пункта определяется объекг OLE, который размещается на форме (рис. 8.2).

В списке указываются все типы объектов OLE, которые зарегистрированы в конкретной версии Windows. Например, если выбрать пункт Диаграмма Microsoft Excel (при условии, что в системе установлена электронная таблица Excel), то в окне компонента отображается некая начальная диаграмма (рис. 8.3).

Если дважды щелкнуть на ней, то в рамках границ компонента TOleContainer запускается программа Excel. С ее помощью можно выполнить редактирование этой диаграммы (рис. 8.4).

Можно также вставить готовый объект из файла. Тогда в диалоговом окне вставки объекта надо установить переключатель Создать из файла и указать нужный файл. Флажок Связь определяет режим добавления документа в программу (связывание или внедрение).

Динамически подключаемые библиотеки (DLL)

Что такое DLL

Самый простой способ обмена информацией между программами — это использование библиотек -DLL. Строго говоря, библиотека .DLL — это не программа, а хранилище программного кода (например, функций) и ресурсов (например, форм). Она подключается к программе динамически, после того как программа запущена.

Использовать библиотеки .DLL очень удобно. Пусть, например, имеется программа прогнозирования некоего значения наосновании данных, вводимых пользователем.

Создадим пользовательский интерфейс, а сам алгоритм расчета прогноза (достаточно сложный) выделим в отдельную функцию и поместим в библиотеку .DLL, подключаемую к программе.

Теперь, если разработчик улучшит алгоритм прогнозирования, то пользователям достаточно поменять только библиотеку .DLL, а вносить изменения в код, ответственный за интерфейс, вообще не придется. По такому принципу, в частности, устроен браузер Netscape Navigator.

Создание библиотеки DLL

Допустим, требуется создать библиотеку, в которой будет находиться функция суммирования двух чисел.

function Sum(X,Y: integer): integer;

Выполним команду File >• New > Other >• DLL Wizard (Файл >• Создать > Другое >• Мастер DLL). При этом создается пустая заготовка библиотеки. Текст модуля начинается не со слова unit, а со слова library. Добавим в нее описание функции Sum, а в конец модуля библиотеки — ключевое слово exports, после которого приводится список экспортируемых функций — функций данной библиотеки, которые доступны другим приложениям.

ВНИМАНИЕ Подпрограммы, названии которых не указаны а директиве exports, не могут вызываться из других программ и используются только внутри программы.

Целиком модуль запишется следующим образом,

library Projectl;

uses

SysUtils,

Classes,-

{SR *-RSS}

function Sum(X,Y: integer): integer;

begin

Result ;= X+Y

end;

exports Sum;

begin

end.

Вызов библиотеки DLL

Добавим в текущую группу проектов новый проект (обычное приложение), разместим на форме два текстовых поля, кнопку и одну надпись для вывода результата,

(рис, 8.5).

В разделе interface опишем импортируемую функцию с ключевым словом external, за которым указывается строка — имя файла (библиотеки .DLL).

function Sum(X,Y: integer): integer;

external 'Projectl.dll1;

Рис. 8.5. Форма для приложения, которое будет обращаться к внешней библиотеке DLL

Обработчик щелчка на кнопке запишется следующим образом.

procedure TForml.ButtonlClick(Sender: TObject};

begin

Labell.Caption :=

InCToStrtSum(StrToInt(Edit1.Text).StrToInt(Edit2.Text)))

end;

Теперь можно запустить приложение (предварительно надо откомпилировать библиотеку Projectl.dll). После щелчка на кнопке выполняется суммирование введенных чисел с помощью функции, программный код которой хранится в динамической

библиотеке (рис. 8.6).

Добавление ресурсов в библиотеку

В библиотеке -DLL можно хранить не только программный код, но и ресурсы, в частности, формы Delphi 7, что значительно повышает полезность таких библиотек.

Сделаем активным проект Projectl.dll и выполним команду File >• New x Form (Файл >Создать > Форма). В текущем проекте появится новая форма (рис. 8.7). Добавим на нее одну кнопку, а обработчик нажатия сделаем таким.

procedure TForm2 . ButtonlClicMSender : TObject) ;

begin

ShowMessage!'DLL!')

end;

Чтобы вызвать форму из другого приложения, ее надо создать динамически, так как обычные механизмы Delphi 7 в библиотеках .DLL не работают. Для этого опишем новую процедуру.

procedure ShowMyFormfAOwner: TComponent);

var MyForm: TForm2;

begin

MyPorm := TForm2.CreatefAOwner);

MyForm.ShowModa1;

MyForm. Free,-

end;

Эта процедура должна иметь параметр типа TComponent, необходимый для конструктора формы. Включим созданную процедуру в список экспорта.

exports Sum, ShowMyForm;

Далее переключимся на проект Project2.exe и укажем новую импортируемую процедуру.

procedure ShowMyFormfAOwner: TComponent);

external 'Projectl.dll';

Добавим на форму еще одну кнопку и создадим такой обработчик щелчка.

procedure TForml.Button2Click(Sender: TObject];

begin

ShowMyForm(Self);

end;

По щелчку на этой кнопке появится работающая форма, взятая из библиотеки -DLL

(рис. 8.8).

 

Работа с потоками

Что такое поток

В предыдущей главе была рассмотрена возможность загрузки и выполнения функций из внешних библиотек. Теперь рассмотрим обратный случай — «одновременное» выполнение нескольких функций в одной программе.

Слово ≪одновременное≫ не зря взято в кавычки. В реальности, параллельно выполнять несколько программ можно, очевидно, только при наличии у компьютера двух и более процессоров. Однако система Windows позволяет имитировать такую одновременную работу: каждой программе операционная система выделяет небольшой квант времени (несколько миллисекунд), в течение которого выполняется данная программа, а затем происходит переключение к следующей программе. Так как квант времени очень мал, для человека такое мгновенное переключение незаметно.

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

Использовать потоки удобно для самых разных целей. Они дают возможность выполнять задачи в фоновом режиме и позволяют пользователю сосредоточиться на главной работе. Например, бухгалтер может вводить хозяйственные проводки,

а в фоновом режиме в это время выполняется расчет баланса.

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

ЗАМЕЧАНИЕ Корпороция Borland не рекомендует создавать в одной программе более 16 процессов, если эта программа работает но однопроцессорном компьютере.

Создание многопоточного приложения

Далее мы рассмотрим пример, в котором в рамках программы, содержащей формы с двумя областями рисования (TPaintBox), запускаются два потока, каждый из которых выполняет рисование в своей области и со своей скоростью.

Создадим новое приложение командой File >• New > Application (Файл >• Создать >Приложение). Подготовим форму с двумя областями рисования TPaintBox размером 100x100 пикселов. Разместим также на форме кнопку, по щелчку на которой запускаются потоки (рис. 8.9).

 

Добавим в проект класс-поток командой File > New > Other > Thread Object (Файл >• Создать >• Другое > Потоковый объект). В диалоговом окне ввода названия класса укажем TMyThread. Этот класс будет наследником базового класса-потока TThread. Возникнет файл с пустым описанием этого класса.

Перейдем к модулю главной формы и опишем в классе TForml новый метод CPaint, который получит в качестве параметра холст и нарисует на нем квадрат размером 10x10 пикселов. Место расположения квадрата и его цвет выбираются случайным образом.

procedure TForml .CPaint ( Cv: TCanvas );

var b: byte,-

C: TColor;

r: TRect;

begin

Cv.Brush.Style := bsSolid;

с := random(256);

b := random(256);

с := с or (b ehl 8);

b := random(256);

с := с or {b shl 16);

Cv.Brush.Color := c;

r.left := random(90);

r.top := random(90),•

r.right := r.left+10;

r.bottom := r.top+10;

Cv.Rectangle(r);

end;

На деталях реализации этой процедуры останавливаться не станем.

Добавим еще два метода (процедуры без параметров), которые будут обращаться к процедуре CPaint для вывода квадрата либо на холст объекта PaintBoxl, либо на холст объекта PaintBox2.

procedure TForml.Paintl;

begin

CPaint( PaintBoxl.Canvas );

продолжение &

15 3ar.MB

procedure TForml.Paint2;

begin

CPaintf PaintBox2.Canvas );

end;

Эти процедуры необходимы, чтобы вызывать их из класса-потока, причем специальным образом. Дело в том, что, когда методы классов Delphi 7 (в нашем случае —метод Rectangle) одновременно вызываются из нескольких потоков, это может приводить к самым неожиданным конфликтам между потоками. Например, проблемы могут быть связаны со слишком быстрым чередованием обработки процесса вывода на экран, когда системе требуется обрабатывать объекты классов

Процесса вывода на экран, когда системе требуется обрабатывать объекты классов TBrush, ТРеп.

Эти классы давно известны как источники ошибок, вызванных неаккуратным обращением с ними. Поэтому в классе TThread имеется метод гарантированно безопасного выполнения таких методов. Этот метод выполняет синхронизацию работы всех потоков.

type TThreadMethod = procedure of object;

procedure Synchronize (Method: TThreadMethod) ,-

В качестве параметра он получает название метода без параметров. Для этого нам и понадобилось создать процедуры Paintl и Paint2. А как определить внутри потока, какой из этих методов надо вызывать? Добавим в класс TMyThread переменную Boxl.

public

Boxl: boolean;

end;

При создании экземпляра потока занесем в эту переменную значение True, если надо вызывать метод Paintl. Вся логика работы потока описывается в его основном методе.

procedure Execute;

Нам надо переопределить этот метод следующим образом.

procedure TMyThread.Execute;

begin

while not Terminated do

if Boxl then Synchronise (Forrnl.Paintl)

else Synchronize(Forml.Paint2)

end;

Свойство класса Terminated автоматически примет значение True, когда программа получит команду на завершение. В зависимости от значения переменной Boxl выполнится отрисовка одного квадрата (вызов соответствующего метода класса TForml),после чего продолжится цикл произвольной длительности.

Теперь надо добавить в описание класса TForm 1 две новые переменные — два будущих

потока.

Tl, T2: TMyThread;

Опишем обработчик щелчка на кнопке Buttonl. .

procedure TForml. ButtonlClick (Sender: TObjectl ,-

begin

Tl := TMyThread.Create (true) ,-

Tl.Boxl := true;

Tl. Priority := tpLower;

T2 := TMyThread.Create(true);

T2.Boxl := false;

T2-Priority := tpLowest;

Tl.Resume;

T2.Resume;

end;

Поток создается с помощью конструктора Create, который имеет один параметр.

Он имеет значение True, если поток начинает работу после вызова метода Resume,

В противном случае (False) поток начнет работу сразу же после создания.

Далее задаются значения переменной Boxl и свойства Priority — приоритета выполнения потока. Приоритет определяет, как часто Windows выделяет процессу кванты времени, то есть фактически задает быстродействие этого процесса.

Свойство Priority имеет тип TThreadPriority и может принимать одно из следующих значений.

Таблица 8.2. Значения свойства Priority

Значение Приоритет потока

tpldle Поток выполняется, только когда системе Windows больше нечего делать

tpLowest Приоритет на два пункта ниже нормального

tpLower Приоритет на один пункт ниже нормального

tpNormal Нормальный приоритет

tpHigher Приоритет на один пункт выше нормального

tpHighest Приоритет на два пункта выше нормального

tpTimeCritical Максимальный приоритет

В раздел interface модуля Unitl нужно добавить ссылку на модуль Unit2, где описан класс

TMyThread, а в раздел implementation модуля Unit? — ссылку на модуль Unitl. Программу

можно откомпилировать и запустить. После щелчка на кнопке начнется заполнение двух

областей рисования небольшими прямоугольниками, причем в правой области это будет про-

исходить заметно медленнее.

 

Использование объектов СОМ

Что такое технология СОМ

Технология СОМ описывает модель объекта и способы взаимодействия таких объектов и программ. Объект СОМ напоминает компонент Delphi 7. Он представляет собой законченный объект со своими свойствами и методами, который может легко встраиваться в приложения или распространяться как отдельный программный продукт. Здесь надо сделать следующее замечание. СОM-объект представляет собой либо DLL-библиотеку, либо £ХЕ-приложение Windows, которые можно создавать

в любой системе программирования, способной поддерживать нужный формат представления. Ранее мы считали объектом любой экземпляр класса, подготовленного с помощью системы Delphi. СОМ-объект (а также объект любой из рассматриваемых далее схожих технологий распределенного взаимодействия, например CORBA или СGI) отличается от таких объектов. СОМ-объект дополнительно обладает интерфейсом — внешним формальным описанием своих свойств и методов, которые могут использоваться другими СОM-объектами. Таким образом, СОМ-объект напоминает скорее компонент Delphi. Из таких объектов, как из готовых кубиков, можно складывать приложения и крупные системы, работающие в компьютерной сети. Операционная система Windows базируется на технологии СОM и ее сетевых расширениях (DCOM, COM+ — они обеспечивают работу и взаимо

действие объектов, физически выполняющихся на разных компьютерах). СОМ-объекты выполняют самые разные функции, причем создаются и уничтожаются системой автоматически (по мере возникновения запросов от пользователей, других программ и выполнения нужных действий), что значительно облегчает их использование. Достаточно только описать интерфейс СОM-объекта и запрограммировать его реализацию, все остальное выполнят компилятор и Windows.

ВНИМАНИЕ Готовящаяся к выпуску в ближайшие годы платформа Windows .NET полностью переработана в архитектурном плане и предлагает качественно новую обьектную модель — модель .NET-объекта.

Массовое внедрение группы технологий .NET начнется, по прогнозам ведущих аналитических компаний, в 2004-2005 годах. В это же время предполагается резкий спад популярности СОМ-подходо,Поэтому если планируется создание распределенной системы на базе Windows, надо решить, на какой срок эксплуатации она рассчитана. Если предполагается ее существенная переработка в течение ближайших пяти лет, то можно использовать СОМ-подход как наиболее простой и эффективный. Если же задумывается значительно более долгосрочный проект, то лучше основываться на таких подходах, как CORBA, Интернет-технологии (все они далее рассматриваются в данной книге). Выглядит очень перспективной и .NET-архитектура, но на момент выхода Delphi 7 она существовала только в бета-версии. Ее поддержка ожидается в следующих версиях продуктов Borland

Одна из важных составляющих .NET — служба Web Services, реализация которой уже отдельно осуществлена корпорацией Microsoft. Создавать приложения Web Services можно и с помощью Delphi 7 — этому вопросу посвящен соответствующий раздел, и хочется порекомендовать: обратите на Web Services самое серьезное внимание, как на одну из альтернатив подходу СОМ\ На основе технологии СОМ был создан ряд расширений, например серверы автоматизации (как в примере с автоматизацией OLE), активные серверные страницы ASP (Active Server Pages) и др. Одно из наиболее известных расширений технологии СОМ — элементы ActiveX, первоначально создававшиеся для использования в Интернете.

Основное различие технологий СОМ и OLE — возможность автоматического общения между компонентами СОМ и приложениями и наличие базового интерфейса, с помощью которого программа может выяснить, поддерживает ли конкретный объект СОМ функцию, нужную приложению (например, вычисление синуса или формирование определенного набора данных).

 

Составные части технологии СОМ

При создании приложения СОМ используются следующие понятия.

Таблица 8-3. Понятия технологии СОМ

Понятие Что это такое

Интерфейс СОМ

Описывает методы и свойства, доступные программам, обращающимся к объекту. Объект СОМ может иметь один или несколько интерфейсов СОМ и содержит их описание и реализацию

 

Сервер СОМ

Законченный модуль кода (ЕХЕ или DLL), в котором хранится программный код одного или нескольких объектов СОМ

 

Клиент СОМ

Программный код в котором происходит обращение к интерфейсу СОМ с запросом на выполнение услуг сервера СОМ. Клиент СОМ знает, что ему надо получить от сервера СОМ, но не знает, как сервер будет это реализовывать и, вообще, где сервер физически расположен. Некоторая аналогия для клиента СОМ — рассмотренный ранее гример контейнера OLE

 

Интерфейс СОМ

Интерфейс СОМ позволяет клиентам СОМ общаться с сервером СОМ на основе стандартного механизма публикации интерфейса. После того как интерфейс СОМ опубликован (стандартным способом зарегистрирован в операционной системе), изменять его нельзя, что гарантирует одинаковую работу объекта СОМ в любых условиях.

 ЗАМЕЧАНИЕ Идея интерфейсов СОМ аналогично идее реализации интерфейсной части (interface) в модулях Паскаля, когда другим разработчикам доступен для использования закрытый код и открытое описание его возможностей.

Базовый интерфейс IUnknown, который имеется у любого объекта СОМ, позволяет  узнать, какие еще интерфейсы СОМ доступны для клиента СОМ Все эти интерфейсы наследуют характеристики интерфейса IUnknown.

ЗАМЕЧАНИЕ Название каждого интерфейса начинается с заглавной буквы I(Interface).

Уникальность интерфейса обеспечивается его глобальным идентификатором Globally Unique Identifier (GUID) длиной 16 байтов, а каждый объект СОМ имеет идентификатор интерфейса 1Ю {Interface Identifier) на основе GUID. Идентификатор GUID требуется, чтобы избежать проблем при появлении интерфейсов СОМ с одинаковыми именами. Например, многие разработчики могут независимо друг от друга создать интерфейс СОМ с именем IGame, однако в каждом конкретном

объекте СОМ он будет выполнять разные функции. Для того чтобы различать интерфейсы СОМ не по именам, и были введены идентификаторы GUID.

Благодаря наличию стандартных интерфейсов объект СОМ может быть реализован на любом языке программирования (в том числе и в системе Delphi 7).

Интерфейс IUnknown содержит метод Querylnterface, возвращающий ссылку на другие доступные интерфейсы, атакже методы AddRef и Release, которые увеличивают и уменьшают счетчик ссылок на конкретный интерфейс, когда к нему происходит обращение клиента СОМ. Например, пусть сервер СОМ содержит объект СОМ, имеющий интерфейс ICos, в котором содержится метод, вычисляющий косинус. При каждом обращении из разных программ к этому интерфейсу для вычисления косинуса счетчик увеличивается, а когда интерфейс освобождается (косинус вычислен и его значение

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

 

Сервер СОМ

 

Когда клиент СОМ обращается к серверу СОМ, он передает ему идентификатор класса CLSID, представляющий собой GUID, который ссылается на подходящий объект СОМ. Сервер СОМ создает специальный объект — фабрику классов (Кlass Factoгу), — который занимается непосредственно созданием и загрузкой (производством) экземпляра нужного объекта СОМ, выполняющего конкретные действия его интерфейса, указанные в запросе клиента СОМ.

Фабрика классов «выпускает» объект СОМ, реализующий один или несколько интерфейсов СОМ, а также экземпляр специал ьного класса CoClass, который обеспечивает возможность обращения к объекту СОМ на основе интерфейсов СОМ.

ЗАМЕЧАНИЕ В реальной работе этот класс называется так же, как класс создаваемого объекта (например, TTestObj), только вместо начальной буквы Т будет использована приставка Со — CoTestObj.

Серверы COM реализуются тремя способами.

1. В виде библиотеки .DLL. При этом объект СОM/ выполняется в адресном пространстве обратившегося к нему приложения.

2. Б виде приложения .ЕХЕ, которое выполняется в собственном адресном пространстве, но на одной машине с клиентом СОМ.

3. Б виде библиотеки .DLL или приложения .ЕХЕ, которые загружаются и работают на иной машине, нежели клиент СОМ (технология DCOM).

 

Расширения технологии СОМ

Ниже описаны некоторые расширения технологии СОМ.

Таблица 8.4. Расширения технологии СОМ

Тип расширения                                                            Что это такое

Серверы автоматизации

 

Объекты СОМ, которые могут программно управляться из Других приложений. Например, большинство офисных приложений Windows, а также браузер Microsoft Internet Explorer, валяются серверами автоматизации

 

Контроллеры автоматизации

 

Так называются клиенты СОМ, которые управляют серверами автоматизации И имеют дополнительные возможности настройки такого управления

 

Элементы ActiveX

Серверы СОМ, встраиваемые в приложения и содержащие средства для своей визуальной настройки. В некоторой степени аналогичны компонентам Delphi 5, которые можно настраивать с помощью Инспектора объектов и собственных редакторов

 

Библиотеки типов

Библиотеки, хранящие описание объектов и их интерфейсов

 

Активные серверные страницы (ASP)

 

Компоненты ActiveX, которые предназначены для создания Web-страниц, активно взаимодействующих с пользователем

Активные документы

 Объекты СОМ, которые поддерживают технологию OLE, методику перетаскивания и визуальное редактирование. Таковы, например,документы редактора Word

 

Визуальные мультипроцессные объекты

Объекты СОМ, которые могут использоваться в одновременно

выполняющихся процессах объекты.