Udostępnij przez


Nawigowanie po przestrzeni nazw

Masz teraz wszystkie podstawowe elementy potrzebne do nawigowania w dowolnym miejscu w przestrzeni nazw. Najprostszym sposobem rozpoczęcia jest wywołanie aplikacji SHGetDesktopFolder w celu pobrania interfejsu IShellFolder pulpitu. Następnie, aby przejść w dół przez przestrzeń nazw, aplikacja może wykonać następujące kroki:

  1. Wyliczanie zawartości folderu.
  2. Określ, które obiekty są podfolderami, i wybierz jeden.
  3. Powiąż z podfolderem, aby pobrać interfejs IShellFolder.

Powtórz te kroki tak często, jak to konieczne, aby osiągnąć cel.

Prosty przykład nawigacji przestrzeni nazw

Poniższy przykładowy kod to prosta aplikacja konsolowa, która ilustruje szereg procedur omówionych w poprzednich sekcjach. Sprawdzanie błędów zostało pominięte w celu zachowania przejrzystości. Aplikacja wykonuje następujące zadania:

  1. Pobiera interfejsIShellFolder folderu Program Files (przy użyciu interfejsu IShellFolder).
  2. Wylicza zawartość folderu (wyliczanie zawartości folderu).
  3. Określa wszystkie nazwy wyświetlane i drukuje je (Określanie nazw wyświetlanych i innych właściwości).
  4. Szukaj podfolderu (Uzyskiwanie wskaźnika do interfejsu IShellFolder podfoldera).
  5. Łączy się z pierwszym znalezionym podfolderem (Pobieranie wskaźnika do interfejsu IShellFolder podfoldera).
  6. Drukuje nazwy wyświetlane obiektów w podfolderze.
#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;
}