Открытые Виртуальные Папки

Sascha

Команда форума
Администратор
Ofline
В Windows, есть некоторые специальные папки, такие как в Сетевое окружение или в папке Мои документы. В даной статье показано, как открыть папку или определить путь такой папки.

Код:
uses

ShlObj, ActiveX, ShellApi;

procedure ShowSpecialFolder(const AFolder: Integer);
var
  ItemIDList: PItemIDList;
  ShExInfo: ShellExecuteInfo;
  ShellH: IMalloc;
begin
  if SUCCEEDED(ShGetSpecialFolderLocation(Application.Handle, AFolder, ItemIDList)) then
  begin
    try
      FillChar(ShExInfo, SizeOf(ShExInfo), 0);
      with ShExInfo do
      begin
        cbSize := SizeOf(ShExInfo);
        nShow := SW_SHOW;
        fMask := SEE_MASK_IDLIST;
        lpIDList := ItemIDList;
      end;
      ShellExecuteEx(@ShExInfo);
    finally
      if SHGetMalloc(ShellH) = NOERROR then
        ShellH.Free(ItemIDList);
    end;
  end
  else
    RaiseLastOSError;
end;

RaiseLastOSError доступен только с Delphi. 6 Программисты, работающие с более старыми версиями использовать в этой точке RaiseLastWin32Error. Кроме того, структура типа SHELLEXECUTEINFO «в старых версиях Delphi не существует. Она должна быть определена позднее:

Код:
type
_SHELLEXECUTEINFOA = record
  cbSize: DWORD;
  fMask: ULONG;
  Wnd: HWND;
  lpVerb: PAnsiChar;
  lpFile: PAnsiChar;
  lpParameters: PAnsiChar;
  lpDirectory: PAnsiChar;
  nShow: Integer;
  hInstApp: HINST;
  { Optional fields }
  lpIDList: Pointer;
  lpClass: PAnsiChar;
  hkeyClass: HKEY;
  dwHotKey: DWORD;
  hIcon: THandle;
  hProcess: THandle;
end;

ShellExecuteInfo = _SHELLEXECUTEINFOA;

В качестве параметров, константа для папки должна быть передана. Они могли бы, например, выглядеть следующим образом:

CSIDL_Desktop для рабочего стола,
CSIDL_Controls для панели управления,
CSIDL_Printers для принтеров,
CSIDL_PERSONAL для Моих документов,
CSIDL_DRIVES для работы,
CSIDL_Network для сетевой среды.

Другие константы в блоке в ShlObj под заголовком SHGetSpecialFolderLocation.

Процедура может быть вызвана следующим образом:
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowSpecialFolder(CSIDL_Desktop);
end;
 
Назад
Сверху Снизу