|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
Извлечение и замена Иконок в exe
Здравствуйте уважаемые Прогеры.. Возник у меня такой вопрос!!! Как сначала извлечь иконку у файла exe (сохранив её при этом в переменную)... А потом из переменной загрузить (поменять) в другом exe!!! Попытаюсь немного разъяснить!!!
Извлекаем иконку: Код:
var MyIcon: TIcon; begin MyIcon := TIcon. Create; try MyIcon.Handle := ExtractIcon(hInstance, 'MYPROG.EXE', 0) {Здесь можно что-нибудь сделать с иконкой} finally MyIcon.Free; end; end; p.s. Не судите строго... Может слишком много хочу!!! Но надеюсь на понимание!!! |
#2
|
||||
|
||||
Цитата:
|
#3
|
|||
|
|||
"Дааааа.... Огромное Всем спасибо... Очень помогли!!!"
|
#4
|
||||
|
||||
Иконка - есть ресурс. А раз его можно выдернусть, то можно и вставить. Вот тебе модуль, который может добавлять/менять ресурс в EXE. Лично я его не применял нигде, но от 100% рабочий, ибо выдернул его с рабочего проекта. Сам не разбирался.
Последний раз редактировалось dr. F.I.N., 12.01.2012 в 17:09. |
#5
|
||||
|
||||
Код:
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
|
|||
|
|||
Погуглил... Нашёл!!. Вроде все правильно... То что нужно... Но не работает... Пожалуйста проверьте... Объясните...
Код:
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. |