5.1. COM komponenty

Jednou z hlavních nevýhod našeho jednoduchého řešení je to, že vytvoření instance komponenty probíhá bezprostředně v klientské aplikaci. To ovšem znamená, že již při překladu této aplikace musíme znát všechny podrobnosti o implementaci komponenty, jako například velikost paměti, kterou instance komponenty vyžaduje, nebo způsob její inicializace. Aplikace je tím pevně svázána s konkrétní implementací komponenty a v případě, že uživatel naší aplikace potřebuje komponentu zaměnit za jinou (třeba při změně dodavatele nebo přechodu na novější verzi komponenty), musíme naši aplikaci znovu přeložit a sestavit. To ovšem obecně není možné, neboť uživatel obvykle nemá k dispozici zdrojové texty aplikace. Jednou z hlavních předností komponentních technologií je ale právě zaměnitelnost jednotlivých komponent, takže musíme najít nějaké lepší řešení.

Naštěstí nám velmi elegantní řešení poskytuje softwarové inženýrství ve formě osvědčených návrhových vzorů, a to konkrétně návrhový vzor Factory. Předáme zodpovědnost za vytváření instancí naší komponenty jiné komponentě, která již bude mít k dispozici dostatek informací o tom, jak instanci vytvořit a jak ji inicializovat. Tato komponenta, nazývaná v terminologii COM class factory, má pevně definované rozhraní a může v obecném případě být schopna vyrobit i více typů komponent současně. Typickým příkladem jsou standardní dialogová okna v knihovně Windows Common Dialog Library (COMMDLG.DLL), určená pro výběr souboru, tisk, výběr barvy a fontu nebo zadávání parametrů pro vyhledávání a náhradu v textu.

Potřebuje-li klientská aplikace ve svém paměťovém prostoru vytvořit instanci komponenty, předá identifikaci požadované komponenty funkci CoCreateInstance, která je součástí infrastruktury COM. Na základě identifikace se v systémovém registru zjistí, kde je umístěn odpovídající soubor DLL. Po zavedení knihovny do paměti se provede základní inicializace, při níž se vytvoří instance class factory. Ta pak obdrží požadavek na vytvoření instance komponenty, jenž vyřídí. Dále již klientská aplikace komunikuje přímo s komponentou.

Obrázek 5.1. Sekvenční diagram vytvoření instance COM komponenty

V případě, že je komponenta realizována samostatnou serverovou aplikací, pak je uvedený postup podobný. Vzhledem k tomu, že ale komunikujeme přes více adresových prostorů, dochází při komunikaci klienta s komponentou k serializaci a deserializaci dat uvnitř zastupujících proxy a stubů.