WWW.DISSERS.RU

БЕСПЛАТНАЯ ЭЛЕКТРОННАЯ БИБЛИОТЕКА

   Добро пожаловать!


Pages:     || 2 | 3 | 4 | 5 |
ФЕДЕРАЛЬНОЕ АГЕНСТВО ПО ОБРАЗОВАНИЮ РФ ВОРОНЕЖСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ Распределенные приложения:

контроллеры автоматизации Учебноепособие по специальности 230201 (071900) «Информационные системы и технологии» ДС.09 Часть 2 ВОРОНЕЖ 2005 2 Утверждено Научно-методическим советом Воронежского университета Протокол № 12 от 18.02.2005 г.

Составитель Фертиков В.В.

Пособиеподготовлено на кафедре информационных систем факультета компьютерных наук Воронежского государственного университета.

Рекомендуетсядля использования студентами 4 курса дневного отделения в качестве учебных материалов на практических занятиях по курсу «Распределенные системы вычислений».

3 Введение в OLE–автоматизацию Настольные приложения – текстовые процессоры, электронные таблицы ит.д. – предназначены для повышенияпроизводительности труда пользователей. Программируемость приложений позволяет использовать их сервисы не только людям, но идругим программам. В результате, вместо того чтобы оставаться инструментами лишь для конечных пользователей, настольные приложения становятся наборами инструментов для программистов. Обеспечение программируемости требует стандартизации способа предоставления одной программой своих сервисов другой программе. Для реализации такого типа взаимодействия Microsoft использует модель COM. Приложенияобеспечивают доступ к своим сервисам через интерфейсы своих COM-объектов, после чего этими сервисами может воспользоватьсялюбой фрагмент кода, способный вызывать методы COM-объекта. Программисты, таким образом, получают возможность создавать приложения поверх функциональности, предоставляемой имеющимся программным обеспечением. В COM такой стандартный способ обеспечения программируемости называется OLE-автоматизацией (OLE Automation).

Итак, разработчик может сделать приложение программируемым, определив объекты (так называемые, объекты автоматизации, Automation objects) и интерфейсы COM, методы которых будут прямо отображаться на внутренние функции приложения. Обычно, хотяи необязательно, для этих целей используется стандартный интерфейс IDispatch, разработанный группой Microsoft Visual Basic. Необходимость в этом интерфейсе возникла на заре OLEавтоматизации из -затого, что Visual Basic, являясь одним из наиболее распространенных средств созданиясценариев для программируемых приложений, не поддерживал возможности вызова методов обычных COM-интерфейсов с виртуальной таблицей. По традиции, с которой приходитсямириться программистам на других языках, OLE-автоматизация большинства приложений и сегодня реализуется с помощью IDispatch. Этот интерфейс в настоящее время поддерживается Microsoft Word, Microsoft Excel и массой других приложений.

ИнтерфейсIDispatch спроектирован таким образом, что клиент с его помощью может обращатьсяк произвольной группеметодов, передавая любые необходимые параметры. Чтобы это действовало, разработчик объекта, реализующего IDispatch, должен определить, какиев точности методы будут доступны. Это достигается определением диспетчерского интерфейса (dispatch interface), сокращенно – диспинтерфейса (dispinterface). Каждый экземпляр стандартного интерфейсаIDispatch (объект может поддерживать несколько экземпляров одновременно) обеспечивает доступ к определенному диспинтерфейсу.

Другой, неменее важной задачей IDispatch и диспинтерфейсов является обеспечениемеханизма позднего связывания даже при отсутствии или недоступности библиотеки типа. Клиент в период выполненияможет запросить у самого объекта информацию о типе при этом в стандартизованном виде дос, тупна вся необходимая для использования объекта информация: имена иидентификаторы свойств и методов, типы параметров ит.п. После этого клиент получает возможность динамически генерировать запросы к объекту.

Важнейшей задачей клиента, использующего IDispatch, является маршалинг параметров запросов. Напомним, что маршалинг (упаковка параметров для пересылки между процессами) обычного COM-интерфейса с виртуальной таблицей выполняется заместителем и заглушкой (proxy, stub). В данном же случае клиент сам обязан выполнить упаковку параметров для метода диспинтерфейса в некую стандартную форму, называемую вариантом (variant), а также – распаковку изварианта результатов вызова, возвращенных методом. Вариант определяет стандартную форму представления каждого параметра и идентификатор типа параметра для всех типов, используемых Visual Basic: короткоецелое, длинноецелое, строка символов ит.д. Программисты на других языках поэтому должны использовать лишь известные Visual Basic типы.

Позднее связывание через диспинтерфейс клиента на Delphi Чтобы исполнить метод диспинтерфейса, клиент должен создать экземпляр соответствующего объекта, получить правильный идентификатор метода, упаковать корректные параметры в вариант ивызвать метод с помощью интерфейса IDispatch. Помимо этого, возможно, клиенту потребуется дополнительно обратиться заинформацией о типе используемого объекта: имена и идентификаторы свойств и методов, типы параметров ит.п. – для производства динамического вызова. После возврата результат вызова клиент должен корректно распаковать изварианта, в соответствии с той же информацией о типе.

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

Переменные типаVariant, помимо всего прочего, можно использовать для обращения к объектам автоматизации. Чтобы иметь такую возможность, необходимо включить ссылку на модуль ComObj изодного из ваших модулей, программы или библиотеки:



uses ComObj;

Когда вариант ссылается на такой объект, можно через вариант вызывать методы объекта, а также считывать или записывать свойства. При этом синтаксис обращенияк внешнему объекту достаточно очевиден: конструкции похожи на используемые при работе с обычными (внутренними) объектами. Основное отличиезаключается в том, что вызовы методов объекта автоматизации связываются во время выполнения и не требуют никаких предыдущих объявлений метода. Проверка правильности этих вызовов во время компиляции непроводится.

Следующий пример иллюстрирует вызовы метода автоматизации. Фрагмент запустит программу Microsoft Word и сохранит в файле документ издвух строк. Функция CreateOleObject (определенная в ComObj) возвращает ссылку наIDispatch объекта автоматизации, совместимую по присваиванию с вариантным типом.

var Word: Variant;

begin Word := CreateOleObject('Word.Basic');

Word.FileNew('Normal');

Word.Insert('This is the first line'#13);

Word.Insert('This is the second line'#13);

Word.FileSaveAs('c:\temp\test.txt', 3);

end;

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

сопровождаемого символом присваивания, с последующим выражением. Позиционные параметры должны предшествовать любым именованным параметрам вызова метода. Именованные параметры могут быть определены в любом порядке.

Некоторые серверы автоматизации позволяют опускать параметры вызова метода, принимая их значения по умолчанию. Например, Word.FileSaveAs('test.doc');

Word.FileSaveAs('test.doc', 6);

Word.FileSaveAs('test.doc',,,'secret');

Word.FileSaveAs('test.doc', Password := 'secret');

Word.FileSaveAs(Password := 'secret', Name := 'test.doc');

Параметры методов автоматизации могут быть следующих типов:

integer, real, string, Boolean и variant. Параметр передается по ссылке, если выражениепараметра состоит только изссылки на переменную Delphi типаByte, Smallint, Integer, Single, Double, Currency, TDateTime, AnsiString, WordBool илиVariant. Если выражениеимеет какой-либо другой тип или если оно неявляетсятолько переменной, параметр передаетсязначением. Передача параметра по ссылке методу, ожидающему параметр-значение, заставляет COM выбирать значениеизпараметра-ссылки. Наоборот, передача параметра-значения методу, который ожидает параметр-ссылку, вызывает ошибку.

Таким образом, методам автоматизации можно передавать типизированные параметры. При этом процедура маршалинга скрыта от программиста. Однако самым эффективным методом передачиявляется обмен между клиентом и сервером двоичными данными, описываемыми как массивы элементов типа varByte. Для таких массивов непроизводитсякакой-либо скрытой обработки в целях маршалинга, и можно эффективно обращаться к ним, используя подпрограммы VarArrayLock и VarArrayUnlock.

Рассматривая приведенные примеры, можно задать вопрос, каким образом имена объектов (например, Word.Basic) или методов (в данном случае, FileNew, Insert и FileSaveAs) транслируются в уникальные идентификаторы Если небудет обеспечен данный механизм, невозможным станет связываниев режиме выполнения. Прежде всего, рассмотрим наш пример так называемого программного идентификатора (programmatic identifier или сокращенно ProgID) «Word.Basic». Программный идентификатор – это удобный синоним уникального идентификатора класса CLSID. Напомним, что в модели COM класс объекта идентифицирует определенную реализацию объекта или группы интерфейсов. Отображениеудобочитаемого ProgID в CLSID содержится в реестре – оно помещается туда при установкепрограммы Word на компьютер.

Таким образом, любой клиент, вызвав CreateOleObject с ProgID в качестве параметра, запустит соответствующий сервер автоматизации.

Что касается идентификаторов методов исвойств, то соответствующая информация связывания может быть получена клиентом из библиотеки типа или же путем обращениянепосредственно к объекту черезIDispatch. Например, метод IDispatch::GetIDsOfNames специально предназначен для этих целей: он возвращает идентификатор метода или свойства диспинтерфейса в ответ на запрашиваемоеклиентом имя. Данный второй способ в своевремя был разработан группой Visual Basic и являетсянаиболее простым, хотя и несамым эффективным. Именно он используется встроенным типом Variant Delphi для производства позднего связывания.

Еще один важный вопрос: где программист может получить сведения о реализуемых сервером объектах автоматизации В данном случае наиболее вероятный источник информации для рассматриваемого примера – интерактивная справочная система Microsoft Word с полным списком объектов в этом приложении, которые можно использовать для автоматизации, их методов исвойств и вообще всего, что необходимо для обращенияк их сервисам. В общем случае приложения, предоставляющиесервисы через автоматизацию, содержат весьма подробную документацию на сей счет.

Учебный пример клиента Microsoft Word Одной из необходимых функций большинства приложений, работающих с данными, является генерацияразличного рода отчетов. Как известно, для реализации генератора отчетов по выборкам избаз данных программист на Delphi имеет в своем распоряжении штатные средства: компоненты из вкладок «QReport» и «Decision Cube» палитры компонентов. Разработанный таким образом генератор становитсячастью приложения, встроен в него, сопровождается специализированным интерфейсом, реализованным как часть интерфейса всего приложения. Часто, однако, пользователям необходимы отчеты в форме, пригодной для некоторой дальнейшей обработки. Удобно для этих целей использовать общедоступные офисные приложения (Word, Excel и т.п.). В этом случае задачей генератора отчетов становится выдача файлов в соответствующих форматах (*.doc, *.xls и т.п.). Можно пойти дальше: реализовать распределенноеприложение, в котором генератор отчетов будет клиентом СУБД с одной стороны иклиентом сервера автоматизации (Word, Excel и т.п.) с другой.





Рассмотрим простой пример такого приложения, генерирующего отчет при помощи Microsoft Word. Данные для отчета будут выбираться из демонстрационной базы данных с псевдонимом DBDEMOS, входящей в поставку Delphi.

Для доступа к какой-либо изтаблиц этой базы данных необходимо на форму разрабатываемого приложения поместить компонент TTable, установив соответственно его свойстваDatabaseName и TableName. Алгоритм чтения данных из таблицы может быть, например, следующим:

Table1.Open;

with Table1 do while not Eof do begin // прочитать значение полей из Fields.Fields[i].AsString;

Next end;

Table1.Close;

Для корректного соединенияс OLE-сервером клиент должен, прежде всего, сделать попытку обнаружить уже запущенный сервер. И только в случае неудачи– создать новый объект автоматизации. Таким образом, пример изпредыдущего раздела целесообразно доработать, как показано ниже:

try // если Word запущен - подключиться к нему W := GetActiveOleObject('Word.Application');

except // если нет - запустить W := CreateOleObject('Word.Application');

end;

Помимо прочего, в данном примере мы изменили программный идентификатор, использовав вместо «Word.Basic» более современный объект автоматизации «Word.Application». К сведению, объект «Word.Basic» инкапсулирует конструкции одноименного языка, обеспечивавшего программируемость прежних версий приложения Word version 6.0 и Word for Windows 95.

:

Его реализациясохранена для обеспечениясовместимости современных версий Word со старыми клиентами.

Ниже приведен полный код генератора отчета, который реализован как отклик на событиенажатия кнопки:

procedure TForm1.Button1Click(Sender: TObject);

var W,D,S,PosBeg,PosEnd:Variant; i,j:Integer; ws:WideString;

begin with Table1 do begin DatabaseName:='DBDEMOS'; TableName:='country.db'; Open end;

try // если Word запущен - подключиться к нему W := GetActiveOleObject('Word.Application');

except // если нет - запустить W := CreateOleObject('Word.Application');

end;

W.Visible := True;

D:=W.Documents.Add;

S:=W.Selection;

S.TypeText('Hello, World!'#13);

PosBeg := S.Start;

j:=0; ws:='№';

for i:=0 to Table1.FieldCount-1 do ws:=ws+#9+Table1.Fields.Fields[i].FieldName;

ws:=ws+#13;

S.TypeText(ws);

with Table1 do while not Eof do begin j:=j+1;

ws:=IntToStr(j)+'.';

for i:=0 to FieldCount-1 do ws:=ws+#9+Fields.Fields[i].AsString;

ws:=ws+#13;

S.TypeText(ws);

Next end;

PosEnd := S.Start;

Table1.Close;

D.Range(PosBeg,PosEnd).ConvertToTable(Separator:=#9, AutoFit:=True,AutoFitBehavior:=1,DefaultTableBehavior:=1) end;

Пожалуйста, незабудьте вставить ссылку на упомянутый модуль ComObj.

Напомним также о необходимости изучения документации по программированию Microsoft Word при разработкеего клиентов автоматизации. В данном пособии мы имеем возможность лишь следующего краткого пояснения пре. Для образования введенных текстовых данных в таблицу использован простой прием: текущая позиция документа запоминается дважды, до и после ввода преобразуемого текста:

PosBeg := S.Start; // начальная позиция S.TypeText(ws);... // вывод текста PosEnd := S.Start; // конечная позиция После чего весь отмеченный диапазон преобразуетсяв таблицу вызовом методаConvertToTable. Заметим, что в данном случае использованы именованные параметры. Обратите вниманиетакже на использованный в программе тип WideString. Именно его целесообразно использовать для представления текстовой информации при программировании OLE-автоматизации, поскольку этот тип совместим со стандартным COM типом представления строк BSTR.

Приложениебудет более эффективным, если вместо конвертирования строк из внутренних типов Delphi в WideString каждый раздля передачисерверу, с самого начала сохранять текст в требуемом формате.

Результат работы приложения – содержимое таблицы country.db демонстрационной базы данных DBDEMOS, помещенноев виде отчета в документ Microsoft Word – представлен на рисункениже:

Рис. 1. Отчет в документе Microsoft Word Особенности программирования на C++Builder Разработка клиента, взаимодействующего с OLE-сервером через диспинтерфейс, возможна также в среде программирования Borland C++Builder, хотяи требует написаниянесколько более обширного кода. Дело в том, что разработчики C++Builder для реализации такой возможности решили обойтись средствами, предоставляемыми стандартным языком C++, в то время как разработчики Delphi пошли по пути расширения стандарта сцелью упрощения синтаксиса.

Pages:     || 2 | 3 | 4 | 5 |










© 2011 www.dissers.ru - «Бесплатная электронная библиотека»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.