Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Получение иконки для зарегистрированного расширения по его имени

Delphi , Графика и Игры , ICO

Получение иконки для зарегистрированного расширения по его имени

Автор: Poirot
WEB-сайт: http://delphibase.endimus.com

{ **** UBPFD *********** by delphibase.endimus.com ****
>> Получение иконки для зарегистрированного расширения по его имени

Функции в качестве параметра передаётся имя файла и в случае удачного выполнения
она (функция) возвращает handle'р иконки (HICON). В случае, если в реестре небыло
найдено расширения предложеного файла, функция возвращает 0.

Также при успешном выполнении необходимо освободить хендлер. Для этого используется
функция DestroyIcon(Handle:HICON).

Зависимости: модуль Registry, модуль ShellAPI, модуль SysUtils и стандартные
функции Pos, Delete, Copy, ExtractFileExt, ExtractIcon, StrToInt.

Автор:       Poirot, poirot@rol.ru, Нижний Новгород
Copyright:   Poirot (частично из Delphi 5. Руководство разработчика)
Дата:        16 июня 2002 г.
***************************************************** }

function GetRegistryIconHandle(FileName: string): HICON;
var
  R: TRegistry;
  Alias, //псевдвним для расширения в реестре
  IconPath: string; //путь для файла с иконкой
  IconNum, //номер иконки в файле
  QPos: Integer; //позиция запятой в записи реестра
begin
  IconNum := 0;

  R := TRegistry.Create;

  try
    R.RootKey := HKEY_CLASSES_ROOT;

    //чтение псевданима
    if R.OpenKey('\' + ExtractFileExt(FileName), True) then
      Alias := R.ReadString('');
    R.CloseKey;

    //чтение записи об иконке
    if R.OpenKey('\' + Alias + '\DefaultIcon', True) then
      IconPath := R.ReadString('');
    R.CloseKey;

    //поиск запятой
    QPos := Pos(',', IconPath);

    //чтение номера иконки в файле если она имеется
    if QPos <> 0 then
    begin
      IconNum := StrToInt(Copy(IconPath, QPos + 1, 4));
      IconPath := Copy(IconPath, 1, QPos - 1)
    end;

  finally
    R.Free;
  end;

  //передача хендлера иконки как рещультат выполнения
  Result := ExtractIcon(hInstance, PChar(IconPath), IconNum);
end;

Пример использования:

GetRegistryIconHandle('c:\winnt\win.ini');

Привет! Я перевёл текст на русский язык:

Код, который вы предоставили, - это функция Delphi под названием GetRegistryIconHandle, которая извлекает handle иконки для зарегистрированного расширения, указанного в имени файла. Вот разбивка кода:

  1. Функция принимает одиночный параметр FileName, который является именем файла, для которого нужно извлечь иконку.
  2. Она создает объект TRegistry под названием R и устанавливает корневой ключ в HKEY_CLASSES_ROOT.
  3. Функция затем читает значение "Alias" из регистрационного ключа, связанного с расширением файла (например, .ini) с помощью метода ReadString.
  4. Далее она читает значение "DefaultIcon" из регистрационного ключа, связанного с значением alias, которое содержит путь к файлу иконки.
  5. Функция затем ищет запятую в строке IconPath и извлекает номер иконки (если он есть) путем преобразования подстроки после запятой в целое число с помощью StrToInt.
  6. Если найден номер иконки, функция обновляет строку IconPath, удалив номер иконки и любые последующие символы.
  7. Наконец, функция вызывает ExtractIcon, чтобы извлечь handle иконки из файла иконки.

Пример использования функции:

GetRegistryIconHandle('c:\winnt\win.ini');

Это извлекает handle иконки для расширения файла .ini зарегистрированного в регистре Windows.

Как вы упомянули, хорошей практикой является освобождать объект TRegistry, когда он больше не используется, с помощью метода Free. Это также реализовано в коде через блок finally.

Некоторые альтернативные решения могут быть:

  1. Использование функции SHGetIconPath из Shell API для извлечения пути иконки и затем вызова ExtractIcon.
  2. Использование третьей-сторонней библиотеки, которая предоставляет доступ к регистру и функциональность извлечения иконок.
  3. Реализация custom-сolution с помощью Windows API-функций, таких как RegQueryValueEx и ExtractIcon.

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

В целом, код хорошо структурирован и соблюдает хорошие практики в программировании Delphi.

Функция GetRegistryIconHandle позволяет получить иконку для зарегистрированного расширения по его имени, открывая соответствующие записи в реестре и извлекая информацию о пути к файлу с иконкой и номере иконки.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: ICO ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-10-24 19:58:31/0.0037698745727539/0