从Delphi中的OpenDialog选择中获取特殊文件夹路径

时间:2015-04-27 15:42:31

标签: delphi path special-folders topendialog

我让我的用户通过OpenDialog组件选择一个文件夹。

但是,当他们选择文档或我的视频等文件夹时,路径就是文件夹的名称。

我可以通过API获取此类文件夹的路径,但如何获取路径 基于他们在OpenDialog中选择的内容?

1 个答案:

答案 0 :(得分:3)

我相信您实际上是在谈论用户选择Windows 7库。在这种情况下,您需要使用特殊代码来查找该库的默认保存位置。

您需要使用IFileDialog界面执行此操作。如果您使用TOpenDialog,则无法访问IFileDialog界面。因此,您需要使用Vista对话框TFileOpenDialog,它会公开IFileDialog界面。

一旦有了这个界面,你就可以通过调用IShellItem多选对话框来获取每个选定shell项的GetResults个接口,并为单选对话框调用GetResult。然后,您可以将这些IShellItem接口传递给这样的函数:

function ShellItemFileSystemPath(const si: IShellItem): string;
var
  attribs: DWORD;
  pszPath: PChar;
  lib: IShellLibrary;
  defSaveFolder: IShellItem;
begin
  OleCheck(si.GetAttributes(SFGAO_FILESYSTEM, attribs));
  if attribs=0 then begin
    // This could be a library, in which case we shall return the default save location
    if  Succeeded(CoCreateInstance(CLSID_ShellLibrary, nil, CLSCTX_INPROC_SERVER, IID_IShellLibrary, lib))
    and Succeeded(lib.LoadLibraryFromItem(si, STGM_READ))
    and Succeeded(lib.GetDefaultSaveFolder(DSFT_DETECT, IShellItem, defSaveFolder)) then begin
      Result := ShellItemFileSystemPath(defSaveFolder);
      exit;
    end;
    raise EValidityError.CreateFmt(
      'Cannot operate on ''%s'' because it is not part of the file system.',
      [ShellItemDisplayName(si)]
    );
  end;
  OleCheck(si.GetDisplayName(SIGDN_FILESYSPATH, pszPath));
  Try
    Result := pszPath;
  Finally
    CoTaskMemFree(pszPath);
  End;
end;

Embarcadero库中的代码应该这样做,但遗憾的是库代码有缺陷。它应该支持Windows 7库。

就个人而言,由于此问题和其他原因,我不使用Embarcadero提供的文件对话框。