4.2. Komunikace s komponentami

Architektura COM je založena na binárních komponentách s definovanou sadou rozhraní. Každá komponenta je uložena v nějakém binárním souboru, a to buď jako dynamicky linkovaná knihovna (DLL), nebo jako samostatná aplikace (EXE).

Aplikace využívající COM komponenty ve formě dynamických knihoven s komponentou komunikuje přímo - zavede si ji do svého adresového prostoru a volá její služby jako obyčejné funkce. Výhodou tohoto řešení je, že se zjednoduší komunikace mezi aplikací a komponentami.

Obrázek 4.1. COM objekt v dynamické knihovně

Pokud ovšem aplikace komunikuje s komponentou uloženou v samostatném spustitelném souboru, je situace složitější. Aplikace i komponenta mají každá svůj vlastní adresový prostor, takže aplikace nemůže komponentu volat přímo. Tato situace se řeší prostřednictvím zástupného (proxy) objektu. Ten na straně aplikace zastupuje komponentu - převezme od aplikace argumenty volání, provede jejich serializaci (marshalling) a zajistí jejich přenos do adresového prostoru komponenty. Tam je připraven tzv. stub, jenž předaná data deserializuje a zajistí volání komponenty. Po provedení operace stub serializuje případné návratové hodnoty, předá je proxy na straně aplikace, provede se opět jejich deserializace a aplikace může pokračovat ve svém běhu.

Obrázek 4.2. COM objekt v EXE souboru

Proxy objekt zastupující komponentu na straně klientské aplikace a stub zajišťující komunikaci s aplikací na straně komponenty není třeba vytvářet ručně. Pro jejich automatické generování postačuje pouze znát rozhraní komponenty. Pro popis rozhraní se ve specifikaci COM používá jazyk MIDL, což je poněkud upravená verze standardizovaného jazyka IDL (Interface Description Language) používaného například v technologii CORBA. Překladem specifikace rozhraní se získá jednak hlavičkový soubor s definicí rozhraní, jednak implementace proxy objektu a stubu. Tím je programátor také osvobozen od nutnosti udržovat tyto tři složky vzájemně konzistentní.