Komponentni objektni model - Component Object Model

Od Wikipedia, Slobodna Enciklopedija

Pin
Send
Share
Send

Komponentni objektni model (COM) je binarno sučelje standard za softverske komponente uveo je Microsoft 1993. Koristi se za omogućavanje međuprocesna komunikacija objekt stvaranje u velikom rasponu od programski jezici. COM je osnova za nekoliko drugih Microsoftovih tehnologija i okvira, uključujući OLE, OLE automatizacija, Objekt pomoćnika preglednika, ActiveX, COM +, DCOM, Windows ljuska, DirectX, UMDF i Vrijeme izvođenja sustava Windows. Suština COM-a je jezično neutralan način implementacije objekata koji se mogu koristiti u okruženjima različitim od onog u kojem su stvoreni, čak i preko granica stroja. Za dobro napisane komponente, COM dopušta ponovnu upotrebu objekata bez znanja o njihovoj internoj implementaciji, jer primorava implementatore komponenata da pruže dobro definirane sučelja koji su odvojeni od provedbe. Različita semantika alokacije jezika prilagođava se stvaranjem predmeta odgovornih za vlastito stvaranje i uništavanje brojanje referenci. Lijevanje pretvorbe tipa između različitih sučelja objekta postiže se pomoću QueryInterface metoda. Poželjna metoda "nasljeđivanja" unutar COM-a je stvaranje pod-objekata kojima se delegiraju "pozivi" metode.

COM je tehnologija sučelja definirana i implementirana kao standard samo na Microsoft Windows i Appleova Temeljna zaklada 1.3 i noviji dodatak sučelje za programiranje aplikacija (API).[1] Potonji samo implementira podskup cijelog COM sučelja.[2] Za neke je programe COM barem barem donekle zamijenio Microsoft .NET okvir i podrška za Web usluge kroz Windows Communication Foundation (WCF). Međutim, COM objekti mogu se koristiti sa svim .NET jezicima putem .NET-a COM Interop. Umreženi DCOM koristi binarni vlasnički formati, dok WCF potiče upotrebu XML-na osnovi SAPUN razmjene poruka. COM je vrlo sličan ostalim komponentni softver tehnologije sučelja, kao što su CORBA i Poduzeće JavaBeans, iako svaka ima svoje snage i slabosti. Za razliku od C ++, COM pruža stabilnu binarno sučelje aplikacije (ABI) koji se ne mijenja između izdanja kompajlera.[3] To čini COM sučelja atraktivnim za objektno orijentirane C ++ knjižnice koje trebaju koristiti klijenti kompilirani pomoću različitih verzija kompajlera.

Povijest

Jedna od prvih metoda međuprocesna komunikacija u sustavu Windows bio Dinamička razmjena podataka (DDE),[4] prvi put predstavljen 1987. godine,[5] koji je omogućavao slanje i primanje poruka u takozvanim "razgovorima" između aplikacija. Antony Williams, koji je sudjelovao u stvaranju COM arhitekture, kasnije je u Microsoftu distribuirao dva interna članka koji su prihvatili koncept softverskih komponenata: Arhitektura objekta: Suočavanje sa sigurnošću nepoznatog - ili - tipa u dinamički proširivoj knjižnici razreda 1988. i O nasljeđivanju: što to znači i kako ga koristiti 1990. To je stvorilo temelj mnogih ideja iza COM-a. Povezivanje i ugrađivanje objekata (OLE), prvi Microsoftov objektni okvir, izgrađen je na vrhu DDE-a i dizajniran posebno za složeni dokumenti. Uvedeno je sa Word za Windows i Excel 1991., a kasnije je uključen u sustav Windows, počevši s verzijom 3.1. 1992. Primjer složenog dokumenta je proračunska tablica ugrađeno u dokument za Word za Windows: kako se u proračunsku tablicu unose promjene u programu Excel, one se automatski pojavljuju u programu Word.

1991. Microsoft je predstavio Visual Basic proširenja (VBX) sa Visual Basic 1.0. VBX je pakirano proširenje u obliku knjižnica dinamičkih veza (DLL) koji omogućuje grafičko postavljanje predmeta u oblik i upravljanje njima Svojstva i metode. Oni su kasnije prilagođeni za upotrebu u drugim jezicima kao što su Vizualni C ++. 1992. kada je verzija 3.1 sustava Windows je objavljen, Microsoft je objavio OLE 2 sa svojim temeljnim sadržajem objektni model. COM Binarno sučelje aplikacije (ABI) bio je isti kao i MAPI ABI (objavljen 1992.), i kao da je zasnovan na MSRPC i u konačnici na Otvori grupu's DCE / RPC. Iako je OLE 1 bio usredotočen na složene dokumente, COM i OLE 2 dizajnirani su za adresiranje softverskih komponenti općenito. Tekstualni razgovori i Windows poruke pokazali su se nedovoljno fleksibilnima da omogućuju dijeljenje značajki aplikacija na robustan i proširiv način, pa je COM stvoren kao novi temelj, a OLE promijenjen u OLE2. 1994. god OLE prilagođene kontrole (OCX) predstavljeni su kao nasljednik VBX kontrola. Istodobno, Microsoft je izjavio da će OLE 2 biti poznat samo kao "OLE", te da OLE više nije kratica, već naziv za sve tehnologije komponenata tvrtke. Početkom 1996. godine Microsoft je pronašao novu uporabu za OLE Custom Controls, proširivši mogućnost njihovog web preglednika da prezentira sadržaj, preimenujući neke dijelove OLE-a koji se odnose na Internet "ActiveX", i postupno preimenovao sve OLE tehnologije u ActiveX, osim tehnologije složenih dokumenata koja je korištena u Microsoft Office. Kasnije te godine Microsoft je proširio COM za suradnju preko mreže DCOM.[6]

Povezane tehnologije

COM je bila glavna platforma za razvoj softvera za Windows i kao takva utjecala je na razvoj brojnih pratećih tehnologija. Na njega su također snažno utjecale ranije tehnologije.

DDE

COM zamijenjen DDE kao preferirani oblik međuprocesne komunikacije.

DCE / RPC i MSRPC

Kao višejezični komponentni model, COM se za opis objekata i pridruženih funkcija oslanja na jezik definicije sučelja ili IDL. COM IDL zasnovan je uvelike na značajkama bogatom DCE / RPC IDL-om, s objektno orijentiranim proširenjima. Microsoftova vlastita implementacija DCE / RPC, poznata kao MSRPC, u velikoj se mjeri koristi kao primarni međuprocesni komunikacijski mehanizam za Windows NT usluge i interne komponente, što ga čini očitim izborom temelja.

DCOM

DCOM (Distribuirani COM) proširio je domet COM-a sa puke podrške jednom korisniku s odvojenim programima koji komuniciraju na Windows radnoj površini, na aktiviranje objekata koji se izvode u različitim sigurnosnim kontekstima i na različitim računalima u mreži. Ovim su dodane potrebne značajke za konfiguriranje koji korisnici imaju ovlasti za stvaranje, aktiviranje i pozivanje objekata, za identificiranje korisnika koji poziva, kao i određivanje potrebne enkripcije za sigurnost poziva.

COM +

Da bi Microsoft pružio programerima podršku za distribuirane transakcije, udruživanje resursa, nepovezane aplikacije, objavljivanje događaja i pretplata, bolje upravljanje memorijom i procesorom (niti), kao i pozicioniranje Windows-a kao alternative drugim operativnim sustavima na razini poduzeća, Microsoft je predstavio tehnologiju tzv. Microsoftov transakcijski poslužitelj (MTS) na Windows NT 4. Sa sustavom Windows 2000, to značajno proširenje COM-a ugrađeno je u operativni sustav (za razliku od niza vanjskih alata koje pruža MTS) i preimenovan COM +. Istodobno, Microsoft je de-naglasio DCOM kao zasebna cjelina. Komponentama koje su koristile COM + usluge izravniji je rukovanje dodanim slojem COM +, posebno podrškom za presretanje operacijskog sustava. U prvom izdanju MTS-a prisluškivano je presretanje - instalacija MTS komponente izmijenila bi Registar sustava Windows da pozovete MTS softver, a ne komponentu izravno. Windows 2000 također je revidirao aplikaciju upravljačke ploče Component Services koja se koristi za konfiguriranje COM + komponenata.

Prednost COM + bila je što se mogao pokretati u "farmama komponenata". Primjeri komponente, ako su pravilno kodirani, mogu se objediniti i ponovno upotrijebiti novim pozivima na njezinu inicijalizacijsku rutinu bez istovara iz memorije. Komponente se također mogu distribuirati (pozivati ​​s drugog stroja). COM + i Microsoft Visual Studio pružao je alate koji olakšavaju generiranje proxyja na strani klijenta, pa iako je DCOM korišten za daljinski poziv, programerima je to bilo lako učiniti. COM + je također predstavio pretplatnički / izdavački mehanizam događaja tzv COM + Događaji, i pružio novi način iskorištavanja MSMQ (tehnologija koja pruža asinkronu razmjenu poruka među aplikacijama) s komponentama tzv Komponente u redu. COM + događaji proširuju COM + programski model kako bi podržao kasno ograničene (vidi Kasno vezivanje) događaji ili pozivi metoda između izdavača ili pretplatnika i sustava događaja.

.NETO

Microsoft .NET pruža sredstva kako za pružanje komponentne tehnologije, tako i za interakciju s COM + (putem COM-interop-sklopova); .NET pruža omote za većinu najčešće korištenih COM kontrola. Microsoft .NET skriva najviše detalja od stvaranja komponenata i stoga olakšava razvoj. .NET može iskoristiti COM + putem prostora imena System.EnterpriseServices, a nekoliko usluga koje COM + pruža duplicirane su u nedavnim izdanjima .NET-a. Na primjer, prostor imena System.Transactions u .NET pruža klasu TransactionScope koja pruža upravljanje transakcijama bez pribjegavanja COM +. Slično tome, komponente u redu može se zamijeniti sa Windows Communication Foundation s an MSMQ prijevoz. (Međutim, MSMQ je izvorna COM komponenta.) Postoji ograničena podrška za povratnu kompatibilnost. COM objekt može se koristiti u .NET-u implementiranjem a Runtime pozivajući omot (RCW)[7] .NET objekti koji odgovaraju određenim ograničenjima sučelja mogu se koristiti u COM objektima pozivanjem a COM omot koji se može pozvati (CCW).[8] Obje strane s COM i .NET strane objekti koji koriste drugu tehnologiju pojavljuju se kao izvorni objekti. Vidjeti COM Interop.WCF (Windows Communication Foundation) olakšava brojne COM-ove izazove daljinskog izvršavanja. Na primjer, omogućuje lakše transparentno marširanje objekata prema vrijednosti preko granica procesa ili stroja.

Vrijeme izvođenja sustava Windows

Microsoftovo novo Windows Runtime (ili WinRT, s kojim se ne smije brkati Windows RT) model programiranja i primjene u osnovi je API zasnovan na COM-u, iako se oslanja na poboljšani COM. Zbog svoje COM-slične osnove, Windows Runtime omogućuje relativno lako povezivanje s više jezika, baš kao što to čini COM, ali u osnovi je neupravljani, izvorni API. Definicije API-ja su, međutim, pohranjene u ".winmd" datotekama, koje su kodirane u formatu metapodataka ECMA 335, isti CLI metapodaci format koji .NET koristi s nekoliko izmjena. Ovaj uobičajeni format metapodataka omogućuje znatno manje dodatnih troškova od P / Invoke kada se WinRT poziva iz .NET aplikacija i njegova je sintaksa mnogo jednostavnija.

Sigurnost

COM i ActiveX komponente izvode se kao izvorni kod na korisnikovom računalu, bez izoliranog okruženja. Stoga je malo ograničenja onoga što kôd može učiniti. Prethodna praksa ugrađivanja ActiveX komponenata na web stranice s Internet Explorer je dakle dovelo do problema s zlonamjerni softver infekcije. Microsoft je prepoznao problem s ActiveX-om još 1996. godine kada je Charles Fitzgerald rekao: "Nikad nismo tvrdili da je ActiveX suštinski siguran".[9] Nedavno[kada?] verzije Internet Explorera pozivaju korisnika prije instaliranja ActiveX kontrola, omogućujući mu da onemogući instalaciju kontrola s web mjesta kojima korisnik ne vjeruje. ActiveX kontrole su potpisao s digitalni potpisi zajamčiti njihovu autentičnost. Također je moguće potpuno onemogućiti ActiveX kontrole ili dopustiti samo nekoliko odabranih. Transparentna podrška za izvanprocesne COM poslužitelje i dalje promiče sigurnost softvera u smislu izolacija procesa. To može biti korisno za razdvajanje podsustava velike primjene u zasebne procese. Izolacija procesa ograničava korupciju države u jednom procesu da negativno utječe na integritet drugih procesa, jer oni komuniciraju samo putem strogo definiranih sučelja. Dakle, samo pogođeni podsustav treba ponovno pokrenuti kako bi se vratilo valjano stanje. To nije slučaj za podsustave unutar istog procesa, gdje a skitnica pokazivač u jednom podsustavu može nasumično pokvariti druge podsustave.

Tehnički detalji

COM programeri grade svoj softver koristeći COM-svjesne komponente. Različite vrste komponenata identificiraju se ID-jevima klasa (CLSID), koji jesu Globalno jedinstveni identifikatori (GUID-ovi). Svaka COM komponenta izlaže svoju funkcionalnost kroz jednu ili više njih sučelja. Različita sučelja koja podržava komponenta međusobno se razlikuju pomoću ID-ova sučelja (IID), koji su također GUID-ovi. COM sučelja imaju uvezi na nekoliko jezika, kao npr C, C ++, Visual Basic, Delfi, Piton[10][11] i nekoliko skriptnih jezika implementiranih na Windows platformi. Sav pristup komponentama vrši se putem metode sučelja. To omogućuje tehnike poput međuprocesnog ili čak inter-računalnog programiranja (potonje pomoću podrške DCOM-a).

Sučelja

Sve COM komponente implementiraju Nepoznato (prilagođen) sučelje, koje izlaže metode za brojanje referenci i pretvorba tipa (lijevanje). A prilagođen IUnknown sučelje sastoji se od pokazivača na tablica virtualne metode koji sadrži popis pokazivača na funkcije koje implementiraju funkcije deklarirane u sučelju, istim redoslijedom kojim su deklarirane u sučelju. Općeniti troškovi prizivanja u procesu stoga su usporedivi s pozivima virtualnih metoda u C ++. Pored toga prilagođen sučelja, COM također podržava otprema sučelja koja nasljeđuju od IDispatch. Podrška dispečerskih sučelja kasno vezivanje za OLE automatizacija. Ovo dopušta otprema sučeljima kojima se izvorno pristupa iz šireg raspona programskih jezika nego prilagođen sučelja.

Nastava

COM klasa ("coclass") konkretna je implementacija jednog ili više sučelja i jako podsjeća na klase u objektno orijentirano programiranje Jezici. Predavanja se kreiraju na temelju njihovog ID-a predmeta (CLSID) ili na temelju njihovog programskog identifikacijskog niza (progid). Kao i mnogi objektno orijentirani jezici, COM pruža odvajanje sučelja od implementacije. Ova je razlika posebno snažna u COM-u, gdje se objektima ne može pristupiti izravno, već samo putem njihovih sučelja. COM također ima podršku za višestruke implementacije istog sučelja, tako da klijenti na vrijeme izvođenja može odabrati koju implementaciju sučelja će stvoriti.

Definicija sučelja Biblioteke jezika i tipova

Biblioteke tipova sadrže metapodatke koji predstavljaju COM tipove. Ove su vrste opisane pomoću Jezik definicije Microsoftovog sučelja (MSIDL / IDL). IDL datoteke definiraju objektno orijentirane klase, sučelja, strukture, nabrajanja i druge korisnički definirane tipove na jezik neovisan način. IDL je izgledom sličan C ++ deklaracijama s nekim dodatnim ključnim riječima kao što su "sučelje" i "knjižnica" za definiranje sučelja i kolekcija klasa. IDL također podržava upotrebu zagradnih atributa prije deklaracija kako bi pružio dodatne informacije, poput GUID-ova sučelja i odnosa između parametara pokazivača i polja duljine. IDL datoteke kompajlira MIDL sastavljač. Za C / C ++, MIDL kompajler generira datoteku zaglavlja neovisnu o kompajleru koja sadrži definicije struktura kako bi odgovarala vtbls deklariranih sučelja i C datoteka koja sadrži deklaracije sučelja GUID-ovi. C ++ izvorni kod za proxy modul također može generirati MIDL prevodilac. Ovaj proxy sadrži kitove metode za pretvaranje COM poziva u pozivi udaljenih procedura kako bi se DCOM omogućio za komunikaciju izvan procesa. IDL datoteke također može kompajlirati MIDL kompajler u knjižnicu tipova (TLB). TLB datoteke sadrže binarne metapodatke koje različiti jezički kompajleri i runtime okruženja mogu obrađivati ​​(npr. VB, Delphi, .NET itd.) Kako bi generirali konstrukcije specifične za jezik koji predstavljaju COM tipove definirane u TLB-u. Za C ++ ovo će pretvoriti TLB natrag u njegov IDL prikaz.

COM kao objektni okvir

Budući da je COM runtime framework, tipovi moraju biti pojedinačno prepoznatljivi i specificirani za vrijeme izvođenja. Da biste to postigli, globalno jedinstveni identifikatori (GUID) se koriste. Svaka COM vrsta određena je svojim GUID-om za identifikaciju tijekom izvođenja. Kako bi informacije o COM vrstama bile dostupne i tijekom vremena kompajliranja i tijekom izvođenja, COM koristi knjižnice tipova. Kroz učinkovitu upotrebu knjižnice tipa taj COM ostvaruje svoje mogućnosti kao dinamički okvir za interakciju objekata.

Razmotrite sljedeći primjer definicije koklase u IDL-u:

coclass SomeClass {[zadano] sučelje ISomeInterface;};

Gornji fragment koda deklarira COM klasu imenovanu Neka klasa koja implementira sučelje nazvano ISomeInterface.

To je konceptualno ekvivalentno definiranju sljedeće klase C ++:

razred Neka klasa : javnost ISomeInterface {  ...  ...};

gdje je ISomeInterface C ++ čista virtualna klasa (ponekad se naziva i apstraktna osnovna klasa).

IDL datoteke koje sadrže COM sučelja i klase kompajliraju se u datoteke knjižnica tipova (TLB), koje klijenti mogu kasnije raščlaniti tijekom izvođenja kako bi utvrdili koja sučelja objekt podržava i pozvali metode sučelja objekta.

U C ++-u su COM objekti instancirani s CoCreateInstance funkcija koja uzima ID klase (CLSID) i ID sučelja (IID) kao argumente. Instanciranje Neka klasa može se provesti na sljedeći način:

ISomeInterface* sučelje_ptr = NULL;HRESULT hr = CoCreateInstance(CLSID_SomeClass, NULL, CLSCTX_ALL,                              IID_ISomeInterface, (poništiti**)&sučelje_ptr);

U ovom se primjeru COM podsustav koristi za dobivanje pokazivača na objekt koji se implementira ISomeInterface sučelje i potrebna je posebna primjena ovog sučelja za CLSID_SomeClass.

Brojanje referenci

Svi COM objekti koriste se brojanje referenci za upravljanje životnim vijekom predmeta. Brojeve referenci kontroliraju klijenti putem AddRef i Otpustite metode u obveznom sučelju IUnknown koje implementiraju svi COM objekti. COM objekti su tada odgovorni za oslobađanje vlastite memorije kad broj referenci padne na nulu. Određeni jezici (npr. Visual Basic) omogućuju automatsko brojanje referenci tako da programeri COM objekata ne moraju izričito održavati bilo koji unutarnji brojač referenci u svojim izvornim kodovima. U C ++, koder može izvesti eksplicitno brojanje referenci ili ih koristiti pametni pokazivači za automatsko upravljanje brojanjem referenci.

Slijede smjernice za vrijeme pozivanja AddRef i Otpustite na COM objektima:

  • Funkcije i metode koje vraćaju reference sučelja (putem povratne vrijednosti ili putem parametra "out") povećavaju broj referenci vraćenog objekta prije vraćanja.
  • Otpustite mora se pozvati na pokazivaču sučelja prije nego što se pokazivač prepiše ili izađe iz opsega.
  • Ako se kopija napravi na referentnom pokazivaču sučelja, AddRef treba pozvati na tom pokazivaču.
  • AddRef i Otpustite mora se pozvati na specifičnom sučelju na koje se upućuje, jer objekt može implementirati brojeve referenci po sučelju kako bi se dodijelili unutarnji resursi samo za sučelja na koja se upućuje.

Nisu svi pozivi za brojanje referenci poslani udaljenim objektima preko žice; proxy zadržava samo jednu referencu na udaljenom objektu i održava vlastiti lokalni broj referenci. Kako bi pojednostavio COM razvoj, Microsoft je predstavio ATL (Active Template Library) za programere C ++. ATL osigurava COM razvojnu paradigmu više razine. Također štiti programere COM klijentskih aplikacija od potrebe da izravno održavaju brojanje referenci pružanjem pametni pokazivač predmeta. Ostale knjižnice i jezici koji su COM-svjesni uključuju Microsoft Foundation Classes, VC Podrška za kompajler COM,[12] VBScript, Visual Basic, ECMAScript (JavaScript) i Borland Delphi.

Programiranje

COM je jezik agnostik binarni standard koji se može razviti u bilo kojem programskom jeziku koji je sposoban razumjeti i implementirati svoje binarno definirane vrste podataka i sučelja. COM implementacije odgovorne su za ulazak i izlazak iz COM okruženja, instanciranje i brojanje referenci COM objekata, ispitivanje objekata za podržana sučelja, kao i rukovanje pogreškama. Kompajler Microsoft Visual C ++ podržava proširenja za C ++ jezik koji se naziva C ++ atributi.[13] Ova su proširenja osmišljena kako bi pojednostavila razvoj COM-a i uklonila velik dio vodovodnog koda potrebnog za implementaciju COM poslužitelja u C ++.[14]

Korištenje registra

U sustavu Windows COM klase, sučelja i knjižnice tipova navedeni su GUID-ovima u registar, pod, ispod HKEY_CLASSES_ROOT CLSID za nastavu i HKEY_CLASSES_ROOT Sučelje za sučelja. COM knjižnice koriste registar da pronađu ispravne lokalne knjižnice za svaki COM objekt ili mrežno mjesto za udaljenu uslugu.

COM bez registracije

COM bez registracije (RegFree COM) tehnologija je predstavljena sa Windows XP koji omogućuje komponentni objektni model (COM) komponente za pohranu aktivacije metapodaci i CLSID (Razred iskaznica) za komponentu bez upotrebe registar. Umjesto toga, metapodaci i CLSID-ovi klasa implementiranih u komponenti deklarirani su u skupni manifest (opisano pomoću XML), pohranjena ili kao resurs u izvršnoj datoteci ili kao zasebna datoteka instalirana s komponentom.[15] To omogućuje instaliranje više verzija iste komponente u različite direktorije, opisane vlastitim manifestima, kao i XCOPY postavljanje.[16] Ova tehnika ima ograničenu podršku za EXE COM poslužitelje[17] i ne može se koristiti za komponente sustava poput MDAC, MSXML, DirectX ili Internet Explorer.

Tijekom učitavanja aplikacije, Windows loader traži manifest.[18] Ako je prisutan, loader dodaje podatke iz njega u kontekst aktivacije.[16] Kada tvornica COM klase pokuša instancirati klasu, prvo se provjerava kontekst aktivacije da li se može pronaći implementacija za CLSID. Samo ako traženje ne uspije je registar skenirano.[16]

Ručno instanciranje COM objekata

COM objekti se također mogu kreirati ručno, s obzirom na put do DLL turpija i vodič predmeta. To ne zahtijeva registraciju DLL-a ili GUID-a u registru sustava i ne koristi datoteke manifesta. COM DLL izvozi funkciju nazvanu DllGetClassObject. Pozivanje DllGetClassObject sa željenim GUID-om i IID_IClassFactory pruža instancu tvornički objekt. Tvornički objekt ima metodu CreateInstance, koja može stvoriti instance objekta kojem je dodan GUID sučelja.[19] To je isti postupak koji se interno koristi prilikom stvaranja instanci registriranih COM komponenti.[20]

Ako stvoreni COM objekt instancira drugi COM objekt koristeći generički CoCreateInstance API, pokušat će to učiniti na uobičajeni generički način, koristeći datoteke registra ili manifesta. Ali može stvoriti unutarnje objekte (koji se uopće ne mogu registrirati) i podijeliti reference na sučelja, koristeći svoje vlastito privatno znanje.

Prozirnost procesa i mreže

COM objekti mogu se transparentno instancirati i referencirati iz istog procesa (u procesu), preko granica procesa (izvan procesa) ili na daljinu preko mreže (DCOM). Korištenje izvanprocesnih i udaljenih objekata marširanje za serializiranje poziva metode i vraćanje vrijednosti preko granica procesa ili mreže. To je marširanje nevidljivo za klijenta koji pristupa objektu kao da je lokalni objekt u procesu.

Provlačenje niti

U COM-u se navoja obrađuje kroz koncept poznat kao apartmani.[21] Pojedinačni COM objekt živi u točno jednom stanu, koji može biti jednonitni ili višenitni. Postoje tri vrste stanova u COM-u: Jednostruki Apartman (STA), Apartman s više navoja (MTA), i Navoj Neutralni apartman (NA). Svaki stan predstavlja jedan mehanizam pri kojem se unutarnje stanje objekta može sinkronizirati kroz više niti. Proces se može sastojati od više COM objekata, od kojih neki mogu koristiti STA, a drugi mogu koristiti MTA. Sve niti koje pristupaju COM objektima slično žive u jednom stanu. Izbor stana za COM objekte i niti određuje se tijekom izvođenja i ne može se mijenjati.

Tip stanaOpis
Apartman s jednim navojem[22] (STA), (ThreadingModel =Apartman)Jedna nit posvećena je izvršavanju metoda objekta. U takvom su rasporedu pozivi metoda iz niti izvan stana marširani i automatski ih sustav stavlja u red (putem standardnog reda poruka za sustav Windows). Dakle, COM vrijeme izvođenja omogućuje automatsku sinkronizaciju kako bi se osiguralo da se svaki poziv metode objekta uvijek izvrši do kraja prije nego što se pozove drugi. Stoga programer ne treba brinuti zbog zaključavanja niti ili uvjeta utrke.
Apartman s više navoja[23] (MTA), (ThreadingModel =Besplatno)COM vrijeme izvođenja ne pruža sinkronizaciju, a više niti može istovremeno istodobno pozivati ​​COM objekte. COM objekti stoga trebaju izvršiti vlastitu sinkronizaciju kako bi spriječili istodobni pristup više niti da uzrokuje stanje utrke. Pozivi na MTA objekt iz niti u STA-u također su marširani.
Dinamički određen stan (ThreadingModel =Oba)U Oba apartmanski način, poslužitelj prilikom odabira objekta automatski odabire STA ili MTA kako bi odgovarao vrsti apartmana pozivne niti.[24] Ovo može biti korisno kako bi se izbjeglo nerazvrstavanje dodatnih troškova kada MTA poslužiteljima pristupa STA nit.
Navoj Neutralni apartman (NA), (ThreadingModel =Neutralno)Poseban stan bez dodijeljenih niti. Kad STA ili MTA nit u istom procesu pozove objekt NA, tada pozivajuća nit privremeno napušta svoj stan i izvršava kôd izravno u NA bez ikakvog prebacivanja niti.[25] Stoga se NA može smatrati optimizacijom za učinkovite pozive metode međuodjela.

Niti i predmeti koji pripadaju istom stanu slijede ista pravila pristupa nitima. Pozivi metoda koji se upućuju unutar istog stana izvode se stoga izravno bez ikakve pomoći COM-a. Pozivi metodama upućeni u svim stanovima postižu se razvrstavanjem. To zahtijeva upotrebu opunomoćenika i kvara.

Kritike

Budući da COM ima prilično složenu implementaciju, programeri mogu biti ometeni nekim od problema s "vodovodom".

Pumpanje poruka

Kada se STA inicijalizira, stvara skriveni prozor koji se koristi za usmjeravanje poruka između stanova i procesa. Redoslijed poruka ovaj prozor mora redovito "pumpati". Ova je konstrukcija poznata kao "pumpa za poruke". U ranijim verzijama Windowsa, ako to ne učine, moglo bi doći do zastoja u cijelom sustavu. Ovaj problem kompliciraju neki Windows API-ji koji inicijaliziraju COM kao dio njihove implementacije, što uzrokuje" curenje "detalja o implementaciji.

Brojanje referenci

Brojanje referenci unutar COM-a može stvoriti probleme ako su dva ili više objekata kružno referencirano. Dizajn aplikacije mora to uzeti u obzir kako objekti ne bi ostali bez roditelja. Objektima se također može ostaviti aktivno brojanje referenci ako se koristi COM model "sudopera događaja". Budući da je objektu koji aktivira događaj potrebna referenca na objekt koji reagira na događaj, broj referenci potonjeg nikada neće doseći nulu. Referentni ciklusi obično se prekidaju pomoću prekida ili izvan podijeljenih identiteta. U tehnici završetka izvan pojasa, objekt izlaže metodu koja ga, kada ga pozovu, prisiljava da baci svoje reference na druge objekte, čime se prekida ciklus. U tehnici podijeljenog identiteta, jedna implementacija izlaže dva odvojena COM objekta (također poznata kao identiteti). Ovo stvara a slaba referenca između COM objekata, sprečavajući referentni ciklus.

DLL Pakao

Budući da su COM komponente u procesu implementirane u DLL datoteke, a registracija omogućuje samo jednu verziju po CLSID-u, u nekim bi situacijama mogle biti predmet "DLL Pakao"efekt. Sposobnost COM bez registracije uklanja ovaj problem za komponente u procesu; COM bez registracije nije dostupan za izvanprocesne poslužitelje.

Vidi također

Bilješke

  1. ^ "Arhiva dokumentacije". developer.apple.com.
  2. ^ "Dodaci i Microsoftov COM". Apple Inc. Preuzeto 5. listopada, 2010.
  3. ^ Microsoftov forum: Binarna kompatibilnost u verzijama Visual C ++
  4. ^ "O mrežnom DDE-u - Windows aplikacije". Microsoft.com. 30. svibnja 2018.
  5. ^ "Tehnika izvršavanja koda daje prednost dinamičkoj razmjeni podataka". McAfee.com. 27. listopada 2017.
  6. ^ "draft-brown-dcom-v1-spec-03 - Protokol distribuiranih komponenata objektnog modela - DCOM / 1.0". datatracker.ietf.org. Preuzeto 29. kolovoza, 2019.
  7. ^ rpetruša. "Runtime pozivajući omot". msdn.microsoft.com.
  8. ^ rpetruša. "COM omot koji se može nazvati". msdn.microsoft.com.
  9. ^ Steinberg, Jill (1. ožujka 1997.). "Konkurentske komponente čine bodljike paneliste". JavaWorld. Preuzeto 2020-07-16.
  10. ^ "indeks dokumentacije win32com". docs.activestate.com.
  11. ^ "Python i COM". www.boddie.org.uk.
  12. ^ "Podrška za Compiler COM". MSDN. Microsoft.
  13. ^ Microsoft MSDN: Referenca atributa C ++
  14. ^ MSDN magazin: C ++ atributi: Neka programiranje COM-a bude lagano s novom značajkom u Visual Studio .NET
  15. ^ "Manifesti skupštine". MSDN. Preuzeto 5. studenog 2009.
  16. ^ a b c Dave Templin. "Pojednostavite postavljanje aplikacija s ClickOnceom i COM-om bez registracije". MSDN Časopis. Preuzeto 22. travnja, 2008.
  17. ^ "Kako koristiti COM-poslužitelj koji nije u procesu bez njegove tlb datoteke". Preuzeto 16. travnja 2011.
  18. ^ "Koncepti izoliranih aplikacija i uporedni sklopovi". MSDN. Preuzeto 5. veljače, 2016.
  19. ^ Arhipov, Mihail (1. travnja 2005.). "COM bez registracije". MSDN blogovi. Preuzeto 29. travnja 2016.
  20. ^ "DllGetClassObject ulazna točka (COM)". MSDN. Ako poziv funkciji CoGetClassObject pronađe objekt klase koji se treba učitati u DLL, CoGetClassObject koristi izvoženu DLL funkciju DllGetClassObject.
  21. ^ Microsoft MSDN: Procesi, niti i apartmani
  22. ^ Microsoft MSDN: Apartmani s jednim navojem
  23. ^ Microsoft MSDN: Višenitni apartmani
  24. ^ Microsoft MSDN: Razumijevanje i upotreba COM niti modela
  25. ^ Codeguru: Razumijevanje COM apartmana

Reference

vanjske poveznice

Pin
Send
Share
Send