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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.08.2016, 17:30   #1
MoneyCrafter
 
Регистрация: 29.09.2015
Сообщений: 7
По умолчанию Изменение иконки Exe вне проекта программно

Я сдох уже.
Нашел юнит, меняющий иконки для любых Exe, так что просто помогите пожалуйста разобраться что есть ResName
Юнит:

Код:
unit Dolphin_Changer_ico;
  
 interface   
  
 uses   
   Windows, Classes, SysUtils, Graphics;   
  
 procedure ChangeIcon(FileName, IconFile, ResName:string);
  
 implementation   
  
 resourcestring   
   SInvalidFileName = 'Invalide filename %s';   
  
 type   
   TNewHeader = record   
     idReserved:WORD;   
     idType:WORD;   
     idCount:WORD;   
   end;   
  
   TResDirHeader = packed record   
     bWidth:Byte;   
     bHeight:Byte;   
     bColorCount:Byte;   
     bReserved:Byte;   
     wPlanes:WORD;   
     wBitCount:WORD;   
     lBytesInRes:Longint;   
   end;   
  
   TIconFileResDirEntry = packed record   
     DirHeader:TResDirHeader;   
     lImageOffset:Longint;   
   end;   
  
   TIconResDirEntry = packed record   
     DirHeader:TResDirHeader;   
     wNameOrdinal:WORD;   
   end;   
  
   PIconResDirGrp = ^TIconResDirGrp;   
   TIconResDirGrp = packed record   
     idHeader:TNewHeader;   
     idEntries:array[0..0] of TIconResDirEntry;   
   end;   
  
   PIconFileResGrp = ^TIconFileResDirGrp;   
   TIconFileResDirGrp = packed record   
     idHeader:TNewHeader;   
     idEntries:array[0..0] of TIconFileResDirEntry;   
   end;   
  
   TBeginUpdateRes=function(pFileName: PChar; bDeleteExistingResources: BOOL): THandle; stdcall;   
  
   TUpdateRes=function(hUpdate: THandle; lpType, lpName: PChar;   
                wLanguage: Word; lpData: Pointer; cbData: DWORD): BOOL; stdcall;   
  
   TEndUpdateRes=function(hUpdate: THandle; fDiscard: BOOL): BOOL; stdcall;   
  
 function MakeLangID:WORD;   
 begin   
   Result:=(SUBLANG_ENGLISH_US shl 10) or LANG_ENGLISH;   
 end;   
  
 procedure CheckFileName(Value:string);   
 var
   a, b: boolean;
 begin
   a := Trim(Value) = EmptyStr;
   b := not FileExists(Value);
   if a or b then
     raise Exception.Create(Format(SInvalidFileName, [Value]));
 end;   
  
 procedure ChangeIcon(FileName, IconFile, ResName:string);   
 var   
   I:Integer;   
   Group:Pointer;   
  
   Header:TNewHeader;   
   FileGrp:PIconFileResGrp;   
   IconGrp:PIconResDirGrp;   
   IconGrpSize,   
   FileGrpSize:Integer;   
  
   Icon:TIcon;   
   Stream:TMemoryStream;   
   hUpdateRes:THandle;   
 begin   
   CheckFileName(FileName);   
   hUpdateRes:=BeginUpdateResource(PChar(FileName), False);   
   Win32Check(hUpdateRes <> 0);   
   CheckFileName(IconFile);   
   Icon:=TIcon.Create;   
   Icon.LoadFromFile(IconFile);   
   Stream:=TMemoryStream.Create;   
   try   
     Icon.SaveToStream(Stream);   
   finally   
     Icon.Free;   
   end;   
   Stream.Position:=0;   
   Stream.Read(Header, SizeOf(Header));   
   FileGrpSize := SizeOf(TIconFileResDirGrp) + (Header.idCount - 1) * SizeOf(TIconFileResDirEntry);   
   IconGrpSize := SizeOf(TIconResDirGrp) + (Header.idCount - 1) * SizeOf(TIconResDirEntry);   
   GetMem(FileGrp, FileGrpSize);GetMem(IconGrp, IconGrpSize);   
   Stream.Position:=0;   
   Stream.Read(FileGrp^, FileGrpSize);//loading icongroup   
   Group:=nil;   
   try   
     for I:=0 to FileGrp^.idHeader.idCount - 1 do //building icongroup from loaded entries   
     begin   
       with IconGrp^ do   
       begin   
         idHeader:=FileGrp^.idHeader;   
         idEntries[I].DirHeader:=FileGrp^.idEntries[I].DirHeader;   
         idEntries[I].wNameOrdinal:=I;//fixing Ordinals   
       end;   
       with FileGrp^.idEntries[I] do   
       begin   
         Stream.Seek(lImageOffset, soFromBeginning);   
         ReallocMem(Group, DirHeader.lBytesInRes);   
         Stream.Read(Group^, DirHeader.lBytesInRes);   
         Win32Check(UpdateResource(hUpdateRes,RT_ICON,PChar(MakeIntResource(I)),   
                             MakeLangID, Group, DirHeader.lBytesInRes));   
       end;   
     end;//for   
     Win32Check(UpdateResource(hUpdateRes,RT_GROUP_ICON, PChar(ResName),   
                    MakeLangID, IconGrp, IconGrpSize));//adding the icongroup   
     Win32Check(EndUpdateResource(hUpdateRes, False));   
     finally   
       Stream.Free;   
       FreeMem(FileGrp);   
       FreeMem(IconGrp);   
       FreeMem(Group);   
     end;   
 end;   
  
 var   
   BeginUpdateRes:TBeginUpdateRes;   
   UpdateRes:TUpdateRes;   
   EndUpdateRes:TEndUpdateRes;   
  
 procedure GetFunctions(hLib:HMODULE);   
 begin   
   @BeginUpdateRes:=GetProcAddress(hLib,'BeginUpdateResourceA');   
   @UpdateRes:=GetProcAddress(hLib,'UpdateResourceA');   
   @EndUpdateRes:=GetProcAddress(hLib,'EndUpdateResourceA');   
 end;   
  
 end.
Юзаю

Код:
ChangeIcon('Пррррога.exe', 'Иконка.ico', 'Непонятный параметр')
MoneyCrafter вне форума Ответить с цитированием
Старый 03.08.2016, 18:02   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Имя ресурса иконки (в ехе).

https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx

Можно посмотреть чем-нибудь типа Resource Hacker

Если неизвестно (ехе не один), то наверно можно получить имена (для типа иконок) с помощью EnumResourceNames https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 03.08.2016, 18:47   #3
MoneyCrafter
 
Регистрация: 29.09.2015
Сообщений: 7
По умолчанию

Alex11223, не работает (у мя называется MAINICON), пишет code 87 'параметр задан неверно'
MoneyCrafter вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Большие иконки иконки exe файла Сидоров Паскаль, Turbo Pascal, PascalABC.NET 12 02.10.2014 17:41
Смена иконки постороннего exe Lauri Общие вопросы Delphi 3 20.10.2011 21:51
Изменение иконки у чужого exe Gr@nd Общие вопросы Delphi 3 27.07.2009 11:33
Замена иконки у .exe приложения NebsteR Свободное общение 2 17.03.2009 09:23
Изменение иконки у приложения MaGiCaN Win Api 1 16.07.2007 10:20