Иконки в исполняемых файлах 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
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.