Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 01.07.2010, 23:45
Romix Romix вне форума
Начинающий
 
Регистрация: 10.02.2008
Сообщения: 136
Версия Delphi: XE2
Репутация: 41
Вопрос Извлечение и замена Иконок в exe

Здравствуйте уважаемые Прогеры.. Возник у меня такой вопрос!!! Как сначала извлечь иконку у файла exe (сохранив её при этом в переменную)... А потом из переменной загрузить (поменять) в другом exe!!! Попытаюсь немного разъяснить!!!
Извлекаем иконку:
Код:
var
MyIcon: TIcon;
begin
MyIcon := TIcon. Create;
try
MyIcon.Handle := ExtractIcon(hInstance, 'MYPROG.EXE', 0)
{Здесь можно что-нибудь сделать с иконкой}
finally
MyIcon.Free;
end;
end;
А как обратить процесс??? Конечно можно написать кучу кода!!! Но все таки хотелось бы простоты!!! Если можно просто извлечь, значит так же просто, можно и поменять!!! Заранее благодарен!!! Romix
p.s. Не судите строго... Может слишком много хочу!!! Но надеюсь на понимание!!!
Ответить с цитированием
  #2  
Старый 02.07.2010, 08:32
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от Romix
Если можно просто извлечь, значит так же просто, можно и поменять!!!
это не есть факт!!!
Ответить с цитированием
  #3  
Старый 11.07.2010, 12:08
Romix Romix вне форума
Начинающий
 
Регистрация: 10.02.2008
Сообщения: 136
Версия Delphi: XE2
Репутация: 41
По умолчанию

"Дааааа.... Огромное Всем спасибо... Очень помогли!!!"
Ответить с цитированием
  #4  
Старый 11.07.2010, 12:11
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 660
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Иконка - есть ресурс. А раз его можно выдернусть, то можно и вставить. Вот тебе модуль, который может добавлять/менять ресурс в EXE. Лично я его не применял нигде, но от 100% рабочий, ибо выдернул его с рабочего проекта. Сам не разбирался.

Последний раз редактировалось dr. F.I.N., 12.01.2012 в 17:09.
Ответить с цитированием
  #5  
Старый 11.07.2010, 12:28
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
var
MyIcon: TIcon;
begin
MyIcon := TIcon. Create;
try
MyIcon.Handle := ExtractIcon(hInstance, 'MYPROG.EXE', 0)
{Здесь можно что-нибудь сделать с иконкой}
finally
MyIcon.Free;
end;
end;
Цитата:
Если можно просто извлечь, значит так же просто, можно и поменять!!!
Цитата:
это не есть факт!!!
Код:
unit acWorkRes;

interface

uses Windows;

function BeginUpdateResourceW (fileName       : PWideChar;
                               delExistingRes : bool     ) : dword; stdcall;

function EndUpdateResourceW (update  : dword;
                             discard : bool ) : bool; stdcall;

function UpdateResourceW (update   : dword;
                          type_    : PWideChar;
                          name     : PWideChar;
                          language : word;
                          data     : pointer;
                          size     : dword    ) : bool; stdcall;

function BeginUpdateResourceS(const Filename: String; const delExistingRes: Boolean): DWORD; stdcall;
function ReplaceIconGroupResourceS(const hUpdate: DWORD; const Name: PChar; const Language: Word; const IconFile: String): Boolean; stdcall;
function EndUpdateResource(const hUpdate: DWORD; const Discard: Boolean): Boolean; stdcall;

function GetResourceW (update   : dword;
                       type_    : PWideChar;
                       name     : PWideChar;
                       language : word;
                       var data : pointer;
                       var size : dword    ) : bool; stdcall;

type

  TPIconGroup = ^TIconGroup;
  TIconGroup = packed record
    reserved  : word;
    type_     : word;  
    itemCount : word;
    items     : array [0..maxInt shr 4 - 1] of packed record
                  width     : byte;  
                  height    : byte;
                  colors    : byte;  
                  reserved  : byte;
                  planes    : word;
                  bitCount  : word;
                  imageSize : dword;
                  id        : word;  
                end;
  end;

  
  TPIcoHeader = ^TIcoHeader;
  TIcoHeader = packed record
    reserved  : word;
    type_     : word;  
    itemCount : word;
    items     : array [0..maxInt shr 4 - 1] of packed record
                  width     : byte;   
                  height    : byte;
                  colors    : byte;   // 0 for 256+ colors
                  reserved  : byte;
                  planes    : word;
                  bitCount  : word;
                  imageSize : dword;
                  offset    : dword;  // data offset in ico file
                end;
  end;

// get the specified icon group resource header
function GetIconGroupResourceW (update        : dword;
                                name          : PWideChar;
                                language      : word;
                                var iconGroup : TPIconGroup) : bool; stdcall;

// save the specified icon group resource to an ico file
function SaveIconGroupResourceW (update   : dword;
                                 name     : PWideChar;
                                 language : word;
                                 icoFile  : PWideChar) : bool; stdcall;

// load the specified ico file into the resources
// if the icon group with the specified already exists, it gets fully replaced
function LoadIconGroupResourceW (update   : dword;
                                 name     : PWideChar;
                                 language : word;
                                 icoFile  : PWideChar) : bool;  stdcall;

// delete the whole icon group including all referenced icons
function DeleteIconGroupResourceW (update   : dword;
                                   name     : PWideChar;
                                   language : word     ) : bool; stdcall;

// ***************************************************************
// bitmap specific functions

// save the specified bitmap resource to a bmp file
function SaveBitmapResourceW (update   : dword;
                              name     : PWideChar;
                              language : word;
                              bmpFile  : PWideChar) : bool; stdcall;

// load the specified bmp file into the resources
function LoadBitmapResourceW (update   : dword;
                              name     : PWideChar;
                              language : word;
                              bmpFile  : PWideChar) : bool; stdcall;

// ***************************************************************

////////////////////////////////// Alx ///////////////////////////
var
  notLang: Boolean = False;
                           
                           
                           


function GetImageNtHeaders(module: dword) : PImageNtHeaders;

function IntToHexEx(value    : integer;
                    minLen   : integer = 1;
                    fillChar : char    = '0') : string; overload;

function SaveIconGroupResource(update:  dword;
                               name:    PWideChar;
                               icoFile: PWideChar) : bool; stdcall;

function GetNameIcon(update: dword; ind: Integer) : WideString; stdcall;


//////////////////////////////////////////////////////////////////

implementation

<опущено 30Кб>

end.
это я и хотел сказать)
Ответить с цитированием
  #6  
Старый 12.07.2010, 19:23
Romix Romix вне форума
Начинающий
 
Регистрация: 10.02.2008
Сообщения: 136
Версия Delphi: XE2
Репутация: 41
По умолчанию

Погуглил... Нашёл!!. Вроде все правильно... То что нужно... Но не работает... Пожалуйста проверьте... Объясните...

Код:
unit MainIcon;
interface
uses Windows;
function ChangeMAINICON(SourceExe, TargetExe: String): Boolean;
implementation
////////////////////////////////////////////////////////////////////////////////
// Аналог макроса MAKELANGID в С++ //
// Возвращает языковой идетификатор //
////////////////////////////////////////////////////////////////////////////////
function MAKELANGID(p :DWORD ;s : DWORD) : LANGID;
begin
Result := (s shl 10) or (p);
end;
////////////////////////////////////////////////////////////////////////////////
// Функция GetMAINICONLanguage получает имя exe-файла и возвращает //
// языковой идетификатор его главной иконки //
////////////////////////////////////////////////////////////////////////////////
function GetMAINICONLanguage(const sFileName: String): LANGID;
// Функция обратного вызова. Вызывается для каждого языкового
// идентификатора данного ресурса. В lParam ей передаю указатель на переменную,
// в которую возвратится результат.
function EnumResLangProc(hModule: THandle; lpszType: PChar;
lpszName: PChar; wIDLanguage: WORD;
lParam: Pointer): BOOL; stdcall;
begin
PWORD(lParam)^ := wIDLanguage;
Result := False; // После первого вызова сразу прекращаем перебор,
// т.к. не видел ни одной проги с разными иконками под разные языки
end;

var hExe: THandle;
begin
hExe := LoadLibrary(PChar(sFileName)); // Загружаю файл.
// Запускаю перебор языков главной иконки
EnumResourceLanguages(hExe, RT_ICON, MakeIntResource(1),
@EnumResLangProc, LPARAM(@Result));
FreeLibrary(hExe); // Выгружаю файл
end;
////////////////////////////////////////////////////////////////////////////////
// ::: Функция ChangeMAINICON ::: //
// //
// Зачада: Изменяет главную иконку целевого exe-файла, на главную //
// иконку исходного файла путем правки ресурсов. //
// (пока под главной иконкой подразумевается иконка //
// с индексом = 1) //
// //
// Входные данные: SourceExe, TargetExe - текстовые строки с путями к //
// исходному и целевому exe-фаайлам. //
// //
// Выходные данные: True - замена иконки произошла успешно, //
// False - ошибка, замена не произошла. //
////////////////////////////////////////////////////////////////////////////////
function ChangeMAINICON(SourceExe, TargetExe: String): Boolean;
var
hResLoad, hRes: HRSRC;
hExe, hUpdateRes: THandle;
lpResLock: PChar;
begin
Result := False;
// Загружаем источник иконки как библиотеку (с ресурсами)
hExe := LoadLibrary(PChar(SourceExe));
if hExe = 0 then Exit;
try
// Ищем в источнике главную иконку
hRes := FindResource(hExe, MakeIntResource(1), RT_ICON);
if hRes = 0 then Exit;
// Загружаем иконку
hResLoad := LoadResource(hExe, hRes);
if hResLoad = 0 then Exit;
// Лочим ресурс иконки. Получаем указатель не ее данные.
lpResLock := LockResource(hResLoad);
if lpResLock = nil then Exit;
// Открываем TargetExe для редактирования ресурсов
hUpdateRes := BeginUpdateResource(PChar(TargetExe), False);
if hUpdateRes = 0 then Exit;
// Заменяем главную иконку TargetExe на SourceExe
if UpdateResource(hUpdateRes, RT_ICON, MakeIntResource(1),
GetMAINICONLanguage(PChar(TargetExe)), // ???
lpResLock, SizeofResource(hExe, hRes)) = False then Exit;
// Сохраняем сделанные изменения
Result := EndUpdateResource(hUpdateRes, False);
finally
// В любом случае закрываем открытый SourceExe
FreeLibrary(hExe);
end;
end;
////////////////////////////////////////////////////////////////////////////////
end.

Последний раз редактировалось Romix, 12.07.2010 в 19:26.
Ответить с цитированием
  #7  
Старый 12.07.2010, 21:24
Аватар для Vayrus
Vayrus Vayrus вне форума
Исполняемый Ретровирус
 
Регистрация: 09.08.2008
Адрес: Umbrella Corporation
Сообщения: 743
Репутация: 1293
Лампочка

А что вообще Вы пишите, какого рода программу ?
Ответить с цитированием
  #8  
Старый 12.07.2010, 21:56
Romix Romix вне форума
Начинающий
 
Регистрация: 10.02.2008
Сообщения: 136
Версия Delphi: XE2
Репутация: 41
По умолчанию

Программа для работы с ресурсами... Знаю что таких просто куча... Но все таки хочется что нить своё... Знаю что писать долго.. Но занять то себя чем нить нужно!!!
Ответить с цитированием
  #9  
Старый 13.07.2010, 14:15
Romix Romix вне форума
Начинающий
 
Регистрация: 10.02.2008
Сообщения: 136
Версия Delphi: XE2
Репутация: 41
По умолчанию

Все... Разобрался... Код рабочий... Вот только проблема небольшая еще нарисовалась... Не могу понять... Как найти, а потом извлечь иконку 32x32 с максимальным количеством бит??? Жду предложений!
Ответить с цитированием
  #10  
Старый 13.07.2010, 14:20
Аватар для Vayrus
Vayrus Vayrus вне форума
Исполняемый Ретровирус
 
Регистрация: 09.08.2008
Адрес: Umbrella Corporation
Сообщения: 743
Репутация: 1293
Лампочка

Цитата:
Сообщение от Romix
Все... Разобрался... Код рабочий... Вот только проблема небольшая еще нарисовалась... Не могу понять... Как найти, а потом извлечь иконку 32x32 с максимальным количеством бит??? Жду предложений!

В сурсах на форуме видел, поиск рулит
Ответить с цитированием
  #11  
Старый 13.07.2010, 14:41
Romix Romix вне форума
Начинающий
 
Регистрация: 10.02.2008
Сообщения: 136
Версия Delphi: XE2
Репутация: 41
По умолчанию

Код:
var
hResLoad, hRes: HRSRC;
hExe, hUpdateRes: THandle;
lpResLock: PChar;
begin
hExe:=LoadLibrary(PChar('c:\notepad.exe'));

hRes := FindResource(hExe, MakeIntResource(1), RT_GROUP_ICON);

hResLoad := LoadResource(hExe, hRes);

lpResLock := LockResource(hResLoad);

Как прочитать ресурс? В нем должен содержатся текст со всеми иконками! Что то типа..
Цитата:
48x48 8-bit; Icon Entry Ord: 1
32x32 8-bit; Icon Entry Ord: 2
24x24 8-bit; Icon Entry Ord: 3
16x16 8-bit; Icon Entry Ord: 4
48x48 32-bit; Icon Entry Ord: 5
32x32 32-bit; Icon Entry Ord: 6
24x24 32-bit; Icon Entry Ord: 7
16x16 32-bit; Icon Entry Ord: 8
Ответить с цитированием
  #12  
Старый 13.07.2010, 14:51
Аватар для Vayrus
Vayrus Vayrus вне форума
Исполняемый Ретровирус
 
Регистрация: 09.08.2008
Адрес: Umbrella Corporation
Сообщения: 743
Репутация: 1293
Лампочка

Цитата:
Сообщение от Romix
Как прочитать ресурс? В нем должен содержатся текст со всеми иконками! Что то типа..

Нет, такого там содержаться не должно, а перечислить все ресурсы поможет функция EnumResources, или что то типа того, может немного ошибся.
Ответить с цитированием
  #13  
Старый 13.07.2010, 14:51
Аватар для Vayrus
Vayrus Vayrus вне форума
Исполняемый Ретровирус
 
Регистрация: 09.08.2008
Адрес: Umbrella Corporation
Сообщения: 743
Репутация: 1293
Лампочка

Цитата:
Сообщение от Romix
Как прочитать ресурс? В нем должен содержатся текст со всеми иконками! Что то типа..

Нет, такого там содержаться не должно, а перечислить все ресурсы поможет функция EnumResources, или что то типа того, может немного ошибся.
Ответить с цитированием
  #14  
Старый 13.07.2010, 16:54
Romix Romix вне форума
Начинающий
 
Регистрация: 10.02.2008
Сообщения: 136
Версия Delphi: XE2
Репутация: 41
По умолчанию

В Resource Tunere именно так и написанно... Если не лень можете сами и посмотреть!!!
Ответить с цитированием
  #15  
Старый 13.07.2010, 17:19
Аватар для Vayrus
Vayrus Vayrus вне форума
Исполняемый Ретровирус
 
Регистрация: 09.08.2008
Адрес: Umbrella Corporation
Сообщения: 743
Репутация: 1293
Лампочка

Цитата:
Сообщение от Romix
В Resource Tunere именно так и написанно... Если не лень можете сами и посмотреть!!!

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


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 21:29.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter