Иллюстрированный самоучитель по Delphi 7 для профессионалов

Интерфейс IShellFolder

Вот как это выглядит на практике.

Memol.Clear; try
OleCheck(SHGetDesktopFolder(DeskTop));
if not Succeeded(DeskTop.ParseDisplayName
(Self.Handle,nil, StringToWideChar (Editl.Text,ws, MAX_PATH),n, pidi, attr))
then begin ShowMessage('Неизвестное имя');
Exit; end; OleCheck(DeskTop.BindToObject(pidl,nil, IID_IShellFolder, Pointer(NewShellFolder)});
OleCheck(NewShellFolder.EnumObj ects{Self.Handle,
SHCONTF_FOLDERS or SHCONTF_NONFOLDERS, Enumerator));
while Enumerator.Next(1, pidl, Numpidls) = S_OK do
begin
NewShellFolder.GetDisplayNameOf(PIDL, SHGDN_FORPARSING, StrRet);
case StrRet.uType of STRRET_CSTR:
s: = StrRet.cStr; STRRET_OFFSET:
begin
P: = @PIDL.mkid.abID[StrRet.uOffset – SizeOf(PIDL.mkid.cb)];
SetString(s, P, PIDL.mkid.cb – StrRet.uOffset);
end; STRRET_WSTR:
s: = StrRet.pOleStr;
end;//case
Memol.Lines.Add(s);
end; except
on ErEOleSysError do ShowMessage('');
end;

В этом примере имя нужной папки извлекается из компонента Edit1. Получив указатель на интерфейс ishellFoider и затем интерфейс IEnumiDList, программа заполняет полученными именами файлов список Memol.Lines.

Помимо названия из большинства объектов файловой системы можно "вытащить" массу полезной информации. Чаще всего задаются вопросом: а как извлечь значок, соответствующий данному файлу или хранящийся в нем?

Способов для достижения этой цели несколько. Самый простой – через вызов функции:

function SHGetFileInfo(pszPath: PAnsiChar; dwFileAttributes: DWORD;
var psfi: TSHFilelnfo; cbFilelnfo, uFlags: UINT): DWORD;

Параметр pszPath может быть указателем как на строку с именем файла, так и на структуру вида pidl. Функция заполняет структуру psfi (тип TSHFilelnfo) длиной cbFilelnfo байт. В зависимости от значения слова флагов (параметр uFlags) на выходе может быть разнообразная информация. В частности, если в параметре uFlags заданы значения SHGFI_SYSICONINDEX и SHGFI_ICON, то в структуру psfi будет записан номер значка для данного файла в системном списке изображений, а результатом выполнения функции будет дескриптор этого списка. Воспользоваться им можно (например, для панели инструментов) так:

procedure TForml.FormCreate(Sender: TObject);
var
Filelnfo: TSHFilelnfo;
ImageListHandle: THandle;
begin
ImageListHandle: = SHGetFilelnfo('С:\', 0,
Filelnfo, SizeOf(Filelnfo),
SHGFI_SYSICONINDEX or SHGFI_ICON);
SendMessage(ToolBarl.Handle, TB_SETIMAGELIST, 0, ImageListHandle);
end;

Точно так же можно извлечь значок, соответствующий конкретному файлу. В составе Shell есть другие функции, созданные для извлечения значков:

function Extractlcon(hlnst: HINST; IpszExeFileName: PChar; nlconlndex: UINT): HICON;

Эта функция извлекает значок из файла IpszExeFileName (это должен быть файл типа EXE, DLL или ICO) и возвращает его дескриптор. Если значок не найден, возвращаемое значение равно 0.

function ExtractAssociatedIcon(hInst: HINST; IpIconPath: PChar; var Ipilcon: Word): HICON;

Эта функция может работать с файлами разных форматов. Сначала она, как и предыдущая, ищет значок в теле файла. Если его там нет, предпринимается попытка отыскать значок в приложении, связанном с данным типом файлов. Например, из файла с расширением .doc будет извлечен один из значков Microsoft Word.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.