uses ShlObj;
function SelectDirectory(Handle: hwnd; const Caption: string ;
const Root: WideString; out Directory: string ): Boolean;
var lpBI: _BrowseInfo;
Buf: array[ 0 ..MAX_PATH] of char ;
ID: IShellFolder;
Eaten, Att: Cardinal;
rt: pItemIDList;
initdir: PWideChar;
begin
Result : = False;
lpbi.hwndOwner : = Handle;
lpbi.lpfn : = nil;
lpbi.lpszTitle : = PChar(Caption);
lpbi.ulFlags : = BIF_RETURNONLYFSDIRS + BIF_EDITBOX;
SHGetDesktopFolder(ID);
initdir : = PWChar(Root);
ID.ParseDisplayName( 0 , nil, InitDir, Eaten, rt, Att);
lpbi.pidlRoot : = rt;
GetMem(lpbi.pszDisplayName, MAX_PATH);
try
Result : = SHGetPathFromIDList(SHBrowseForFolder(lpbi), buf);
except
FreeMem(lpbi.pszDisplayName);
end;
if result then begin
Directory : = buf;
if Length(Directory) <> 3 then
Directory : = Directory + ' ';
end;
end;
function SelectDirectory(Handle: hwnd; const Caption: string ;
const Root: WideString; out Directory: string ): Boolean;
var lpBI: _BrowseInfo;
Buf: array[ 0 ..MAX_PATH] of char ;
ID: IShellFolder;
Eaten, Att: Cardinal;
rt: pItemIDList;
initdir: PWideChar;
begin
Result : = False;
lpbi.hwndOwner : = Handle;
lpbi.lpfn : = nil;
lpbi.lpszTitle : = PChar(Caption);
lpbi.ulFlags : = BIF_RETURNONLYFSDIRS + BIF_EDITBOX;
SHGetDesktopFolder(ID);
initdir : = PWChar(Root);
ID.ParseDisplayName( 0 , nil, InitDir, Eaten, rt, Att);
lpbi.pidlRoot : = rt;
GetMem(lpbi.pszDisplayName, MAX_PATH);
try
Result : = SHGetPathFromIDList(SHBrowseForFolder(lpbi), buf);
except
FreeMem(lpbi.pszDisplayName);
end;
if result then begin
Directory : = buf;
if Length(Directory) <> 3 then
Directory : = Directory + ' ';
end;
end;