Dela via


Introduktion till Shell-namnområdet

Shell-namnrymd organiserar filsystemet och andra objekt som hanteras av gränssnittet i en enda trädstrukturerad hierarki. Konceptuellt är det en större och mer inkluderande version av filsystemet.

Introduktion

Ett av de primära ansvarsområdena för Shell är att hantera och ge åtkomst till de många olika objekt som utgör systemet. De flesta och mest bekanta av dessa objekt är de mappar och filer som finns på datordiskenheter. Shell hanterar dock ett antal icke-filsystem eller virtuella objekt. Några exempel är:

  • Nätverksskrivare
  • Andra nätverksdatorer
  • Applikationer på Kontrollpanelen
  • Papperskorgen

Vissa virtuella objekt omfattar inte fysisk lagring alls. Skrivarobjektet innehåller till exempel en samling länkar till nätverkskopplade skrivare. Andra virtuella objekt, till exempel papperskorgen, kan innehålla data som lagras på en diskenhet, men som måste hanteras på ett annat sätt än vanliga filer. Ett virtuellt objekt kan till exempel användas för att representera data som lagras i en databas. När det gäller namnområdet kan de olika objekten i databasen visas i Utforskaren som separata objekt, även om de alla lagras i en enda diskfil.

Virtuella objekt kan till och med finnas på fjärrdatorer. För att underlätta roaming kan till exempel en användares dokumentfiler lagras på en server. För att ge användarna åtkomst till sina filer från flera stationära datorer pekar mappen Mina dokument på den stationära dator som de använder för närvarande på servern, inte hårddisken på den stationära datorn. Sökvägen innehåller antingen en mappad nätverksenhet eller ett UNC-sökvägsnamn.

Precis som filsystemet innehåller namnområdet två grundläggande typer av objekt: mappar och filer. Mappobjekt är noder i trädet. de är containrar för filobjekt och andra mappar. Filobjekt är de bladen i trädet. de är antingen vanliga diskfiler eller virtuella objekt, till exempel skrivarlänkar. Mappar som inte ingår i filsystemet kallas ibland virtuella mappar.

Precis som filsystemmappar varierar samlingen av virtuella mappar vanligtvis från system till system. Det finns tre klasser med virtuella mappar:

  • Virtuella standardmappar, till exempel papperskorgen, som finns på alla system.
  • Valfria virtuella mappar som har standardnamn och funktioner, men som kanske inte finns i alla system.
  • Icke-standardmappar som installeras av användaren.

Till skillnad från filsystemmappar kan användarna inte skapa nya virtuella mappar själva. De kan bara installera dem som skapats av icke-Microsoft-utvecklare. Antalet virtuella mappar är därför normalt mycket färre än antalet filsystemmappar. En diskussion om hur du implementerar virtuella mappar finns i Namnområdestillägg.

Du kan se en visuell representation av hur namnområdet är strukturerat i Explorer-fältet i Utforskaren. Följande skärmbild av Utforskaren visar till exempel ett relativt enkelt namnområde.

en vy över gränssnittets namnområde

Den ultimata roten i namnområdeshierarkin är skrivbordet. Direkt under roten finns flera virtuella mappar, till exempel Min dator och papperskorgen.

Filsystemen på de olika diskenheterna kan ses som delmängder av den större namnområdeshierarkin. Roten till dessa filsystem är undermappar till mappen Min dator. Min dator innehåller även rötterna till alla mappade nätverksenheter. Andra noder i trädet, till exempel Mina dokument, är virtuella mappar.

Identifiera namnområdesobjekt

Innan du kan använda ett namnområdesobjekt måste du först ha ett sätt att identifiera det. Ett objekt i filsystemet kan ha ett namn som MyFile.htm. Eftersom det kan finnas andra filer med det namnet någon annanstans i systemet kräver unikt identifiering av en fil eller mapp en fullständigt kvalificerad sökväg, till exempel "C:\MyDocs\MyFile.htm". Den här sökvägen är i princip en ordnad lista över alla mappar i en sökväg från filsystemets rot, C:\, som slutar med filen.

I samband med namnområdet är sökvägar fortfarande ganska användbara för att identifiera objekt som finns i filsystemets del av namnområdet. De kan dock inte användas för virtuella objekt. Shell tillhandahåller i stället ett alternativt identifieringsmedel som kan användas med valfritt namnområdesobjekt.

Objekt-ID

I en mapp har varje objekt ett objekt-ID, vilket är den funktionella motsvarigheten till ett fil- eller mappnamn. Objekt-ID:t är faktiskt en SHITEMID- struktur:

typedef struct _SHITEMID { 
    USHORT cb; 
    BYTE   abID[1]; 
} SHITEMID, * LPSHITEMID; 

abID- medlem är objektets identifierare. Längden på abID har inte definierats och dess värde bestäms av mappen som innehåller objektet. Eftersom det inte finns någon standarddefinition för hur abID värden tilldelas av mappar, är de bara meningsfulla för det associerade mappobjektet. Program bör helt enkelt behandla dem som en token som identifierar ett objekt i en viss mapp. Eftersom längden på abID varierar, har cb medlem storleken på SHITEMID struktur, i byte.

Eftersom objekt-ID:t inte är användbara för visningsändamål tilldelar mappen som innehåller objektet normalt ett visningsnamn. Det här är det namn som används av Utforskaren i Windows när innehållet i en mapp visas. Mer information om hur visningsnamn hanteras finns i Hämta information från en mapp.

Objekt-ID-listor

Objekt-ID:t används sällan av sig självt. Normalt är det en del av en objekt-ID-lista som har samma syfte som en filsystemsökväg. Men i stället för teckensträngen som används för sökvägar är en objekt-ID-lista en ITEMIDLIST- struktur. Den här strukturen är en ordnad följd av ett eller flera föremåls-ID:n som avslutas med en tvåbyte NULL. Varje objekt-ID i objekt-ID-listan motsvarar ett namnområdesobjekt. Deras ordning definierar en sökväg i namnområdet, ungefär som en filsystemsökväg.

Följande bild visar en schematisk representation av ITEMIDLIST- struktur som motsvarar C:\MyDocs\MyFile.htm. Visningsnamnet för varje objekt-ID visas ovanför det. De varierande breddarna på abID medlemmar är godtyckliga. de illustrerar det faktum att storleken på den här medlemmen kan variera.

en schematisk bild av en pidl-

PIDL:er

För Shell-API:et identifieras namnområdesobjekt vanligtvis med en pekare till deras ITEMIDLIST struktur eller pekare till en objektidentifierarlista (PIDL). För enkelhetens skull refererar termen PIDL vanligtvis i den här dokumentationen till själva strukturen i stället för pekaren till den.

PIDL som visas i föregående illustration kallas för en komplett, eller absolut, PIDL. En fullständig PIDL startar från skrivbordet och innehåller objekt-ID:t för alla mellanliggande mappar i sökvägen. Det avslutas med objektets artikel-ID, följt av de avslutande två byte NULL. En fullständig PIDL liknar en fullständigt kvalificerad sökväg och identifierar objektet unikt i Shell-namnområdet.

Fullständiga PIDL:er används sällan. Många funktioner och metoder förväntar sig en relativ PIDL-. Roten för en relativ PIDL är en mapp, inte skrivbordet. Precis som med relativa sökvägar definierar serien med objekt-ID:t som utgör strukturen en sökväg i namnområdet mellan två objekt. Även om de inte unikt identifierar objektet är de vanligtvis mindre än en fullständig PIDL och tillräckliga för många ändamål.

De vanligaste relativa PIDL:erna, enkelnivå-PIDL:er , är relativa till objektets överordnade mapp. De innehåller endast objektets objekt-ID och en avslutande NULL. PIDL:er på flera nivåer används också för många syften. De innehåller två eller flera objekt-ID:er och definierar vanligtvis en sökväg från en överordnad mapp till ett objekt via en serie med en eller flera undermappar. Observera att en PIDL på enkel nivå fortfarande kan vara en fullt kvalificerad PIDL. I synnerhet är skrivbordsobjekt underordnade skrivbordet, så deras fullständigt kvalificerade PIDL:er innehåller bara ett objekt-ID.

Som beskrivs i Hämta en mapps IDtillhandahåller Shell-API:et ett antal sätt att hämta ett objekts PIDL. När du har det använder du det ofta bara för att identifiera objektet när du anropar andra Shell API-funktioner och -metoder. I det här sammanhanget är en PIDL:s interna innehåll ogenomskinligt och irrelevant. För syftet med denna diskussion bör du tänka på PIDL:er som token som representerar specifika objekt i namnrymden och fokusera på hur de används i vanliga uppgifter.

Allokera PIN-adresser

Även om PIDL:er har vissa likheter med sökvägar kräver användning av dem en något annorlunda metod. Den primära skillnaden är hur du allokerar och frigör minne för dem.

Precis som strängen som används för en sökväg måste minne allokeras för en PIDL. Om ett program skapar en PIDL måste det allokera tillräckligt med minne för ITEMIDLIST- struktur. För de flesta av de fall som beskrivs här skapar Shell PIDL och hanterar minnesallokering. Oavsett vad som allokerade PIDL, är det vanligtvis programmet som ansvarar för att deallokera PIDL när det inte längre behövs.

Använd funktionen CoTaskMemAlloc för att allokera PIDL och funktionen CoTaskMemFree för att frigöra den.