Esplorazione dello spazio dei nomi
Sono ora disponibili tutti gli elementi essenziali necessari per spostarsi in qualsiasi punto dello spazio dei nomi. Il modo più semplice per iniziare consiste nel fare in modo che l'applicazione chiami SHGetDesktopFolder per recuperare l'interfaccia IShellFolder del desktop. Per spostarsi verso il basso nello spazio dei nomi, l'applicazione può quindi seguire questa procedura:
- Enumerare il contenuto della cartella.
- Determinare quali oggetti sono sottocartelle e selezionare uno.
- Eseguire l'associazione alla sottocartella per recuperare l'interfaccia IShellFolder .
Ripetere questi passaggi con la frequenza necessaria per raggiungere la destinazione.
La parte di codice di esempio seguente è una semplice applicazione console che illustra una serie di procedure descritte nelle sezioni precedenti. Il controllo degli errori è stato omesso per maggiore chiarezza. L'applicazione esegue queste attività:
- Recupera l'interfaccia IShellFolder della cartella Programmi (utilizzando l'interfaccia IShellFolder).
- Enumera il contenuto della cartella (enumerazione del contenuto di una cartella).
- Determina tutti i nomi visualizzati e li stampa (Determinazione dei nomi visualizzati e altre proprietà).
- Cerca una sottocartella (Recupero di un puntatore a un'interfaccia IShellFolder di una sottocartella).
- Esegue l'associazione alla prima sottocartella trovata (recupero di un puntatore all'interfaccia IShellFolder di una sottocartella).
- Stampa i nomi visualizzati degli oggetti nella sottocartella.
#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;
}