Navigieren im Namespace
Sie verfügen jetzt über alle wichtigen Elemente, die zum Navigieren an einer beliebigen Stelle im Namespace erforderlich sind. Die einfachste Möglichkeit zum Starten besteht darin, dass 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:
- Auflisten des Ordnerinhalts.
- Bestimmen Sie, welche Objekte Unterordner sind, und wählen Sie einen aus.
- Binden Sie an den Unterordner, um seine IShellFolder-Schnittstelle abzurufen.
Wiederholen Sie diese Schritte so oft wie nötig, um das Ziel zu erreichen.
Der folgende Beispielcode 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).
- Listet den Inhalt des Ordners auf (Aufzählen des Inhalts eines Ordners).
- Bestimmt alle Anzeigenamen und druckt sie (Ermitteln von Anzeigenamen und anderen Eigenschaften).
- Sucht nach einem Unterordner (Abrufen eines Zeigers auf die IShellFolder-Schnittstelle eines Unterordners).
- Bindet an den ersten Gefundenen Unterordner (Abrufen eines Zeigers auf die IShellFolder-Schnittstelle eines 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;
}