Navigieren im Namespace
Sie verfügen nun über alle wesentlichen Elemente, die zum Navigieren an einer beliebigen Stelle im Namespace erforderlich sind. Am einfachsten können Sie beginnen, wenn Ihre Anwendung SHGetDesktopFolder aufruft, um die IShellFolder-Schnittstelle des Desktops abzurufen. Um dann nach unten durch den Namespace zu navigieren, kann Ihre Anwendung die folgenden Schritte ausführen:
- Enumerieren Sie den Inhalt des Ordners.
- Bestimmen Sie, welche Objekte Unterordner sind, und wählen Sie eines aus.
- Binden Sie eine Bindung an den Unterordner, um die IShellFolder-Schnittstelle abzurufen.
Wiederholen Sie diese Schritte so oft wie nötig, um das Ziel zu erreichen.
Ein einfaches Beispiel für die Namespacenavigation
Der folgende Codeabschnitt ist eine einfache Konsolenanwendung, die eine Reihe der in den vorherigen Abschnitten erläuterten Verfahren veranschaulicht. Die Fehlerüberprüfung wurde aus Gründen der Übersichtlichkeit ausgelassen. Die Anwendung führt die folgenden Aufgaben durch:
- Ruft die IShellFolder-Schnittstelle des Ordners Programme ab (mithilfe der IShellFolder-Schnittstelle).
- Enumeriert den Inhalt des Ordners (Aufzählendes Inhalts eines Ordners ).
- Bestimmt alle Anzeigenamen und gibt sie aus (Bestimmen von Anzeigenamen und anderen Eigenschaften).
- Sucht nach einem Unterordner ( Abrufen eines Zeigers auf dieIShellFolder-Schnittstelle eines Unterordners).
- Bindet an den ersten gefundenen Unterordner ( Abrufen eines Zeigers auf dieIShellFolder-Schnittstelleeines Unterordners ).
- Gibt die Anzeigenamen der Objekte im Unterordner aus.
#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;
}