Интерфейс IShellFolder

икона
Здравейте на всички! В тази статия ще започнем да разглеждаме Shell, по-специално интерфейсаIShellFolder. Този интерфейс основно се занимава с управлението на файлове и папки на операционната система Windows.

Именно в тази статия ще разгледаме как можете да получите иконата на файл, свързана с конкретно приложение. Вече разгледахме нещо подобно в статията - "Извличане на икони отEXE-файлове. Там получихме всички икони, които бяха налични от ресурсите на файла, и в тази статия ще разгледаме: как да получите икона, свързана с конкретно приложение (чрез кое приложение се отваря). Освен това, както в предишната статия, ще можем да получаваме икони с големи (големи) и малки (малки) размери.

За да получите достъп до интерфейсаIShellFolder, трябва да свържете следните модули към проектаDelphi:

Затова нека създадем проект вDelphiи да свържем тези модули вuses. Освен това ще инсталираме следните компоненти на формуляра:

  • Т етикет
  • Бутон - 2 бр
  • TEdit
  • TImage - 2 бр
  • TOpenDialog

В компонентаTEditще покажем пътя до нашия файл, за който ще получим иконата на приложението, свързано с него. Като щракнете върху един бутон, ще стартираме диалоговия прозорец за избор на файл, като щракнете върху друг бутон, ще покажем нашата икона в компонентаTImage(в едната - малка икона, във втората - голяма икона). Като цяло моят проект изглежда така:

икона

За всички тези цели се нуждаем от функция:

функцияSHGetFileInfo(pszPath: PAnsiChar; dwFileAttributes: DWORD;varpsfi:TSHFileInfo; cbFileInfo, uFlags: UINT): DWORD;

  • pszPath е параметър, към който се предава низ, съдържащ пътя до файла. За този файл ще получим иконата.
  • dwFileAttributes са флагове за файлови атрибути.
  • Psfi е структурата, в която се поставя резултатът (в повечето случаи). За да получим иконата, трябва да се обърнем към полето hIcon на нашата структура от тип TSHFileInfo. Полето hIcon е от тип HICON. Също така в тази структура има поле szTypeName (типът му е array[0..79] of AnsiChar) - и така чрез това поле на структурата можете да получите името на типа файл, например - Microsoft Excel Document.
  • cbFileInfo - предава размера на структурата psfi: TSHFileInfo, трябва да се посочи в байтове.
  • uFlags - флагове, които определят върнатата информация

Сега при събитиетоOnClickна бутона, който ще избере пътя до файла, ще напишем следния код:

Тук всичко е ясно и просто, така че на събитието на бутонаOnClick, което ще покаже иконата, свързана с конкретно приложение в компонентаTImage, ще напишем следния код:

Този код ви позволява да заредите асоцииран файл с малка икона, за да получите голяма икона, имате нужда от линията flag:=flag или SHGFI_SMALLICON; замени с флаг:=флаг или SHGFI_LARGEICON; Крайният резултат ще бъде:]

икона

Както разбирате, получихме данни от нашата структура, която е от типTSHFileInfo, можем също да получим:

  • szdisplayName (тип array[0..max_patch-1] на AnsiChar) е буфер, който съхранява името на посочения обект, като System(C:).
  • szTypeName (типът му е array[0..79] of AnsiChar) - и така чрез това поле на структурата можете да получите името на типафайл, като например документ на Microsoft Excel.

За да направите това, трябва да използвате флагове:

  • SHGFI_DISPLAYNAME - за szdisplayName
  • SHGFI_EXETYPE - за szTypeName

Можете да ги използвате, като комбинирате, както в примера, с помощта на операцията ИЛИ (или), например:

флаг:=флаг или SHGFI_LARGEICON или SHGFI_EXETYPE;