C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 14 - Извлечение иконки по расширению файла и ее загрузка из DLL или EXE / С++ Builder 5 / Borland C++

Шаг 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 мы и нашли этой функцией.

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


Загрузить проект | | |
Автор Аванесов Самвел.
[AD]