Delen via


Het ID van de map verkrijgen

Voordat u een naamruimteobject kunt gebruiken, hebt u een manier nodig om het te identificeren. Dit betekent het verkrijgen van ofwel de pointer naar een item-identificatielijst (PIDL) of, in het geval van bestandssysteemobjecten, het pad. In deze sectie worden twee eenvoudigere manieren besproken om object-id's te verkrijgen.

Gebruik de interface IShellFolder voor een krachtigere benadering die met elke map werkt. Zie Informatie ophalen over de inhoud van een map voor meer informatie.

Het dialoogvenster OpenFiles

Als u wilt dat de gebruiker door de naamruimte navigeert en een map selecteert, kan uw toepassing de IFileDialog interface gebruiken. Als u deze interface aanroept met de vlag FOS_PICKFOLDERS, wordt het dialoogvenster Bestanden openen in de modus Mappen kiezen gestart.

Voor Windows Vista en hoger is dit de aanbevolen manier om mappen te kiezen.

Het dialoogvenster SHBrowseForFolder

Als u wilt dat de gebruiker door de naamruimte navigeert en een map selecteert, kan uw toepassing gewoon SHBrowseForFolder-aanroepen. Als u deze functie aanroept, wordt een dialoogvenster geopend met een gebruikersinterface die enigszins lijkt op de Openen of Opslaan als algemene dialoogvensters.

Wanneer de gebruiker een map selecteert, SHBrowseForFolder de volledig gekwalificeerde PIDL en de weergavenaam van de map retourneert. Als de map zich in het bestandssysteem bevindt, kan de toepassing de PIDL converteren naar een pad door SHGetPathFromIDList-aan te roepen. De toepassing kan ook het bereik van mappen beperken waaruit de gebruiker kan selecteren door een hoofdmap op te geven. Alleen mappen die zich onder die hoofdmap in de naamruimte bevinden, worden weergegeven. In de volgende afbeelding ziet u het dialoogvenster SHBrowseForFolder, waarbij de hoofdmap is ingesteld op Program Files.

schermafbeelding van het dialoogvenster Bladeren naar map

Een eenvoudig voorbeeld van het gebruik van SHBrowseForFolder wordt later gegeven.

Speciale mappen en CSIDLs

Een aantal veelgebruikte mappen wordt door het systeem aangeduid als speciale. Deze mappen hebben een goed gedefinieerd doel en de meeste zijn aanwezig op alle systemen. Zelfs als ze in eerste instantie niet aanwezig zijn, worden hun namen en locaties nog steeds gedefinieerd, zodat ze later kunnen worden toegevoegd. De verzameling speciale mappen bevat alle standaard virtuele mappen van het systeem, zoals Printers, Mijn documenten en Netwerkwijk. Het bevat ook een aantal standaardmappen van het bestandssysteem, zoals Program Files en System.

Hoewel de mappen een standaardonderdeel van alle systemen zijn, kunnen hun namen en locaties in de naamruimte variëren. De systeemmap is bijvoorbeeld C:\Winnt\System32 op sommige systemen en C:\Windows\System32 op andere. In het verleden hebben omgevingsvariabelen een manier geboden om de naam en locatie van een speciale map op een bepaald systeem te bepalen. De Shell biedt nu een robuustere en flexibele manier om speciale mappen te identificeren, CSIDLs. U moet ze over het algemeen gebruiken in plaats van omgevingsvariabelen.

CSIDLs bieden een uniforme manier om speciale mappen te identificeren en te lokaliseren, ongeacht hun naam of locatie op een bepaald systeem. In tegenstelling tot omgevingsvariabelen kunnen CSIDLs worden gebruikt met virtuele mappen en bestandssysteemmappen. Aan elke speciale map is een unieke CSIDL toegewezen. De map Program Files-bestandssysteem heeft bijvoorbeeld een CSIDL van CSIDL_PROGRAM_FILESen de virtuele map Network Neighborhood heeft een CSIDL van CSIDL_NETWORK.

Een CSIDL wordt gebruikt in combinatie met een van de verschillende Shell-functies om de PIDL van een speciale map of het pad van een speciale bestandssysteemmap op te halen. Als de map niet bestaat op een systeem, kan uw toepassing afdwingen dat deze wordt gemaakt door de CSIDL te combineren met CSIDL_FLAG_CREATE. De CSIDL kan worden doorgegeven aan de volgende functies:

Houd er rekening mee dat deze twee functies zijn geïntroduceerd met versie 5.0 van de Shell en de functies SHGetSpecialFolderLocation en SHGetSpecialFolderPath vervangen.

Een eenvoudig voorbeeld van het gebruik van CSIDLs en SHBrowseForFolder

De volgende voorbeeldfunctie, PidlBrowse, laat zien hoe u CSIDLs gebruikt om de PIDL van een map op te halen en SHBrowseForFolder om de gebruiker een map te laten selecteren. Hiermee worden de PIDL en weergavenaam van de geselecteerde map geretourneerd.

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;
}

De aanroepende applicatie geeft een vensterhandle door, die nodig is voor SHBrowseForFolder. De parameter nCSIDL is een optionele CSIDL die wordt gebruikt om een hoofdmap op te geven. Alleen mappen onder de hoofdmap in de hiërarchie worden weergegeven. De afbeelding die eerder is weergegeven, is gegenereerd door deze functie aan te roepen met nCSIDL- ingesteld op CSIDL_PROGRAM_FILES. De aanroepende toepassing geeft ook een tekenreeksbuffer door, pszDisplayName, om de weergavenaam van de geselecteerde map op te slaan wanneer PidlBrowse retourneert. Het is de verantwoordelijkheid van de aanroepende toepassing om de IDList die wordt geretourneerd door SHBrowseForFolder, met behulp van CoTaskMemFree.