Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
A Shell névtér egyetlen faszerkezetes hierarchiába rendezi a Rendszerhéj által felügyelt fájlrendszert és egyéb objektumokat. Elméletileg ez a fájlrendszer nagyobb és befogadóbb verziója.
Bevezetés
A Shell egyik elsődleges feladata a rendszert alkotó objektumok kezelésének és hozzáférésének biztosítása. Ezeknek az objektumoknak a legtöbbje és ismerőse a számítógéplemez-meghajtókon található mappák és fájlok. A Rendszerhéj azonban számos nem fájlrendszert vagy virtuális objektumot is kezel. Néhány példa:
- Hálózati nyomtatók
- Egyéb hálózati számítógépek
- Vezérlőpult-alkalmazások
- A Lomtár
Egyes virtuális objektumok egyáltalán nem foglalnak magukban fizikai tárolást. A nyomtatóobjektum például hálózati nyomtatókra mutató hivatkozások gyűjteményét tartalmazza. Más virtuális objektumok, például a Lomtár, tartalmazhatnak lemezmeghajtón tárolt adatokat, de ezeket a normál fájloktól eltérően kell kezelni. Egy virtuális objektum például az adatbázisban tárolt adatok ábrázolására használható. A névtér szempontjából az adatbázis különböző elemei külön objektumként jelenhetnek meg a Windows Intézőben, annak ellenére, hogy mindegyik egyetlen lemezfájlban van tárolva.
Előfordulhat, hogy a virtuális objektumok távoli számítógépeken is találhatók. A barangolás megkönnyítése érdekében például előfordulhat, hogy a felhasználó dokumentumfájljai egy kiszolgálón lesznek tárolva. Ha több asztali számítógépről szeretne hozzáférést adni a felhasználóknak a fájljaikhoz, a jelenleg használt asztali számítógépen a Dokumentumok mappa a kiszolgálóra fog mutatni, nem pedig az asztali számítógép merevlemezére. Az elérési út tartalmaz egy leképezett hálózati meghajtót vagy egy UNC elérési utat.
A fájlrendszerhez hasonlóan a névtér is két alapvető objektumtípust tartalmaz: mappákat és fájlokat. A mappaobjektumok a fa csomópontjai,; fájlobjektumok és más mappák tárolói. A fájl objektumok a fa levelei; ezek normál lemezfájlok vagy virtuális objektumok, például nyomtató linkek. A fájlrendszer részét nem képező mappákat néha virtuális mappáknaknevezik.
A fájlrendszermappákhoz hasonlóan a virtuális mappák gyűjteménye általában rendszerről rendszerre változik. A virtuális mappáknak három osztálya van:
- Az összes rendszeren megtalálható szabványos virtuális mappák, például a Lomtár.
- Választható virtuális mappák, amelyek szabványos névvel és funkcióval rendelkeznek, de nem minden rendszeren vannak jelen.
- A felhasználó által telepített nem szabványos mappák.
A fájlrendszermappákkal ellentétben a felhasználók maguk nem hozhatnak létre új virtuális mappákat. Csak nem Microsoft-fejlesztők által létrehozottakat telepíthetnek. A virtuális mappák száma így általában sokkal kevesebb, mint a fájlrendszermappák száma. A virtuális mappák implementálásáról a Névtérbővítményekcímű témakörben olvashat.
A névtér szerkezetének vizuális ábrázolása a Windows Intéző eszköztárában látható. A Windows Explorer alábbi képernyőképén például egy viszonylag egyszerű névtér látható.
A névtérhierarchia végső gyökere az asztali környezet. Közvetlenül a gyökér alatt számos virtuális mappa található, például a Saját számítógép és a Lomtár.
A különböző lemezmeghajtók fájlrendszerei a nagyobb névtérhierarchia részhalmazainak tekinthetők. Ezeknek a fájlrendszereknek a gyökere a Saját számítógép mappa almappái. A Sajátgép a leképezett hálózati meghajtók gyökereit is tartalmazza. A fa többi csomópontja, mint például a Dokumentumok, virtuális mappák.
Névtérobjektumok azonosítása
A névtérobjektumok használatához először azonosítania kell azt. A fájlrendszer egyik objektumának neve lehet például MyFile.htm. Mivel a rendszerben máshol is lehetnek ilyen nevű fájlok, a fájlok vagy mappák egyedi azonosításához teljes elérési út szükséges, például: "C:\MyDocs\MyFile.htm". Ez az elérési út alapvetően a fájlrendszer gyökerétől (C:\) kezdődő, és a fájllal végződő mappák rendezett listája.
A névtér kontextusában az elérési utak továbbra is nagyon hasznosak a névtér fájlrendszer részén található objektumok azonosításához. Ezek azonban nem használhatók virtuális objektumokhoz. Ehelyett a Rendszerhéj egy alternatív azonosítási módot biztosít, amely bármely névtérobjektummal használható.
Elemazonosítók
Egy mappán belül minden objektum elemazonosítóval rendelkezik, amely egy fájl vagy mappanév funkcionális megfelelője. Az elemazonosító valójában egy SHITEMID struktúra.
typedef struct _SHITEMID {
USHORT cb;
BYTE abID[1];
} SHITEMID, * LPSHITEMID;
Az abID tag az objektum azonosítója. Az abID hossza nincs meghatározva, értékét pedig az objektumot tartalmazó mappa határozza meg. Mivel nincs szabványos definíció arra vonatkozóan, hogy abID értékek hogyan vannak mappákhoz rendelve, ezek csak a társított mappaobjektum számára értelmezhetők. Az alkalmazásoknak egyszerűen olyan jogkivonatként kell kezelniük őket, amely egy adott mappában lévő objektumot azonosít. Mivel az abID hossza változó, a cb tag a SHITEMID szerkezet méretét tartalmazza bájtban.
Mivel az elemazonosítók nem használhatók megjelenítési célokra, az objektumot tartalmazó mappa általában megjelenítendő nevet rendel hozzá. Ezt a nevet használja a Windows Intéző egy mappa tartalmának megjelenítésekor. A megjelenítendő nevek kezeléséről további információt a Információk lekérése mappábólcímű témakörben talál.
Elemazonosító-listák
Az elemazonosítót ritkán használják önmagában. Általában egy elemazonosító-lista része, amely ugyanazt a célt szolgálja, mint a fájlrendszer elérési útja. Az elérési utakhoz használt karaktersztring helyett azonban az elemazonosító-lista ITEMIDLIST struktúra. Ez a struktúra egy vagy több elemazonosító rendezett sorozata, amely egy két bájtos NULL-jel végződik. Az elemazonosító-listában szereplő minden elemazonosító egy névtérobjektumnak felel meg. A sorrend egy elérési utat határoz meg a névtérben, hasonlóan a fájlrendszer elérési útjaihoz.
Az alábbi ábra a ITEMIDLIST struktúra sémás ábrázolását mutatja, amely megfelel a(z) C:\MyDocs\MyFile.htm-nek. Minden egyes elemazonosító neve fölötte látható. A abID tagok eltérő szélessége tetszőleges; szemléltetik, hogy ennek a tagnak a mérete eltérő lehet.
sematikus illusztrációja
PIDL-ek
A Shell API esetében a névtérobjektumokat általában a ITEMIDLIST szerkezetére mutató mutató, vagy egy elemazonosító-listára (PIDL) mutató azonosítja. Az egyszerűség kedvéért a PIDL kifejezés általában a szerkezetre hivatkozik, nem pedig a mutatóra.
Az előző ábrán látható PIDL-t teljesvagy abszolútPIDL-nek nevezzük. A teljes PIDL az asztalról indul, és tartalmazza az elérési út összes köztes mappájának elemazonosítóját. Az objektum elemazonosítójával végződik, amelyet egy két bájtos NULLkövet. A teljes PIDL hasonló a teljes elérési úthoz, és egyedileg azonosítja az objektumot a Shell névterében.
A teljes PIDL-ek ritkán használatosak. Számos függvény és metódus egy PIDL-relatívértéket vár. A relatív PIDL gyökere egy mappa, nem pedig az asztal. A relatív elérési utakhoz hasonlóan a struktúrát alkotó elemazonosítók sorozata meghatároz egy elérési utat a névtérben két objektum között. Bár nem egyedileg azonosítják az objektumot, általában kisebbek, mint egy teljes PIDL, és számos célra elegendőek.
A leggyakrabban használt relatív PIDL-k, egyszintű PIDL-ek, az objektum szülőmappáihoz vannak viszonyítva. Csak az objektum azonosítóját és a lezáró NULLkaraktert tartalmazzák. A többszintű PIDL-k számos célra is használhatók. Két vagy több elemazonosítót tartalmaznak, és általában egy szülőmappából egy objektumhoz vezető útvonalat határoznak meg egy vagy több almappából álló sorozaton keresztül. Vegye figyelembe, hogy az egyszintű PIDL továbbra is teljes mértékben minősített PIDL lehet. A számítógépasztal elemei, különösen az asztalfelület gyermekei, tehát a teljesen minősített PIDL-ek csak egy elem-azonosítót tartalmaznak.
Amint azt a Mappaazonosító lekéréserészben megvitattuk, a Shell API számos lehetőséget kínál egy objektum PIDL-jének lekérésére. Miután megkapta, gyakran csak arra használja, hogy azonosítsa az objektumot, amikor más Shell API-függvényeket és metódusokat hív meg. Ebben az összefüggésben a PIDL belső tartalma átlátszatlan és irreleváns. A vita során a PIDL-eket olyan jogkivonatoknak tekintjük, amelyek bizonyos névtérobjektumokat jelölnek, és arra összpontosítanak, hogyan használhatók gyakori feladatokhoz.
PIDL-ek kiosztása
Bár a PIDL-ek valamilyen hasonlóságot mutatnak az elérési utakhoz, a használatuk némileg más megközelítést igényel. Az elsődleges különbség az, hogy hogyan lehet lefoglalni és felszabadítani a memóriát számukra.
Az elérési úthoz használt karakterlánchoz hasonlóan a memóriát is le kell foglalni egy PIDL-hez. Ha egy alkalmazás létrehoz egy PIDL-t, elegendő memóriát kell lefoglalnia a ITEMIDLIST struktúrához. Az itt tárgyalt esetek többségében a Shell létrehozza a PIDL-t, és kezeli a memóriafoglalást. Függetlenül attól, hogy mi rendelte el a PIDL-t, az alkalmazás általában felelős a PIDL felszabadításáért, amikor már nincs rá szükség.
A PIDL lefoglalásához használja a CoTaskMemAlloc függvényt, és a CoTaskMemFree függvényt a felszabadításához.