Megosztás a következőn keresztül:


Az Explorer általános fogalmai

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 Shell azonban számos nem fájlrendszerbeli 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 útvonalat.

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ájlobjektumok a fa levelei; ezek normál lemezfájlok vagy virtuális objektumok, például nyomtatóhivatkozások. 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 felépítésének vizuális megjelenítése a Windows Intéző keresősávjában látható. A Windows Explorer alábbi képernyőképén például egy viszonylag egyszerű névtér látható.

képernyőfelvétel: a shell névtér

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át számítógép a leképezett hálózati meghajtók gyökerét is tartalmazza. A fa többi csomópontja, 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ően az összes mappa rendezett listája, amely a fájllal végződik.

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 önmagában ritkán használják. Általában egy elemazonosító-lista része, amely ugyanazt a célt szolgálja, mint a fájlrendszer elérési útja. Azonban az elérési utakhoz használt karaktersztring helyett az elemazonosító-lista egy ITEMIDLIST struktúra. Ez a struktúra egy vagy több elemazonosító rendezett sorozata, amely egy két bájtos NULLvégződéssel van lezárva. 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 az ITEMIDLIST struktúra sémaképet mutatja, amely megfelel C:\MyDocs\MyFile.htm-nek. Az egyes elemazonosítók megjelenítendő 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.

pidl sematikus illusztrációja

PIDLs

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, amit egy két bájtos NULLkövet. A teljes PIDL hasonló a teljes elérési úthoz, és egyedileg azonosítja a Shell névterében található objektumot.

A teljes PIDL-ek ritkán használatosak. Sok függvény és metódus relatív PIDL--t 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 elemazonosítóját és egy NULLjelzőt 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 teljesen minősített PIDL lehet. Az asztali környezet objektumai különösen az asztali környezet gyermekei, így a teljesen meghatározott PIDL-ek csak egy elemazonosítót tartalmaznak.

A A mappa azonosítójának megszerzésecímű részben megvitatottak szerint a Shell API számos módot kínál az objektumok 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 sztringhez hasonlóan, a PIDL-hez is memóriát kell lefoglalni. 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 osztotta ki a PIDL-t, az alkalmazás általában felelős azért, hogy a PIDL-t felszabadítsa, 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.