HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

MS SQL adatbázis kezelés Delphi-ből


MS SQL 27. rész

Példaprogram letöltése

14163 bájt

Mostani cikkünkben a Component Object Model (COM) felhasználási lehetőségeit vesszük szemügyre.
Nagyon röviden a COM a Microsoft által létrehozott specifikáció, amit azért találtak ki, hogy újrafelhasználható objektumokat illetve komponenseket írhassunk. Mint komponens architektúra, a COM-nak két alapvető előnye van:
  • A COM objektumok írása nyelvfüggetlen olyan értelemben, hogy bármely programozási nyelven elkészíthetők.
  • A COM objektumokat bármelyik Windows-os programozási környezetben használhatjuk. (Delphi, C++Builder, VC++, VB, PowerBuilder, Visual DBase, stb.)


Egy COM objektum tipikusan DLL-ben foglal helyet. A DLL kiterjesztése lehet .DLL, de lehet .OCX is. Egy DLL vagy OCX tartalmazhat egyetlen COM objektumot, de tartalmazhat többet is.
Mielőtt továbbmennénk, tisztázzuk a leggyakrabban használt kifejezések jelentését.
A COM objektum nem más, mint egy valamilyen funkcionalitást megvalósító bináris kód. A COM objektum rendelkezik bizonyos metódusokkal, amin keresztül elérhető ez a funkcionalitás. Ezek a metódusok a COM interfészen keresztül érhetők el. Egy COM objektum akár több interfészt is tartalmazhat. Az interfészt tehát arra használjuk, hogy az objektumot megszólítsuk, elérjük. Az interfészek neve általában I-vel kezdődik. A Windows shell-je (ami természetesen egy COM objektum) például a következő interfészeket implementálja: IShellLink, IShellFolder, IShellExtInit. A Windows a COM interfészeket az ún. interfész azonosítón (IID) keresztül azonosítja és kezeli.

A COM osztály (COM class, coclass) egy osztály, ami egy vagy több COM interfészt tartalmaz. Közvetlenül COM interfészt nem tudunk használni, ehelyett azokat COM osztályokon keresztül érhetjük el. A COM osztályok osztálygyárakat (class factory) tartalmaznak, és az osztálygyárak fogják nekünk előállítani az interfészt és visszaadni egy pointert az adott interfészre. A COM osztályt a Windows az osztály azonosítóján keresztül éri el (CLSID). A CLSID az IID-hez hasonlóan egyedileg azonosítja a COM osztályt.

A COM osztályokat a Windowsban be kell regisztrálni. Ez az a pont, ahol a CLSID-nek és az IID-nek hasznát vesszük. Mindkét 'ID' ugyanannak az adatstruktúrának két különböző neve, mégpedig a GUID-nak, a Global Unique Identifier-nek (magyarul globális egyedi azonosító). A GUID egy 128 bites, vagyis 16 byte-os egyedi érték. Ezt az értéket egy speciális COM könyvtári függvény, a CoCreateGUID hozza létre. Azzal garantálja az érték egyediségét, hogy kiszámításához felhasználja a futtató számítógép néhány jellemző paraméterét, az aktuális időt és a véletlenszám generátort. (Mindamellett matematikailag lehetséges, hogy a függvény két egyforma értéket állít elő, de ennek valószínűsége rendkívül csekély.)

Szerencsére a Delphi programozóknak nem kell a GUID előállításával foglalkoznia, minden új COM objektum létrehozásakor a GUID automatikusan előáll. A TGUID típus a system.pas-ban a következőképpen van definiálva:
TGUID = record
  D1: Integer;
  D2: Word;
  D3: Word;
  D4: array[0..7] of Byte;
end;
Egyébként bármikor szükségünk van egy GUID-ra a programozás során, csak le kell nyomnunk a Ctrl+Shift+G billentyűket.

A COM objektumok gyakran használnak *típuskönyvtárat*. A típuskönyvtár egy speciális fájl, ami információkat tartalmaz a COM objektumról. Tartalmazza a metódusokat, property-ket, interfészeket, struktúrákat, adattípusokat és minden más olyan elemet, amit az objektum magában foglal. A típuskönyvtár fájl kiterjesztése .TLB. A típuskönyvtárra akkor van szükség, ha más fejlesztők szeretnék felhasználni a COM objektumot. A típuskönyvtár több információt tartalmaz az COM objektumról, mint ami az interfészén keresztül elérhető.

Minden COM objektum rendelkezik egy hivatkozási számlálóval (*reference count*). A számláló azon folyamatok (vagyis alkalmazások és DLL-ek) számát mutatja, amelyek éppen használják a COM objektumot. A számlálót használhatjuk arra, hogy eldöntsük, mikor nem használja már senki az objektumot, mikor lehet tehát felszabadítani a memóriát. Amikor egy COM objektum létrejön, a hivatkozási számláló 1 értéket vesz fel. Minden új folyamat csatlakozásakor a számláló értéke eggyel nő, lecsatlakozáskor csökken. Nulla értéknél az objektum által foglalt memóriaterület felszabadul.

Mindegyik COM interfész az *IUnknown* interfész leszármazottja. Az IUnknown három metódust deklarál: QueryInterface, _AddRef, és _Release. A QueryInterface az interfész lekérdezésével a támogatott interfészek listáját adja vissza. Az _AddRef metódus inkrementálja a hivatkozás számlálót, a _Release metódus dekrementálja azt.

Áttekintettük a fontosabb kifejezéseket, csináljunk hát egy COM objektumot. Az objektum feladata egyszerű lesz, összead két számot.

Az első lépés a DLL project létrehozása. A Delphi, kicsit pongyolán, a COM project-ekre ActiveX Library néven hivatkozik. Ennek megfelelően a File/New... menüpontra kattintva az object repository-ból az ActiveX fülről válasszuk az ActiveX Library ikont. A project-et mentsük el mondjuk TestCOM néven.

A következő lépés a COM objektumunk létrehozása. Az előzőhöz hasonlóan bonyolult lépéssor a következő: a File/New menüpontra kattintva válasszuk az ActiveX lapról a COM Object ikont. Ezzel elindítjuk a COM objektum varázslót. A Class Name, vagyis osztálynév mezőbe a COM objektum nevét kell beírni. Nem kell sem I-t, sem T-t eléírni, a Delphi automatikusan generálja majd mind az osztályt, mind az interfészt. Az Instancing mezőben azt választhatjuk ki, hogyan töltődjön be a COM objektumunk. Három választási lehetőségünk van: Internal, Single Instance, Multiple Instance. A Threading Model mezőben azt állíthatjuk be, hogy a kliens alkalmazások hogyan szólíthatják meg a COM objektumot (Single, Apartment, Free, Both). Az Implemented Interfaces mezőben adhatjuk meg azon interfészek nevét, amit a COM objektumban meg fogunk valósítani. A Description mezőt nem kötelező kitölteni, az objektum leírását adhatjuk meg itt. Ha a Type Library jelölőnégyzetet kiválasztjuk, a Delphi típuskönyvtárat állít elő a COM objektumhoz.

Folytatva a saját programunkat tehát a Class Name mezőbe írjuk be, hogy 'Sum', A Description mezőbe: 'Test COM Object', és jelöljük meg a Type Library négyzetet. A többi mezőben hagyjuk meg az eredeti értékeket. Végül az OK gombra kattintva a Delphi létrehoz egy unitot a COM objektum osztálynak, és utána a Type Library Editor (TLE) dialógusablakba jutunk. A TLE ablakban manipulálhatjuk egyszerűen a típuskönyvtárat. Interfészeket adhatunk a könyvtárhoz vagy törölhetünk belőle, az interfészeket property-kkel és metódusokkal láthatjuk el. A TLE bal oldalán az objektum panelen fastruktúrában láthatók az objektumok. A gyökér objektum maga a típuskönyvtár, alatta azok az objektumok sorjáznak, amik a típuskönyvtárban szerepelnek. Ezen a ponton a TLE két obejktumot mutat, az ISum interfészt és a Sum coclass-t. A TLE jobb oldalán az információs panelen az éppen kiválasztott objektum jellemzői olvashatók. Hogy itt milyen jellemzőket látunk, az a kiválasztott objektumtól függ. A mindig jelen lévő Attributes lapon láthatjuk az objektum nevét, GUID-ját, verzióját, stb. (Itt szembesülhetünk azzal, hogy tényleg nem kell a GUID-dal sokat foglalkoznunk, a Delphi kezeli helyettünk.)

Ha most a bal oldalon kiválasztjuk a típuskönyvtárat, és a jobb oldalon kiválasztjuk a Uses fület, látni fogjuk azokat a típuskönyvtárakat, amelytől a miénk függ. Majdnem minden esetben a lista tartalmazza az OLE Automation könyvtárat. Hogy ezen kívül még mi kerül ide, az a COM objektumunk bonyolultságától függ. A Text lap mutatja a típuskönyvtár definícióját IDL szintaxis szerint. Az IDL egy script nyelv, ez alapján készül majd a típuskönyvtár bináris formája. Bármely változtatás a többi lapon az IDL script megváltozását vonja maga után, de akár közvetlenül ezt is megváltoztathatjuk.

Más lapok elérhetősége a kiválasztott objektumtól függ.

Ezen a ponton mentsük el a COM objektumot tartalmazó unit-unkat, mondjuk SumU.pas néven. És most adjunk property-ket az objektumhoz. Kattintsunk az interfészre (ISum a bal oldalon). A jobb oldalon láthatjuk az interfész nevét, GUID-ját, verzióját (1.0) és a szülő interfész nevét, ami természetesen IUnknown. Korábban már említettük, hogy az IUnknown minden interfész szülő interfésze, éppen ezért a Delphi ezt ajánlja fel szülőnek, de választhatunk mást is. Jobb egérgombbal kattintva az interfészre, majd a New/Property menüpontot választva a TLE-ban két új bejegyzés jelenik meg az interfész neve alatt. A property neve legyen X. Minden property alapértelmezés szerint írható/olvasható property. Az íráshoz a Put metódus, az olvasáshoz a Get metódus szükséges, ezért a két bejegyzés. Ha most hol az egyik, hol a másik X property-re kattintunk, láthatjuk a jobb oldalon az Invoke Kind mezőt, ami hol property Get, hol property Put. A Type mezőt állítsuk Integer-re. Készítsünk egy Y nevű, Integer típusú property-t is.

Most sorban kattintsunk végig a property-ken, és állítsuk be a paraméterezésüket. Az X property (Invoke Kind = property Get), Parameters fülén a Return Type legyen Integer (valószínűleg az is, de azért nem árt ellenőrizni), és ha a Parameters DBGrid-ben van paraméter, azt töröljük ki. A másik X property-hez (Put) procedure fog kapcsolódni, ezért a Return Type mezőben ne legyen semmi. Ugyanígy állítsuk be a két Y property paraméterezését is.

Most adjunk új metódust az interfészhez. A metódus neve legyen SumIt. A jobb oldalon láthatjuk, hogy az Invoke Kind mező értéke most: Function. A paraméter lapon állíthatjuk be a metódus paramétereit. A Return Type mezőbe írjunk Integer-t, ez lesz a visszatérési érték típusa. Paramétert most nem állítunk be. Nyomjuk meg a felső gombsor Refresh Implementation gombját. Ha most megnézzük a unit forráskódját, láthatjuk az üres Get és Set utasításokat. Ez a COM objektumunk magva. Láthatjuk azt is, hogy a TSum osztály a TTypedComObject és az ISum osztály leszármazottja. Ez azonban nem teljesen ugyanaz, mint a többszörös öröklődés a C++-ban.

Írjuk meg a hiányzó kódot. Adjuk az objektum definíciójához a következő két sort:
  private
    FX: Integer;
    FY: Integer;
A Get_X metódus törzse:
  Result := FX;
A Get_Y metódus törzse:
  Result := FY;
A SumIt metódus törzse:
  Result := FX + FY;
A Set_X metódus törzse:
  FX := Value;
A Set_Y metódus törzse:
  FY := Value;
Mindeközben a Delphi bőszen jegyzetelt a típuskönyvtárba, amit meg is nézhetünk a TestCOM.tlb fájl betöltésével. Ezt a fájlt nem érdemes módosítani, ahogy a fájl fejléce is írja, hiszen minden fordításkor felülíródik. Nagyjából készen van a COM objektumunk, már csak le kell fordítani és regisztrálni kell a Windowsban. A fordításhoz a Project/Build TestCOM menüpontot válasszuk, a regisztrációhoz pedig a Run/Register ActiveX Server menüpontot. A regisztráció azt jelenti, hogy az objektumunk ezentúl a registry-ben is megtalálható lesz. (A regisztrációt a tregsvr.exe programmal is elvégezhettük volna. Még egy megjegyzés: ha nem az IUnknown interfészből származtatjuk a sajátunkat, hanem az IDispatch interfészből, akkor most automation objektumot írtunk volna.) Ezentúl az objektumunkat minden gond nélkül használhatjuk.

Írjunk egy programot, amivel tesztelhetjük az objektumunk működését. Kezdjünk új alkalmazást (File/New Application), tegyünk egy gombot és egy edit boxot a Form-ra és a uses utáni listába vegyük fel a következő két unitot: ComObj és TestCOM_TLB.

A Form megjelenésekor létrehozunk egy pointert, ami egy ISum interfészre mutat. Ehhez meghívjuk a CreateComObject metódust. Paraméterként megkapja az objektum GUID-ját, ami a típuskönyvtárban CLASS_Sum néven szerepel. A metódus visszatérési értéke az interfészre mutató pointer lesz, aminek típusa IUnknown tehát castolnunk kell, hogy ISum típusú legyen.
  Sum := CreateComObject(CLASS_Sum) as ISum;
Ezek után egyszerűen hivatkozhatunk az objektum metódusaira.
  if Assigned(Sum) then
  begin
    Sum.Set_X(x);
    Sum.Set_Y(y);
    i := Sum.SumIt;
    eSum.Text := InttoStr(i);
  end;


Cikksorozat

#IDKategóriaCikk címeSorozat
3333WindowsNet Shell parancsok1. rész
3367WindowsNet Shell parancsok2. rész
3396WindowsNet Shell parancsok3. rész


Könyv
Ez a cikk megtalálható ebben a könyvben: Delphi Software Offline 2001 évkönyv 244. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |