1. Objekt COM

[znalosti]

Component Object Model je způsob, kterým mohou komunikovat softwarové komponenty. Jedná se o binární a sítový standard umožňující kterýmkoliv dvěma komponentám komunikovat bez starostí, na kterém stroji právě běží (pokud jsou stroje propojeny), pod jakým OS stroje pracují (pokud podporují COM) a v jakém jazyce jsou komponenty napsány.

COM je založena na objektech. Tyto objekty ale nejsou úplně to stejné jako v objektových jazycích (i když si jsou velice podobné). COM objekty jsou velmi dobře zapozdřeny, není tedy možnost získat přístup k vnitřní implementaci objektu. Není možnost zjistit, jaká data, datové struktury a podobné může daný objekt obsahovat. Obvykle se COM objekty kreslí pouze jako prázdné obdélníky.

[znalosti]

Jediný způsob, jak komunikovat s COM objekty je skrze rozhraní. Rozhraní pak zpřístupňují sadu metod použitelnou pro práci s objektem. Rozhraní tvoří dohodu mezi komponentou a klientem. Jinými slovy, rozhraní pouze nedefinuje, které funkce a metody jsou použitelné, ale definuje také, co objekt dělá, když jsou dané metody volány. Tato dohoda ale nevymezuje způsob implementace - COM objekt není nijak omezen ve způsobu implementace metod rozhraní. Jediné, co musí dodržet, je že už jednou dohodnuté rozhraní nelze změnit.

Toto se děje z důvodu, že na dohodnutém způsobu komunikace mohou záviset další aplikace. Pokud by se dohoda rozhraní porušila, mohlo by dojít k selhání.

Existují však úskalí této technologie. Nelze například zcela využít kód nacházející se v těchto komponentách (právě kvůli "dokonalému" zapouzdření). Nelze tedy z komponent dědit a následně upravit některé metody. U COM komponent se hovoří o tzv. DLL hell, tedy "peklu DLL". Potíže se vyskytují zejména v souvislosti s verzemi. Často se stává, že novější verze komponent přepíší jejich starší verze a tím způsobí nekorektní chování aplikací vycházejících z předchozích verzí.

Každý COM objekt implemetuje rozhraní IUnknown obsahující následující tři funkce. Z něj dědí všechna ostatní rozhraní použitá v COM objektu.

  • AddRef()

    Slouží ke zvýšení počtu odkazů na použité rozhraní.

  • QueryInterface()

    Slouží pro přepínání mezi rozhraními

  • Release()

    Sníží počet odkazů na použité rozhraní. Pokud počet klesne na nulu, objekt je uvolněn.

1.1. GUID

GUID (Globally Unique Identifier) je klíčová část modelu COM. Jedná se o 128 bitovou strukturu, u níž je zajištěno, aby žádné dva GUID nebyly stejné. GUID se v COM modelu používá ze dvou důvodů:

  • jednoznačně rozlišit určitý COM objekt. GUID přiřazené ke COM objektu se nazývá class ID (CLSID). To se používá k vytvoření instance COM objektu.

  • jednoznačně rozlišit patřičné rozhraní COM. GUID používané s určitým COM rozhraním se pak nazývá interface ID (IID). Tohoto se používá tehdy, když se žádá o náležité rozhraní od objektu.

I když GUID se bere jako struktura, většinou se jedná o řetězec ve tvaru {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}, kde x představují hexadecimální čísla.

1.2. HRESULT hodnoty

Všechny COM objekty vracejí 32-bitovou hodnotu nazývanou HRESULT. Nejčastěji se HRESULT bere jako struktura dvou druhů informací

  • Zda daná metoda uspěla či nikoliv

  • Detailnější informace o výstupu operace podporované metodou