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;