Inleiding tot de Shell-naamruimte
De Shell naamruimte ordent het bestandssysteem en andere objecten die door de Shell worden beheerd in één structuurhiërarchie. Conceptueel is het een grotere en inclusievere versie van het bestandssysteem.
Introductie
Een van de belangrijkste verantwoordelijkheden van de Shell is het beheren en bieden van toegang tot de grote verscheidenheid aan objecten waaruit het systeem bestaat. De meest talrijke en bekende van deze objecten zijn de mappen en bestanden die zich op computerschijfstations bevinden. De Shell beheert echter ook een aantal niet-bestandssysteem of virtuele objecten. Enkele voorbeelden zijn:
- Netwerkprinters
- Andere computers in het netwerk
- Configuratieschermtoepassingen
- De Prullenbak
Sommige virtuele objecten hebben helemaal geen betrekking op fysieke opslag. Het printerobject bevat bijvoorbeeld een verzameling koppelingen naar netwerkprinters. Andere virtuele objecten, zoals de Prullenbak, kunnen gegevens bevatten die zijn opgeslagen op een schijfstation, maar moeten anders worden verwerkt dan normale bestanden. Een virtueel object kan bijvoorbeeld worden gebruikt om gegevens weer te geven die zijn opgeslagen in een database. In termen van de naamruimte kunnen de verschillende items in de database worden weergegeven in Windows Verkenner als afzonderlijke objecten, ook al worden ze allemaal opgeslagen in één schijfbestand.
Virtuele objecten bevinden zich mogelijk zelfs op externe computers. Als u bijvoorbeeld roaming wilt vergemakkelijken, kunnen de documentbestanden van een gebruiker op een server worden opgeslagen. Om gebruikers toegang te geven tot hun bestanden vanaf meerdere desktop-pc's, verwijst de map Mijn documenten op de desktop-pc die ze momenteel gebruiken naar de server, niet naar de harde schijf van de desktop-pc. Het pad bevat een toegewezen netwerkstation of een UNC-padnaam.
Net als het bestandssysteem bevat de naamruimte twee basistypen object: mappen en bestanden. Mapobjecten zijn de knooppunten van de structuur; ze zijn containers voor bestandsobjecten en andere mappen. Bestandsobjecten zijn de bladeren van de boom; ze zijn normale schijfbestanden of virtuele objecten, zoals printerkoppelingen. Mappen die geen deel uitmaken van het bestandssysteem worden soms virtuele mappengenoemd.
Net als bij bestandssysteemmappen varieert de verzameling virtuele mappen in het algemeen van systeem tot systeem. Er zijn drie klassen virtuele mappen:
- Standaard virtuele mappen, zoals de Prullenbak, die op alle systemen worden gevonden.
- Optionele virtuele mappen met standaardnamen en functionaliteit, maar die mogelijk niet aanwezig zijn op alle systemen.
- Niet-standaardmappen die door de gebruiker zijn geïnstalleerd.
In tegenstelling tot bestandssysteemmappen kunnen gebruikers zelf geen nieuwe virtuele mappen maken. Ze kunnen alleen degenen installeren die zijn gemaakt door niet-Microsoft-ontwikkelaars. Het aantal virtuele mappen is dus normaal gesproken veel minder dan het aantal bestandssysteemmappen. Zie Naamruimteextensiesvoor een discussie over het implementeren van virtuele mappen.
U ziet een visuele weergave van de structuur van de naamruimte in de Verkenner-balk van Windows Verkenner. De volgende schermafbeelding van Windows Verkenner toont bijvoorbeeld een relatief eenvoudige naamruimte.
Het eindpunt van de naamruimtehiërarchie is het bureaublad. Direct onder de hoofdmap bevinden zich verschillende virtuele mappen, zoals Mijn computer en de Prullenbak.
De bestandssystemen van de verschillende schijfstations kunnen worden gezien als subsets van de grotere naamruimtehiërarchie. De hoofdmappen van deze bestandssystemen zijn submappen van de map Mijn computer. Mijn computer bevat ook de wortels van toegewezen netwerkstations. Andere knooppunten in de structuur, zoals Mijn documenten, zijn virtuele mappen.
Naamruimteobjecten identificeren
Voordat u een naamruimteobject kunt gebruiken, moet u eerst een manier hebben om het te identificeren. Een object in het bestandssysteem kan een naam hebben, zoals MyFile.htm. Omdat er mogelijk andere bestanden zijn met die naam ergens anders in het systeem, vereist het uniek identificeren van een bestand of map een volledig gekwalificeerd pad, zoals "C:\MyDocs\MyFile.htm". Dit pad is in feite een geordende lijst met alle mappen in een pad vanuit de hoofdmap van het bestandssysteem, C:\, eindigend op het bestand.
In de context van de naamruimte zijn paden nog steeds heel nuttig voor het identificeren van objecten die zich in het bestandssysteemgedeelte van de naamruimte bevinden. Ze kunnen echter niet worden gebruikt voor virtuele objecten. In plaats daarvan biedt de Shell een alternatieve methode voor identificatie die kan worden gebruikt met elk naamruimteobject.
Item-ID's
In een map heeft elk object een item-id, wat het functionele equivalent is van een bestandsnaam of mapnaam. De item-id is eigenlijk een SHITEMID structuur:
typedef struct _SHITEMID {
USHORT cb;
BYTE abID[1];
} SHITEMID, * LPSHITEMID;
De abID lid is de id van het object. De lengte van abID is niet gedefinieerd en de waarde ervan wordt bepaald door de map die het object bevat. Omdat er geen standaarddefinitie is voor de manier waarop abID waarden worden toegewezen door mappen, zijn ze alleen zinvol voor het gekoppelde mapobject. Toepassingen moeten ze gewoon behandelen als een token dat een object in een bepaalde map identificeert. Omdat de lengte van abID- varieert, heeft het cb lid de grootte van de SHITEMID structuur, in bytes.
Omdat item-id's niet nuttig zijn voor weergavedoeleinden, wijst de map met het object normaal gesproken een weergavenaam toe. Dit is de naam die door Windows Verkenner wordt gebruikt wanneer de inhoud van een map wordt weergegeven. Voor meer informatie over hoe weergavenamen worden verwerkt, zie Gegevens ophalen uit een map.
Item-id-lijsten
De item-id wordt zelden zelf gebruikt. Normaal gesproken maakt het deel uit van een item-id-lijst, die hetzelfde doel heeft als een bestandssysteempad. In plaats van de tekenreeks die wordt gebruikt voor paden, is een lijst met item-id's echter een ITEMIDLIST structuur. Deze structuur is een geordende reeks van een of meer item-id's, afgesloten door een tweebyte NULL. Elke item-id in de lijst met item-id's komt overeen met een naamruimteobject. Hun volgorde definieert een pad in de naamruimte, net als een bestandssysteempad.
In de volgende afbeelding ziet u een schematische weergave van de ITEMIDLIST structuur die overeenkomt met C:\MyDocs\MyFile.htm. De weergavenaam van elke item-id wordt erboven weergegeven. De verschillende breedten van de abID leden zijn willekeurig; ze illustreren het feit dat de grootte van dit lid kan variëren.
PIDLs
Voor de Shell-API worden naamruimteobjecten meestal geïdentificeerd door een aanwijzer naar hun ITEMIDLIST structuur of aanwijzer naar een item-id-lijst (PIDL). Voor het gemak verwijst de term PIDL doorgaans in deze documentatie naar de structuur zelf in plaats van naar de aanwijzer.
De PIDL die in de vorige afbeelding wordt weergegeven, wordt een volledigeof een absolutePIDL genoemd. Een volledige PIDL begint vanaf het bureaublad en bevat de item-id's van alle tussenliggende mappen in het pad. Het eindigt met de item-id van het object, gevolgd door een afsluitende twee-byte NULL-. Een volledige PIDL is vergelijkbaar met een volledig gekwalificeerd pad en identificeert het object uniek in de Shell-naamruimte.
Volledige PIDLs worden zelden gebruikt. Veel functies en methoden verwachten een relatieve PIDL-. De basis van een relatieve PIDL is een map, niet het bureaublad. Net als bij relatieve paden definieert de reeks item-id's waaruit de structuur bestaat een pad in de naamruimte tussen twee objecten. Hoewel ze het object niet uniek identificeren, zijn ze meestal kleiner dan een volledige PIDL en voldoende voor veel doeleinden.
De meest gebruikte relatieve PIDLs, PIDLs met één niveau, zijn relatief ten opzichte van de map waarin het object zich bevindt. Ze bevatten alleen de item-id van het object en een afsluitende NULL. PiDls op meerdere niveaus worden ook gebruikt voor veel doeleinden. Ze bevatten twee of meer item-id's en definiëren doorgaans een pad van een bovenliggende map naar een object via een reeks van een of meer submappen. Houd er rekening mee dat een PIDL met één niveau nog steeds een volledig gekwalificeerde PIDL kan zijn. Specifiek zijn bureaubladobjecten subelementen van het bureaublad, zodat hun volledig gekwalificeerde PIDL's slechts één item-id bevatten.
Zoals beschreven in De id van een map ophalen, biedt de Shell-API een aantal manieren om de PIDL van een object op te halen. Zodra u deze hebt, gebruikt u het meestal alleen om het object te identificeren wanneer u andere Shell-API-functies en -methoden aanroept. In deze context is de interne inhoud van een PIDL ondoorzichtig en irrelevant. Voor deze discussie kunt u PIDLs beschouwen als tokens die bepaalde naamruimteobjecten vertegenwoordigen en richten u zich op het gebruik ervan voor algemene taken.
PIDLs toewijzen
Hoewel PIDLs vergelijkbaar zijn met paden, is voor het gebruik ervan een enigszins andere benadering vereist. Het belangrijkste verschil is hoe geheugen toe te wijzen en vrij te geven.
Net als bij een tekenreeks voor een pad, moet er geheugen worden toegewezen voor een PIDL. Als een toepassing een PIDL maakt, moet deze voldoende geheugen toewijzen voor de ITEMIDLIST structuur. Voor de meeste gevallen die hier worden besproken, maakt de Shell de PIDL en verwerkt de geheugentoewijzing. Ongeacht door wat of wie de PIDL is toegewezen, is de toepassing meestal verantwoordelijk voor het vrijgeven van de PIDL wanneer deze niet meer nodig is.
Gebruik de functie CoTaskMemAlloc om de PIDL toe te wijzen en de functie CoTaskMemFree om de toewijzing ervan ongedaan te maken.