Ф Е Д Е РАЛ Ь Н О Е АГ Е Н С Т В О П О О БРАЗО В АН И Ю РФ В О РО Н Е Ж С К И Й Г О С У Д АРС Т В Е Н Н Ы Й У Н И В Е РС...
5 downloads
185 Views
324KB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
Ф Е Д Е РАЛ Ь Н О Е АГ Е Н С Т В О П О О БРАЗО В АН И Ю РФ В О РО Н Е Ж С К И Й Г О С У Д АРС Т В Е Н Н Ы Й У Н И В Е РС И Т Е Т
Распред ел енныеприл ож ения: контрол л еры автоматизации У чебноепособиепо специал ьности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 ид испинтерф ей сов явл яется обеспечение мех анизмапоздне го с вязы вани я д аж е при отсутствииил и нед оступностибибл иотекитипа. К л иент в период выпол нения мож ет запросить у самого объектаинф ормацию о типе, при этом в станд артизованном вид е д оступнався необх од имая д л я испол ьзования объектаинф ормация: именаиид ен-
4
тиф икаторы свой ств иметод ов, типы параметров ит.п. П осл еэтого кл иент пол учает возмож ность д инамическигенерировать запросы к объекту. В аж ней ш ей зад ачей кл иента, испол ьзую щ его IDispatch, явл яется м ар ш али нгпараметров запросов. Н апомним, что марш ал инг (упаковкапараметров д л я пересыл ки меж д у процессами) обычного COM-интерф ей сас виртуальной табл ицей выпол няется заместител ем и загл уш кой (proxy, stub). В д анном ж е сл учае кл иент сам обязан выпол нить упаковку параметров д л я метод ад испинтерф ей сав некую станд артную ф орму, называемую вар и ант ом (variant), атакж е – распаковку из вариантарезул ьтатов вызова, возвращ енных метод ом. В ариант опред ел яет станд артную ф орму пред ставл ения каж д ого параметра и ид ентиф икатор типапараметрад л я всех типов, испол ьзуемых Visual Basic: короткое цел ое, д л инное цел ое, строкасимволов ит.д . П рограммисты над ругих языках поэтому д ол ж ны испол ьзовать л иш ь известныеVisual Basic типы. П о зднее с в язы в а ни е через ди с пи нт ерф ейс к л и ент а на Delphi Ч тобы испол нить метод д испинтерф ей са, кл иент д ол ж ен созд ать экземпл яр соответствую щ его объекта, пол учить правил ьный ид ентиф икатор метод а, упаковать корректные параметры в вариант ивызвать метод с помощ ью интерф ей са IDispatch. П омимо этого, возмож но, кл иенту потребуется д опол нител ьно обратиться за инф ормацией о типе испол ьзуемого объекта: имена и ид ентиф икаторы свой ств иметод ов, типы параметров ит.п. – д л япроизвод ства д инамического вызова. П осл е возвратарезул ьтат вызовакл иент д ол ж ен корректно распаковать изварианта, в соответствиис той ж е инф ормацией о типе. П рограммист наDelphi избавл ен от необх од имости реализации под робностей перечисл енных мех анизмов. П очти все они инкапсул ирую тся внутренним типом Variant. П еременные типаVariant, помимо всего прочего, мож но испол ьзовать д л я обращ ения к объектам автоматизации. Ч тобы иметь такую возмож ность, необх од имо вкл ю чить ссыл ку намод уль ComObj изод ного изваш их мод ул ей , программы ил ибибл иотеки: uses ComObj;
К огд авариант ссыл ается натакой объект, мож но черезвариант вызывать метод ы объекта, атакж есчитывать ил изаписывать свой ства. П риэтом синтаксис обращ ения к внеш нему объекту д остаточно очевид ен: конструкциипох ож и наиспол ьзуемые приработе с обычными(внутренними) объектами. О сновное отл ичие закл ю чается в том, что вызовы метод ов объектаавтоматизациисвязываю тся во время выпол нения и не требую т никаких пред ыд ущ их объявл ений метод а. П роверкаправил ьностиэтих вызовов во время компил яциине провод ится. С л ед ую щ ий пример ил л ю стрирует вызовы метод аавтоматизации. Ф рагмент запустит программу Microsoft Word исох ранит в ф ай л ед окумент изд вух строк. Ф ункция CreateOleObject (опред ел енная в ComObj) возвращ ает ссыл -
5
ку на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. Д л я та ких массивов не производ ится какой -л ибо скрытой обработки
6
в цел ях марш ал инга, и мож но эф ф ективно обращ аться к ним, испол ьзуя под программы 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 и т.п.). В этом сл учае зад ачей генератораотчетов становится выд ачаф ай л ов в соответствую -
7
щ их ф орматах (*.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 W := except W := end;
// если Word запущен - подключиться к нему GetActiveOleObject('Word.Application'); // если нет - запустить CreateOleObject('Word.Application');
П омимо прочего, в д анном примере мы изменил ипрограммный ид ентиф икатор, испол ьзовав вместо « 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;
8 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.
9
П рил ож ение буд ет бол ееэф ф ективным, есл ивместо конвертирования строк из внутренних типов Delphi в WideString каж д ый раз д л я перед ачи серверу, с самого начал асох ранять текст в требуемом ф ормате. Резул ьтат работы прил ож ения – сод ерж имое табл ицы country.db д емонстрационной базы д анных DBDEMOS, помещ енное в вид е отчетав д окумент Microsoft Word – пред ставл ен нарисункениж е:
Р ис. 1. О тчет в д окументеMicrosoft Word О собе нност и п рог рам м и ровани я на C++Builder Разработкакл иента, взаимод ей ствую щ его с OLE-сервером черезд испинтерф ей с, возмож натакж ев сред епрограммированияBorland C++Builder, х отя и требует написания несколько бол ее обш ирного код а. Д ело в том, что разработчикиC++Builder д л я реал изациитакой возмож ностиреш ил иобой тись сред ствами, пред оставл яемымистанд артным языком C++, в то время как разработчикиDelphi пош л ипо путирасш ирениястанд артасцел ью упрощ ениясинтаксиса. П реж д е всего, необх од имо заметить, что реализован специал ьный кл асс Variant, обл а д аю щ ий теми ж е возмож ностями, что и встроенный тип Variant Delphi. Д л я нас важ но то, что объекты д анного кл ассата кж е могут х ранить указател инад испинтерф ей сы ипред оставл яю т возмож ность управл ения объектамиавтоматизации. М ы рекоменд уем вкл ю чать в код программы заголовочный ф ай л utilcls.h , который помимо самого необх од имого инструментария сод ерж ит ш аблоны метод ов и кл ассов, пред оставл яю щ ие ал ьтернативныеспособы обращ енияк метод ам исвой ствам д испинтерф ей сов:
10 #include
Н е вд аваясь в тонкостиреал изациид анной библ иотеки, укаж ем л иш ь на сущ ествованиед вух способов обращ енияк д испинтерф ей су. • М етод Variant::Exec пред назначен д л я запускаметод ов д испинтерф ей сов, атакж е– д л ясчитыванияиустановкиих свой ств. • Ш абл оны метод ов кл асса Variant , названные OleFunction , OleProcedure , OlePropertyGet и OlePropertySet , реа л изую т бол ее уд обный способ д оступак метод ам исвой ствам д испинтерф ей сав смысл е уд обочитаемоститекстапрограммы. Н апример, команд аустановки свой ствад испинтерф ей сачерез объект W кл ассаVariant, взятаяизпред ыд ущ его примеранаDelphi: W.Visible := True;
наязыкеC++ мож ет быть реализованад вумяспособами: W.Exec(PropertySet("Visible")