Delen via


Navigeren door de Namespace

U hebt nu alle essentiële elementen die nodig zijn om overal in de naamruimte te navigeren. De eenvoudigste manier om te beginnen is door uw applicatie SHGetDesktopFolder aan te laten roepen om de IShellFolder-interfacevan het bureaubladop te halen. Als u vervolgens omlaag door de naamruimte wilt navigeren, kan uw toepassing de volgende stappen uitvoeren:

  1. De inhoud van de map opsommen.
  2. Bepaal welke items submappen zijn en selecteer er een.
  3. Bind aan de submap om de IShellFolder interface op te halen.

Herhaal deze stappen zo vaak als nodig is om het doel te bereiken.

Een eenvoudig voorbeeld van naamruimtenavigatie

Het volgende stukje voorbeeldcode is een eenvoudige consoletoepassing die een aantal procedures illustreert die in de voorgaande secties worden besproken. Foutcontrole is weggelaten voor duidelijkheid. De toepassing voert de volgende taken uit:

  1. Hiermee wordt de IShellFolder--interface van de map Program Files opgehaald (Gebruikmakend van de IShellFolder-interface).
  2. Opsomming van de inhoud van de map (De inhoud van een map opsommen).
  3. Bepaalt alle weergavenamen en drukt deze af (Weergavenamen en andere eigenschappen bepalen).
  4. Zoekt naar een submap (Een aanwijzer naar de IShellFolder-interface van een submap).
  5. Wordt gekoppeld aan de eerste submap die wordt gevonden (Een aanwijzer naar de IShellFolder-interface van een submap).
  6. Drukt de weergavenamen van de objecten in de submap af.
#include <shlobj.h>
#include <shlwapi.h>
#include <iostream.h>

main()
{
    LPITEMIDLIST pidlProgFiles = NULL;
    LPITEMIDLIST pidlItems = NULL;
    IShellFolder *psfFirstFolder = NULL;
    IShellFolder *psfDeskTop = NULL;
    IShellFolder *psfProgFiles = NULL;
    LPENUMIDLIST ppenum = NULL;
    ULONG celtFetched;
    HRESULT hr;
    STRRET strDispName;
    TCHAR pszDisplayName[MAX_PATH];
    ULONG uAttr;
   
    CoInitialize( NULL );
    
    hr = SHGetFolderLocation(NULL, CSIDL_PROGRAM_FILES, NULL, 0, &pidlProgFiles);

    hr = SHGetDesktopFolder(&psfDeskTop);

    hr = psfDeskTop->BindToObject(pidlProgFiles, NULL, IID_IShellFolder, (LPVOID *) &psfProgFiles);
    psfDeskTop->Release();

    hr = psfProgFiles->EnumObjects(NULL,SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &ppenum);

    while( hr = ppenum->Next(1,&pidlItems, &celtFetched) == S_OK && (celtFetched) == 1)
    {
        psfProgFiles->GetDisplayNameOf(pidlItems, SHGDN_INFOLDER, &strDispName);
        StrRetToBuf(&strDispName, pidlItems, pszDisplayName, MAX_PATH);
        cout << pszDisplayName << '\n';
        if(!psfFirstFolder)
        {
            uAttr = SFGAO_FOLDER;
            psfProgFiles->GetAttributesOf(1, (LPCITEMIDLIST *) &pidlItems, &uAttr);
            if(uAttr & SFGAO_FOLDER)
            {
                hr = psfProgFiles->BindToObject(pidlItems, NULL, IID_IShellFolder, (LPVOID *) &psfFirstFolder);
            }
        }
        CoTaskMemFree(pidlItems);
    }

    cout << "\n\n";

    ppenum->Release();

    if(psfFirstFolder)
    {
        hr = psfFirstFolder->EnumObjects(NULL,SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &ppenum);

        while( hr = ppenum->Next(1,&pidlItems, &celtFetched) == S_OK && (celtFetched) == 1)
        {
            psfFirstFolder->GetDisplayNameOf(pidlItems, SHGDN_INFOLDER, &strDispName);
            StrRetToBuf(&strDispName, pidlItems, pszDisplayName, MAX_PATH);
            cout << pszDisplayName << '\n';
            CoTaskMemFree(pidlItems);
        }
    }

    ppenum->Release();
    CoTaskMemFree(pidlProgFiles);
    psfProgFiles->Release();
    psfFirstFolder->Release();

    CoUninitialize();
    return 0;
}