#define NO_WIN32_LEAN_AND_MEAN
// ...........................
#include "shlobj.h"
// ...........................
bool SelectDirectory(const AnsiString ACaption, const WideString ARoot, AnsiString &ADirectory)
{
char *Buffer = new char[MAX_PATH];
try
{
ITEMIDLIST *RootItemIDList = NULL;
IShellFolder *IDesktopFolder;
if (ARoot != WideString(""))
{
SHGetDesktopFolder(&IDesktopFolder);
IDesktopFolder->ParseDisplayName(0, NULL,
POleStr(ARoot), NULL, &RootItemIDList, NULL);
}
BROWSEINFO bi;
bi.hwndOwner = 0;
bi.pidlRoot = RootItemIDList;
bi.lpszTitle = ACaption.c_str();
bi.ulFlags = BIF_NEWDIALOGSTYLE|BIF_EDITBOX;
bi.lpfn = NULL;
bi.lParam = 0;
bi.pszDisplayName = Buffer;
LPITEMIDLIST pidlBrowse = SHBrowseForFolder(&bi);
if (pidlBrowse != NULL)
{
if (SHGetPathFromIDList(pidlBrowse, Buffer))
ADirectory = Buffer;
}
}
__finally
{
delete [] Buffer;
return DirectoryExists(ADirectory);
}
}
и пример
void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString dir;
if (SelectDirectory("Select directory:", "", dir))
Edit1->Text = dir;
}