Umíme to s Delphi, 38. díl – technologie OLE jasně a srozumitelně, 1. část

Kalendář máme úspěšně za sebou a jistě uzrála doba pro otevření tématu, který se může na první pohled jevit těžko pochopitelný. Zkratka OLE znamená „Object Linking and Embedding“ (vkládání a propojování objektů) a dnes si o ní povíme vše podstatné.
OLE je postaveno na modelu COM („Component Object Model“, komponentový objektový model), takže se zmíníme i o něm. Výklad bude dostatečně názorný a srozumitelný, takže (snad) proniknou do této technologie i ti, kterým se to dosud nedařilo.

V souvislosti s dnešní kapitolou našeho seriálu mám na vás, milí čtenáři, malou prosbu. Téma OLE je zatím asi nejkomplikovanější ze všech, které se v seriálu objevily. Mým cílem je, abyste si na konci této (příp. příští) kapitoly řekli cosi ve smyslu „ejhle, to OLE je skvělá technologie a navíc na něm vlastně nic složitého není!“ Pokud si řeknete něco jiného (a to i v průběhu čtení), například „co má tohle slovo zase znamenat?“, případně „co tímhle autor myslel?“, ozvěte se prosím do diskuse, případně mi pošlete mail. Rád bych OLE popsal tak, aby bylo každému pochopitelné, ale je mi jasné, že se mi to nemusí podařit u každého a u všech témat. A nyní již k věci.

Problematika OLE je poměrně rozsáhlá. Mrzí mě to, ale je nutné začít trochou teorie. V dnešní kapitole si řekneme základní (teoretické) informace o tom, co je vlastně OLE, z čeho vzniklo, k čemu se používá a jaké další technologie jsou na něm postaveny. Více informací se do dnešního dílu bohužel nevejde, ale nedá se ni c dělat, protože určitý teoretický základ je podle mého soudu poměrně důležitý. Za týden si pak ukážeme základní komponentu Delphi, která slouží k práci s OLE a důkladně si ji popíšeme.

OLE. Co to vlastně probůh je?

Od začátku článku jsem již nesčíslněkrát zopakoval pojem OLE. V úvodním odstavci jsem dokonce napsal, že OLE znamená „Object Linking and Embedding“, neboli „Vkládání a propojování objektů“. To je pěkné, ale asi si pod tím lze těžko něco představit.

Nejlepší bude praktická ukázka. Představte si, že programujete textový editor, ale chcete v něm zobrazit také bitmapový obrázek <.BMP). Nemusíte naprogramovat ani jednu funkci pro práci s bitmapami a přesto lze obrázek v editoru zobrazit a dokonce editovat. Objekt bitmapa byl totiž vložen do aplikace textový editor pomocí mechanismu OLE. Propojování je podobné; rozdíl mezí propojováním a vkládáním si vysvětlíme za okamžik.

Dobře, v textovém editoru máme bitmapový obrázek. Pořád ale nevíme, jak je to možné. Vysvětlení je takovéto: mechanismus OLE totiž ke své práci využívá tzv. servery OLE. Server OLE není (resp. nemusí být) žádným fyzickým počítačem, který je připojen k síti a využívá se jako server. Server OLE můžete velmi jednoduše používat i na svém počítači, který nemusí být připojen vůbec k ničemu. Dokonce se vsadím, že server OLE vlastníte, aniž o tom možná víte. Server OLE je (zjednodušeně řečeno) aplikace, která je schopná poskytnout jiným aplikacím (nazvěme je pro naše účely třeba klienty OLE) své služby a funkce. Nemáme teď na mysli funkce z programátorského hlediska, tedy to, co sami programujeme a uvozujeme klíčovým slovem function. Myslíme ty funkce, které server OLE poskytuje uživateli. Nepleťte si tedy mechanismus OLE třeba s dynamicky linkovanými knihovnami (DLL). Tyto knihovny také aplikaci poskytují funkce. Poskytují ovšem jejich implementaci. To není principem technologie OLE. Říkejme snad raději, že servery OLE poskytují klientům OLE svou funkčnost, nikoliv své funkce (ale není to úplně přesné).

Nezaškodí zřejmě příklad. Představte si aplikaci Microsoft Word. Pomocí mechanismu OLE nemůžete volat funkci, kterou Word ve svém zdrojovém kódu odchytává výjimky typu EInOutError. Naopak ovšem lze pomocí OLE zavolat funkci Wordu „zobraz dokument“, případně „zkopíruj označený text do schránky“, tedy funkce, které Word poskytuje uživatelům prostřednictvím svého menu a dalších ovládacích prvků. Zřejmě nejdůležitější funkcí Wordu (ve významu, který jsme si právě vysvětlili) je „zobrazit dokument ve formátu MS Wordu *.DOC“.

Pomocí mechanismu OLE můžete tedy ve své aplikaci zobrazit třeba dokument Wordu. Pokud vás předchozí věta (pro jistotu je označena kurzívou) ponechala klidnými, přečtěte si ji pro jistotu ještě jednou. Schopnost, která je v ní uvedena, je totiž naprosto úžasná! Uvědomte si, že můžete zobrazit a dokonce editovat dokument *.DOC, aniž máte jakékoliv tušení o tom, jaký je vnitřní formát tohoto souboru. Přeženu-li to trochu, nemusíte naprogramovat ani čárku a vaše aplikace bude přesto disponovat funkcemi, na které se programátoři Microsoftu dost nadřeli.

Microsoft Word je tedy typický server OLE, neboť dokáže pomocí mechanismu OLE poskytovat klientům OLE své funkce (lépe snad psát svou funkčnost). Dalším podobným serverem OLE, který je často využíván především kvůli svému masovému rozšíření mezi uživateli, je Microsoft Excel.

Zdaleka ne každá aplikace ve Windows je ovšem serverem OLE. Nečekejte proto, že když naprogramujete (nebo stáhnete) nějakou „obyčejnou“ aplikaci, rázem získáte server OLE, který budou moci využívat programátoři po celém světě.

Server OLE musí být samozřejmě v okamžiku, kdy chceme jeho služeb využít, k dispozici. Na počítači, který nemá instalovaný Word, nelze pomocí mechanismu OLE přistoupit k jeho funkcím, to asi příliš nepřekvapí.

V další podkapitole si následující tvrzení zobecníme a uvedeme do souvislostí, nicméně obecně lze říci, že OLE je mechanismus přinášející schopnost vložit do aplikace objekt definovaný v jiné aplikaci. Tato definice není ani vyčerpávající ani přesná, zato je poměrně výstižná a říká o technologii OLE to, co se s ní nejčastěji provádí (a co s ní budeme zanedlouho provádět my).

Tolik tedy první úvod o OLE. V této podkapitolce jsme si tuto technologii popsali velmi vágně, spíše z hlediska uživatele než s důrazem na terminologickou přesnost. V následující podkapitole se podíváme na to, z čeho tato technologie vznikla a s jakými technologiemi souvisí. V dalších podkapitolách se pak vrátíme k popisu a příkladům OLE.

OLE vzniklo z COM – leč nebylo jediné

Pokud vás nejvíce zajímá, jak využít OLE ve své aplikaci a stačí vám úvodní informace, které jste si přečetli v předcházející podkapitole, můžete tuhle podkapitolu přeskočit. Budou v ní totiž uvedeny podrobnější a ucelenější informace o vzniku této technologie a o dalších mechanismech, které s OLE souvisí. Tyto údaje sice nebudete bezprostředně potřebovat k programování, ale je dobré je znát, už kvůli navazujícím tématům, kterými se budeme zabývat za čas.

Na úvod je třeba uvést, že technologie OLE není výmyslem firmy Borland (která vytvořila Delphi). OLE je podporován samotným tvůrcem operačního systému, tedy firmou Microsoft. Microsoft byl totiž před časem postaven před úkol pokusit se zbourat (nebo alespoň částečně eliminovat) hranice mezi aplikacemi. Proč musím ve své aplikaci vytvářet takový a takový objekt, proč musím implementovat takovou a takovou funkci, když už to někdo udělal přede mnou? A především když aplikace, která přesně to, co potřebuji, dokonale umí a leží přede mnou? Pokud jsem před příchodem mechanismu OLE potřeboval přistoupit k nějaké funkci nebo k nějakému objektu jiné aplikace, měl jsem smůlu. Nemohl jsem přistoupit k ničemu, co tato aplikace obsahovala (pokud nebyla vyjímečně osvíceně napsaná), a to jen proto, že to zkrátka bylo implementováno v ní – v cizí aplikaci. Vypadalo to, že si každá aplikace střeží své funkce a objekty a nikdo zvenčí nemá šanci je využívat.

To je ovšem výrazně proti principu znovuvyužitelnosti kódu, který je mezi programátory skloňován jako jeden bod z jejich desatera. Proto bylo otázkou času, kdy tento stav skončí. Průlom znamenala technologie COM, se kterou přišel Microsoft. COM znamená Component Object Model (komponentový objektový model) a je to model umožňující interakci mezi aplikacemi a komponentami. O technologii COM si budeme povídat v některém z příštích dílů, takže dnes jen velmi stručně. COM je specifikace jakýchsi rozhraní, která umožňují programátorům vytvářet objekty, ke kterým mohou aplikace libovolně přistupovat a využívat jejich funkce.

Přece jen mi to nedá a alespoň jedním odstavečkem se pokusím popsat technologii COM. Uvidíte, že podobnost s OLE je velmi výrazná – a vzápětí se také dozvíte, proč. Představte si, že chcete vytvořit nějaký objekt (případně nějakou softwarovou komponentu v nejobecnějším slova smyslu – tedy opět objekt nabízející množinu nějakých funkcí), a jeho funkčnost chcete poskytnout ostatním programátorům. Tento objekt tedy naprogramujete jako objekt COM a nadefinujete takzvaná rozhraní, jejichž prostřednictvím budou uživatelé přistupovat k funkcím, které váš COM objekt nabízí. Představte si (velmi zjednodušeně), že tento objekt „visí“ v operační paměti počítače a jakákoliv aplikace, která potřebuje nějakou jeho službu, zavolá příslušné rozhraní a služba je jí poskytnuta.

Jednou z nejvýznamnějších výhod celého modelu COM je jazyková nezávislost, takže objekt COM vytvořený v Delphi může využívat aplikace napsaná ve Visual C++.

Pokud jste si pokusili představit, jak objekt COM poskytuje své služby a funkce ostatním aplikacím, asi budete souhlasit s tím, že technologie OLE má k této představě poměrně blízko. Vždyť pomocí ní si také aplikace vyžadují funkce, které jim poskytuje někdo cizí. Podobnost kupodivu není čistě náhodná, neboť technologie OLE byla postavena na modelu COM.

Mechanismus OLE ovšem není to jediné, co je vystavěno na technologie COM. Jistě jste už zaslechli pojem ActiveX. ActiveX je další technologie postavená na modelu COM a v našem seriálu se jí budeme časem také věnovat. Byla vyvinuta Microsoftem primárně kvůli Internetu. V souvislosti s pojmem ActiveX vzniká v poslední době tak trochu terminologický zmatek, nicméně můžeme si stručně uvést, že pojem ActiveX zahrnuje (kromě dalších) následující prvky:

  • ovládací prvky ActiveX: vizuální komponenty podobající se komponentám knihovny vizuálních komponent (Visual Component Library, VCL) v Delphi, s rozdílem, že jsou jazykové nezávislé a nemusíme je tedy používat zdaleka jen v Delphi. Budeme se jim v seriálu také věnovat.
  • technologii OLE Automation: „rozšíření“ mechanismu OLE umožňující volat obecné další služby serverů OLE a především přistupovat k nim programově.
  • technologii ActiveForm: jedna nebo více vizuálních (nebo nevizuálních) komponent vložených společně na jeden formulář za účelem vytvoření jedné „velké“, „složené“ ActiveX komponenty.
  • Active Server Pages: ActiveX komponenty umožňující vytvářet dynamicky generované internetové stránky.
  • Active Documents: aktivní dokumenty.
S největší pravděpodobností máte nyní v pojmech nepředstavitelný zmatek. Je to pochopitelné, proto v další podkapitole učiníme lehké „terminologické shrnutí“.

Velmi krátce bych se chtěl zmínit také o technologii OLE Automation. Pod definicí „OLE Automation umožňuje volat obecné služby serverů OLE“ si asi mnoho nepředstavíte. Přitom jde o skvělou technologii, která velmi rozšiřuje možnosti našich aplikací. Jak zakrátko poznáte, pomocí mechanismu OLE (tedy „obyčejného“ OLE, nikoliv Automation) můžete do své aplikace vložit nějaký objekt z cizí aplikace, například dokument aplikace Word. Poznáte, že „uvnitř své aplikace“ můžete tento objekt aktivovat, což v podstatě způsobí otevření aplikace Word přímo na formuláři vaší aplikace. Mechanismus OLE tak umožňuje uživateli třeba připsat do dokumentu Word další řádku. Uživateli, ale nikoliv vám jakožto vývojáři! Technologie OLE Automation naproti tomu umožňuje ovládat server OLE programově, tedy v případě téhož dokumentu Word dovolí připsat na jeho konec novou řádku programátorovi.

Doufám, že vás vytvořený terminologický zmatek dokonale neznechutil; v dalších podkapitolách se již budeme držet takřka výhradně mechanismu OLE. K mnohým z pojmů, na které jsme v předchozím výkladu narazili, se vrátíme v příštích dílech seriálu. Možná si říkáte, proč se nevěnujeme nejprve technologii COM, když z ní vlastně všechno vzniklo. To je správný argument, nicméně složitost problematiky COM je mnohem větší než v případě mechanismu OLE, který můžete velmi rychle a jednoduše použít i ve své aplikaci. Až se s konceptem OLE dostatečně sžijete, budete se v popisu modelu COM mnohem rychleji orientovat.

Terminologické shrnutí

V předchozí podkapitole jsme udělali v pojmech a termínech patřičný zmatek, nicméně tento zmatek je bohužel odrazem reality. Přesto se pokusíme (bez nároku na exaktnost) vnést do tohoto ponurého bludiště trochu světla. Následující tabulka se pokusí shrnout zmíněné pojmy v pořadí, ve kterém na sebe „logicky“ navazují a velmi stručně připomenout jejich význam.

Označení technologie Název technologie Stručný popis
COM Component Object Model Specifikace popisující vytváření objektů a způsob přístupu k jejich rozhraní. Tím zprostředkovává funkce těchto objektů. Objekty jsou jazykově nezávislé. Model COM boří hranice mezi aplikacemi.
OLE Object Linking and Embedding Mechanismus založený na COM. Umožňuje vkládat do jedné aplikace objekt definovaný v jiné aplikaci. Pomocí serveru OLE také nabízí používání funkcí jiné aplikace (serveru OLE).
ActiveX ActiveX Široký pojem zahrnující další technologie postavené na COM. Byla vyvinuta především kvůli Internetu. Její složky viz další řádky.
OLE Automation OLE Automation Technologie umožňující přistupovat k funkcím objektu (např. OLE serveru) programově. Budeme se jí v našem seriálu také zabývat.
Ovládací prvky ActiveX Ovládací prvky ActiveX Můžete si je představit jako komponenty v Delphi. Budeme se jimi v našem seriálu také zabývat.
ASP Active Server Pages ActiveX komponenty umožňující vytvářet dynamicky generované internetové stránky
Active Documents Active Documents Aktivní dokumenty jsou objekty podporující vkládání a propojování, operace drag-and-drop, vizuální editaci a aktivaci na místě. Typickými ukázkami jsou dokumenty Wordu nebo tabulky Excelu. Budeme se jimi v našem seriálu také zabývat

Nejsem si jist, zda se mi podařilo trochu osvětlit pojmy související s architekturou OLE, nicméně doufám, že je to lepší než na začátku:-)

Zpět k OLE: podrobnější informace

Vraťme se ovšem k mechanismu OLE a pokračujme v jeho důkladném popisu. Nejprve si však dovolím ocitovat z knihy Mistrovství v Delphi 3 (Miller, T., Powell, D., Computer Press 1998): „V budoucnu bude model COM nezávislý na konkrétním operačním systému a možná dokonce nezávislý na platformě. takže aplikace a operační systémy budou moci pomocí něj provádět meziprocesní komunikace. Microsoft v této době pracuje na operačním systému, který bude kompletně postaven na technologii OLE, takže někdy v blízké době budeme moci pracovat s operačním systémem OLE. Proto se jako programátoři musíme technologii OLE naučit a porozumět jí; většina programování bude znamenat výstavbu nad ovládacími prvky OLE.“ (str. 585).

Nedovolím si pronášet podobné věštby, nicméně je asi zřejmé, že mechanismus OLE (a vůbec COM) bude nabývat na významu a je dobré jej důkladně znát – přinejmenším proto, že nám to v důsledku zjednoduší práci.

Řekli jsme si, že OLE vychází z modelu COM, který byl vyvinut v touze po větší znovuvyužitelnosti kódu. Máte-li k dispozici vhodnou aplikaci serveru OLE, která provádí určitou činnost, nemusíte sami tutéž činnost programovat, dokonce vás ani nezajímá, jakým způsobem je daná činnost implementována, prostě ji ve své aplikaci jednoduše použijete. Poskytne vám ji server OLE.

Pokud nám má server OLE zpřístupnit nějakou funkci, ale zároveň se po nás nevyžaduje, abychom ji implementovali či se o ní jinak zajímali, je asi zřejmé, že server se bude muset v naší aplikaci (nebo přinejmenším v její „těsné blízkosti“) zobrazit. Jak by třeba Word mohl poskytnout funkci „zobraz dokument *.DOC“ aniž by se sám zobrazil, když jsme žádnou takovou funkci neprogramovali? Word může zajistit zobrazení dokumentu jedině jaksi „sám v sobě“ – nemůže naši aplikaci jen tak „naučit“ zobrazit dokument Word. Pojďme se tedy podívat na to, jakým způsobem se server OLE zobrazí (aktivuje) v naší aplikaci.

V původní verzi OLE se servery OLE aktivovaly ve zvláštním okně, tedy mimo vlastní aplikaci. Nebylo proto možné zobrazit dokument Word na našem formuláři, otevřelo se nové okno – v podstatě s aplikací Word. Verze 2 mechanismu OLE (které je nyní prakticky jediné používané) však již tento nedostatek eliminovala, takže server se otevře (aktivuje) přímo v naší aplikaci, na jejím formuláři (přesněji řečeno uvnitř speciální komponenty, kterou musíme na formulář umístit a o které si brzy povíme). Tuto vlastnost je nicméně možné vypnout a aktivovat servery ve zvláštním okně. Situace pak vypadá tak, že můžete na formuláři zobrazit třeba bitmapu, ale jakmile ji chcete editovat (kvůli čemuž se musí spustit program Malování – Paintbrush), otevře se nové okno s tímto programem.

Propojování nebo vkládání?

Od začátku dnešního dílu stále opakujeme pojem OLE, který znamená propojování a vkládání objektů, a ještě jsme si neřekli, co je vlastně propojování, co je vkládání a jaký je mezi nimi nejdůležitější rozdíl. Nuže, nyní tento dluh splatíme:
  • Vkládání dokumentu znamená, že se do aplikace vloží skutečný, fyzický, celý objekt. Například máte-li na disku soubor C:\DOKUMENT.DOC a chcete-li jej vložit do své aplikace, bude fyzicky tento soubor zkopírován ze svého umístění do této aplikace.
  • Propojení dokumentu naproti tomu znamená (jak už asi tušíte), že do vaší aplikace nebude vložen fyzický soubor, ale jen odkaz na něj. To znamená, že soubor bude sice zobrazen ve vaší aplikaci, ale fyzicky budete pracovat přímo s jeho uložením na disku. Výhodou propojení je, že k témuž dokumentu může přistupovat více aplikací zároveň. Změní-li jedna aplikace tento dokument, změny se promítnou také ve všech dalších aplikacích, které obsahují propojení na tento soubor.

Na závěr

Tolik tedy k dnešní náplni seriálu. Doufám, že po přečtení máte alespoň základní informace potřebné pro reálné využívání technologie OLE ve svých aplikacích. Předpokládám, že jste již velmi netrpěliví vyzkoušet si celý mechanismus v praxi – v Delphi. Dočkáte se za týden, neboť hned od začátku příštího dílu se budeme věnovat základní komponentě Delphi pro práci s OLE: komponentě OleContainer.
Diskuze (8) Další článek: Kino jako řemen

Témata článku: , , , , , , , , , , , , , , , , , , , , , , , , ,