Recupero dell'ID di una cartella

Prima di poter usare un oggetto spazio dei nomi, è necessario un modo per identificarlo. Ciò significa ottenere il puntatore a un elenco di identificatori di elemento (PIDL) o, nel caso di oggetti file system, il relativo percorso. Questa sezione illustra due dei modi più semplici per ottenere gli ID oggetto.

Per un approccio più potente che funzionerà con qualsiasi cartella, usare l'interfaccia IShellFolder . Per altri dettagli, vedere Recupero di informazioni sul contenuto di una cartella .

Finestra di dialogo OpenFiles

Per consentire all'utente di spostarsi nello spazio dei nomi e selezionare una cartella, l'applicazione può usare l'interfaccia IFileDialog . La chiamata a questa interfaccia con il flag FOS_PICKFOLDERS avvia la finestra di dialogo Apri file comuni in modalità "seleziona cartelle".

Per Windows Vista e versioni successive, questo è il modo consigliato per selezionare le cartelle.

Finestra di dialogo SHBrowseForFolder

Per consentire all'utente di spostarsi nello spazio dei nomi e selezionare una cartella, l'applicazione può semplicemente richiamare SHBrowseForFolder. La chiamata a questa funzione avvia una finestra di dialogo con un'interfaccia utente simile alle finestre di dialogo comuni Apri o SalvaAs .

Quando l'utente seleziona una cartella, SHBrowseForFolder restituisce il PIDL completo della cartella e il relativo nome visualizzato. Se la cartella si trova nel file system, l'applicazione può convertire il PIDL in un percorso chiamando SHGetPathFromIDList. L'applicazione può anche limitare l'intervallo di cartelle che l'utente può selezionare specificando una cartella radice. Verranno visualizzate solo le cartelle che si trovano sotto la radice nello spazio dei nomi. La figura seguente mostra la finestra di dialogo SHBrowseForFolder con la cartella radice impostata su Programmi.

screenshot della finestra di dialogo Cerca cartella

In seguito viene fornito un semplice esempio di come usare SHBrowseForFolder .

Cartelle speciali e CSIDLs

Una serie di cartelle di uso comune viene designata come speciale dal sistema. Queste cartelle hanno uno scopo ben definito e la maggior parte di esse sono presenti in tutti i sistemi. Anche se inizialmente non sono presenti, i nomi e le posizioni sono ancora definiti, in modo che possano essere aggiunti in un secondo momento. La raccolta di cartelle speciali include tutte le cartelle virtuali standard del sistema, ad esempio Stampanti, Documenti e Quartiere di rete. Include anche una serie di cartelle di file system standard, ad esempio Programmi e Sistema.

Anche se le cartelle sono un componente standard di tutti i sistemi, i nomi e le posizioni nello spazio dei nomi possono variare. Ad esempio, la directory di sistema è C:\Winnt\System32 in alcuni sistemi e C:\Windows\System32 in altri. In passato, le variabili di ambiente fornivano un modo per determinare il nome e la posizione di una cartella speciale in qualsiasi sistema specifico. Shell offre ora un modo più affidabile e flessibile per identificare cartelle speciali, CSIDL. In genere è consigliabile usarli invece delle variabili di ambiente.

I CSP offrono un modo uniforme per identificare e individuare cartelle speciali, indipendentemente dal nome o dalla posizione in un particolare sistema. A differenza delle variabili di ambiente, gli ID CERTIFICATI possono essere usati con cartelle virtuali e cartelle del file system. A ogni cartella speciale è assegnato un CSIDL univoco. Ad esempio, la cartella del file system Programmi ha un CSIDL di CSIDL_PROGRAM_FILES e la cartella virtuale Network Neighborhood ha un CSIDL di CSIDL_NETWORK.

Un CSIDL viene usato insieme a una delle diverse funzioni shell per recuperare il PIDL di una cartella speciale o il percorso di una cartella del file system speciale. Se la cartella non esiste in un sistema, è possibile forzare la creazione dell'applicazione combinando il codice CSIDL con CSIDL_FLAG_CREATE. Il linguaggio CSIDL può essere passato alle funzioni seguenti:

Si noti che queste due funzioni sono state introdotte con la versione 5.0 di Shell e sostituiscono le funzioni SHGetSpecialFolderLocation e SHGetSpecialFolderPath .

Esempio semplice di come usare CSIDLs e SHBrowseForFolder

La funzione di esempio seguente, PidlBrowse, illustra come usare GLIDL per recuperare il PIDL di una cartella e usare SHBrowseForFolder per fare in modo che l'utente selezioni una cartella. Restituisce il PIDL e il nome visualizzato della cartella selezionata.

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

L'applicazione chiamante passa un handle di finestra, necessario per SHBrowseForFolder. Il parametro nCSIDL è un CSIDL facoltativo usato per specificare una cartella radice. Verranno visualizzate solo le cartelle sotto la cartella radice nella gerarchia. La figura illustrata in precedenza è stata generata chiamando questa funzione con nCSIDL impostato su CSIDL_PROGRAM_FILES. L'applicazione chiamante passa anche un buffer stringa, pszDisplayName, per contenere il nome visualizzato della cartella selezionata quando PidlBrowse restituisce. È responsabilità dell'applicazione chiamante liberare l'IDList restituito da SHBrowseForFolder usando CoTaskMemFree.