#include <shlobj.h> WM_CREATE: ... CoInitialize(0); |
Die zentrale Funktion heisst SHBrowseForFolder und arbeitet mit einer Struktur BROWSEINFO.
WINSHELLAPI LPITEMIDLIST WINAPI SHBrowseForFolder(LPBROWSEINFO lpbi);Die folgende Routine startet einen Selektionsdialog für Verzeichnisse.
char strOrdner[_MAX_PATH] = ""; BROWSEINFO browseInfo = {0}; browseInfo.pszDisplayName = strOrdner; // wir verwenden diesen nicht browseInfo.hwndOwner = hWnd; LPITEMIDLIST ret; ret = SHBrowseForFolder(&browseInfo); if (ret) { // OK selektiert if (SHGetPathFromIDList(ret, strOrdner)) { MessageBox(hWnd, strOrdner, "selektiert", MB_OK); } } |
Das Feld pszDisplayName muss auf einen Speicherplatz zeigen, in den die Dialogbox den "Anzeigenamen" ablegt. Dieser besteht aber aus dem nackten Verzeichnisnamen ohne Pfad. Das nutzt dem Programmierer meist wenig. Um den kompletten Pfadnamen zu erlangen, wird der Rückgabezeiger von SHBrowseForFolder an die Funktion SHGetPathFromIDList weitergegeben, der im Speicherbereich des zweiten Arguments den kompletten Pfad ablegt. Da der Displayname nicht gebraucht wird, wird hier der Einfachheit halber einfach der gleiche Speicher wiederverwendet.
Variationen
Das Flag ulFlags der BROWSEINFO kann mit Konstanten besetzt werden, die die Auswahl einschränken. Das wird durch Grauschalten des OK-Buttons erreicht. Eine Kombination durch Odern ist möglich.
BIF_BROWSEFORCOMPUTER | nur Computer |
BIF_BROWSEFORPRINTER | nur Drucker |
BIF_RETURNONLYFSDIRS | nur Verzeichnisse |