Как получить путь к виртуальной папке моего компьютера?

#delphi #winapi #delphi-2010

#delphi #winapi #delphi-2010

Вопрос:

Моя задача звучит очень просто… Так я и думал.

Задача: использовать диалог FileCtrl.SelectDirectory только с локальными дисками. Показывать подключенные диски, сеть, общие ресурсы и другие удаленные пути запрещено.

Похоже, неплохо открыть диалоговое окно с Root = виртуальная папка моего компьютера.

Но когда я пробую разные подходы для получения пути, в результате я всегда получаю пустую строку.

Пожалуйста, покажите мне, что я делаю не так?

В приведенном ниже примере я показываю свои 2 подхода, которые очень популярны в Интернете.

 unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, cxClasses, cxShellBrowserDialog, FileCtrl, ShlObj, KnownFolders,
  ActiveX;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function GetKnownFolderPath(const folder : KNOWNFOLDERID ) : string;
var
  path: LPWSTR;
begin
  if SUCCEEDED(SHGetKnownFolderPath(folder, 0, 0, path)) then
  begin
    try
      Result := path;
    finally
      CoTaskMemFree(path);
    end;
  end else
    Result := '';
end;

function GetSpecialFolderPath(CSIDLFolder: Integer): string;
var
   FilePath: array [0..MAX_PATH] of char;
begin
  SHGetFolderPath(0, CSIDLFolder, 0, 0, FilePath);
  Result := FilePath;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Root, Directory: String;
begin
  Root := GetKnownFolderPath(FOLDERID_ComputerFolder);
  SelectDirectory('caption', Root, Directory, [sdNewUI, sdShowShares], nil);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  Root, Directory: String;
begin
  Root := GetSpecialFolderPath($0011); //CSIDL_DRIVES 
  SelectDirectory('caption', Root, Directory, [sdNewUI, sdShowShares], nil);
end;

end.
  

Комментарии:

1. Для этого нет каталога файловой системы . Вам нужно будет получить PItemIDList и использовать его для получения вложенных папок. Существует несколько способов получить список виртуальных папок, предоставляемых системой, большинство из них в ShlObj или KnownFolders.

2. FWIW, взгляните на справку для SelectDirectory . Также взгляните на обратный вызов: docwiki.embarcadero.com/Libraries/Rio/en /…

Ответ №1:

SelectDirectory() работает только с путями файловой системы, а не с виртуальными элементами. Элементы, которые вы пытаетесь установить Root , не имеют путей к файловой системе.

Если вы хотите отобразить диалоговое окно, которое работает с виртуальными элементами, вы должны использовать SHBrowseForFolder() непосредственно или IFile(Open)Dialog вместо. Затем вы можете работать с элементами, которые представлены PIDL s или IShellItem интерфейсом соответственно.

Комментарии:

1. Хорошо, теперь я вижу диалоговое окно с Root в качестве моего компьютера. Знаете ли вы способ скрыть подключенные диски под корнем?