Share via


Navigation dans l’espace de noms

Vous disposez maintenant de tous les éléments essentiels nécessaires pour naviguer n’importe où dans l’espace de noms. Le moyen le plus simple de commencer consiste à demander à votre application d’appeler SHGetDesktopFolder pour récupérer l’interface IShellFolder du bureau. Ensuite, pour naviguer dans l’espace de noms, votre application peut suivre les étapes suivantes :

  1. Énumérez le contenu du dossier.
  2. Déterminez les objets qui sont des sous-dossiers, puis sélectionnez-en un.
  3. Liez au sous-dossier pour récupérer son interface IShellFolder .

Répétez ces étapes aussi souvent que nécessaire pour atteindre la cible.

Exemple simple de navigation dans les espaces de noms

L’exemple de code suivant est une application console simple qui illustre un certain nombre de procédures décrites dans les sections précédentes. La vérification des erreurs a été omise pour plus de clarté. L’application effectue les tâches suivantes :

  1. Récupère l’interface IShellFolder du dossier Program Files (à l’aide de l’interface IShellFolder).
  2. Énumère le contenu du dossier (énumération du contenu d’un dossier).
  3. Détermine tous les noms d’affichage et les imprime (Détermination des noms d’affichage et autres propriétés).
  4. Recherche un sous-dossier (obtention d’un pointeur vers l’interface IShellFolder d’un sous-dossier).
  5. Lie au premier sous-dossier qu’il trouve (obtention d’un pointeur vers l’interface IShellFolder d’un sous-dossier).
  6. Imprime les noms d’affichage des objets dans le sous-dossier.
#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;
}