1 function SelectFolderDialog(const Handle: integer; const Caption: string;const InitFolder: WideString; var SelectedFolder: string): boolean;
2 var
3 BInfo: _browseinfo;
4 Buffer: array[0..MAX_PATH] of Char;
5 ID: IShellFolder;
6 Eaten, Attribute: Cardinal;
7 ItemID: PItemidlist;
8 begin
9 Result := False;
10 BInfo.HwndOwner := Handle;
11 BInfo.lpfn := nil;
12 BInfo.lpszTitle := Pchar(Caption);
13 BInfo.ulFlags := BIF_RETURNONLYFSDIRS + BIF_NEWDIALOGSTYLE;
14 SHGetDesktopFolder(ID);
15 ID.ParseDisplayName(0, nil, PWideChar(InitFolder), Eaten, ItemID, Attribute);
16 BInfo.pidlRoot := ItemID;
17 GetMem(BInfo.pszDisplayName, MAX_PATH);
18 try
19 if SHGetPathFromIDList(SHBrowseForFolder(BInfo), Buffer) then
20 begin
21 SelectedFolder := Buffer;
22 if Length(SelectedFolder) <> 3 then
23 SelectedFolder := SelectedFolder + '\';
24 result := True;
25 end
26 else
27 begin
28 SelectedFolder := '';
29 Result := False;
30 end;
31 finally
32 FreeMem(BInfo.pszDisplayName);
33 end;
34 end;