Delphi világ - Delphi és com

COM (Component Object Model) - entitásbabnak modell - az egyik kulcsfontosságú technológiák, ahol a Windows. Sőt, az összes új technológiák a Windows (Shell, Scripting, HTML támogatás, stb) végrehajtja az API-COM-interfészek. Így most a szakmai programozási modell megköveteli annak megértését, COM és az ő munkaképességét. Ebben a fejezetben tárgyaljuk alapfogalmait COM és különösen azok támogatását Delphi.

A lényeg, amelynek alapja a modell a COM, az az elképzelés, a felület. Mivel nem világos megértése, amit a felület, a sikeres programozás COM-objektumok lehetetlen.

Interface, képletesen szólva, a „szerződés” a programozó és a fordító.

Programozó vállalja, hogy végre minden leírt módszerek a felületen, és kövesse a követelmények végrehajtására vonatkozó néhány közülük.

A fordító elkötelezett, hogy hozzon létre a belső szerkezete a program, amely lehetővé teszi a hozzáférést a módszerek ezen a felületen, bármilyen támogatja az azonos egyezmények szoftvert. Így COM egy nyelv-független technológiai és fel lehet használni, mint egy „ragasztó” összekötő írt programok különböző nyelveken.

Interfészek lehet örökletes. Interface öröklés - egy nyilatkozatot arról, hogy az örökölt felület tartalmaznia kell az összes őse módszerekkel.

Így meg kell érteni a következő:

  • A felület nem egy osztály. Class lehet megvalósítása a felületet, de az osztály tartalmazza módszerek kódot adott programozási nyelv és felület - nincs.
  • Az interfész erősen típusos. Mind a kliens és a megvalósítása a felületet kell használnia pontosan ugyanazt a módszerek és paramétereket, amelyeket A felületen megadott leírást.
  • A felület „ugyanazt a szerződést.” Nem lehet meghatározni egy új változatát az azonos felület megváltozott módszeregyütteseket (vagy paramétereit), de ugyanazt az azonosítót.

Ez biztosítja, hogy az új felületek soha nem lesz ellentétes a régi. Ha szükséges, kiterjeszti a funkcionalitást meg kell adnia egy új felület, ami azért lehetséges, örököse a régi, és végre kell hajtani a további módszerek is.

Automatikus memória kezelése és a referencia számlálás

Azon kívül, hogy független a programozási nyelv hozzáférés módszereit tárgyak, COM végrehajtja az automatikus memória kezelése COM-objektumokat. Ez alapján az ötlet számít a hivatkozásokat az objektumot. Bármilyen ügyfél igénybe venni kívánó COM-objektum létrehozása után, fel kell hívni előre egy előre meghatározott eljárás, amely növeli a belső referencia száma a tárgyat az egységre. Az adagolás befejezése után a használat a kliens objektum okoz annak más módszerrel, amely csökkenti az értéke ugyanezen számláló. Amikor a számláló eléri a nullát linkek COM-objektum automatikusan eltávolítja magát a memóriából. Ez a modell lehetővé teszi az ügyfeleknek, hogy nem megy bele a végrehajtás részleteit a tárgy és a tárgy - szolgálni több ügyfelet és megfelelően törölje a memóriát, amikor befejezte az utolsó is.

Ahhoz, hogy létrehoz egy új GUID értékek IDE Delphi szolgál a Ctrl + Shift + G

Base interfész a COM modell IUnknown. Bármilyen felületen örököl IUnknown és köteles végrehajtani a metódusnak meg. IUnknown System.pas bejelentett modul az alábbiak szerint:

Tekintsük a kinevezését IUnknown módszerek részletesebben.

Az utolsó két módszer végrehajtására használják referencia számlálási mechanizmus.

Ez a funkció növeli a számlálóját az interfész és visszatér az új számláló értékét.

Ez a funkció csökkenti a számlálóját az interfész és visszatér az új számláló értékét. Amikor a számláló eléri a nullát kell felszabadítja a memóriát foglal el a végrehajtás a felület.

Az első módszer lehetővé teszi, hogy egy hivatkozás egy interfész által végrehajtott osztályban.

Ez a függvény a bemeneti interfész azonosítója. Ha az igényelt objektum megvalósítja egy interfész, a funkció:

  1. visszatér az arra való utalás, a Obj paraméter
  2. Úgy kapjuk _AddRef interfész módszer;
  3. értéke 0.

Ellenkező esetben - E_NOINTERFACE függvény egy hibakódot.

Elvileg a konkrét megvalósítására ezeket a módszereket lehet tölteni bármilyen más, eltér a hagyományos funkciókat, de a felület nem összeegyeztethető a COM modell, ezért nem ajánlott ebben az esetben.

A System.pas modul bejelentett osztálynak TInterfacedObject, végrehajtja IUnknown és módszerei. Javasoljuk, hogy használja ezt az osztályt, hogy saját implementációja interfészek.

Ezen túlmenően, a felület támogatása valósul TObject alap osztály. Van egy módszer

Amennyiben a kért osztály megvalósítja az interfészt, a funkció:

  1. visszatér az arra való utalás, a Obj paraméter
  2. Úgy kapjuk _AddRef interfész módszer;
  3. TRUE értékkel tér vissza.

Ellenkező esetben - a függvény false.

Így lehetőség van arra, hogy bármely osztály Delphi rájöttek, hogy a felületen. További használata ezt a funkciót az alábbiakban tárgyaljuk.

TMyClass osztály megvalósítja interfészek IMyInterface és IDropTarget. Meg kell érteni, hogy a végrehajtás az osztály nem jelent több interfész többszörös öröklés és minden osztály öröklési a felületen. Megadása interfészek az osztályban leírást csak azt jelenti, hogy ez az osztály valósítja meg az összes ilyen interfészek.

Az osztály kell egy módszert, amely pontosan egyezik a nevek és lehetőséget felsorolja az összes módszer minden bejelentett interfészek a fejlécben.

Vegyünk egy részletesebb példáját.

Itt TTEST iTest osztály megvalósítja az interfészt. Fontolja meg az interfész programok.

Mivel ez a kód úgy néz ki elég furcsa, nézzük meg részletesebben.

Először is, az alábbi értékadás ha aktív az interface adattípus implicit _AddRef módszer. A számos hivatkozás a felület növekszik.

Figyelem! Ha egy osztály van szükség, legalább egy felület - nem hívja a módszer Free (vagy elpusztítani). Az osztály fog megjelenni, amikor már nem kell az utolsó láncszeme annak interfészeket. Ha ezen a ponton elpusztult példánya a kézzel - hiba memóriakártya elérésekor.

Például, a következő kód hibát okoznak idején kilép a funkció:

Ha azt szeretnénk, hogy elpusztítsa a végrehajtás a felület azonnal, várakozás nélkül a változó hatálya - csak adja meg a értéke NIL:

Fordítson különös figyelmet arra, hogy a IUnknown felület eljárás hívások Delphi hallgatólagosan és automatikusan. Tehát ne hívja IUnknown módszerek a felület magad. Ez zavarja a normális működését az automatikus referencia számlálást és vezet kiadatlan memóriájába vagy a memória védelem megsértését, amikor dolgozik interfészek. Ennek elkerülése érdekében, akkor csak meg kell emlékezni a következő.

  1. Amikor aktiválódik, az objektum típusát, hogy egy interfész nevű _AddRef módszerrel.
  2. Ha a kimeneti változó, amely utal a felület körét, vagy ha rendelni egy másik értéket nevezik _Release módszer.
  3. Miután kérő objektum interfész a jövőben ne engedje el a tárgyat kézzel. Általában Ettől a ponttól kezdve, hogy jobb dolgozni egy tárgy interfészen keresztül hivatkozásokat.

Ebben a példában a kódot az interfész az osztályban generált (típusellenőrzés) fordításkor. Ha az osztály nem hajtja végre a szükséges felület, a program nem fordul le. Azonban, akkor kérheti felület és futás közben. Erre szolgál operátor, amely felhívja QueryInterface, és ha sikeres, visszatér egy hivatkozás a kapott felület. Ellenkező esetben kivételt dob.

Például az alábbi kódot sikeresen össze, de a teljesítmény nem fog sikerülni «felület nem támogatott»:

Ez lesz sikeres összeállítani és végrehajtani.

Interfészek megvalósítása (kiterjesztett venni)

Tekintsük a kérdések végrehajtásának interfészek részletesen.

Állapítsa két interfész:

Most hozzon létre egy osztályt, amely végrehajtja a két interfész:

Mint látható, az osztály nem tartalmazhat csak két módszer Beep. Ezért Delphi módot ad, hogy megoldja névütközéshez azáltal egyértelműen jelzik, hogy melyik osztályba eljárás szolgál majd a végrehajtását a megfelelő interfészen módszer.

Amennyiben a végrehajtás módszereit és TTest2.Beep1 TTest2.Beep2 azonos, nem hozhat létre két különböző módszert, és arra, hogy egy osztály az alábbiak szerint:

Végrehajtása során osztályokat, amelyek több interfészek és sok módszer, célszerű lehet átruházni végrehajtását néhány ilyen gyermek osztályban. Tekintsük a példa egy osztályt, amely megvalósítja két interfész:

Delegálni végrehajtása interfészt másik osztály egy kulcsszót munkagépek.

Ez a megközelítés lehetővé teszi, hogy szét a végrehajtás egy bonyolult osztály néhány egyszerű, ami leegyszerűsíti a programozást, és fokozza a modularitás a program.

pontosan elérni a származtatott osztály, valamint minden olyan osztályt, amely megvalósítja a felületet:

Interfészek és TComponent

Az alap osztály VCL TComponent egy komplett módszerek végrehajtására IUnknown interfész, bár az osztály nem hajtja végre ezt a felületet. Ez lehetővé teszi, hogy az örökösök TComponent végre interfészek nem kell aggódni végrehajtásáról IUnknown. Azonban a módszerek és TComponent._AddRef TComponent._Release futásidejű programok nem kapcsolatok megvalósítása számítva mechanizmus, és így a származtatott osztályokban TComponent, megvalósítja az interfészt nem befolyásolja az automatikus memória kezelése. Ez lehetővé teszi, hogy a lekérdezés az interfészek, hogy attól kellene tartaniuk, hogy az objektum törlődik a memóriából, amikor kilép a változó a hatálya alá. Így a következő kódot teljesen korrekt és biztonságos:

Ez a kód ellenőrzi minden formája az alkalmazás megvalósíthatósági IGetData felületet, és ha a forma megvalósítja ezt a felületet, az ő módszere.

Használata interfészek a programon belül

Fentebb TComponent viselkedés lehetővé teszi, hogy építsenek könnyen és veszteség nélkül az erős gépelés, társult alkalmazás komponensek, valamint egységes módszerek hívja őket, anélkül, hogy a komponensek már örökölt közös őse. Elég, ha végrehajtja az alkatrész felület, és a hívó programban, hogy ellenőrizze annak jelenlétét.

Példaként vegyünk egy MDI-alkalmazás, amely sok különböző formájú és egyetlen eszköztár. Tegyük fel, hogy a eszköztár a „Mentés” parancs „Load” és a „Törlés”, de minden ablak reagál a különböző parancsokat.

IToolBarCommands interfész leírja a módszereket alkalmaz, amelyek végre kell hajtani formák támogatása munkát a gombjait. SupportedCommands módszer ad egy listát a támogatott formája a parancsot.

Hozzon létre három gyermek formák - form2, Form3 és Form4 - és állítsa a tulajdon FormStyle = fsMDIChild.

Form2 képes végrehajtani mind a három csapat:

Form3 végezhet csak Tiszta parancsot:

Végül Form4 nem IToolBarCommands végrehajtja a felületet, és nem reagál semmilyen parancsot.

A fő formája az alkalmazással a Akciólista létre három TAction összetevőt. Ezen felül, akkor helyezze rá TToolBar majd hozzárendelni a megfelelő gombok TAction.

A legérdekesebb módszer ActionList1Update, amelyben a próbát az aktív formája a csapat, és állítsa be a fő formája felületen. Ha nincs aktív gyermek formájában, vagy nem támogatja a IToolBarCommands felület, a csapatok tilos, egyébként - csak akkor engedélyezett formában támogatott parancsok.

Bekapcsolt állapotban, a parancs ellenőrzi a jelenlétét az aktív gyermek formájában, kérte IToolBarCommands felületet, és felszólítja a megfelelő módszert:

munkaprogram kerül bemutatásra az ábrán.

Ugyanez a hatás érhető el más módszerekkel (pl örökli a gyermek formája egy közös őstől vagy üzenetváltás velük), de ezek a módszerek van néhány jelentős hátránya.

Tehát, ha az üzenetküldés elveszítjük erős gépelés és kényszerítette, hogy adja át paramétereket a számok, és vizuális öröklés mi köti magunkat a szülő osztály nem mindig kényelmes. Ezen felül, akkor lehet meghatározni egy sor interfészek és végrehajtja az egyes gyermek formák csak akkor szükséges, abban az esetben minden formája öröklési majd végre kell hajtania az összes közös módszerek.

Segítségével interfészek megvalósítása Plug-In

Még kényelmesebb interfészek megvalósítása a program bővítő modulok (Plug-In). Általános szabály, hogy egy ilyen modul exportálja számos ismert módszer a fő program, ami oka lehet belőle. Ugyanakkor gyakran kell hivatkozni a hívó fél funkciókat. Mindkettő könnyen megvalósítható interfészek.

Példaként, egy egyszerű program, amely a Plug-In adatokat letölteni.

Hirdesse meg a bővítő modul interfész és a belső API programot.

Ez a modul kell használni plug-in, valamint a fő program, és biztosítja azok használatát azonos interfészek.

Plug-In egy DLL, az exportáló funkció CreateFilter visszatér utalás ILoadFilter felület. A fő modul először hívja a Init módszer, átadva azt a fájl nevét, valamint egy linket a belső API felületet, majd hívja GetNextLine eljárás mindaddig, amíg ez nem tér vissza HAMIS.

Tekintsük a bővítő modul kód:

Init metódus két feladat: tárolja a hivatkozás az API a fő modul további felhasználásra, és megpróbálja megnyitni az adatállományban. Ha a fájl megnyitásakor sikeresen - mutatott egy belső zászló InitSuccess.

GetNextLine eljárás beolvassa a következő adatsor, és visszatér TRUE, ha a sikeres vagy hamis - ha a fájl teljes. Ezen túlmenően, az API használatával, feltéve, hogy a fő modul, az eljárás tájékoztatja a felhasználót, rakodás közben.

A destruktor is nulla hivatkozással az API a fő modul, megrongálásával, és zárja be a fájlt.

Ez a funkció létrehoz egy példányt az osztályt, amely megvalósítja az interfészt ILoadFilter. Hivatkozások másolatának mentéséhez nem szükséges, akkor automatikusan kiold.

Most a kapott DLL lehet használni a fő program.

Class TAPI implementálja az API, korszerű modult. ShowMessage funkció modul jeleníti meg az üzeneteket a Status Bar alkalmazás fő formája.

Készítsünk TMemo az adatok betöltéséhez:

Kapunk a modul nevét egy szűrőt a kiválasztott fájl kiterjesztését. Leírások modulok tárolt fájl plugins.ini részén szűrők sorokba méret:

<расширение> = <имя модуля>, például:

Most próbálja meg betölteni a modult, és megtalálja a CreateFilter funkció:

A funkció található, hozza létre a szűrőt fokon és inicializálja azt. Mivel a belső API-t is megvalósítva felület - nem kell tartani az arra való utalás.

Terhelési adatok alapján Szűrő létrehozása:

Kirakodás előtt a DLL memória kell bizonyosodni arról, hogy kiadja a hivatkozást a Plug-In felület, különben nem fog történni a kilépés a funkció, ami Access violation.

Mi kirak DLL és frissítés TMemo:

Így, hogy végre plug-inek betölteni az adatokat a formátumtól eltérő szöveget, és következetesen könnyű velük dolgozni.

Módszer előnyei különösen nyilvánvaló, amikor végrehajtási komplex bővítő modulok interfész áll, sok módszerek.

Figyelem! Mivel az EXE és DLL által használt hosszú sorokat, ne felejtsük el, hogy tartalmazza a modult használja mindkét ShareMem projekteket. Egy másik megvalósítási mód szerint a megoldások távvezetékek, hogy használja az adattípus WideString. Számukra a memória kiosztás részt vesz a OLE, és nem annyira, függetlenül a modul, ahonnan a vonal jött létre.

Kapcsolódó cikkek