Dela via


Hämta en mapps ID

Innan du kan använda ett namnområdesobjekt behöver du ett sätt att identifiera det. Det innebär att antingen hämta pekaren till en lista över objektidentifierare (PIDL) eller, i fallet med filsystemobjekt, dess sökväg. I det här avsnittet beskrivs två av de enklare sätten att hämta objekt-ID:t.

Använd gränssnittet IShellFolder för en mer kraftfull metod som fungerar med valfri mapp. Mer information finns i Hämta information om innehållet i en mapp.

Dialogrutan Öppna filer

Om du vill att användaren ska kunna navigera i namnområdet och välja en mapp kan programmet använda IFileDialog-gränssnittet. Om du anropar det här gränssnittet med flaggan FOS_PICKFOLDERS startas dialogrutan Öppna filer gemensam i läget "välj mappar".

För Windows Vista och senare är detta det rekommenderade sättet att välja mappar.

Dialogrutan SHBrowseForFolder

Om du vill att användaren ska kunna navigera i namnområdet och välja en mapp kan programmet bara anropa SHBrowseForFolder. Om du anropar den här funktionen startas en dialogruta med ett användargränssnitt som fungerar ungefär som Öppna eller SparaAs vanliga dialogrutor.

När användaren väljer en mapp returnerar SHBrowseForFolder mappens fullständigt kvalificerade PIDL och dess visningsnamn. Om mappen finns i filsystemet kan programmet konvertera PIDL till en sökväg genom att anropa SHGetPathFromIDList. Programmet kan också begränsa det intervall med mappar som användaren kan välja mellan genom att ange en rotmapp. Endast mappar under roten i namnområdet visas. Följande bild visar dialogrutan SHBrowseForFolder med rotmappen inställd på Programfiler.

skärmbild av dialogrutan för att bläddra efter mapp

Ett enkelt exempel på hur du använder SHBrowseForFolder tillhandahålls senare.

Särskilda mappar och CSIDL:er

Ett antal vanliga mappar anges som särskilda av systemet. De här mapparna har ett väldefinierat syfte och de flesta finns på alla system. Även om de inte finns från början definieras deras namn och platser fortfarande, så de kan läggas till senare. Samlingen med särskilda mappar innehåller alla systemets virtuella standardmappar, till exempel Skrivare, Mina dokument och Nätverksområde. Den innehåller också ett antal standardfilsystemmappar, till exempel Programfiler och System.

Även om mapparna är en standardkomponent i alla system kan deras namn och platser i namnområdet variera. Systemkatalogen är till exempel C:\Winnt\System32 på vissa system och C:\Windows\System32 på andra. Tidigare var miljövariabler ett sätt att fastställa namnet och platsen för en särskild mapp i ett visst system. Shell ger nu ett mer robust och flexibelt sätt att identifiera särskilda mappar, CSIDL:er. Du bör vanligtvis använda dem i stället för miljövariabler.

CSIDL:er ger ett enhetligt sätt att identifiera och hitta särskilda mappar, oavsett namn eller plats i ett visst system. Till skillnad från miljövariabler kan CSIDL:er användas med virtuella mappar och filsystemmappar. Varje särskild mapp har tilldelats en unik CSIDL. Filsystemmappen Program Files har till exempel ett CSIDL för CSIDL_PROGRAM_FILESoch den virtuella mappen Nätverksområde har ett CSIDL för CSIDL_NETWORK.

En CSIDL används tillsammans med en av flera Shell-funktioner för att hämta en särskild mapps PIDL eller en särskild filsystemmapps sökväg. Om mappen inte finns på ett system kan ditt program tvinga fram att den skapas genom att kombinera dess CSIDL med CSIDL_FLAG_CREATE. CSIDL kan skickas till följande funktioner:

Observera att dessa två funktioner introducerades med version 5.0 av Shell och ersätter funktionerna SHGetSpecialFolderLocation och SHGetSpecialFolderPath.

Ett enkelt exempel på hur du använder CSIDL:er och SHBrowseForFolder

Följande exempelfunktion, PidlBrowse, visar hur du använder CSIDL:er för att hämta en mapps PIDL och använder SHBrowseForFolder för att låta användaren välja en mapp. Den returnerar PIDL och visningsnamnet för den valda mappen.

LPITEMIDLIST PidlBrowse(HWND hwnd, int nCSIDL, LPSTR pszDisplayName)
{
    LPITEMIDLIST pidlRoot = NULL;
    LPITEMIDLIST pidlSelected = NULL;
    BROWSEINFO bi = {0};

    if(nCSIDL)
    {
        SHGetFolderLocation(hwnd, nCSIDL, NULL, NULL, &pidlRoot);
    }

    else
    {
        pidlRoot = NULL;
    }

    bi.hwndOwner = hwnd;
    bi.pidlRoot = pidlRoot;
    bi.pszDisplayName = pszDisplayName;
    bi.lpszTitle = "Choose a folder";
    bi.ulFlags = 0;
    bi.lpfn = NULL;
    bi.lParam = 0;

    pidlSelected = SHBrowseForFolder(&bi);

    if(pidlRoot)
    {
        CoTaskMemFree(pidlRoot);
    }

    return pidlSelected;
}

Det anropande programmet överför ett fönsterhandtag, vilket behövs av SHBrowseForFolder. Parametern nCSIDL är en valfri CSIDL som används för att ange en rotmapp. Endast mappar under rotmappen i hierarkin visas. Bilden som visades tidigare genererades genom att anropa den här funktionen med nCSIDL inställd på CSIDL_PROGRAM_FILES. Det anropande programmet skickar också en strängbuffert, pszDisplayName, för att lagra visningsnamnet för den valda mappen när PidlBrowse returnerar. Det är det anropande programmets ansvar att frigöra IDList som returneras av SHBrowseForFolder med hjälp av CoTaskMemFree.