Abrufen der ID eines Ordners
Bevor Sie ein Namespaceobjekt verwenden können, benötigen Sie eine Möglichkeit, es zu identifizieren. Dies bedeutet, dass entweder der Zeiger auf eine Elementbezeichnerliste (PIDL) oder im Fall von Dateisystemobjekten der Pfad abgerufen wird. In diesem Abschnitt werden zwei einfachere Möglichkeiten zum Abrufen von Objekt-IDs erläutert.
Für einen leistungsfähigeren Ansatz, der mit jedem Ordner funktioniert, verwenden Sie die IShellFolder-Schnittstelle . Weitere Informationen finden Sie unter Abrufen von Informationen zum Inhalt eines Ordners .
- Das Dialogfeld OpenFiles
- Das Dialogfeld SHBrowseForFolder
- Spezielle Ordner und CSIDLs
- Ein einfaches Beispiel für die Verwendung von CSIDLs und SHBrowseForFolder
Das Dialogfeld OpenFiles
Damit der Benutzer durch den Namespace navigieren und einen Ordner auswählen kann, kann Ihre Anwendung die IFileDialog-Schnittstelle verwenden. Wenn Sie diese Schnittstelle mit dem Flag FOS_PICKFOLDERS aufrufen, wird das Allgemeine Dialogfeld Dateien öffnen im Modus "Ordner auswählen" gestartet.
Für Windows Vista und höher ist dies die empfohlene Methode zum Auswählen von Ordnern.
Das Dialogfeld SHBrowseForFolder
Damit der Benutzer durch den Namespace navigieren und einen Ordner auswählen kann, kann Ihre Anwendung einfach SHBrowseForFolder aufrufen. Durch Aufrufen dieser Funktion wird ein Dialogfeld mit einer Benutzeroberfläche gestartet, die ähnlich wie die allgemeinen Dialogfelder Öffnen oder Speichern funktioniert.
Wenn der Benutzer einen Ordner auswählt, gibt SHBrowseForFolder die vollqualifizierte PIDL des Ordners und seinen Anzeigenamen zurück. Wenn sich der Ordner im Dateisystem befindet, kann die Anwendung die PIDL durch Aufrufen von SHGetPathFromIDList in einen Pfad konvertieren. Die Anwendung kann auch den Ordnerbereich einschränken, aus dem der Benutzer auswählen kann, indem sie einen Stammordner angibt. Nur Ordner, die sich unterhalb dieses Stammes im Namespace befinden, werden angezeigt. Die folgende Abbildung zeigt das Dialogfeld SHBrowseForFolder , wobei der Stammordner auf Programme festgelegt ist.
Ein einfaches Beispiel für die Verwendung von SHBrowseForFolder wird später bereitgestellt.
Spezielle Ordner und CSIDLs
Eine Reihe von häufig verwendeten Ordnern wird vom System als speziell bezeichnet. Diese Ordner haben einen klar definierten Zweck, und die meisten von ihnen sind auf allen Systemen vorhanden. Auch wenn sie anfangs nicht vorhanden sind, werden ihre Namen und Standorte weiterhin definiert, sodass sie später hinzugefügt werden können. Die Sammlung von speziellen Ordnern umfasst alle virtuellen Standardordner des Systems, z. B. Drucker, Eigene Dokumente und Netzwerkumgebung. Es enthält auch eine Reihe von Standarddateisystemordnern, z. B. Programme und System.
Obwohl die Ordner eine Standardkomponente aller Systeme sind, können ihre Namen und Speicherorte im Namespace variieren. Das Systemverzeichnis lautet beispielsweise C:\Winnt\System32 auf einigen Systemen und C:\Windows\System32 auf anderen Systemen. In der Vergangenheit boten Umgebungsvariablen eine Möglichkeit, den Namen und den Speicherort eines speziellen Ordners auf einem bestimmten System zu bestimmen. Die Shell bietet jetzt eine robustere und flexiblere Möglichkeit, spezielle Ordner, CSIDLs, zu identifizieren. Sie sollten diese im Allgemeinen anstelle von Umgebungsvariablen verwenden.
CSIDLs bieten eine einheitliche Möglichkeit, spezielle Ordner zu identifizieren und zu suchen, unabhängig von ihrem Namen oder Speicherort auf einem bestimmten System. Im Gegensatz zu Umgebungsvariablen können CSIDLs sowohl mit virtuellen Ordnern als auch mit Dateisystemordnern verwendet werden. Jedem speziellen Ordner ist eine eindeutige CSIDL zugewiesen. Beispielsweise verfügt der Dateisystemordner Programme über eine CSIDL von CSIDL_PROGRAM_FILES, und der virtuelle Ordner Netzwerkumgebung verfügt über eine CSIDL von CSIDL_NETWORK.
Eine CSIDL wird in Verbindung mit einer von mehreren Shellfunktionen verwendet, um die PIDL eines speziellen Ordners oder den Pfad eines speziellen Dateisystemordners abzurufen. Wenn der Ordner nicht auf einem System vorhanden ist, kann Ihre Anwendung die Erstellung erzwingen, indem sie seine CSIDL mit CSIDL_FLAG_CREATE kombiniert. Die CSIDL kann an die folgenden Funktionen übergeben werden:
- SHGetFolderLocation, das die PIDL eines speziellen Ordners abruft.
- SHGetFolderPath, der den Pfad eines speziellen Dateisystemordners abruft.
Beachten Sie, dass diese beiden Funktionen mit Version 5.0 der Shell eingeführt wurden und die Funktionen SHGetSpecialFolderLocation und SHGetSpecialFolderPath ablösen.
Ein einfaches Beispiel für die Verwendung von CSIDLs und SHBrowseForFolder
Die folgende Beispielfunktion PidlBrowse veranschaulicht, wie sie CSIDLs zum Abrufen der PIDL eines Ordners verwenden und SHBrowseForFolder verwenden, damit der Benutzer einen Ordner auswählen kann. Es gibt die PIDL und den Anzeigenamen des ausgewählten Ordners zurück.
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;
}
Die aufrufende Anwendung übergibt ein Fensterhandle, das von SHBrowseForFolder benötigt wird. Der nCSIDL-Parameter ist eine optionale CSIDL, die zum Angeben eines Stammordners verwendet wird. Es werden nur Ordner unterhalb des Stammordners in der Hierarchie angezeigt. Die weiter oben gezeigte Abbildung wurde durch Aufrufen dieser Funktion generiert, wobei nCSIDL auf CSIDL_PROGRAM_FILES festgelegt ist. Die aufrufende Anwendung übergibt auch einen Zeichenfolgenpuffer, pszDisplayName, um den Anzeigenamen des ausgewählten Ordners zu speichern, wenn PidlBrowse zurückgibt. Es liegt in der Verantwortung der aufrufenden Anwendung, die von SHBrowseForFolder zurückgegebene IDList mithilfe von CoTaskMemFree freizugeben.