![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Здравствуйте уважаемые Прогеры.. Возник у меня такой вопрос!!! Как сначала извлечь иконку у файла 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. |