interfész IUnknown

Tehát, ez a döntés nem elég a szerver objektum hozzá tudott rendesen kezelni az ügyfél - található. Voltak részei a tervezési megoldások pontos software design. Azt találtuk, hogy a fenti típusú készülék igényelnek mutatókat felületek, és az eszköz számlálóját az objektum egy beépített „self-gyilkos”. Ők csak akkor lehet hozzáférni a kliens objektum módszereket, ami az ügyfél és ezek ugyanazokat a módszereket kell vagy lehet egy része az egyes interfész által végrehajtott alá, vagy - egy speciális funkció külön felületet. És minden egyes tárgy, nem számít, milyen a család és a törzs is lehet - köteles megvalósítani ezt a funkciót.

Mivel a kiállítás ezeket a funkciókat csak akkor lehet, mint egy interfész, és a vita tárgya: mi a jobb - kiadni őket formájában egyetlen felületen, a feladata, hogy tegye, hogy imputálására semmilyen tárgyat (beleértve az összes többi objektum interfészek), vagy - ezt a funkciót, hogy minden felület, kiállított tárgy ?

Mi határozza meg, amit mondunk. Az első módszer kerül meghívásra QueryInterface- meg prinimatIID másik felületen látható adatokat az objektum, és visszatér a mutatót, hogy a felület. A második módszer akkor nazyvatsyaAddRef- nincsenek paraméterei, és mindegyik hozza a kihívás, hogy a haladás az számlálóját a tárgy előre egyet. A harmadik módszer -release. Feladata - obratnayaAddRef, és amikor a referencia száma eléri nulyaReleasezhe oka idelete ezt.

Miért, ahelyett, hogy egy irányító eljárás hivatkozási száma, jöttünk össze kettő? Nem utolsósorban azért, mert ez a módszer hívás kód paraméterek nélkül - rövidebb. Hagyja néhány bájt, de ezek néhány bájt a kliens találkozik bárhol is szaporították index. És a teljes mellett a kód nagy lehet.

Tehát a három módszer:

tudjuk rendezni egyetlen felületen. Vagy - tudjuk felírni része minden más felület. Melyik a jobb? És miért?

Mondjuk, ez a funkció származik az egy teljesen külön felületet X. és minden egyéb interfészek ugyanazon objektum nem rendelkezik. Mi történik? És ez az, ami történik, - ha az objektum jön létre, azt fogja kérni a szerver, hogy visszatérjen egy pointert interfeysX minket. birtokában van az index, akkor könnyen kap mutatókat és az összes többi objektum interfészek -QueryInterfacezhe áll interfeysaX. De ha azt kérdezzük, hogy a szerver vissza semmilyen más interfészt ugyanazon objektum, tehát ezzel a felület és az is marad - ez a felület netQueryInterface. Ez arra kényszeríti minden alkalommal kérni fogja a kívánt felületet és imennoX. majd belőle a jogot, hogy nekünk egy mutatót. Van egy dupla munka a kliens oldalon - a készítmény a felületet mutató.

Ha ezt a funkciót helyezték minden felületen, hogy kiteszi egy tárgy, minden felületen fog részt további három cellában Vtbl. de nem kell semmilyen dupla munka a kliens oldalon, mind a menedzsment a létesítmény végezhetjük annak bármely felületen. És úgy tűnik, hogy a második módszer sokkal kényelmesebb az ügyfél, persze -, hogy újra használni a névszerver.

De mivel tudjuk építeni egy ilyen létesítmény, ahol nem lesz „hasznos” felület? Lehetséges. De ez a típus alkalmassága minden esetben legyen. És akkor szorozzuk meg a mutatót, majd -, hogy elpusztítsa az objektumot. És minden, ami felül - meghatározása kizárólag kiküszöbölése egy szoftver probléma.

A leírt funkció, olyan alapvető, hogy e nélkül a „semmi nem működik” - mi, és elgondolkodni rajta, mert a mi végrehajtásában komponens kölcsönhatása hiányzott igen jelentős töredékek. Lehetséges, hogy végre ez egyébként? Részletezve - igen, valóban - nem. Végtére is, az ok, amiért ezt a funkciót részeként a tárgy - filozofikus. Ha tudnánk, hogy pontosan fordító statikus téma típusának és írja ez volt az egyik a kliens és a szerver természetesen a fordító tudta megvalósítani, és javítsa ki a hívást az új és helyes vyzovdelete *, és a fordítóprogram átalakítani mutatókat kell gépelni. De valójában azt jelenti, hogy mind a kliens és a szerver kell elhelyezni keretében ugyanazon projekt - és már csak az ellenkezőjét „kezdeti feltételek”. Mi és a kliens és a szerver kell elhelyezni a különböző projektek különböző kontextusokban. Már - programozás bináris komponenseket.

Ez ennek fényében, először vett részt asztalok fordításidejű ágyazott maga az objektum, úgy, hogy azok fenntartását és futásidejű (vtbl), és most meg kell tölteni egy objektumot, és funkciók, mint például időgazdálkodás és az élet hozza. És nem tudjuk elkerülni, hogy - vagy mi magunk, vagy fordító.

Meg kell jegyezni, hogy különösen -, hogy bár tanul COM. amely már megfogalmazott filozófiai jellegű. És akkor az egyik vagy másik formájában is megtalálható realizatsiiCORBA legyen általános bármely bináris komponens technológia. „Wrapper”, amely eltérő lehet, de a lényeg - ugyanaz.

A COM, ez nagyon alapvető lényege az úgynevezett „interfeysIUnknown”, amely lazán lefordítva úgy hangzik, mint „ismeretlen interface”, és legalább valamennyire zavartan -, ami ismeretlen felület, ha garantálva a jelenléte semmilyen tárgyat? Azonban, ha ez fordítva „felület nem tudom, ki” - minden a helyére kerül. Sőt, a bináris komponens objektum obektomCOM akkor és csak akkor, ha rájön, legalább interfeysIUnknown. Ha egy ilyen felület nem - ez nem obektCOM. Bár, mint láttuk, az objektum lehet egy „bináris-komponens”, és anélkül, ispolzovaniyaCOM.

Ezzel a felületet, azt akarva-akaratlanul meg kell felelnie nagyon közel - ő az „alfa és omega” az összes interfész definiálja különleges viselkedését az objektumot. És most, miközben azt látjuk, hogy - bármilyen COM interfész kell örökölt interfeysaIUnknown. Meg kell érteni, hogy miért - imennoIUnknownv része minden felületen kezeli tárgy élettartam és a mutató típusú öntött. És nem kell semmilyen extra költségeket az ügyfélnek.

Tulajdonképpen csak a bevezetése a tárgyak az előző példához végrehajtása IUnknowni elválasztjuk a létesítmények váljon „igazi obektyCOM”. De ahhoz, hogy lépjenek előre meg kell pontosan megfeleljen az előírásoknak - azaz a „interfeysCOM” a C ++ és hogyan írták le.

Ez a helyzet általában nem „automatikusan szabályozott.” Ez csak úgy kerülhető pontosságát kódolás, amely ki van téve a külső a modult. Mindig figyeljünk arra, hogy a „normális külső neve” C ++ - díszített, azaz bináris modul néz ki egészen más, mivel úgy tűnik, az eredeti szövegben. Emlékeztetni kell arra, hogy bárki kívül kiállított módszert kell írni csak egyetértésben svyazyah__stdcall. Nem szabad elfelejteni, hogy a módszerek kitett felületek nem lehet túlterhelni. Ezeket a korlátozásokat kell csak azért, mert „más fordítók, hogy nem tudják, hogyan” ACOM - bináris technológia.

Ezért a pontos ismerete „hogy milyen nyelvi konstrukció interfészt COM” a programozó - létfontosságú szükség. Minden yazykeC ++ interfész leírja a szerkezet - a szerkezet egy osztály, amelynek tagjai yavlyayutsyapublic. Lehetőség van, és a leírás az interfész konstruktsieyclass. A fájl tartalmazza van egy bizonyos tervezési, hogy meghatározzák a részek a felületen:

#define STDMETHODCALLTYPE __stdcall

#define interfész struct

#define STDMETHOD (módszer) virtuális HRESULT STDMETHODCALLTYPE módszerrel

#define STDMETHOD_ (típus, módszer) virtuális típusú STDMETHODCALLTYPE módszerrel

#define DECLARE_INTERFACE (iface) interfész iface

#define DECLARE_INTERFACE_ (iface, baseiface) interfész iface. nyilvános baseiface

és a fájl :

typedef HOSSZÚ HRESULT;

Ugyanabban a fájlban (Enyhén rövidített és egyszerűsített) tudjuk, hogy a felület van leírva, mint:

Kapcsolódó cikkek