Шаг 14 - Извлечение иконки по расширению файла и ее загрузка из DLL или EXE

Наверняка многие задумывались, как это сделать, на собственном опыте знаю. Это на самом деле не так сложно. В разделе Software/CLASSES раздела HKLM хранится информация по расширениям для всех общеиспользуемых файлов. Информация записывается как раздел с именем "."+расширение файла. Если не верите, сами можете в regedit'е посмотреть. Далее, параметр "" содержит строку, пересылающую нас на конкретный тип фацла, тоже являющимся разделом там же. Именно этот раздел хранит информацию о типе файла.

"По умолчанию" в разделе прописан тип строкой, например "WinZip file". В подразделе DefaultIcon указан в том же параметре путь к иконке с файлом. Тут является еще одна проблема - иконки чаще всего хранятся в EXE или DLL файлах, а стандартными способами C++Builder ее оттуда не выудишь. Но с этим мы справимся. Еще есть раздел shell, тоже очень интересный, но пока он нам не нужен. Займемся иконками.

Нужно создать новое приложение и положить на него компоненты TEdit gif/14_1.gif (139 b), TImage gif/14_2.gif (166 b), TButton gif/14_3.gif (129 b) и TLabel gif/14_4.gif (103 b). Приблизительно форма должна выглядеть так:

gif/14_5.gif (1603 b)

Свойство Center объекта Image1 лучше всего установить в true, тогда изображения автоматически будет центрироваться. Кодовый листинг будет такой:

#include <registry.hpp>
void __fastcall TForm1::Button1Click(TObject *Sender)
{
String s=Edit1->Text;
   if(s[1]!='.')s="."+s;
TRegistry* reg=new TRegistry;
reg->RootKey=HKEY_LOCAL_MACHINE;
reg->OpenKey("Software\\CLASSES",false);
   if(!reg->OpenKey(s,false))return;
bool open=false;
s=reg->ReadString("");
open=reg->OpenKey("\\Software\\CLASSES\\"+s+"\\DefaultIcon",false);
s=reg->ReadString("");
   if(s=="%1")return;
int pos=s.LastDelimiter(",");
int index=s.SubString(pos+1,s.Length()-pos).ToInt();
s.Delete(pos,s.Length()-pos+1);
Image1->Picture->Icon->Handle=ExtractIcon(HInstance,s.c_str(),index);
}

По-моему, по количеству появлений здесь главную роль играет строка s ;). Листинг вроде понятный. При неудаче открытия раздела OpenKey возвращает false. Единственное - для файлов ICO и EXE иконка задается внутри самого файла по индексу, то есть по умолчанию может не быть. Тогда параметр DefaultIcon содержит значение "%1". Естественно, что имени конкретного файла мы не знаем, для этого я возврат и вставил. Далее вычисляется путь к DLL или EXE и индекс иконки. Они идут через запятую, например "C\Мои документы\prog.exe, 1". Обратите внимание, что бэкслэш "\" пишется как "\\", потому что это ESC-комбинации.

В последней строчке вызывается функция WinAPI ExtractIcon(). Первым параметром у нее идет HInstance, переменная приложения, затем NULL-term строка и индекс иконки. Она возвращает Handle иконки. Свойство Picture класса TImage имеет вложенное свойство TIcon, содержащее ICO файл. Его-то Handle мы и нашли этой функцией.

Вот и все на этот раз. Это заготовка для создания файлового менеджера, как мне кажется, правда, очень уж базовая ;).


Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Аванесов Самвел.