Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.09.2014, 20:00   #1
hapera2
Пользователь
 
Регистрация: 12.11.2013
Сообщений: 65
Радость Извлечение MAINICON из любого exe файла.

Нужно извлечь иконку из любой программы. Использовал:
Код:
 function GetShellFileIcon(const FileName : string) : HICON;
var SYSIL : THandle;
SFI : TSHFileInfo;
begin
Result:=0;
FillChar(SFI, SizeOf(SFI), 0);
SysIL := SHGetFileInfo(PChar(FileName), 0, SFI, SizeOf(SFI), SHGFI_LARGEICON or SHGFI_SYSICONINDEX);
if SysIL <> 0
then Result:=ImageList_GetIcon(SysIL, SFI.iIcon, 0)
else RaiseLastOSError;
end;
Вызывал таким образом:
Код:
icon1:=TIcon.Create;
icon1.Handle:=GetShellFileIcon(label2.caption);

icon1.SaveToFile('pricon.ico');
icon1.Free;
Все бы ничего, но вот только качество экспортированной иконки мягко говоря не очень.
А вот если бы извлекать группу иконок (icon group), как это делает Resource Hacker, было бы здорово. Есть идеи?

Последний раз редактировалось hapera2; 18.09.2014 в 00:24.
hapera2 вне форума Ответить с цитированием
Старый 18.09.2014, 22:02   #2
hapera2
Пользователь
 
Регистрация: 12.11.2013
Сообщений: 65
По умолчанию

Неужели нету идей в силу того чтобы из exe извлечь группу иконок в ico файл?
hapera2 вне форума Ответить с цитированием
Старый 18.09.2014, 23:42   #3
indexx
Заблокирован
 
Регистрация: 12.09.2014
Сообщений: 544
По умолчанию

Попробовал код отсюда, качество нормальное. Что не устраивает?
indexx вне форума Ответить с цитированием
Старый 19.09.2014, 13:51   #4
hapera2
Пользователь
 
Регистрация: 12.11.2013
Сообщений: 65
По умолчанию

Функция извлекает 32/32 даже из обычной иконки 256/256
Как извлечь иконку правильно и со всеми размерами в формате ico?

Последний раз редактировалось hapera2; 19.09.2014 в 14:00.
hapera2 вне форума Ответить с цитированием
Старый 19.09.2014, 14:36   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

http://programmersforum.ru/showthread.php?t=254997
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 19.09.2014 в 14:38.
Аватар вне форума Ответить с цитированием
Старый 19.09.2014, 15:16   #6
hapera2
Пользователь
 
Регистрация: 12.11.2013
Сообщений: 65
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Можешь ткнуть пальцем, что именно оттуда брать? Там вроде речь немножечко не о том вроде...

Последний раз редактировалось hapera2; 19.09.2014 в 15:35.
hapera2 вне форума Ответить с цитированием
Старый 19.09.2014, 15:49   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

В конце есть все вплоть до получения HIcon. Из него файл можно примерно так
Код:
var xIcon: TIcon;
     IconHandle: HIcon;
...
  xIcon:=TIcon.Create;
  xIcon.Handle:=IconHandle;
  xIcon.SaveToFile('file.ico');
  xIcon.Free;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 19.09.2014, 17:03   #8
hapera2
Пользователь
 
Регистрация: 12.11.2013
Сообщений: 65
По умолчанию

Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

type
  GRPICONDIR = packed record
    idReserved:Word;//зарезервировано, всегда 0
    idType:Word;    //тип образа: 1 - иконка, 0 - курсор
    idCount:Word;   //число иконок типа RT_ICON
  end;
  PGRPICONDIR = ^GRPICONDIR;

  GRPICONDIRENTRY = packed record
    bWidth:Byte;       //ширина иконки в пикселях (если больше 255, то 0)
    bHeight:Byte;      //высота иконки в пикселях (если больше 255, то 0)
    bColorCount:Byte;  //число цветов (если больше 255, то 0)
    bReserved:Byte;    //зарезервировано, всегда 0
    wPlanes:Word;      //?
    wBitCount:Word;    //глубина цвета, в битах
    dwBytesInRes:DWORD;//размер в байтах битового образа иконки
    nId:Word;          //ID ресурса иконки
  end;
  PGRPICONDIRENTRY = ^GRPICONDIRENTRY;

procedure TForm1.Button1Click(Sender: TObject);
var
 pElm: PGRPICONDIRENTRY;
   HRsrcIcon,DataIcon: THandle;
 LockIcon: Pointer;
    Icon: HIcon;
    pGrp: PGRPICONDIR;
    xIcon: TIcon;

     xModule: hModule;
begin
xModule:= LoadLibrary('C:\Windows\notepad.exe');
pElm:=PGRPICONDIRENTRY(DWORD(pGrp)+SizeOf(GRPICONDIR));
HRsrcIcon:=FindResource(xModule,MakeIntResource(pElm^.nId),RT_ICON);
DataIcon:=LoadResource(xModule,HRsrcIcon);
 LockIcon:=LockResource(DataIcon);
          Icon:=CreateIconFromResourceEx(LockIcon,SizeofResource(xModule,DataIcon),True,$00030000,0,0,LR_DEFAULTCOLOR);
       xIcon:=TIcon.Create;
  xIcon.Handle:=Icon;
  xIcon.SaveToFile('file.ico');
  xIcon.Free;

end;

end.
При нажатии на кнопку icon image is not valid.
Если в debug режиме запускать, на строке:
Код:
Icon:=CreateIconFromResourceEx(LockIcon,SizeofResource(xModule,DataIcon),True,$00030000,0,0,LR_DEFAULTCOLOR);
Код:
First chance exception at $75F172A1. Exception class $C0000005 with message 'access violation at 0x75f172a1: read of address 0x00000000'. Process Project1.exe (2436)
hapera2 вне форума Ответить с цитированием
Старый 19.09.2014, 18:24   #9
hapera2
Пользователь
 
Регистрация: 12.11.2013
Сообщений: 65
По умолчанию

Может по-проще что-то есть?
hapera2 вне форума Ответить с цитированием
Старый 19.09.2014, 19:25   #10
indexx
Заблокирован
 
Регистрация: 12.09.2014
Сообщений: 544
По умолчанию

Не знаю попроще ли, но можно обратиться непосредственно к бинару, и вычитать файл побайтово. По этому способу без проблем вычитывал PNG картинки из различных RES файлов, и EXE.
indexx вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Касперский ругается на извлечение exe файла из ресурсов и его запуск batnik.com C++ Builder 2 29.06.2013 12:15
извлечение из .EXE gregori_demchuk Помощь студентам 5 23.05.2011 16:31
Извлечение всех exe-файла из запороленного exe -файла Memfis1992 Общие вопросы Delphi 1 27.10.2010 03:06
извлечение из своего тела exe файла Titan123 Общие вопросы Delphi 4 22.10.2008 19:17
Извлечение файлов проекта из .exe файла shtuceron Общие вопросы Delphi 3 25.05.2008 18:01