М И Н И СТ Е РСТ В О О БРА ЗО В А Н И Я И Н А У К И РО ССИ Й СК О Й Ф Е Д Е РА Ц И И В О РО Н Е Ж СК И Й ГО СУ Д А РСТ В...
15 downloads
788 Views
402KB 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
М И Н И СТ Е РСТ В О О БРА ЗО В А Н И Я И Н А У К И РО ССИ Й СК О Й Ф Е Д Е РА Ц И И В О РО Н Е Ж СК И Й ГО СУ Д А РСТ В Е Н Н Ы Й У Н И В Е РСИ Т Е Т
О снов ы COM У чебно-метод и ческоепособи епо специ альности «При клад наяматемати ка и и нформати ка» 010200
В оронеж 2004
2
У тв ерж д ено научно-метод и чески м сов етом протокол № 2 от24 октября2004 г. факультета ПМ М
Состав и тели :
Руд алев В .Г., К ры ж анов скаяЮ .А .
У чебно-метод и ческоепособи епод готов лено на кафед ретехни ческой ки бернети ки и ав томати ческого регули ров ани яфакультета при клад ной математи ки , и нформати ки и механи ки В оронеж ского госуд арств енного уни в ерси тета. Рекоменд уетсяд лястуд ентов 3 курса д /о факультета ПМ М .
3
В работе рассматри в аю тся основ ополагаю щ и е в опросы технологи и COM, ш и роко при меняю щ ей ся д ля раз работки си стемного и при клад ного программного обеспечени я, сов мести мого с операци онны ми си стемами семей ств а Microsoft Windows. При в од ятсялабораторны еработы и при меры программи ров ани я. Пособи епред наз начено студ ентам 3 курса, и з учаю щ и м д и сци пли ну СППО , и мож ет бы ть и спольз ов ано д алее при и з учени и некоторы х раз д елов курса «Баз ы д анны х и экспертны е си стемы » и д и сци пли н специ али з аци и , св яз анны х с программи ров ани ем и нформаци онны х си стем. Раз д елы 1,2 напи саны В .Г.Руд алев ы м, п.2.3, 2.4, раз д ел 3 –Ю .А .К ры ж анов ской . С о дер ж а н и е 1. О снов ны епоняти я… … .… … … … … .… … … … … … … … … … … … … … … … ..3 1.1.Проблемы и терми ны COM … .… … … … … … … … … … … … … … … … .… 3 1.2.И нтерфей сы … … … … … … … … .… … … … … … … … … … … … … … … … … 5 1.3.О бращ ени еки нтерфей сам … … .… … … … … … … … … … … … … … … … ...8 1.4.IDispatch и ав томати з аци я… … ..… … … … … … … … … … … … … … … … ...9 1.5.Реали з аци яи нтерфей сов … … … … … … … … … … … … .… … … … … … .… 13 1.6.М арш алли нг … … … … … … … … … … … … … … … … … .… … … … … … … .14 1.7.М од ели потоков … … … … … … … … … … … … … … … … … … … … … … … 15 2. При меры программи ров ани я… … … … … … … … … … … … … … … … … … … .15 2.1.Соз д ани есервера и контроллера ав томати з аци и … … … … … … … … … ..15 2.2.В нутренни й сервер.… … … … … … … … … … … … … … … … … … … … … ..24 2.3.К омпоненты ActiveX .… … … … … ..… … … … … … … … … … … … … … … .28 2.4.Соз д ани еи нтерфей са собы ти й .… … … … ...… … … … … … … … … … … ....33 3. Зад ачи и упраж нени я.… … … … … … … … … … … … … … … … … … … … … … 37 4. Глоссари й … … … … … … … … … … … … … … … … … … … … … … … … … … … 38 Л и тература … … … … … … … … … … .… … … … … … … … … … … … … … … … … … 38
1. О снов ны е поня т и я 1.1. П робле м ы и т е рм и ны COM COM (Component Object Model), и ли мод ель объектны х компонентов 1 –од на и з основ ны х технологи й , на которы х баз и руется Windows. О громное чи сло элементов сред ы Windows (нав и гаторInternet Explorer, мод ули сж ати я ауд и о- и в и д еои нформаци и , элементы оболочки Shell, технологи и д оступа кбаз ам д анны х и т.д . и т.п.) реали з ую т св ои API в в и д е COM-и нтерфей сов . Под д ерж ка COM в строена в больш и нств о коммерчески х при клад ны х программны х пакетов (раз д ел си стемного реестра HKEY_CLASSES_ROOT, в котором з ареги стри ров ана и нформаци я, св яз анная с COM, какправ и ло, яв ляется самы м объемны м по срав нени ю с д руги ми раз д елами ). Знани е основ COM станов и тся насущ но необход и мы м нетолько д ляпрограмми ров ани яв операци онной си стеме Windows, но и д ля грамотного ее и спольз ов ани я. В опреки прогноз ам, COM не 1
У стояв ш егосяперев од а терми на COM несущ еств ует
4
сход и т со сцены , уступая место технологи и Microsoft .NET, а и спольз уется с ней параллельно. При чи на столь ш и рокого распространени я состои т, преж д е в сего, в том, что COM реш ает несколько в аж ны х проблем, стоящ и х перед раз работчи ками слож ны х программны х комплексов . В о-первы х –это проблема соз д ани я ед и ного, уни фи ци ров анного и нез ав и си мого от яз ы ка программи ров ани я и архи тектуры в ы чи сли тельной сред ы (локальной и ли сетев ой ) механи з ма обмена и нформаци ей меж д у при лож ени ями и ли частями од ного при лож ени я. В о-в торы х, это проблема экспорта метод ов объектов меж д у при лож ени ями . Т рад и ци онны е DLL экспорти рую т (д елаю т д оступны ми и з в не) процед уры и функци и , а не объекты . М етод ы ж е объектов по св оей сути не могут в ы полняться в неконтекста объекта, которому они при над леж ат(при нци п и нкапсуляци и ). Д оступ кобъектам, наход ящ и мсяв отд ельны х процессах, в ы полняю щ и хся в и з оли ров анны х ад ресны х пространств ах, трад и ци онны ми способами нев оз мож ен в при нци пе. В -третьи х, при менени е польз ов ателем компонентов сторонни х раз работчи ков (напри мер, Delphi-компонентов ) в собств енной программе мож ет бы ть з атруд нено конфли ктами в ерси й компонентов и ли несов мести мостью яз ы ков ой сред ы . Э тотперечень проблем мож етбы ть прод олж ен. Под д ерж ка COM в строена в больш и нств о сов ременны х яз ы ков программи ров ани я. Д алее, без ограни чени я общ ности , мы буд ем рассматри в ать основ ны е при нци пы COM на при мересред ы программи ров ани яDelphi 6. COM баз и руется на объектно-ори енти ров анном программи ров ани и . Э кземпляр COM-объекта обы чно наз ы в ается просто объектом, а ти п, которы й и д енти фи ци руетэтотобъект, –компонентны м классом (component class и ли coclass). COM-сервер– программа, соз д аю щ ая COM-объект. Э то в сегд а и сполняемы й фай л и ли д и нами чески компонуемая би бли отека (DLL). COM-кли ент – программа, обращ аю щ аясякэкспорти руемы м метод ам сервера. М ож но в ы д ели ть три в и д а серв еров . 1. В нутренни й (In-Process) сервер. Пред став ляетсобой д и нами чески компонуемую би бли отеку (DLL), которая мож ет соз д ав ать COM-объекты д ля и спольз ов ани яв в ы з ы в аю щ ем (кли ентском) при лож ени и (DLL-сервер). О тноси тсяк тому ж е процессу, что и кли ентское при лож ени е, и спольз ует его ад ресное пространств о. Раз нов и д ностью в нутренни х серверов яв ляю тся компоненты ActiveX, постав ляемы ев в и д ефай лов *.dll, *.ocx и при год ны ед ляред акти ров ани я в раз ли чны х в и з уальны х сред ах программи ров ани я (Visual C++, Delphi и д р.). 2. Л окальны й и ли в неш ни й сервер(Out-Of-Process Server). Соз д ается отд ельны м процессом на том ж екомпью тере, что и кли ентскоепри лож ени е, но работает, раз умеется, в отд ельном ад ресном пространств е. Х рани тся в в и д е EXE-фай лов (EXE-сервер). При мерами локальны х серверов яв ляю тся при лож ени яMS Word, Excel и д р. и з пакета MS Office.
5
3. У д аленны й сервер(Remote Server). Работаетна д ругом компью тересети . К акв и д и м, основ ной з ад ачей COM яв ляется соз д ани е многократно и спольз уемого код а, д оступного в сетев ой сред е и з программ, напи санны х на раз ли чны х яз ы ках программи ров ани я. При этом очень в аж но обеспечи ть уни кальность в и менов ани и компонентны х классов , и нтерфей сов и д руги х объектов COM. Д ля этой цели они снабж аю тся 128-раз ряд ны м глобальны м уни кальны м и д енти фи катором (GUID), алгори тм форми ров ани я которого гаранти руеткрай нени з кую в ероятность пов торени я з начени й . GUID мож но получи ть спомощ ью функци и API CoCreateGuid() и ли в сред е Delphi, наж ав комби наци ю клав и ш Ctrl+Shift+G. И д енти фи каторGUID д ляклассов наз ы в аетсяCLSID, д ляи нтерфей сов - IID. 1.2. И нт е рф е йсы В основ е COM леж и т поняти е и нтерфей са. И нтерфей с - это сов окупность метод ов класса, з ад аю щ ая соглаш ени е меж д у раз работчи ком и польз ов ателем класса о формальны х прав и лах и х и спольз ов ани я. Св ой ств а и нтерфей са: 1. В и нтерфей с в ход ят только объяв лени я метод ов и и х параметров . Поля в и нтерфей сенеопи сы в аю тся, такж екаки реали з аци яметод ов . 2. Поряд окметод ов в и нтерфей сесущ еств енен, а и х наз в ани я–нет. 3. И нтерфей с ни когд а не меняется раз работчи ком. При необход и мости мод и фи каци и соз д аетсянов ы й и нтерфей с. 4. У каж д ого объекта COM мож етбы ть множ еств о и нтерфей сов . 5. И нтерфей сы снабж аю тся уни кальны м и д енти фи катором IID, аналоги чны м GUID. 6. И нтерфей сы могутнаслед ов атьсяи образ ов ы в ать и ерархи ю . 7. В сеи нтерфей сы и мею тобщ его пред ка –и нтерфей сIUnknown. О пи сани е его, при в ед енноев мод улеsystem.pas, и меетв и д type IUnknown = interface ['{00000000-0000-0000-C000-000000000046}'] function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall; function _AddRef: Integer; stdcall; function _Release: Integer; stdcall; end; Зд есь в кв ад ратны х скобках з апи сы в ается строков ое пред став лени е и д енти фи катора IID. В целом опи сани еи нтерфей са аналоги чно опи сани ю класса, только и спольз уется д ругое служ ебное слов о – interface. Е сли и нтерфей снаслед ует метод ы пред ка, то и мя и нтерфей са-пред ка указ ы в ается в круглы х скобках послеслов а interface. Рассмотри м наз начени е метод ов IUnknown. Послед ни е д в а метод а пред наз начены д ляреали з аци и механи з ма ав томати ческого под счета ссы лок.
6
function _AddRef: Integer; stdcall; Э та функци я д олж на ув ели чи ть счетчи кссы локна и нтерфей с на 1 и в ернуть нов оез начени есчетчи ка. function _Release: Integer; stdcall; уменьш ает счетчи к ссы лок на и нтерфей с на 1 и в оз в ращ ает нов ое з начени е счетчи ка. При д ости ж ени и счетчи ком з начени я 0 она д олж на осв обод и ть память, з анятую объектом. Первы й метод поз в оляетполучи ть ссы лку на реали з уемы й классом и нтерфей с. Ф ункци я function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall; получает в качеств е в ход ного параметра и д енти фи катори нтерфей са IID. Е сли объектреали з уетз апрош енны й и нтерфей с, то функци я • в оз в ращ аетссы лку на него в параметреObj • в ы з ы в аетметод _AddRef полученного и нтерфей са • в оз в ращ ает0 (константу S_OK). В проти в ном случае функци я в оз в ращ ает код ош и бки E_NOINTERFACE. В мод улеSystem.pas объяв лен классTInterfacedObject, реали з ую щ и й IUnknown и его метод ы . Рекоменд уетсяи спольз ов ать этотклассд ля соз д ани яреали з аци й св ои х и нтерфей сов . Т аки м образ ом, IUnknown помогает реш ать з ад ачи пои ска нуж ного и нтерфей са, з агруз ки объекта с най д енны м и нтерфей сом в память и осв обож д ени я памяти . О бъект соз д ается в памяти при первом обращ ени и клю бому и нтерфей су, при этом на ед и ни цу ув ели чи в ается з начени е счетчи ка ссы лок. При рав енств есчетчи ка нулю объектуд аляетсяи з памяти . Т аккакв сеи нтерфей сы наслед ую тIUnknown, то спомощ ью лю бого од ного и нтерфей са мож но получи ть ссы лку на в сеостальны еи нтерфей сы . Поясни м теперь механи з м в ы з ов а метод ов спомощ ью и нтерфей сов . А д реса метод ов хранятсяв такназ ы в аемой в и ртуальной табли цеVTable, соз д ав аемой в ад ресном пространств е COM-сервера д ля каж д ого и нтерфей са. Т ак какпоряд окметод ов сущ еств енен (см. в торое св ой ств о и нтерфей сов ), первы е три строки каж д ой табли цы сод ерж и т ссы лку на метод ы QueryInterface, AddRef, Release, соотв етств енно, послед ую щ и е строки – на собств енны е метод ы и нтерфей са. При компи ляци и в место и мени метод а в код кли ента под став ляется не ад рес, а поряд ков ы й номерметод а в VTable. Получени е ссы лки на и нтерфей с оз начает получени е соотв етств ую щ его ад реса в и ртуальной табли цы . Проблема д оступа ки нтерфей сам (в и ртуальны м табли цам) объекта, наход ящ и мсяв чуж ом ад ресном пространств е, реш аетсяспомощ ью марш алли нга (см. п. 2.6). Замети м, что в нутренняя реали з аци ямехани з ма COM в раз ли чны х си стемах программи ров ани ямож етнесколько отли чаться. Е сли и нтерфей с сод ерж и т опи сани е св ой ств а, то в в и ртуальной табли це хранятсяад реса метод ов чтени яи з апи си св ой ств а (см. при меры и з раз д ела 2).
7
При д оступеспомощ ью VTable кли ентской программенеобход и ма б и б ли оте ка ти п ов (БТ). Э то мод уль, сод ерж ащ и й опи сани я в сех и нтерфей сов , объяв лени я констант, обоз начаю щ и х GUID и нтерфей сов и классов и д р. БТ пи ш ется ли бо на специ альном яз ы кеопи сани яи нтерфей сов IDL, ли бо на и спольз уемом яз ы ке программи ров ани я. В случае и спольз ов ани я Delphi БТ храни тся в фай ле с расш и рени ем *.pas и д олж на бы ть под клю чена д и ректи в ой Uses. О д нако первоочеред ной з ад ачей яв ляется пои сксерверов по з апросу кли ента. Пои скосущ еств ляетсяпо баз ед анны х, з апи санной в реестреWindows в раз д еле HKEY_CLASSES_ROOT\CLSID. Д ля каж д ого сервера пропи сы в ается его местонахож д ени е - локальны й и ли сетев ой путь. Т аки м образ ом, кли ентское при лож ени е не д олж но беспокои ться о пои ске сервера, д остаточно з ареги стри ров ать его на компью тере и COM ав томати чески най д ет и з агруз и т нуж ны й мод уль. К роме этого, объект мож ет з ареги стри ров ать св ое «д руж еств енное» и мя PROGID. О бы чно оно форми руется как комби наци я и мени сервера и и мени объекта, напри мер«Excel.Application» . В етка реестра с эти м и менем сод ерж и т ссы лку на CLSID объекта, откуд а COM получает необход и мую и нформаци ю . В неш ни е и уд аленны е серверы ав томати чески реги стри рую тся при первом з апуске программы на компью тере. Д ля реги страци и в нутренни х серверов служ и тути ли та Regsvr32.exe, постав ляемаяв состав еWindows. Д ля в ы з ов а акти в аци и COM-сервера кли ент мож ет и спольз ов ать функци ю CreateComObject, опи санную в мод улеComObj.pas: function CreateComObject(const ClassID: TGUID): IUnknown; Параметром з д есь яв ляетсяCLSID требуемого объекта, рез ультатом - ссы лка на его и нтерфей с IUnknown. Д алее кли ент мож ет з апроси ть требуемы й и нтерфей с и работать с ни м. CreateComObject – функци я Delphi, в нутри которой прои сход и тв ы з ов функци и COM API CoCreateInstance. Ф ункци я CreateComObject обращ ается кси стемному реестру, по и д енти фи катору класса наход и ти нформаци ю о местонахож д ени и сервера и з апускает его. Серверспомощ ью ф аб ри ки классов (Class Factory) соз д аетэкземпляркласса – объект и в оз в ращ ает указ атель на з апрош енны й и нтерфей с (т.е. указ атель на VTable), ув ели чи в ая на ед и ни цу счетчи кссы лок. Э тот указ атель перед ается кли енту, которы й по смещ ени ю в VTable наход и тнуж ны й метод . В се COM-объекты соз д аю тся фабри ками классов . К аж д ы й COM-класс и меет соотв етств ую щ ую фабри ку, отв ечаю щ ую з а соз д ани е объектов этого класса. Ф абри ка классов – это COM-объект, реали з ую щ и й и нтерфей с IClassFactory. К лю чев ы м метод ом этого и нтерфей са яв ляется метод CreateInstance, которы й и соз д ает экземпляр требуемого объекта. COM в ы з ы в ает метод CreateInstance и перед ает полученны й и нтерфей с кли енту. И нтерфей с фабри ки классов соз д ается ав томати чески д ля в сех COMсерв еров и при и х старте реги стри руется в си стеме. После з апуска и реги страци и COM сраз у получаетссы лку на фабри ку классов . 1.3. О бращ е ни е к и нт е рф е йсам
8
Рассмотри м несколько при меров обращ ени яки нтерфей сам. Пред полож и м, что у соз д анного нами COM-объекта есть и нтерфей сICalcSrv, сод ерж ащ и й метод Calculate. При мер1. И спольз ов ани еоператора as. var Srv: ICalcSrv; begin … // Создаем COM объект и запрашиваем у него интерфейс. // Константа Class_Calcsrv обозначает CLSID // COM-объекта и описывается в библиотеке типов Srv := CreateComObject (Сlass_Сalcsrv) as ICalcSrv; // Вызываем метод Calculate интерфейса ICalcSrv Srv.Calculate; // Освобождаем интерфейс Srv := Nil; end; О ператорas д ей ств уетв д анном фрагментекод а по такому ж епри нци пу, что и при при в ед ени и ти пов объектов , но поз в оляетперей ти клю бому и нтерфей су, а нетолько кд очернему. Ф акти чески компи ляторв страи в аетз д есь в ы з ов метод а QueryInterface. При мер2. Я в ноеи спольз ов ани еметод а QueryInterface. var Srv: ICalcSrv; IU: IUnknown; … IU := CreateComObject (Class_Calcsrv); // Константа IID_ICalcsrv обозначает IID интерфейса if IU.QueryInterface(IID_ICalcsrv, Srv) S_OK then ShowMessage('Интерфейс не найден') else Srv.Calculate; Э тот способ пред почти телен, когд а точно не и з в естно, и меется ли у объекта требуемы й и нтерфей с. О стальны е способы при отсутств и и и нтерфей са в ы з ы в аю ти склю чи тельную си туаци ю . При мер3. И спольз ов ани екомпонентного класса. var Srv: ICalcSrv; … Srv := CoEditSrv.Create; Srv.Calculate; …
9
О чень похож е на работу с обы чны ми объектами . К омпонентны й класс («сокласс» ) CoEditSrv объяв лен в би бли отеке ти пов . Е го конструкторCreate в оз в ращ аетссы лку на и нтерфей сICalcSrv и сод ерж и тв себестроку Result := CreateComObject (CLASS_CalcSrv) as ICalcSrv; Поэтому д анны й способ полностью экв и в алентен способу, рассмотренному в при мере1. По з ав ерш ени и работы с COM-объектом кли ент осв обож д ает ссы лку на него, что при в од и т кв ы з ов у метод а Release. В этот момент COM-серверпров еряет, есть ли ещ е ссы лки на соз д анны е и м объекты . Е сли в се объекты и з в неш него серв ера осв обож д ены , то COM-серверз ав ерш ает св ою работу. Е сли в се объекты и з DLL осв обож д ены , то она в ы груж аетсяи з памяти . К омпи ляторDelphi ав томати чески в став ляетв ы з ов ы метод ов под счета ссы лок _AddRef при обращ ени и ки нтерфей су и _Release при з ав ерш ени и мод уля, гд е объяв лена переменная и нтерфей сного ти па. Поэтому яв ное обращ ени е к ни м наруш и тпод счетссы локи в ы з ов ети склю чи тельную си туаци ю . 1.4. IDispatch и А в т о м ат и заци я Рассмотренны е нами и нтерфей сы , основ анны е на в и ртуальны х табли цах, реали з ую т т.н. ранне е св язы в ани е и мен метод ов с и х программной реали з аци ей . Т ерми н «раннее св яз ы в ани е» з д есь несколько отли чается от з накомого В ам на первы х курсах, буд учи относи тельны м. О но оз начает з амену компонов щ и ком программы (и ли компи лятором, если операци и компи ляци и и компонов ки сов мещ ены ) и мен метод ов не на и х ад реса в программе, а на сме ще ни я в нутри в и ртуальной таб ли цы . О д нако в стречаю тсяси туаци и , когд а и такоесв яз ы в ани е з атруд ни тельно и ли не пред став ляется в оз мож ны м. Н апри мер, у польз ов ателя компонента мож ет отсутств ов ать би бли отека ти пов с опи сани ем и нтерфей сов , необход и мы х компи лятору д ля получени я в ы ш еупомянуты х смещ ени й . В ы з ов COM-объектов часто осущ еств ляется и з программ, напи санны х на яз ы ках и нтерпрети руемого ти па и ли на скри птов ы х яз ы ках (напри мер, VBasic и ли JScript). В эти х случаях раз реш ени е и мен д олж но в ы полняться без участи я компи лятора в о в ремяв ы полнени япрограммы (п оздне е св язы в ани е ). Д ля реш ени я этой проблемы Microsoft бы л раз работан специ альны й и нтерфей с IDispatch, яв ляю щ и й ся основ ой технологи и OLE Automation (А в томати з аци я). О бъяв лени еи нтерфей са IDispatch и меетв и д
type IDispatch = interface (IUnknown) ['{00020400-0000-0000-C000-000000000046}'] function GetTypeInfoCount(out Count: Integer): HResult; stdcall; function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; stdcall;
10
function GetIDsOfNames(const IID: TGUID; Names: Pointer; NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall; function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer; Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall; end; Зад ача и нтерфей са –пои ск метод а по его текстов ому и мени в о в ремяв ы полнени я программы . К лю чев ы ми метод ами и нтерфей са яв ляю тся метод ы GetIdsOfNames и Invoke. Сначала в ы з ы в ается метод GetIdsOfNames, которому перед ается и мя з апрош енного метод а. Е сли серверпод д ерж и в аеттакой метод , он в оз в ращ ает его и д енти фи каторDispID – целое чи сло, уни кальное д ля каж д ого метод а. После этого кли ент упаков ы в ает параметры метод а в масси в переменны х ти па OleVariant и в ы з ы в ает Invoke, перед ав ая ему масси в параметров и и д енти фи каторDispID метод а. М етод ы GetTypeInfo и GetTypeInfoCount яв ляю тсяв спомогательны ми и обеспечи в аю тпод д ерж ку би бли отеки ти пов объекта. Т аки м образ ом, в се, что д олж ен з нать кли ент, – это строков оеи мяметод а. След ует отмети ть, что в реальности метод а с указ анны м и менем, напри мер method1, мож ет и не сущ еств ов ать. В се д ей ств и я, в ы полняемы е метод ами , в ы полняю тся п о номе ру DispID в нутри Invoke, ти пи чная реали з аци я которого сод ерж и топератор case DispID of 1: действие1;//Блок «действие1» выполняет роль метода 1 2: method2; ... end; Соотв етств и е меж д у и д енти фи каторами DispID и и менами метод ов устанав ли в ается в нутри специ альной структуры , наз ы в аемой ди сп и нте рф е йсом. Д и спи нтерфей сопи сы в аетсяслед ую щ и м образ ом: type IMyDisp = dispinterface ['{EE05DFE2-5549-11D0-9EA9-0020AF3D82DA}'] procedure Method1; dispid 1; procedure Method2; dispid 2; ... end; Delphi и меет в строенную под д ерж ку работы в качеств е кли ента Automation. Т и п д анны х Variant мож ет сод ерж ать ссы лку на и нтерфей с IDispatch и и спольз ов атьсяд ляв ы з ов а его метод ов . При мер: uses ComObj; ... var
11
V: Variant; ... V := CreateOleObject('MyServer.CalcSrv'); if VarType (V) = VarDispatch then V.Calculate else ShowMessage ('Объект не найден!'); ... // Освобождаем интерфейс V:=UnAssigned; О бъектсоз д аетсяфункци ей function CreateOleObject(const ClassName: string): IDispatch; Е е параметром ClassName яв ляется не и д енти фи катор, а строков ое и мя PROGID класса, з ареги стри ров анное в си стемном реестре (оно соотв етств ует CLSID). PROGID состав ляется по прав и лу: Имя_сервера.Имя_сокласса. Рез ультатом функци и яв ляетсяссы лка на и нтерфей с. Замети м, что би бли отека ти пов з д есь не требуется. Переменная V не яв ляется классом и , очев и д но, не и меет ни од ного и з и спольз уемы х св ой ств и метод ов , что, од нако, нев ы з ы в аетош и бки компи ляци и . К омпи ляторDelphi з апоми наетв код епрограммы строков ы еопи сани я обращ ени й ксерверу ав томати з аци и , а на этапев ы полнени яперед аети х его метод ам и нтерфей са IDispatch, которы еи прои з в од ятси нтакси чески й раз бори в ы полнени е. Д ля и спольз ов ани я IDispatch требуется соз д ать д и спи нтерфей с и з апрограмми ров ать метод Invoke. Н о гораз д о уд обнее в место и нтерфей са IDispatch и спольз ов ать его наслед ни ка, напри мер, ICalcSrv = interface(IDispatch) ['{EC007291-3A73-11D5-BCC6-444553540000}'] // Далее перечисляются методы диспинтерфейса procedure Calculate; safecall; ... end; Программи ров ани е з д есь требуется только д ля в нов ь объяв ленны х метод ов . И нтерфей с, яв ляю щ и й ся потомком IDispatch, наз ы в ается дуальны м. Д уальны й и нтерфей св клю чаеттри метод а IUnknown, четы реметод а IDispatch и в семетод ы д и спи нтерфей са, след ов ательно, его в и ртуальная табли ца сод ерж и т семь и болеестрок. К д уальному и нтерфей су мож но обрати ться в семи упомянуты ми в ы ш е способами , а такж е- получени ем ссы лки на д и спи нтерфей с: var D: IMyDisp; …
12
D := CreateComObject(Class_CalcSrv) as IMyDisp; D.Calculate; … В д анном случаеси нтакси чески й контроль прои сход и тна этапе компи ляци и , и при этом необход и ма би бли отека ти пов : на стад и и компи ляци и по д и спи нтерфей су оты ски в аетсяDISPID, которы й з атем при в ы полнени и программы перед ается метод у Invoke. Э та послед ов ательность д ей ств и й в страи в ается в код программы компи лятором. М етод GetIDsOfNames з д есь не и спольз уется. По скорости в ы полнени я д анны й способ, наз ы в аемы й ID-св язы в ани е м, уступает раннему св яз ы в ани ю , но прев осход и тпоз д неесв яз ы в ани е. Т ехнологи я д оступа с помощ ью д уальны х и нтерфей сов наз ы в ается OLE Automation (такж е - Automation, ав томати з аци я). Automation наклад ы в ает на COMсерв еры ряд д ополни тельны х требов ани й [2]: 1. И нтерфей с, реали з уемы й IDispatch
COM-сервером, д олж ен наслед ов аться от
2. Д олж ны и спольз ов атьсяти пы д анны х, сов мести мы есOLE Automation Т и п д анны х Т и п д анны х При мечани е OLE Automa- Delphi tion Boolean
WordBool
Unsigned Char
Byte
Double
Double
Float
Single
Int
SysInt
Long
Integer
Short
SmallInt
BSTR
WideString
Currency
Currency
Date
TDateTime
SafeArray
PSafeArray
М асси в и з элементов лю бого под д ерж и в аемого ти па
Decimal
TDecimal
96 би тноед есяти чноечи сло
М аш и нно-з ав и си мы й целы й ти п д анны х. В настоящ ее в ремя объяв лен как integer, од нако в буд ущ ем мож ет и меть д ругую раз ряд ность
Т и п WideString требует д ля каж д ого си мв ола д в а бай та. О бы чны е строки Delphi в Automation и спольз ов ать нельз я
13
Interface IDispatch IDispatch*
Ссы лка на IDispatch и ли лю бой унаслед ов анны й отнего и нтерфей с
Interface Iunknown*
IUnknown
Ссы лка на прои з в ольны й и нтерфей с
VARIANT
OleVariant
В ари антны й ти п, сов мести мы й сOLE
В оз мож на под д ерж ка польз ов ательски х ти пов д анны х, д ля чего необход и мо реали з ов ать и нтерфей сIRecordInfo [2]. 3. В семетод ы д олж ны бы ть процед урами и ли функци ями , в оз в ращ аю щ и ми з начени ети па HRESULT и и меть соглаш ени ео в ы з ов ах safecall. 4. Д ля перед ачи серв еру масси в ов д анны х след ует и спольз ов ать ти п SafeArray (без опасны й масси в ), реали з ов анны й в Delphi с помощ ью масси в ов в ари антного ти па. К роме этого, Automation-серв еры могут под д ерж и в ать ещ е ряд и нтерфей сов , поз в оляю щ и х получать и нформаци ю о метод ах, обрабаты в ать ош и бки и т.п. В сенеобход и мы еи нтерфей сы реали з ую тсяVCL Delphi ав томати чески . 1.5.
Ре али заци я и нт е рф е йсов
Реали з аци я (программны й код ) метод ов и нтерфей са при в од и тся, какобы чно, при объяв лени и класса. О д и н класс мож ет под д ерж и в ать несколько и нтерфей сов . И мена и нтерфей сов , реали з ов анны х в д анном классе, указ ы в аю тся в скобках через з апятую послеи мени класса и и мени класса пред ка, напри мер, type TMyClass = class (TObject, MyInt1, MyInt2[,…]) … end; К аж д ы й метод , в ход ящ и й в и нтерфей с, д олж ен бы ть од и наков о объяв лен д в а раз а: в опи сани и и нтерфей са и в объяв лени и класса. Ч тобы и з бав и ть программи ста отрути нной работы , раз работчи ки Delphi пред усмотрели несколько специ альны х классов , в которы х уж е реали з ов аны рассмотренны е нами станд артны е метод ы и нтерфей сов . Программи сту остается д опи сать ли ш ь теметод ы , которы еи м сами м раз работаны . К лассTComObject сод ерж и треали з аци ю (т.е. код ) метод ов и нтерфей са IUnknown, храни т GUID и сод ерж и т и нфраструктуру д ля соз д ани я экземпляра объекта спомощ ью фабри ки классов . Е го непосред ств енны м потомком яв ляется класс TTypedComObject, и спольз уемы й д ля соз д ани я COM-объектов , под д ерж и в аю щ и х би бли отеку ти пов . Н и ж е в и ерархи и наход и тся класс TAutoObject, сод ерж ащ и й реали з аци ю метод ов и нтерфей са IDispatch и и спольз уемы й при соз д ани и серверов ав томати з аци и . COM-серверы в Delphi уд обно соз д ав ать мастерами , которы е ав томати чески генери рую т необход и мы й код , сод ерж ащ и й объяв лени е потомков указ анны х классов (см. часть 2).
14
Е сли требуется соз д ав ать не COM, а обы чны е объекты с и нтерфей сами , то рекоменд уется и х наслед ов ать от класса TInterfacedObject, в котором реали з ов аны метод ы IUnknown, но нет под д ерж ки специ фи чны х д ля COM элементов - фабри кклассов , GUID и д р. Потомки TInterfacedObject соз д аю тсяобы чны ми конструкторами . Д етальноеи з лож ени епрограмми ров ани яси спольз ов ани ем и нтерфей сом в ы ход и тз а рамки д анного пособи я, ему посв ящ ена кни га [4], сод ерж ащ ая множ еств о и нтересны х при меров . 1.6.
М арш алли нг
В общ ем случае кли ент и серверз ани маю т раз ли чное ад ресное пространств о. М арш алли нг(marshalling, транспорти ров ка) – это механи з м перед ачи аргументов функци й и в оз в ращ аемы х з начени й через «грани цу» ад ресны х пространств процессов и ли по сети . М арш алли нг нетребуетсяпри работесDLL-серверами , что упрощ аети х программи ров ани е. М арш алли нг в ы полняется след ую щ и м образ ом. Получаемы й кли ентом указ атель и нтерфей са ссы лается на специ альны й proxy-объект (объект-з амести тель), которы й работает в нутри кли ентского процесса. Замести тель пред остав ляет кли енту те ж е и нтерфей сы , что и в ы з ы в аемы й объект COM на локальном и ли уд аленном серв ере. Получи в в ы з ов от кли ента, з амести тель упаков ы в ает его параметры в отд ельную структуру и спомощ ью сред ств операци онной си стемы перед ает в ы з ов в процесс сервера. При этом и спольз ую тся общ и е области памяти и механи з м уд аленного в ы з ов а процед ур(Remote Procedure Call, RPC), ш и роко при меняемы й в операци онны х си стемах фи рмы Microsoft. Н а сервере в ы з ов перед ается stub-объекту (з аглуш ке), которы й распаков ы в ает в ы з ов (д емарш алли нг) и перед аетего требуемому объекту COM. След уетпомни ть: • д ляв нутренни х серверов марш алли нг нетребуется • серв еры ав томати з аци и (т.е. серверы , и спольз ую щ и ед уальны еи нтерфей сы ) и мею тв строенную реали з аци ю марш алли нга д ля OLE-сов мести мы х ти пов (см. табли цу 1). Поэтому ав томати з аци я–рекоменд уемы й под ход . • ручное программи ров ани е марш алли нга необход и мо ли ш ь в случае и спольз ов ани я в неш ни х серверов , основ анны х на потомках IUnknown и д лянекоторы х несов мести мы х сав томати з аци ей ти пов д анны х 1.7. М оде ли поток ов Windows – многоз ад ачная и многопоточная сред а с в ы тесняю щ ей многоз ад ачностью . М од ель потоков опред еляет, каки м образ ом буд ет функци они ров ать объект в многопоточной сред е. Проблема состои т в том, что сервери кли ент могутоказ аться в раз ны х потоках од ного процесса и ли в раз ны х процессах, а к од ному серверу могут обращ аться множ еств о кли ентов . Д ля COM-объектов , соз д ав аемы х при помощ и Delphi, мод ель потоков в ы би рается в д и алогов ом окнепри з апускемастера (см. раз д ел 2) и в д альней ш ем реги стри руетсяв си стемном реестрев местесд ругой и нформаци ей об объекте.
15
И мею тсяслед ую щ и епотоков ы емод ели : • О д нопоточная (Single). В есь COM-сервер(т.е. в сесоз д ав аемы еи м экземпляры объектов ) в ы полняетсяв од ном потоке. • Раз д ельная (apartment). Э ту мод ель такж е наз ы в аю т од нопоточнораз д ельной (singlethreaded apartment, STA). К аж д ы й экземпляр объекта в ы полняется в св оем собств енном потоке. Л окальны е д анны е потоков при этом з ащ и щ ены ав томати чески . Л ю бы е глобальны е переменны е, сов местно и спольз уемы е нескольки ми экземплярами объекта, д олж ны з ащ и щ аться самостоятельно с помощ ью метод ов си нхрони з аци и (семафоров , кри ти чески х секци й и д р.) • Св обод ная (Free). И наче наз ы в ается многопоточно-раз д ельной (multithreaded apartment, MTA). К ли ент мож ет в ы з в ать метод объекта в лю бом потокев лю боев ремя. О бъекты д олж ны самостоятельно з ащ и щ ать такж е и св ои локальны е д анны е от од нов ременного д оступа и з нескольки х потоков . • О бемод ели (Both). Под д ерж и в аю тсяобепред ы д ущ и емод ели . И спольз ов ать д в епослед ни х мод ели без особой необход и мости нерекоменд уется, такэто чрев ато в оз ни кнов ени ем ош и бок. Болеепод робно с в опросами многопоточности в COM мож но оз накоми тьсяпо кни ге[2].
2. П ри м е ры програм м и ров ани я 2.1. Создани е в не ш не госе рв е ра и к онт ро лле ра ав т о м ат и заци и 2.1.1. Соз д ани есервера О ткрой тенов ы й проект. И з мени тез аголов оки и мя формы –Серверз апущ ен, MainForm.
Сохрани тепроект(и мяSa.dpr) и мод уль (и мяSrvMain). Н аз начени е этого проекта – з апусксервера и отображ ени е полученны х и м от кли ента д анны х. В ад ресном пространств е сервера (sa.exe) по з апросу кли ента буд ет соз д ав атьсяCOM-объект. В общ ем случае и сход ны й проект мож ет сод ерж ать процед уры и метод ы , которы ена след ую щ ем ш агемож но в клю чи ть в состав и нтерфей сов , т.е. преобраз ов ать и сход ную программу в COM-сервер.
16
След ую щ и й этап –преобраз ов ани епроекта в серверав томати з аци и спомощ ью масте ра. М астерпомож етсформи ров ать необход и мы еи нтерфей сы и объекты , эти и нтерфей сы реали з ую щ и е. Запусти те (не з акры в ая и сход ны й проект sa.dpr) мастер New – ActiveX – Automation Object. Заполни тепояв и в ш ую сяформу.
Зд есь CoClass Name - и мя компонентного класса, реали з ую щ его COM-сервер. Под эти м и менем COM-сервербуд етз ареги стри ров ан в реестре. Instansing опред еляет реж и м соз д ани я COM-объектов . Параметрмож ет при ни мать след ую щ и ез начени я: • Internal. О бъектмож ети спольз ов атьсятолько в нутри этого при лож ени я. • Single Instance. Соз д ани екаж д ого экземпляра объекта при в од и ткз апуску нов ого экземпляра при лож ени я-серв ера. Послесоз д ани яобъекта фабри ка классов уд аляети нформаци ю о себеи з си стемного спи ска з ареги стри ров анны х фабри к, что з астав ляетCOM при соз д ани и нов ого объекта з апускать серверкакнов ы й процесс. • Multiple Instance. Послесоз д ани я экземпляра объекта фабри ка не уд аляет себяи з спи ска з ареги стри ров анны х. При з апросена соз д ани енов ого объекта COM обнаруж и теё в этом спи скеи з апроси тсоз д ани еу той ж ефабри ки . Н ов ы й экземпляробъекта буд етсоз д ан в том ж епри лож ени и . Д ля соз д ани я в сех объектов д анного ти па з апускается только од и н экземпляр серв ера. Поле Threading Model з аполни те в соотв етств и и с рекоменд аци ями , и з лож енны ми в п. 1.7. Е сли з ад ать флаг Generate Event Support code, генери руется д ополни тельны й код , поз в оляю щ и й серверу реали з ов ать и нтерфей с собы ти й . Э тот и нтерфей с опи сы в аетсобы ти я, которы емож етгенери ров ать сервер. К ли ентмож етз ареги стри ров ать себяв качеств епод пи счи ка на эти собы ти яи получать ув ед омлени я о ни х (см. п. 2.4). Н аж ми теOk. Послеэтого мы окаж емсяв ред актореби бли отеки ти пов .
17
Со здани е и нт е рф е йсов Д ля простоты соз д ад и м од и н и нтерфей с IСalcSrv, в клю чаю щ и й св ой ств о Value: WideString и метод function GetSquare: WideString, в ы чи сляю щ и й кв ад ратчи сла, хранящ егосяв этом св ой ств е. Д ляэтого в контекстном меню д ля Project1 в ы бери те New – Interface и переи менуй те Interface1 в IСalcSrv. И з мени теи мясервера (полеName) в место Project1 – MyServer. Д обав и м в и нтерфей сеICalcSrv нов оесв ой ств о Value ти па WideString. Д ля этого в контекстном меню д ля и нтерфей са iCalcSrv в лев ой части окна в ы берем New – Property. Появ ятся д в е поз и ци и Property1 – од на д ля чтени я (обоз начена стрелкой в в ерх и в прав о), а д ругая - д ля з апи си св ой ств а (обоз начена стрелкой в ни з и в лев о). Замени м и мя св ой ств а Property1 на Value и и з мени м его ти п на BSTR –аналог ти па WideString.
18
Буд ьте в ни мательны . Св ой ств а опи саны на яз ы ке опи сани я и нтерфей сов IDL, отли чном от Delphi. В о-первы х, при сутств ую т д в а св ой ств а, а не од но. В ов торы х, ти п рез ультата – в сегд а HResult, а з начени я св ой ств а перед аю тся через параметры . У бед и тесь, что д ля параметров на з аклад кеParameters указ ано: Д ляз апи си : Value BSTR [in]. Д лячтени я: Value BSTR* [out, retval] .
19
Д обав и м в этотж еи нтерфей сметод -функци ю GetSquare.
Н а з аклад ке “Parameters” укаж ем и мя, ти п и мод и фи каторв оз в ращ аемого параметра – p1, BSTR *, [out, retval].
След уетпомни ть: • Д лясоз д ани яфункци и од и н и з параметров д олж ен бы ть объяв лен как ссы лка (си мв ол *, напри мер, BSTR*) смод и фи катором [out, retval]. Э то и буд етз начени ем, в оз в ращ аемы м функци ей . • Д лясоз д ани япараметра, перед аю щ егосяпо ад ресу, необход и мо указ ать * и мод и фи каторin . • По з начени ю параметрперед аетсясмод и фи катором in. Т екст сформи ров анной нами би бли отеки ти пов мож но посмотреть, наж ав клав и ш у F12. В д альней ш ем в ы з в ать окно би бли отеки ти пов мож но, в ы брав пункт меню View –Type Library. Е сли в се бы ло сд елано прав и льно, то в би бли отеке ти пов появ и тся опи сани е д уального и нтерфей са, характерного д лясерверов ав томати з аци и : type ICalcSrv = interface(IDispatch) ['{80807261-88A2-11D7-941A-D22E27DF7904}'] function Get_value: WideString; safecall; procedure Set_value(const value: WideString); safecall; function GetSquare: WideString; safecall;
20
property value: WideString read Get_value write Set_value; end; Ре али заци я и нт е рф е йса Н аж мем кнопку Refresh Implementation. Сформи руется (и ли обнов и тся) текст би бли отеки ти пов . Появ и тся нов ы й мод уль Unit1.pas. Сохрани те его как Srv_int. М од уль сод ерж и т: объяв лени екласса, сод ерж ащ его объяв ленны ев и нтерфей се метод ы , пусты ез аготов ки метод ов и нтерфей са. Д обав и м в ы деленны е с т ро к и (реали з аци ю метод ов и нтерфей са - чтени я и з апи си св ой ств а и метод а в ы чи слени якв ад рата). Е сли В ы хоти те перед ав ать з начени я форме серв ера MainForm, напри мер, д ля отображ ени я, нез абуд ьтед обав и ть uses SrvMain, гд еэта форма опи сана. unit srv_int; {$WARN SYMBOL_PLATFORM OFF} interface uses SrvMain, SysUtils, ComObj, ActiveX, MyServer_TLB, StdVcl; type { Этот класс должен содержать реализацию методов интерфейса. Дальнейшие обращения к интерфейсу будут означать обращения к экземпляру этого класса. } TCalcSrv = class(TAutoObject, ICalcSrv) private f: real; //Здесь хранятся значения свойства protected function Get_value: WideString; safecall; function GetSquare: WideString; safecall; procedure Set_value(const Value: WideString); safecall; end; implementation uses ComServ; function TCalcSrv.Get_value: WideString; begin Result:=FloatToStr(f); // Чтение числа end; function TCalcSrv.GetSquare: WideString;
21
begin Result:=FloatToStr(f*f); // Получение квадрата end; procedure TCalcSrv.Set_value(const Value: WideString); begin // Записываем значение F:=StrToFloat(value); // Отображаем на форме MainForm.Label2.Caption:=string(value); end; initialization TAutoObjectFactory.Create(ComServer, TCalcSrv, Class_CalcSrv, ciMultiInstance, tmApartment); end. О ткомпи ли руй те проект. При в ы полнени и серв ерав томати чески з ареги стри руется в реестре. Просмотри те з анесенную туд а и нформаци ю с помощ ью ред актора реестра regedit. Реги страци якласса:
22
Реги страци яи нтерфей са:
2.1.2. Соз д ани екли ента (контроллера ав томати з аци и ) О ткрой тенов ы й проект(client.dpr). Н а формесоз д ай тестроку ред акти ров ани я и пять кнопок
unit Client_main; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,MyServer_tlb {для доступа через Vtable}, comobj; type TFrmClient = class(TForm) Edit1: TEdit; btWrite: TButton; btRead: TButton; btDelete: TButton; btCalculate: TButton; btLoad: TButton;
23
procedure btDeleteClick(Sender: TObject); procedure btWriteClick(Sender: TObject); procedure btReadClick(Sender: TObject); procedure btCalculateClick(Sender: TObject); procedure btLoadClick(Sender: TObject); private { Private declarations } v: ICalcSrv; public { Public declarations } end; var frmClient: TFrmClient; implementation {$R *.DFM} procedure TFrmClient.btLoadClick(Sender: TObject); begin // доступ через таблицу виртуальных методов v:=CreateComObject(Class_CalcSrv) as ICalcSrv; end; procedure TFrmClient.btDeleteClick(Sender: TObject); begin v:=Nil; end; procedure TFrmClient.btWriteClick(Sender: TObject); begin v.value:=WideString(Edit1.text); end; procedure TFrmClient.btReadClick(Sender: TObject); begin Edit1.text:=String(v.value); end; procedure TFrmClient.btCalculateClick(Sender: TObject); begin Edit1.text:=string(v.GetSquare); end; end. У праж не ни я 1. Соз д ай те ещ е од и н и нтерфей с ITrig с метод ами , в ы чи сляю щ и ми три гонометри чески е функци и . А ргументы функци й перед ав ай те через параметры метод ов .
24
2. Д оработай те кли ентски й проект, пред усмотрев в оз мож ность обращ ени я к метод ам такж ечерез IDispatch и д и спи нтерфей с. 3. Перепи ш и те обработчи к btLoadClick, и спольз уя яв ны й в ы з ов QueryInterface. 2.2. Внут ре нни й се рв е р 2.2.1. Соз д ани есервера Сначала В ы д олж ны соз д ать би бли отеку, оформленную с учетом требов ани й COM. Э то д елаетсяпри помощ и мастера File - New –ActiveX - ActiveX Library. При его в ы боре буд етсоз д ан нов ы й проект, реали з ую щ и й DLL, и сгенери ров ан след ую щ и й код : Library Project1; uses ComServ; exports DllGetClassObject, DllCanUnloadNow, DllRegisterServer, DllUnregisterServer; {$R *.RES} begin end. Соз д анная DLL экспорти руетчеты рефункци и , необход и мы ед ля работы COM. Д алееэту би бли отеку необход и мо преобраз ов ать в COM-серв ер. Сохрани тееес и менем InProcServer и в ы з ов и темастер«COM-object» . В появ и в ш емсяд и алоге в поле Class Name (и мя компонентного класса) в в ед и те ChangeImage. Поля Instansing, Threading Model з аполни те в соотв етств и и с рекоменд аци ями п.2.1. Ф лаг Include Type Library при в од и т кв клю чени ю в серв ерби бли отеки ти пов . Ф лаг Mark interface OleAutomation д елает COM-серверсов мести мы м с OLE Automation, что в ы нуд и т В ас и спольз ов ать в метод ах и нтерфей са только сов мести мы есOLE Automation ти пы д анны х. ПолеImplemented interfaces показ ы в аети мяи нтерфей са COM-объекта по умолчани ю . Е го мож но з амени ть, в в ед я, напри мерISetImage. В ред акторе би бли отеке ти пов д ля и нтерфей са ISetImage соз д ай те метод Paint. Paint и меет д в а параметра. Ч ерез в ход ной параметр FileName строков ого ти па перед аетсяи мяграфи ческого фай ла. Т и п в ы ход ного параметра Destination, через которы й и з мененное и з ображ ени е буд ет перед ав аться кли енту, опред ели те как Picture**. Ред актор з амени т его ти пом IPictureDisp.
25
unit IntUnit; {$WARN SYMBOL_PLATFORM OFF} interface uses Windows, ActiveX, Classes, ComObj, InProcServer_TLB, StdVcl, graphics, AxCtrls; // выделены модули, которые нужно добавить вручную type TChangeImage = class(TTypedComObject, ISetImage) protected function Paint(const FileName: WideString; out Destination: IPictureDisp): HResult; stdcall; end; implementation uses ComServ; function TChangeImage.Paint(const FileName: WideString; out Destination: IPictureDisp): HResult; var Pic: TPicture; begin // Создаем изображение Pic:=TPicture.Create; try
26
// Загружаем файл - эмблему Delphi Pic.LoadFromFile(FileName); // Меняем изображение with Pic.Bitmap.Canvas do begin Font.name:='Times New Roman'; Font.Style:=[fsItalic,fsBold]; Font.Size:=20; Font.Color:=clRed; TextOut(40,110,'E'); TextOut(105,70,'D'); TextOut(98,1,'B'); end; // Преобразуем для отправки клиенту GetOlePicture(Pic, Destination); except MessageDlg ('Ошибка преобразования!', mtError,[mbOK], 0); end; // Освобождаем переменную Pic.Free; end; initialization TTypedComObjectFactory.Create(ComServer, Class_ChangeImage, ciMultiInstance, tmApartment); end.
TChangeImage,
Послекомпи ляци и проекта мы получи м фай л InProcServer.dll, сод ерж ащ и й код серв ера. Д алее необход и мо з ареги стри ров ать серверв реестре, и спольз уя процед уру RegSvr32 RegSvr32 InProcServer.dll, и ли наж ав кнопку Register Type Library в ред актореби бли отеки ти пов , и ли в ы брав пунктменю Run –Register ActiveX Server. Раз умеется, логи чнее перед ав ать серв еру не и мя фай ла, а само и з ображ ени е. Н о, к сож алени ю , у преобраз ов ани й , осущ еств ляемы х функци ями Delphi 6 GetOlePicture и SetOlePicture, и мею тся нед окументи ров анны е особенности , в рез ультате чего кпреобраз ов анному и ми TPicture нев оз мож но при мени ть метод ы класса TBitMap д ля ред акти ров ани я, и з менени я формата и сохранени яи з ображ ени я. О тмети м такж е труд ности перед ачи и з ображ ени й с и спольз ов ани ем в неш него серв ера, таккакд ля ти па д анны х IPictureDisp марш алли нг над о программи ров ать в ручную . Д ляв нутреннего сервера марш алли нг нетребуется.
27
2.2.2. О бращ ени ексерверу О ткрой те нов ы й проект и сохрани те его в папке, гд е наход и тся фай л InProcServer.dll . И спольз уй тед в а компонента TImage –д ляв ы в од а и сход ного и преобраз ов анного и з ображ ени й и компонентTOpenPictureDialog. unit TestUnit; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, ExtDlgs, ActiveX, ComObj, AxCtrls, InProcServer_Tlb; type TForm1 = class(TForm) btLoad: TButton; btChange: TButton; imSource: TImage; imResult: TImage; pdOpen: TOpenPictureDialog; procedure btLoadClick(Sender: TObject); procedure btChangeClick(Sender: TObject); private PicDisp: IPictureDisp; srv: ISetImage; { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.btLoadClick(Sender: TObject); begin if pdOpen.Execute then imSource.Picture.LoadFromFile(pdOpen.FileName); end; procedure TForm1.btChangeClick(Sender: TObject); begin if pdOpen.FileName'' then begin srv:=CreateComObject(CLASS_ChangeImage) as ISetImage; srv.Paint(pdOpen.FileName,PicDisp); SetOlePicture(imResult.Picture, PicDisp); end else
28
MessageDlg ('Файл не выбран!', mtWarning, [mbOK], 0) end; end. Рез ультатработы программы (и спольз уетсяфай л Athena.bmp - эмблема Delphi):
2.3. Создани е к ом поне нт ов ActiveX К омпонент ActiveX – это в нутренни й сервер, под д ерж и в аю щ и й технологи ю Automation (т.е. д уальны е и нтерфей сы ) и д опускаю щ и й в и з уальное ред акти ров ани е в сред ах раз работки . Поэтому наряд у с основ ны ми и нтерфей сами ActiveX под д ерж и в ает более 10 д ополни тельны х и нтерфей сов , обеспечи в аю щ и х в и з уали з аци ю , управ лени е, реакци ю на собы ти я и т.п. Пред ком компонентов ActiveX в Delphi яв ляется класс TActiveXObject, сод ерж ащ и й реали з аци ю эти х д ополни тельны х и нтерфей сов . ActiveX снабж аю тся ци фров ой под пи сью , при з нанной уд остов ери ть «пролетарскоепрои схож д ени е» компонента. Сред и способов соз д ани я ActiveX д ля Delphi-программи ста мож но рекоменд ов ать д в а наи более эффекти в ны х. Первы й состои т в преобраз ов ани и готов ого VCL-компонента в ActiveX-компонент, что легко сд елать с помощ ью мастера New – ActiveX – ActiveX Control. Более и нтересен в торой способ, которы й мы сей часи рассмотри м. Те хно логи я ActiveForm Ф орма ActiveForm пред став ляет собой комби ни ров анны й элемент управ лени я ActiveX - окно с набором в и з уальны х и нев и з уальны х компонентов . М ож но соз д ав ать целы е при лож ени я ActiveForm, которы е могут и спольз ов аться в раз ли чны х сред ах раз работки такж е легко, каки обы чны е компоненты ActiveХ . В частности , в нутри ActiveForm мож но и спольз ов ать компоненты д оступа кбаз ам д анны х, что при нали чи и потенци ально неограни ченного чи сла функци й д елает ActiveForm д остаточно эффекти в ной технологи ей . Е д и нств енное ограни чени етаки х при лож ени й –нали чи етолько од ной формы .
29
Д ругая особенность состои т в том, что кли ентам пред остав ляю тся только те св ой ств а, метод ы и собы ти я, которы е св яз аны непосред ств енно с формой ActiveX. Э то оз начает, что св ой ств а, метод ы и собы ти якомпонентов VCL, располож енны х на форме, нед оступны кли ентам. Е сли ж е необход и мо пред остав и ть кли ентам д оступ ксв ой ств ам в нутренни х компонентов VCL, след ует д обав и ть в форму ActiveForm нов ы е опубли ков анны е св ой ств а и метод ы , какв процессесоз д ани яэлемента управ лени яActiveX. Рассмотри м при мер, которы й при ми ни мумепрограммного код а поз в оляетпоказ ать основ ны еэтапы и особенности соз д ани яActiveForm. Раз рабаты в аемаяформа ActiveForm сод ерж и тд в а поляред акти ров ани я, метку и кнопку Button, после наж ати я которой сод ерж и мое окон ред акти ров ани я перемнож ается, а рез ультатотображ аетсяна Label. Э тап 1. Соз д ани епроекта ActiveForm. Д лясоз д ани яActiveForm требуетсяв ы полни ть след ую щ и еш аги . В ы бери те в глав ном меню File – New - Other. Н а экранепояв и тся окно репоз и тори яобъектов . К аки при соз д ани и в нутреннего сервера, в ы бери тена з аклад кеActiveX сначала ActiveX Library, а з атем - ActiveForm. Д алее В ы ув и д и те окно мастера ActiveForm Wizard, которое ни чем не отли чается от ActiveX Control Wizard з а и склю чени ем того, что поле VCL ClassName в д анном случае яв ляется нед оступны м.
В в ед и те в полеNew ActiveX Name з начени еMyFormX. И з мени тез начени еполя Implementation Unit на MyFormImpl.pas. И з мени те з начени е поля Project Name на MyFormProj.dpr. О став ьтеустанов ку поляThread Model без и з менени й (его з начени ем д олж но бы ть Apartment). О тметьте флаж окInclude Version Information.
30
ПослеО К Delphi соз д астби бли отеку ти пов , в которую в ой д утв сеобщ ед оступны еи опубли ков анны есв ой ств а, метод ы и собы ти я класса TActiveForm. К роме того, Delphi соз д асттри фай ла и сход ного код а и отобраз и тна экранеформу. Ф ай л MyFormProj.dpr сод ерж и т опи сани е DLL (MyFormProj.ocx) и по аналоги и св нутренни м сервером и меетв и д library MyFormProj; uses ComServ, MyFormProj_TLB in 'MyFormProj_TLB.pas', MyFormImpl in 'MyFormImpl.pas' {MyFormX: TActiveForm} {$E ocx} exports DllGetClassObject, DllCanUnloadNow, DllRegisterServer, DllUnregisterServer; {$R *.TLB} {$R *.RES} begin end. Ф ай л MyFormProj_TLB сод ерж и т и нформаци ю и з би бли отеки ти пов . Ф ай л MyFormImpl реали з ует метод ы и нтерфей са, объяв ленны е в би бли отеке ти пов . Э тотфай л сод ерж и тобъяв лени екласса формы type TMyFormX = class(TActiveForm, IMyFormX) private { Private declarations } FEvents: IMyFormXEvents; procedure ActivateEvent(Sender: TObject); procedure ClickEvent(Sender: TObject); procedure CreateEvent(Sender: TObject); procedure DblClickEvent(Sender: TObject); procedure DeactivateEvent(Sender: TObject); procedure DestroyEvent(Sender: TObject); procedure KeyPressEvent(Sender:TObject;var Key:Char); procedure PaintEvent(Sender: TObject); protected { Protected declarations } procedure DefinePropertyPages(DefinePropertyPage: TDefinePropertyPage); override; … // и т.п. public { Public declarations }
31
procedure Initialize; override; end; и больш оеколи честв о строккод а, сгенери ров анны х мастером самостоятельно. Н ам понад оби тся д обав и ть в опи сани еформы необход и мы е компоненты и напи сать з д есь обработчи к собы ти й . Э тап 2. Соз д ани еэкранной формы Н а этом этапе форма ActiveForm ни чем не отли чается от обы чной формы . Н а ней мож но раз мещ ать сред ств а управ лени я и соз д ав ать обработчи ки собы ти й . Е д и нств енное раз ли чи е меж д у ни ми состои т в том, что з аголов ок окна ActiveForm небуд етпояв лятьсяна самом элементеуправ лени я. О н при сутств уеттам только в о в ремяпроекти ров ани я. Т еперь след ует д обав и ть компоненты и код , при д аю щ и е форме способность прои з в од и ть некоторы ед ей ств и я. Раз мести течеты реТLabel, д в а TEdit и од ну кнопку в соотв етств и и сри сунком.
И з мени тесв ой ств о формы АхВогderStyle на afbRaised. В обработчи ксобы ти яOnClick д лякнопки в в ед и теслед ую щ и й код : procedure TMyFormX.GoButtonClick(Sender: TObject); begin try ResultLbl.Caption := IntToStr(StrToInt(NumlEdit.Text) *StrToInt(Num2Edit.Text)); except on EConvertError do ShowMessage('Вы что-то не то ввели!'); end; end; Е сли при преобраз ов ани и текста в целочи сленны ез начени япрои з ой д етош и бка (напри мер, од но и з окон ред акти ров ани я буд етсод ерж ать букв ы ), буд етв оз буж д ено и склю чени еEConvertError. В ы бери те в глав ном меню View | Type Library. В и нформаци онной панели и з мени тез начени еполяHelp String на My Test ActiveForm Library. Т еперь при установ ке формы ActiveForm этот текст буд ет отображ аться в панели д и алога
32
Import ActiveX. Сохрани тепроект, согласи в ш и сь си менами фай лов по умолчани ю (в ы з ад али и х в мастереActiveForm Wizard). Э тап 3. Построени е, реги страци яи и мпортActiveForm. Т еперь мож но откомпи ли ров ать форму, з ареги стри ров ать ее в Windows и , наконец, и мпорти ров ать в Delphi. В этом отнош ени и она ни чем не отли чается от лю бы х д руги х элементов управ лени яActiveX. Д ляэтого нуж но в ы полни теслед ую щ и ед ей ств и я. В ы бери те в глав ном меню Project | Build MyFormProj. К огд а проект буд ет откомпи ли ров ан, в ы полни теRun Register ActiveX Server. В ы бери тев глав ном меню Component | Import ActiveX Control. У станов и те форму My Test ActiveForm Library (Version 1) в пакет DCLUSR40. Помести те ее на страни цу ActiveX пали тры компонентов и ли лю бую д ругую страни цу по в ы бору. Послеэтого нов ая ActiveForm установ лена в и нтегри ров анную сред у Delphi. Э тап 4. Т ести ров ани еActiveForm Д ля пров ерки нов ой акти в ной формы соз д ай те нов ое при лож ени е. Перей д и те на страни цу ActiveX пали тры компонентов , в ы бери те MyFormX (Delphi при св ои ла ему з начокпо умолчани ю ) и помести те его на форму. Запусти те программу и протести руй те нов ы й элемент управ лени я. Т еперь соз д анны й фай л О СХ мож но и мпорти ров ать в лю бую сред у программи ров ани я, которая под д ерж и в аетэлементы управ лени яActiveX. У праж не ни е . В оспольз ов ав ш и сь лю бы м HTML-ред актором (напри мер, MS FrontPage), соз д ай теWeb-страни цу, располож и тена ней соз д анную нами форму и пров ерьтеееработоспособность. 2.4. Создани е и нт е рф е йса собы т и й Ч асто в практи ческом программи ров ани и в оз ни кает потребность ув ед омлени я кли ента о каком-ли бо собы ти и , прои сш ед ш ем в работесервера. Н апри мер, кли ентотправ и л COM-серверу з ад ани ез агруз ки фай ла по мод емной ли ни и . К ли ент прод олж ает работу, а при наступлени и собы ти я з ав ерш ени я з агруз ки сервер посы лает кли енту ув ед омлени е. Серверотв ечает з а генераци ю собы ти й , а и х реали з аци ей (реаги ров ани ем) з ани маетсякли ент. М од ель собы ти й в COM и меет опред еленны е сход ств а с мод елью собы ти й в Delphi, но и сущ еств енны е отли чи я. Н апомни м, в Delphi собы ти я в ы полнены какуказ атели на метод ы . Н апри мер, кнопка, располож еннаяна форме, яв ляется в терми нах COM сервером, которы й опред еляет и генери рует собы ти е. К ли ентом яв ляется при лож ени е (форма), которая под клю чается ксобы ти ю св яз ы в ани ем и мени метод а с указ ателем. Н ед остатокмод ели Delphi – нев оз мож ность опов ещ ени яо собы ти и сраз у нескольки х кли ентов (multicasting). М од ель собы ти й COM болееслож на и основ ана на перед ачеи нтерфей сов [2,3].
33
При в оз ни кнов ени и собы ти я в COM-серв ере, которое он д олж ен перед ать кли енту, серв ерд олж ен в ы з в ать какой -ли бо и з метод ов кли ента. Ф акти чески в этот момент кли ентссервером меняю тся местами . О бращ ени еккли енту осущ еств ляетсяпри помощ и станд артны х механи з мов COM. О снов наяи д еяз аклю чается в том, что сервер, генери рую щ и й собы ти я, д еклари руети нтерфей си х обработчи ка. К ли ент, под пи сы в аю щ и й ся на собы ти я, д олж ен реали з ов ать этот и нтерфей с (то есть факти чески д олж ен в клю чать в себя COM-объект, реали з ую щ и й и нтерфей с). К роме того, серверд олж ен реали з ов ать станд артны е и нтерфей сы COM, поз в оляю щ и е з ареги стри ров ать на нем обработчи ксобы ти й . И спольз уя эти и нтерфей сы , кли ентреги стри руетна сервереи нтерфей собработчи ка собы ти й , поз в оляя серверу в ы з ы в ать св ои метод ы . Рассмотри м основ ны еи нтерфей сы , и спольз уемы ев этом процессе. К аж д ы й COM-объект, которы й поз в оляет под клю чаться к св ои м собы ти ям, реали з уети нтерфей сIConnectionPointContainer: type IConnectionPointContainer = interface ['{B196B284-BAB4-101A-B69C-00AA00341D07}'] function EnumConnectionPoints(out Enum: IenumConnectionPoints): HResult;stdcall; function FindConnectionPoint(const iid: TIID; out cp: IConnectionPoint): HResult; stdcall; end; О бъект, нуж д аю щ и й ся в опов ещ ени и о собы ти ях (кли ент), д олж ен з апроси ть у и сточни ка этот и нтерфей с (наз ы в аемы й и сходящи м и нте рф е йсом), з атем при помощ и метод а FindConnectionPoint получи ть «точку под клю чени я» – и нтерфей сIConnectionPoint и посред ств ом в ы з ов а его метод а Advise з ареги стри ров ать в этой точке под клю чени я ссы лку на св ою реали з аци ю и нтерфей са IDispatch, метод ы которого буд утв ы з ы в аться при в оз ни кнов ени и тех и ли и ны х собы ти й в и сточни ке собы ти й . О снов ной метод FindConnectionPoint получает GUID и нтерфей са-обработчи ка и в оз в ращ аетуказ атель на соотв етств ую щ ую этому обработчи ку «точку под клю чени я» . В случаеуспеха метод в оз в ращ аетS_OK, в случаенеуд ачи — код ош и бки . Т очка под клю чени я такж е пред став ляет собой и нтерфей с IConnectionPoint. О снов ны еметод ы этого и нтерфей са — Advise и UnAdvise. Перв ы й метод реги стри рует на сервере кли ентски й и нтерфей с обработчи ка собы ти й , которы й перед ается в параметре unkSink. М етод в оз в ращ ает dwCookie — и д енти фи каторпод клю чени я, которы й д олж ен и спольз ов атьсяпри отклю чени и обработчи ка собы ти й . Н ачи наясэтого момента, серверпри в оз ни кнов ени и собы ти я в ы з ы в ает метод ы перед анного ему и нтерфей са-обработчи ка. М етод Unadvise отклю чаетобработчи котсервера. Delphi сущ еств енно упрощ ает работу, ав томати з и руя операци и с перечи сленны ми и нтерфей сами . Рассмотри м след ую щ и й при мер. Соз д ад и м простой COMсерв ер, которы й при и з менени и текста в св оем окне (со стороны польз ов ателя
34
и ли кли ента) генери руетсобы ти яд лякли ента. К ли ентэти собы ти яобрабаты в аети в ы в од и тсоотв етств ую щ и есообщ ени я. Со здани е се рв е ра Н а основ ной форменов ого проекта располож и текомпонентMemo. И мяпроекта –Evp. Преобраз уй тепроектв серверав томати з аци и , какэто д елалось ранее. Н е з абуд ьте в окне мастера указ ать Generate Event Support Code – сгенери ров ать код под д ерж ки собы ти й . У каж и теи мякласса –Evt. В ред актореби бли отеки ти пов в и нтерфей сеIEvt д обав ьтед в а метод а procedure AddText(const s: WideString); procedure Clear; В и нтерфей сесобы ти й IEvtEvents - метод ы OnTextChanged и OnClear стаки ми ж епараметрами . К аки ранее, в мод уле, сод ерж ащ ем опи сани екласса, з апи ш и тереали з аци ю метод ов и нтерфей са: procedure Tevt.Clear; begin // Fevents Nil означает готовность клиента к приему // события, которое здесь генерируется вызовом // FEvents.OnClear; MainForm.Memo1.Lines.Clear; if FEventsnil then FEvents.OnClear; end; procedure Tevt.AddText(const s: WideString); begin MainForm.Memo1.Lines.Add(s); end; Д обав и м в класс д ополни тельны й метод , необход и мы й д ля генераци и собы ти й отпольз ов ательского в в од а в Memo: procedure Tevt.MemoChange(Sender:TObject); begin if FEventsNil then FEvents.OnTextChanged((Sender as TMemo).Text); end; и з апи ш ем в процед уру Tevt.Initialize MainForm.Memo1.OnChange:=MemoChange; Серверготов . Со здани е к ли е нт а
35
В нов ом проектев ы бери тепунктменю Project –Import Type Library. В д и алогов ом окнев ы бери теEvp Library Version 1.0 и наж ми теInstall. Н а страни цепали тры ActiveX появ и тсякомпонентEvp сав томати чески сгенери ров анны ми и нтерфей сами собы ти й . Располож и теего на форме(з начокв прав ой части ). Т акж ерасполож и тед в екнопки и строку ред акти ров ани я.
К омпонент Evp и меетд в а опубли ков анны х собы ти я OnClear и OnTextChanged, соз д ай тед ляни х обработчи ки . procedure TForm1.Evt1Clear(Sender: TObject); begin // Реакция на событие ShowMessage('Текст очищен!'); end; procedure TForm1.Evt1TextChanged(Sender: TObject; var s: OleVariant); begin // Реакция на событие ShowMessage('Текст добавлен!') end; О бработчи ки д ляпосы лки д анны х серверу: procedure TForm1.bSendClick(Sender: TObject); begin // Передача текста серверу Evt1.AddText(Edit1.text); end; procedure TForm1.bClearClick(Sender: TObject); begin Evt1.Clear; end; При мерработы программы и з ображ ен на ри сунке.
36
3. Задачи и упраж не ни я 1. Соз д ай тесервер, ри сую щ и й на св оей формеграфи ки три гонометри чески х функци й . Параметры графи ков перед аю тсячерез метод Draw и нтерфей са. 2. Преобраз уй тев COM-серверод ну и з напи санны х В ами ранеепрограмм. Н апи ш и теCOM-сервер, поз в оляю щ и й : 3. Реш и ть д и фференци альноеурав нени е. 4. Реш и ть си стему д и фференци альны х урав нени й . 5. Н ай ти прои з в ед ени ед в ух поли номов . 6. Н ай ти сумму/раз ность д в ух поли номов . 7. Получи ть рез ультатд елени яд в ух поли номов (частноеи остаток). 8. Н ай ти корни поли нома. 9. Н ай ти матри цу, обратную з ад анной . 10. По матри цеA построи ть матри цу An. 11. Н ай ти собств енны ез начени яматри цы . 12. Д лякомплексного чи сла най ти мод уль. 13. Н ай ти сумму, раз ность, прои з в ед ени ед в ух комплексны х чи сел. 14. Реш и ть си стему алгебраи чески х урав нени й . 15. Н ай ти скалярноепрои з в ед ени ед в ух в екторов . 16. Реали з ов ать алгори тм нахож д ени якратчай ш его пути в графе. 17. Реали з ов ать алгори тм нахож д ени ямакси мального потока. 18. Реали з ов ать алгори тм нахож д ени ями ни мального раз рез а. 19. Реш и ть з ад ачу опти ми з аци и спомощ ью си мплекс-метод а. 20. Состав и ть спи сокслов , и спольз уемы х в тексте, с указ ани ем частоты появ лени я. 21. Реали з ов ать пои ски з амену слов а в тексте с в оз мож ностью в ы бора направ лени япои ска. 22. Прои з в ести расстанов ку слов текста в алфав и тном поряд ке. 23. О тсорти ров ать слов а текста по частотепояв лени я. 24. Заш и фров ать текст.
37
25. О пред ели ть стои мость перев од а текста и з расчета 15р./1000з наков . 26. По фай лу, сод ерж ащ ему наборчи сел и ли текст, построи ть кругов ую д и аграмму. 27. По фай лу, сод ерж ащ ему наборчи сел и ли текст, построи ть столби ков ую д и аграмму. 28. О пред ели ть, яв ляетсяли з ад анны й год в и сокосны м. 29. По д атерож д ени яопред ели ть з накз од и ака и «з в еря» год а. 30. По в в ед енной д атеопред ели ть д ень нед ели . 31. Построи ть графи кпрои з в ольной функци и , з ад ав аемой польз ов ателем. 32. Реали з ов ать ав томати ческоев ращ ени ед в умерной фи гуры . 33. Реали з ов ать ав томати ческоев ращ ени етрехмерной фи гуры . 34. Реали з ов ать в ращ ени ед в умерной фи гуры спомощ ью мы ш и . 35. Реали з ов ать в ращ ени етрехмерной фи гуры спомощ ью мы ш и . 36. Построи ть проекци ю фи гуры на плоскость. 37. Построи ть трехмерную пов ерхность. 38. Реали з ов ать в оз мож ность Cut/Copy/Paste д ля и з ображ ени я (с з ад ани ем области копи ров ани янеправ и льной формы ).
4. Гло ссари й Automation (OLE Automation, ав т о м ат и заци я ) – обращ ени е ксерв еру через д уальны й и нтерфей с CoClass – компонентны й класс. Н ад строй ка над объяв лени ем и нтерфей са и реали з ую щ его его класса, сод ерж ащ аяметод ы соз д ани яобъекта в соотв етств и и со специ фи каци ей COM. О пи сы в аетсяв би бли отекети пов COM+ - улучш енная в ерси я COM, в клю чаю щ ая управ лени е транз акци ями , под д ерж ку без опасности , уд аленноеад ми ни стри ров ани еи д р. DCOM (Distributed COM) –расш и рени еCOM, под д ерж и в аю щ ееработу суд аленны ми серверами IDispatch – и нтерфей с, сод ерж ащ и й специ альны е метод ы д ля раз реш ени я текстов ы х и мен метод ов д и спи нтерфей са в о в ремяв ы полнени япрограммы Би бли о т е к а COM – набор си стемны х DLL, пред остав ляю щ и х станд артны е API д ляработы сCOM Би бли о т е к а т и пов –мод уль, сод ерж ащ и й и нформаци ю об и нтерфей сах Ви рт уальная т абли ца (VTable) – табли ца, сод ерж ащ ая ад реса метод ов в соотв етств и и споряд ком и х перечи слени яв и нтерфей се Ди спи нт е рф е йс – сов окупность объяв лени й метод ов , д оступны х через IDispatch, снабж енны х уни кальны ми и д енти фи каторами Дуальны й и нт е рф е йс – и нтерфей с-потомокIDispatch. О ты ски в аетметод ы как через IDispatch, таки спомощ ью в и ртуальной табли цы М арш алли нг –обмен и нформаци ей св неш ни м сервером Ф абри к а к лассов (Class Factory) – COM-объект, соз д аю щ и й экземпляры д руги х объектов . CoClass и фабри ка классов соз д аю тся д ля каж д ого объекта ав томати чески
38
Л и т е рат ура 1. Д арахв ели д з е П.Г. Раз работка Web-служ б сред ств ами Delphi. / П.Г. Д арахв ели д з е, Е .П. М арков .- СПб.: БХ В -Петербург, 2003. –672 с. 2. Е лманов а Н . Delphi и COM. / Н . Е лманов а, А . Т енцер, С. Т репали н. - СПб.: Пи тер, 2003. — 701 с. 3. Т ей ксей ра С. Delphi 5. / С. Т ей ксей ра, К . Пачеко. –К и ев : Д и алекти ка, 2001. –Т 2–988 с. 4. Х армон Э . Раз работка COM-при лож ени й в сред е Delphi. / Э . Х армон. – М .: В и льямс, 2000. –464 с. 5. БоксД . Сущ ность технологи и СО М . Би бли отека программи ста. / Д .Бокс. — СПб.: Пи тер, 2001. - 400 с.
39
Состав и тели : Руд алев В алери й Геннад ьев и ч, К ры ж анов скаяЮ ли ана А лександ ров на Ред акторТ и хоми ров а О .А .