Папка - понятие более общее, чем каталог. Наряду с папками, соответствующими каталогам, существуют виртуальные папки: Панель управления, Принтеры, Мой компьютер и т.п. Папки имеют интерфейс IShellFolder, объявленный в модуле ShlObj. Доступ к интерфейсу корневой папки Рабочий стол (Desktop) дает функция SHGetDesktopFolder:

function SHGetDesktopFolder(var ppshf: IShellFolder): Hresult;
stdcall;

В случае успешного выполнения она возвращает значение NOERROR и заносит в ppshf указатель на интерфейс IShellFolder. Учтите, что содержимое корневой папки в общем случае отличается от содержимого Рабочего стола в более привычном понимании, т.е. от набора папок и ярлыков, расположенных на экране. Например, независимо от того, что вы вынесли на экран, корневая папка помимо элементов, размещенных на экране, обычно содержит такие элементы, как Мой компьютер, Сетевое окружение, Internet Explorer, Мои документы и ряд других.

Вы можете вставить вызов SHGetDesktopFolder, например, в обработчик события OnCreate вашей формы следующим образом:

uses ShlObj;
var ISF: IShellFolder;

procedure TForml.FormCreate(Sender: TObject); begin

if (SHGetDesktopFolder(ISF) <> NOERROR) then begin

ShowMessage(1 Корневая папка недоступна1);
Close;
end;
end;

Если функция выполнилась без ошибок, вы получили доступ к интерфейсу корневой папки через переменную ISF.

Каждый элемент, содержащийся в папке, имеет уникальный идентификатор, определяющий его место в родительской папке. Идентификатор является записью типа TSHItemID. Ее поле cb указывает размер записи, а поле abID содержит различную информацию в зависимости от интерфейса родительской папки. При работе с папками чаще приходится иметь дело не с самими идентификаторами элементов, а с указателями на них. В приложениях VCL Win32 тип этих указателей - PItemIDList. В приложениях VCL .NET тип указателей IntPtr (см. "Введение" разд. "Обмен информацией между управляемым и неуправляемым кодом"). Обычно эти указатели называются PIDL (a pointer to an item identifier list). PIDL указывают на запись типа TItemIDList с единственным полем mkid типа TSHItemID, представляющим идентификатор элемента.

Теперь остановимся на некоторых методах интерфейса IShellFolder. Метод GetDisplayNameOf дает доступ к имени элемента - файла или папки. В VCL Win32 он объявлен следующим образом:

function GetDisplayNameOf(pidl: PItemIDList;
uFlags: DWORD;
var lpName: TStrRet):HResult;
stdcall;

В VCL .NET объявление выглядит так:

function GetDisplayNameOf(pidl: IntPtr;
uFlags: DWORD;
var IpName: TStrRet): Hresult;

Параметр pidl - указатель PIDL на идентификатор элемента. Параметр uFlags задает форму отображения имени и может принимать одно из трех значений: SHGDNJVORMAL, SHGDN_ INFOLDER или SHGDN_FORPARSING. Первые два мало различаются, влияя только на отображение общих документов. А третье значение предназначено не для показа пользователю, а для программного использования: имя, отображаемое в этом варианте, может передаваться в метод Parse-DisplayName, позволяющий по имени найти PIDL.


|Следующая страница ⇒

Приемы программирования в Delphi на основе VCL



Новости за месяц

  • Май
    2020
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс