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

Как извлечь все иконки из исполняемого файла EXE в высоком качестве для разных версий Windows

Delphi , Файловая система , Ресурсы

Иконки в исполняемых файлах Windows хранятся в ресурсах файла и могут быть извлечены для дальнейшего использования. Однако, стандартные методы, такие как функция ExtractIconEx, не всегда позволяют извлечь иконки в высоком разрешении, особенно если работа ведется на системах с Windows XP. В таких случаях, когда требуется извлечь все иконки, сохраняя их исходное качество, можно использовать альтернативные подходы.

Использование функции PrivateExtractIcons

Функция PrivateExtractIcons из библиотеки user32.dll позволяет извлечь иконки из исполняемого файла, сохраняя их в указанном разрешении. Это может быть полезно, когда необходимо извлечь все иконки, включая те, которые не поддерживаются стандартными функциями, например, иконки высокого разрешения для Windows Vista и выше.

Пример кода на Object Pascal (Delphi) для использования PrivateExtractIcons:

unit ExtractIconUtils;

interface

uses
  Graphics, Forms, Windows;

function ExtractIcons(exeFilename, icoOutFileName: string; icoSize: Integer): Boolean;

implementation

function ExtractIcons(exeFilename, icoOutFileName: string; icoSize: Integer): Boolean;
var
  hUserDll: THandle;
  hIcon: THandle;
  nIconId: DWORD;
  Icon: TIcon;
  PrivateExtractIcons: TExtractFunc;
type
  TExtractFunc = function(lpszFile: PChar; nIconIndex, cxIcon, cyIcon: Integer; phicon: PHANDLE; piconid: PDWORD; nicon, flags: DWORD): DWORD; stdcall;
begin
  result := False;
  if (hUserDll < 4) then
  begin
    hUserDll := LoadLibrary('user32.dll');
    if (hUserDll < 4) then
      exit;
  end;
  // Проверка на наличие функции в библиотеке
  PrivateExtractIcons := GetProcAddress(hUserDll, ExtractProcName);
  if not Assigned(PrivateExtractIcons) then
    exit;

  // Извлечение иконки заданного размера
  if PrivateExtractIcons(PWideChar(exeFilename), 0, icoSize, icoSize, @hIcon, @nIconId, 1, LR_LOADFROMFILE) <> 0 then
  begin
    try
      Icon := TIcon.Create;
      try
        Icon.Handle := hIcon;
        Icon.SaveToFile(icoOutFileName);
        result := True;
      finally
        Icon.Free;
      end;
    finally
      DestroyIcon(hIcon);
    end;
  end;
end;

initialization
// none
finalization
  if (hUserDll > 4) then
    FreeLibrary(hUserDll);
end.

Важные замечания:

  • Функция PrivateExtractIcons не предназначена для общего использования и может быть недоступна в будущих версиях Windows. Это следует учитывать при разработке программ, которые должны быть будучеустойчивыми.
  • При использовании функции важно обрабатывать возможные ошибки и предусматривать альтернативные способы извлечения иконок в случае её отсутствия.
  • Для извлечения иконок в высоком разрешении, таких как 128x128 пикселей для Windows Vista, необходимо указать соответствующий размер в параметрах функции.

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

Создано по материалам из источника по ссылке.

Как использовать функцию `PrivateExtractIcons` для извлечения иконок в высоком качестве из исполняемого файла EXE для различных версий Windows, с примером кода на Delphi.


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

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




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


:: Главная :: Ресурсы ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-06-15 23:48:10/0.0035371780395508/0