Извлечение значков из EXE-файлов

5 минут на чтение

iconci-v-delphiВсем привет. Что-то в последнее время я начал все больше работать с изображениями и компонентом TStringGrid. На этот раз, я захотел попробовать сделать фотогалерею из TStringGrid, используя иконки: bmp, ico (и их названиями), но для начала, я напишу о том, как можно эти иконки получить из EXE или же DLL-файлов.

Поэтому в данной статье мы рассмотрим, как их можно получить, а в следующей, как можно совместить нашу фотогалерею на TStringGrid с данной статьей. Для осуществления такой идеи нам понадобиться сам файл, из которого мы будем извлекать иконки, а также компонент, в котором мы будем их отображать. При этом, иконки мы сможем получать абсолютно любых размеров, но для начала все по порядку.

Нам необходим компонент, в котором мы будем хранить полученные иконки, а также нам необходим компонент, в котором мы будем отображать их. Для этих целей нам подойдет TImageList и TListView, соответсвенно. Поэтому, давайте создадим проект в Delphi и установим на форму следующие компоненты:

  • TImageList
  • TListView
  • TButton – 2 шт
  • TEdit
  • TOpenDialog

С компонентами TImageList и TListView, мы разобрались, для чего они нам нужны. Один компонент TButton нам необходим для того, чтобы по нажатию мы указывали путь к файлу, с которого нам необходимо получить иконки, а второй, по нажатию на который мы будем, соответственно, получать иконки. TEdit – для отображения пути к файлу, TOpenDialog – для вызова диалога выбора файла. У меня проект выглядит следующим образом:

iconci-v-listview

Поэтому, на событие Onclick кнопки «Выбор», мы напишем следующий код:

procedure TForm1.Button2Click(Sender: TObject);
begin
   if OpenDialog1.Execute then
    begin
     Edit1.Text:=OpenDialog1.FileName;
    end;
end;

Тут все понятно и комментировать особого нечего. Для того, чтобы получить список иконок из EXE-файла, нам необходимо в каком-нибудь спецификаторе доступа объявить следующую процедуру:

procedure GetIcons(FileName:String; Image32: TImageList);

Первый параметр процедуры FileName – будет отвечать за сам файл, с которого мы будем получать иконки, а второй параметр Image32, будет отвечать за то, где мы будем хранить иконки. Поэтому ставим курсор на данную процедуру и нажимаем сочетание клавиш Ctrl+Shift+C и заполняем нашу процедуру:

procedure TForm1.GetIcons(FileName: String; Image32: TImageList);
var
 icon:TIcon;
 Icon32,Icon16:HICON;
 i:integer;
begin
   try
    i:=0;
    while Integer(ExtractIconEx(PAnsiChar(FileName),i,Icon16,Icon32,1))>0 do
     begin
      inc(i);
      icon:=TIcon.Create;
      icon.Handle:=Icon16;
      Image32.AddIcon(icon);
     end;
   except
    on e:Exception do
   end;
end;

Тут особого сложного также ничего нет. Здесь нас интересует функция ExtractIconEx, которая имеет следующие параметры:

Function ExtractIconEx(lpszFile:PChar; nIconIndex:Integer; var phiconLarge, phiconSmall:HICON; nIcons:UINT):UINT

  • lpszFile – данный параметр содержит путь файла, из которого будут извлекаться значки
  • nIconIndex – этот параметр содержит номер значка (иконки), с которого будет извлекаться они. Если данный параметр равен -1, а параметры phiconLarge и phiconSmall равны нулю, то функция возвратит количество значков, которое можно извлечь
  • phiconLarge, phiconSmall – в эти параметры помещается дескриптор значков (больших и малых)
  • nIcons – этот параметр для указания количества извлекаемых значков из файла

Чуть не забыл, для того, чтобы данная функция работала, необходимо наличие, в проекте, модуля Shallapi. Поэтому в uses следует подключить данный модуль.

Дальше нам остается написать код, который поможет получить и отобразить наши иконки файла. Поэтому, на событие Onclick кнопки «Получить» мы напишем следующий код:

procedure TForm1.Button1Click(Sender: TObject);
var
 i:integer;
 lItem:TListItem;
begin
   try
    ListView1.Clear;
    ImageList1.Clear;
    GetIcons(Edit1.Text,ImageList1);
    for i:=0 to ImageList1.Count-1 do
     begin
      lItem:=ListView1.Items.Add();
      lItem.ImageIndex:=i;
     end;
   except
    on e:Exception do
   end;
end;

Тут все понятно. Просто заполняем наш компонент TImageList, полученнымb иконками (а получаем мы их, при помощи нашей процедуры GetIcons) и дальше их отображаем в компоненте TListView, присваивая номер иконки.

Сейчас стоит быть немного внимательным, для того, чтобы работало все, необходимо связать эти компоненты между собой. Все зависит от того, какие Вы хотите отображать иконки. Но мы разберем два варианта.

Отображаем маленькие иконки (16 на 16 пикселей).

Например, мы хотим мелкие иконки, например 16 на 16 пикселей. Поэтому, выделяем компонент TImageList и в свойствах Height и Width, выставляем 16. Затем выделяем компонент TListView и в свойстве ViewStyle выбираем vsSmallIcon и в свойстве SmallImages необходимо выбрать тот ImageList, в котором хранятся маленькие иконки, в моем случае TImageList1. В итоге, когда мы скомпилируем проект и укажем путь, к какому-нибудь файлу, у нас должно получиться, что-то похожее:

iconci-v-listview2

Отображаем маленькие иконки (32 на 32 пикселей).

Для этого, в свойствах Height и Width, компонента TImageList необходимо выставить 32. Затем выделить компонент TListView и в свойстве ViewStyle выбрать vsIcon, а свойство SmallImages оставить пустым, а LargeImages выбрать тот TImageList, где хранятся большие иконки. В итоге, у нас получиться следующее:

iconci-v-listview3

Как видите все просто, в эту статью прикладываю исходные коды, и ждем следующую, где мы совместим все.

Facebook Vk Ok LinkedIn Telegram

Похожие записи:

Всем привет! В этой статье мы начнем рассматривать оболочку Shell, а в частности интерфейс IShellFolder. Этот интерфейс, в первую очередь работает с обслуживанием файлов и папок операционной системы Windows. Именно в данной статье, мы рассмотрим, как можно пол...
Итак в последней — четвертой части, посвященной разработки тестов с помощью типизированных файлов в среде разработки Delphi, узнали как можно использовать в своих тестах различные форматы файлов. А вообще, чтобы вспомнить все части, что мы прошли по созданию т...
Как и обещал поговорим о том, как еще одним способом можно добавить картинки в БД, да и не только картинки в любую БД. Добавление файлов в любую БД это громко сказано, конечно, мы как бы формально будем хранить эти файлы, а если быть еще более точным, или боле...