close

Komponentní objektový model

Přejít na navigaci Přejít na hledání

Component Object Model (COM) je platforma společnosti Microsoft pro softwarové komponenty , představená v roce 1993 . Tato platforma umožňuje komunikaci mezi procesy a dynamickou tvorbu objektů v jakémkoli programovacím jazyce, který tuto technologii podporuje. Termín COM se ve světě vývoje softwaru často používá jako zastřešující termín pro technologie OLE, OLE Automation, ActiveX, COM+ a DCOM. Ačkoli COM byl představen v roce 1993, Microsoft nezdůrazňoval název COM až do roku 1997.

COM je v podstatě způsob implementace jazykově neutrálních objektů, takže je lze použít v jiných prostředích, než ve kterém byly vytvořeny, bez ohledu na hranice strojů. U dobře vytvořených komponent umožňuje COM opětovné použití objektů bez znalosti jejich interní implementace, protože nutí implementátory komponent poskytovat dobře definovaná rozhraní, která jsou oddělená od implementace. Různá sémantika alokace paměti je přizpůsobena tím, že objekty jsou odpovědné za jejich vlastní vytvoření a zničení prostřednictvím počtu odkazů. Můžete přetypovat mezi různými rozhraními objektu pomocí QueryInterface(). Preferovanou metodou dědičnosti v COM je vytváření dílčích objektů, na které jsou delegována volání metod (tzv. agregace).

Přestože tyto technologie byly implementovány na mnoha platformách, používají se primárně s programem Microsoft Windows . Očekává se, že COM bude alespoň do určité míry nahrazen Microsoftem .NET a podporou webových služeb prostřednictvím Windows Communication Foundation (WCF). Network DCOM používá proprietární binární formáty, zatímco WCF používá zprávy SOAP založené na XML . COM také soutěží s CORBA a JavaBeans jako systém softwarových komponent.

Technické detaily

Programátoři COM vytvářejí software pomocí softwarových komponent s podporou COM. Různé typy komponent jsou identifikovány pomocí ID typu (CLSID), což jsou globálně jedinečné identifikátory, neboli GUID. Každá komponenta COM odhaluje svou funkčnost prostřednictvím jednoho nebo více rozhraní. Různá rozhraní podporovaná komponentou se od sebe odlišují pomocí ID rozhraní (IID), což jsou také GUID.

Rozhraní COM mají implementace v různých jazycích, jako je C, C++, Visual Basic a několik skriptovacích jazyků implementovaných na platformě Windows. Veškerý přístup ke komponentám se provádí prostřednictvím metod rozhraní. To umožňuje techniky, jako je inter-processing, dokonce i programování mezi počítači (druhé prostřednictvím podpory DCOM).

Rozhraní

Všechny součásti COM musí implementovat alespoň standardní rozhraní IUnknown , a proto jsou všechna rozhraní COM odvozena od IUnknown . Rozhraní IUnknown se skládá ze tří metod: AddRef()a Release(), které implementují počítání referencí a řízení životního cyklu rozhraní; a QueryInterface(), které zadáním IID umožňuje volání načíst odkazy na různá rozhraní, která komponenta implementuje. Účinek QueryInterface()je podobný jako dynamic_cast <>v C++ nebo castingv C# a Javě.

Rozhraní komponenty COM jsou vyžadována pro zobrazení reflexních, symetrických a tranzitivních vlastností. Reflexní vlastnost odkazuje na schopnost volání na QueryInterface(), vzhledem k rozhraní s ID rozhraní, vrátit stejnou instanci rozhraní. Vlastnost symetrická odkazuje na skutečnost, že když je rozhraní B načteno z rozhraní A pomocí QueryInterface(), pak lze rozhraní A získat také z rozhraní B. Přechodná vlastnost je podobná vlastnosti symetrické, ale vyžaduje, aby pokud lze rozhraní B získat z A, a C zase od B, pak by mělo být rozhraní C dostupné od A.

Rozhraní se skládá z ukazatele virtuální funkce, který obsahuje seznam ukazatelů na funkce, které funkce deklarovaná v rozhraní implementuje, ve stejném pořadí, v jakém byly deklarovány v rozhraní. Tato technika předávání ukazatele funkce struktury je velmi podobná té, kterou používá OLE 1.0 ke komunikaci se svým knihovním systémem.

COM specifikuje mnoho dalších standardních rozhraní používaných k umožnění komunikace mezi komponentami. Jedním z nich je například IStream , který je určen pro komponenty, které mají sémantiku datového toku ( komponenta FileStream používaná ke čtení a zápisu souborů). Má očekávané metody čtení a zápisu pro provádění čtení a zápisu proudu. Dalším standardním rozhraním je IOleObject , které je určeno pro komponenty, které očekávají, že budou svázány nebo vložené do kontejneru. IOleObject obsahuje metody, které umožňují zúčastněným stranám určit velikost hranic obdélníkové komponenty, pokud komponenta podporuje operace jako 'Otevřít' , 'Uložit' a tak dále.

Třídy

Třída v COM se nazývá coclass , což je smluvní forma třídy Component Object . Coclass je způsob, jak COM definovat třídu v jazykově nezávislém, objektově orientovaném smyslu. Coclass poskytuje konkrétní implementaci jednoho nebo více rozhraní. V COM mohou být takové konkrétní implementace napsány v jakémkoli programovacím jazyce, který podporuje vývoj komponent COM, jako je C++, Visual Basic atd.

Jedním z největších příspěvků COM do vývojového světa Windows je povědomí o konceptu oddělení rozhraní od implementace. Toto povědomí nepochybně ovlivnilo způsob, jakým programátoři staví dnešní systémy. Rozšířením tohoto základního konceptu je koncept jednoho rozhraní, více implementací. To znamená, že za běhu se aplikace může rozhodnout vytvořit instanci rozhraní z jedné z několika konkrétních implementací.

Knihovny jazyků a typů definice rozhraní

Knihovny typů obsahují metadata , která představují typy COM. Tyto typy však musí být nejprve popsány pomocí jazyka MIDL ( Microsoft Interface Definition Language ). To je běžná praxe při vývoji komponenty COM, například když začínáte s definicí typů pomocí IDL. Soubor IDL je to, co poskytuje COM, což umožňuje vývojářům nezávisle definovat objektově orientované třídy, rozhraní, struktury, výčty a další uživatelem definované typy v jazyce. COM IDL je vzhledově podobný deklaracím C nebo C++ s přidáním klíčových slov jako „rozhraní“ a „knihovna“ pro definici rozhraní a kolekcí tříd. IDL také vyžaduje použití atributů v hranatých závorkách před deklaracemi k poskytnutí dalších informací, jako je GUID rozhraní a vztah mezi ukazatelem a parametry délky polí.

Soubor IDL je kompilován kompilátorem MIDL několika způsoby pro použití v různých jazycích. Pro C/C++ kompilátor MIDL generuje na kompilátoru nezávislou hlavičku obsahující definice struktury, které odpovídají virtuálním funkcím deklaraci rozhraní, a soubor C obsahující GUID deklarace rozhraní. Zdrojový kód C++ pro modul proxy může být také generován kompilátorem MIDL. Tento proxy obsahuje metody se zakázaným inzerováním pro převod volání COM na RPC, což DCOM povoluje.

Soubor IDL může být kompilátorem MIDL také zkompilován do knihovny typů (soubor .TLB). Binární metadata obsažená v knihovně jsou určena ke zpracování kompilátory jazyka a běhovým prostředím (VB, Delphi, .NET CLR atd.). Konečným výsledkem takového zpracování TLB je, že jsou vytvářeny jazykově specifické konstrukce, které reprezentují třídu COM definovanou v .TLB (a nakonec tu definovanou ve zdrojovém souboru IDL).

Počítání referencí

Nejdůležitější ze všech rozhraní COM, tj. IUnknown (od kterého se musí odvozovat všechna rozhraní COM), podporuje dva hlavní koncepty: dotazování na funkce (nebo rozhraní, která objekt implementuje) pomocí metody queryInterface()a správu životního cyklu objektu pomocí zahrnutí AddRef ()a Release (). Funkce počítání referencí a dotazování se vztahují na objekty (nikoli na každé rozhraní), a proto musí mít centralizovanou implementaci.

Specifikace COM vyžadují techniku ​​zvanou počítání referencí, aby se zajistilo, že různé objekty jsou živé, pokud existují klienti, kteří získali přístup k jednomu nebo více jejich rozhraním, a naopak, že stejný objekt je správně zlikvidován, když je veškerý kód odstraněn. přítomný. který používá objekt je s ním hotový a již jej nevyžaduje. Objekt COM je zodpovědný za uvolnění své vlastní paměti, jakmile se jeho počet odkazů sníží na nulu.

Pro své provedení si objekt COM obecně udržuje hodnotu, která se používá jako reference pro počítání. Při volání AddRef ()přes jakékoli rozhraní objektu se tato hodnota zvýší. Když se zavolá Release(), toto celé číslo se sníží. AddRef ()a Release ()jsou jedinými prostředky, kterými je klient objektu COM schopen ovlivnit jeho životní cyklus. Interní hodnota zůstává soukromým členem objektu COM a nikdy nebude přímo přístupná.

Instanciace

COM standardizuje proces vytváření instance (tj. vytváření) objektů COM tím, že vyžaduje použití třídy Factories . Pro každý objekt COM, který byl vytvořen, musí existovat dva související parametry:

  • Třída ID .
  • Tovární třída .

Každá třída COM nebo CoClass musí být spojena s jedinečným ID třídy (GUID). Musí být také spojen s vlastní třídou Factory (což je dosaženo použitím centralizovaného registru). Třída Factory je sama o sobě objektem COM. Je to objekt, který musí odhalit rozhraní IClassFactory nebo IClassFactory2 (poslední s podpůrnými licencemi). Odpovědností takového objektu je vytváření dalších objektů.

Třída Factory je obvykle obsažena ve stejném spustitelném kódu (tj. kódovém serveru) jako samotný objekt COM. Když je za účelem vytvoření cílového objektu volána třída Factory , cílem tohoto objektu je id třídy, které musí být poskytnuto. Takto třída Factory pozná, kterou třídu objektu má k instanci.

Jedna třída objektů Factory může vytvářet objekty více než jedné třídy. To znamená, že stejnou třídou objektů Factory mohou být vytvořeny dva objekty s různými ID třídy. To je však pro systém COM transparentní.

Delegováním odpovědnosti za vytvoření objektu na samostatný objekt je dosaženo vyšší úrovně abstrakce a vývojář má větší flexibilitu.

Aby klientské aplikace získaly třídy objektů Factory , musí je servery COM náležitě vystavit. Třída Factory je vystavena odlišně v závislosti na povaze kódu serveru. Server založený na knihovnách DLL musí exportovat globální funkci DllGetClassObject (). Server EXE, který je založen na třídě Factory , se za běhu registruje prostřednictvím funkce Windows API CoRegisterClassObject ().

Programování

COM je binární standard a může být vyvinut v jakémkoli programovacím jazyce , který je schopen porozumět a implementovat jeho definované binární datové typy a rozhraní.

Run-time knihovny (v extrémních situacích programátoři) jsou zodpovědné za vstup a výstup z prostředí COM, instanci a počítání referencí objektů COM, objekty pro dotazování na informace o verzi, kódování pro využití pokročilých verzí objektů.

Průhlednost aplikací a sítě

Objekty COM lze vytvářet instance a odkazovat na ně v rámci procesu, přes hranice procesu v počítači a přes síť pomocí technologie DCOM . Ukončení procesu a vzdálené objekty mohou používat serializaci k odesílání volání metod a vracení hodnot zpět a vpřed. Serializace je neviditelná pro objekt a kód používající objekt.

Kritika

Zpráva o čerpání

Když je STA inicializována, vytvoří skryté okno, které se používá pro směrování zpráv mezi byty a procesy. Toto okno by mělo mít pravidelně pumpovanou frontu zpráv. Tato konstrukce je známá jako zpráva bomba. V dřívějších verzích systému Windows by to mohlo způsobit selhání celého systému. Tento problém je obzvláště nepříjemný, protože některá rozhraní Windows API inicializují COM jako součást své aplikace, což způsobuje únik podrobností o implementaci.

Počítání referencí

Počítání odkazů v rámci COM může způsobit problémy, pokud jsou kruhově odkazovány dva nebo více objektů. Návrh aplikace to musí vzít v úvahu, aby objekty nebyly osiřelé.

Objekty mohou také ponechat aktivní počítání referencí, pokud je použitý model COM "sink case". Protože objekt, který událost spustí, potřebuje k reakci na událost odkaz na objekt, počet odkazů na objekt nikdy nedosáhne nuly.

DLL peklo

Protože umístění každé součásti je uloženo v umístění pro celý systém (registr Windows), může být nainstalována pouze jedna verze určité součásti. Proto COM těžce trpí peklem DLL , kde dvě nebo více aplikací vyžadují různé verze stejné komponenty.

Windows XP zavádí nový režim registrace objektů COM: "COM Free Registration". Tato služba umožňuje aplikacím, které potřebují instalovat objekty COM, uložit všechny informace registru potřebné pro registraci COM do adresáře požadavků, nikoli do globálního registru, kde se přísně vzato používá pouze jeden požadavek. DLL peklo, lze se mu vyhnout pomocí COM bez registru, jediným omezením je, že vyžaduje alespoň Windows XP nebo novější verze Windows a že by neměl být používán pro EXE, COM nebo systémové komponenty celého serveru, jako jsou MDAC, MSXML , DirectX nebo Internet Explorer.

Reference

  • Berger, Dan (2004). « COM: Stručný úvod » . Africká historie na About.com . Získáno 6. února 2006 . 
  • Microsoft Corp. (2006). " Component Object Model " . Archivováno z originálu dne 2006-03-18 . Získáno 6. února 2006 . 
  • Box, Don (1998). Základní COM . Addison-Wesley Object Technology Series . ISBN  0-201-63446-5 . 

Viz také

Externí odkazy