Component Object Model
A Component Object Model (COM), mely ActiveX-ként is ismert, a Microsoft által kifejlesztett technológia a komponens alapú fejlesztés támogatására, mely a szoftverek közti kommunikációt teszi lehetővé. Bár több platformon is megvalósították, elsősorban a Microsoft Windows operációs rendszerében használják. Az elődje az object linking and embedding (OLE) technológia volt, ma a COM szerepét a Microsoft .NET rendszer veszi át.
A COM architektúra fejlesztésében részt vevő egyik legjelentősebb gondolkodó Anthony Williams volt, aki a szoftver komponensek elméletének jelentőségét az Object Architecture: Dealing With the Unknown – or – Type Safety in a Dynamically Extensible Class (1988) és az On Inheritance: What It Means and How To Use It (1990) műveiben publikálta.
Történelem
A Microsoft korábbi objektum-alapú, beágyazott dokumentumok kezelésére tervezett technológiája az Object Linking and Embedding (OLE) 1.0 volt, mely a dynamic data exchange-en (DDE) alapult. A beágyazott dokumentumokra egy példa a Microsoft Wordbe beágyazott táblázat. A táblázat tartalmát az Excelben megváltoztatva a tartalom megváltozik a Wordben is, illetve Wordben is változtatható a táblázat tartalma. 1991-ben mutatták be a Microsoft Word for Windows és Excel alkalmazásokkal, és később hozzáadták a Windows alapfunkcióihoz 1992-ben, a 3.1-es verziótól kezdve. 1991-ben a Microsoft bemutatta a Visual Basic-vezérlőket (VBX) a Visual Basic 1.0-s verziójával.
1993-ban a Microsoft kiadta az OLE 2-t, valamint megalkotta a COM-ot az OLE 2 alatt működő objektummodellként. Míg az OLE 1 beágyazott dokumentumok kezelésére szolgált, addig a COM és az OLE 2 szoftverkomponensek kezelését célozta meg. 1994-ben bemutatták az OLE vezérlőket (OCX) a VBX vezérlők utódaként. Ezzel egy időben a Microsoft bejelentette, hogy az OLE 2-t csak „OLE”-nek kell hívni, az OLE többé nem betűszó, hanem a vállalat komponenstechnológiájának összefoglaló neve.
1996 elején a Microsoft elnevezte az OLE internettel kapcsolatos részét ActiveX-nek, aztán minden OLE technológiát ActiveX-nek kezdett hívni, kivéve a Microsoft Office-ban használt beágyazott dokumentumtechnológiát. Később ugyanebben az évben bemutatták a DCOM-ot válaszként a CORBA technológiára.
Bár a COM technológia 1993 óta használatban van, a Microsoft 1997 óta használja a COM megnevezést.
COM+
A Windows 2000 megjelenésével a COM is jelentősen továbbfejlődött, melynek neve COM+ lett. Ezzel egy időben a Microsoft nem tekintette a DCOM-ot külön entitásnak.
A COM+ egyik előnye a "komponens farmok" támogatása, valamint az automatikus tranzakciókezelés a Microsoft Transaction Server (MTS) segítségével. Egy megfelelően kódolt komponens újrafelhasználható az új hívásokkal, nem kell törölni a memóriából. A komponensek elosztottak is lehetnek (másik gépről hívhatóak), ami korábban csak a DCOM használatával volt elérhető.
DCOM
Lásd: Distributed Component Object Model
Áttérés COM-ról .NET-re
A Microsoft .NET Keretrendszer nagy részben feleslegessé teszi a COM platformot. Bár a COM használható technológia marad (és a Microsoft nem is tervezi a megszüntetését), a vállalat a marketing tevékenységét a .NET platformra fókuszálja.
A .NET rendelkezik korlátozott COM kompatibilitással, ami lehetővé teszi a COM használatát egy runtime callable wrapper (RCW, futtató környezet által meghívható burkoló osztály) megvalósításával, valamint a COM képes használni a .NET osztályokat a COM callable wrapper (CCW, COM által meghívható burkoló osztály) megvalósításával. Ráadásul a legtöbb COM+ szolgáltatás (mint a tranzakció-kezelés) még mindig fontos szerepet tölt be az enterprise .NET (nagyvállalati környezetbe szánt) alkalmazások létrehozása során.
ActiveX és az internetes biztonság
Az ActiveX vezérlők beágyazása az Internet Explorerbe olyan lehetőségeket is nyitott, melyek a számítógépes vírusok, trójai programok és kémprogramok elterjedéséhez vezettek. Ezen támadások jelentős részének terjedése nagyban függ az ActiveX-től. A Microsoft 1996-ban nyilvánította ki, hogy problémák vannak az ActiveX-szel, amikor Charles Fitzgerald, a Microsoft Java csapatának programmenedzsere a következőket mondta: "Ha biztonságban akarsz lenni a Neten, húzd ki a géped. […] Sosem állítottuk, hogy az ActiveX biztonságos." [1]
Technikai részletek
A COM programozók a szoftvereiket a COM feltételeinek megfelelő komponensekből építik fel. A különböző komponens típusok osztályazonosítókkal (class ID, CLSID) azonosíthatóak, melyek globálisan egyéni azonosítók, avagy GUID-ok. Minden COM komponens egy vagy több interfészen keresztül szolgáltat funkciókat. A különböző, komponens által támogatott interfészek interfész azonosítókkal különböztethetőek meg egymástól (interface ID, IID), melyek szintén GUID-ok.
A COM interfészeknek több programozási nyelvhez van kötése , például C, C++, D, Visual Basic, valamint több Windows platformon implementált script nyelvhez. Minden hozzáférés a komponensekhez az interfészek metódusain keresztül történik. Ez olyan lehetőségeket kínál, mint a folyamatközi illetve számítógépközi programozás (az utóbbi DCOM segítségével valósul meg).
Minden komponensnek meg kell valósítania (legalább) a szabványos IUnknown interfészt. Tulajdonképpen minden COM interfész az IUnknown
interfészből származik. Az IUnknown interfész három metódusból áll: az AddRef()
és Release()
függvények az interfészek referencia számlálását és élettartamát valósítják meg; valamint a QueryInterface()
, ami egy IID, ami mutatókat ad vissza a különböző komponensek által megvalósított interfészekre. A QueryInterface()
hatása hasonló a dynamic_cast<>
-hoz a C++ -ban, illetve a cast-hoz a D, Java vagy C# nyelvben.
A COM több egyéb szabványos interfészt is definiál, melyek komponens-közi kommunikációt tesznek lehetővé. Például az egyik ilyen interfész az IStream
, melyet adatfolyam szemantikát alkalmazó komponensek valósítanak meg (például a FileStream
komponens, ami fájlokat ír és olvas). A Read
és Write
metódusokkal rendelkezik folyam olvasásra és írásra. Másik szabványos interfész az IOleObject
, melyet olyan komponensek valósítanak meg, melyek valószínűleg konténerbe lesznek beágyazva vagy belinkelve. Az IOleObject
olyan metódusokkal rendelkezik, melyek lehetővé teszik a komponens térigényét; a komponens támogatja-e az olyan műveleteket, mint a megnyitás, mentés stb.
Egy komponens futó példányát úgy lehet létrehozni, hogy a COM futtató könyvtártól kérünk egy class factoryt ("osztálygyár" minta), és megadjuk a CLSID-jét a kívánt komponensnek. Ezután utasítjuk a class factoryt a kívánt komponens egy példányának létrehozására, megadva egy IID-t egy bizonyos a komponens által megvalósított interfész kinyerésére. A kliens ezután meghívja az interfész metódusait, végül elengedi az interfészt a Release()
metódus meghívásával.
A komponensek COM típuskönyvtárakkal (COM Type Library) tudják önmagukat leírni. A típuskönyvtár olyan információkat tartalmaz, mint a komponens CLSID-je, a komponens által megvalósított interfészek IID-ja, valamint ezen interfészek metódusainak leírása. A típuskönyvtárakat jellemzően RAD környezetek használják, mint a Visual Basic vagy Visual Studio, hogy segítsék a fejlesztőt a komponensek létrehozása során.
A COM programozók felelősek a COM környezetbe való belépésért és az onnan való kilépésért, a COM objektumok inicializálásáért és referenciaszámlálásáért, az objektumok verzióinformációjának lekérdezéséért, a fejlettebb objektum verziók lehetőségeit kihasználó kódért és a visszalépésért az újabb verzió hiányában. A COM osztályokat Globálisan egyedi azonosítók (GUID) azonosítják. A COM osztályokat regisztrálni kell a Regisztrációs adatbázisban. COM objektumokra folyamaton belül, folyamatok között és hálózaton keresztül lehet hivatkozni. A COM objektum figyeli a saját referenciaszámlálóját, és felszabadítja önmagát, ha a számláló értéke nulla.