Share via


Navegación por el espacio de nombres

Ahora tiene todos los elementos esenciales necesarios para navegar por cualquier lugar del espacio de nombres. La manera más sencilla de empezar es hacer que la aplicación llame a SHGetDesktopFolder para recuperar la interfaz IShellFolder del escritorio. A continuación, para navegar hacia abajo por el espacio de nombres, la aplicación puede seguir estos pasos:

  1. Enumere el contenido de la carpeta.
  2. Determine qué objetos son subcarpetas y seleccione uno.
  3. Enlazar a la subcarpeta para recuperar su interfaz IShellFolder .

Repita estos pasos con la frecuencia necesaria para alcanzar el destino.

Un ejemplo sencillo de navegación de espacio de nombres

El siguiente fragmento de código de ejemplo es una aplicación de consola sencilla que ilustra varios de los procedimientos descritos en las secciones anteriores. Se ha omitido la comprobación de errores para mayor claridad. La aplicación realiza las tareas siguientes:

  1. Recupera la interfaz IShellFolder de la carpeta Archivos de programa (mediante la interfaz IShellFolder).
  2. Enumera el contenido de la carpeta (enumerando el contenido de una carpeta).
  3. Determina todos los nombres para mostrar y los imprime (Determinar nombres para mostrar y otras propiedades).
  4. Busca una subcarpeta (Obtener un puntero a la interfaz IShellFolder de una subcarpeta).
  5. Enlaza con la primera subcarpeta que encuentra (Obtener un puntero a la interfaz IShellFolder de una subcarpeta).
  6. Imprime los nombres para mostrar de los objetos en la subcarpeta.
#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;
}