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

Delphi Sources



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

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

Здравствуйте уважаемые Прогеры.. Возник у меня такой вопрос!!! Как сначала извлечь иконку у файла exe (сохранив её при этом в переменную)... А потом из переменной загрузить (поменять) в другом exe!!! Попытаюсь немного разъяснить!!!
Извлекаем иконку:
Код:
1
2
3
4
5
6
7
8
9
10
11
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
Адрес: Россия, г. Новосибирск
Сообщения: 663
Версия 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
По умолчанию

Код:
1
2
3
4
5
6
7
8
9
10
11
var
MyIcon: TIcon;
begin
MyIcon := TIcon. Create;
try
MyIcon.Handle := ExtractIcon(hInstance, 'MYPROG.EXE', 0)
{Здесь можно что-нибудь сделать с иконкой}
finally
MyIcon.Free;
end;
end;
Цитата:
Если можно просто извлечь, значит так же просто, можно и поменять!!!
Цитата:
это не есть факт!!!
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
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
По умолчанию

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

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
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
По умолчанию

Код:
1
2
3
4
5
6
7
8
9
10
11
12
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, время: 23:35.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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