Воскресенье, 14.08.2022, 03:31
PureBasic - кроссплатформенный язык программирования
Главная Форум Регистрация Вход
Приветствую Вас, Гость · RSS
Меню сайта
Категории раздела
Начинающим [8]
Статьи
[16.06.2011][Начинающим]
Как быстро найти описание функции или оператора. (0)
[11.06.2011][Начинающим]
Создание EXE программы. (3)
[24.03.2011][Начинающим]
Работа с отладчиком (0)
[17.03.2011][Начинающим]
Замена значка в исполняемом файле (2)
[15.03.2011][Начинающим]
Перезагрузка процедур. (0)
[09.03.2011][Начинающим]
Создание самораспаковывающегося ZIP архива (0)
[24.02.2011][Начинающим]
Работа с ZIP архивами (0)
[22.02.2011][Начинающим]
Определение IP адреса компьютера (0)
Файлы
[28.06.2011][Примеры]
Примеры программ. (1)
[27.06.2011][PB 4.50 и 4.51]
PortLib - работа с портами компьютера (2)
[10.04.2011][PB 4.50 и 4.51]
PureSMTP - отправка почты (2)
[10.03.2011][Примеры]
3D демки. (1)
[10.03.2011][Примеры]
2D демка. (0)
[09.03.2011][PB 4.50 и 4.51]
Русская справка (0)
[09.03.2011][PB 4.50 и 4.51]
Русификатор PureBasic (1)
[02.03.2011][PB 4.50 и 4.51]
HID_Lib - работа с USB HID устройствами. (9)
[01.03.2011][Примеры]
CodeArchiv_v4-Beta (0)
[28.02.2011][Учебники]
Установка PureBasic на ОС Linux (0)
 Каталог статей
Главная » Статьи » Учебные материалы » Начинающим

Замена значка в исполняемом файле
Представим, у вас есть исполняемый файл какой-либо программы и нужно у него сменить значок.

Для замены значка (иконки программы), нужно модифицировать ресурс RT_ICON (бинарные данные значков) и ресурс RT_GROUP_ICON, описывающий группу значков исполняемого файла ресурса RT_ICON.
Для программной модификации ресурсов, существуют WinAPI функции BeginUpdateResource, UpdateResource и EndUpdateResource.
Первая получает доступ редактирования ресурсов требуемого исполняемого файла.
Вторая, собственно пишет данные в указанные ресурсы.
Третья, завершает редактирование и записывает данные в исполняемый файл.

Вот код программы, заменяющий иконки в исполняемых файлах.

Код:
Structure IcoItemHeader
    Width.b
   
Height.b
    Colors.b
   
Reserved.b
   
Planes.w
   
BitCount.w
   
ImageSize.l
EndStructure

Structure IcoItem
   
Header
.IcoItemHeader
   
Offset.l
EndStructure

Structure IcoHeader
   
Reserved.w
   
Typ.w
   
ItemCount.w
   
Items
.IcoItem[4]
EndStructure

Structure GroupIconDirItem
   
Header
.IcoItemHeader
    Id.w
EndStructure


Structure GroupIconDir
    Reserved.w
   
Typ.w
    ItemCount.w
    Items.GroupIconDirItem[4]
EndStructure


Enumeration
  #Window_0
EndEnumeration


;- Gadget Constants
Enumeration
 
#Text_0
 
#String_0
 
#Button_0
 
#Text_1
 
#String_1
  #Button_1
  #Button_2
EndEnumeration

Procedure Open_Window_0()
  If OpenWindow(#Window_0, 255, 317, 310, 124, "Заменялка значков в прогах",  #PB_Window_MinimizeGadget | #PB_Window_Invisible | #PB_Window_TitleBar | #PB_Window_ScreenCentered )
      TextGadget(#Text_0, 5, 5, 270, 15, "Путь к исполняемому файлу:")
      StringGadget(#String_0, 5, 20, 270, 20, "")
      ButtonGadget(#Button_0, 280, 20, 25, 20, "...")
      TextGadget(#Text_1, 5, 45, 270, 15, "Путь к файлу с иконкой:")
      StringGadget(#String_1, 5, 60, 270, 20, "")
      ButtonGadget(#Button_1, 280, 60, 25, 20, "...")
      ButtonGadget(#Button_2, 85, 90, 130, 25, "Заменить значок")
      HideWindow(#Window_0,0)
  EndIf
EndProcedure

Procedure ReplaceIcon(EXE_File.s, ICON_File.s)
Protected Result=0, File
; EXE_File - Путь к исполняемому файлу

; ICON_File - Путь к файлу иконки

 
GroupIconDir
.GroupIconDir
 
Ico
.IcoHeader
 
InfoIcon
.GroupIconDir
  If FileSize(EXE_File)>And FileSize(ICON_File)>0 ; Файлы есть на диске
    File=ReadFile(#PB_Any,ICON_File) ; Открываем файл с иконкой в режиме "Только чтение"
    If File
      FileSize=Lof(File) ; Размер файла в байтах
      *DataIcon=AllocateMemory(FileSize) ; Память под иконку
     
If
*DataIcon
        ReadData(File, *DataIcon, FileSize) ; Копирование в память данных из файла
       
CloseFile
(File)
        CopyMemory(*DataIcon, @Ico, SizeOf(IcoHeader))
        H = BeginUpdateResource_(@EXE_File, 0)
       
If
H
         
If
Ico\ItemCount>4
            Ico\ItemCount=4
         
EndIf

         
NewGroupIconDirSize = 20*Ico\ItemCount
         
InfoIcon
\Reserved = Ico\Reserved
          InfoIcon\Typ = Ico\Typ
          InfoIcon\ItemCount = Ico\ItemCount
          For I = 0 To Ico\ItemCount-1
            CopyMemory(@Ico\Items[I]\Header, @InfoIcon\Items[I]\Header, SizeOf(IcoItemHeader))
            InfoIcon\Items[I]\Id = I+1
            UpdateResource_(H, #RT_ICON, I+1, 1033, *DataIcon + Ico\Items[I]\Offset, Ico\Items[I]\Header\ImageSize)
          Next i
          UpdateResource_(H, #RT_GROUP_ICON, 1, 1033, @InfoIcon, NewGroupIconDirSize)
          Result=EndUpdateResource_(H, #False)
        EndIf
       
FreeMemory
(*DataIcon)
      EndIf
    EndIf
  EndIf
ProcedureReturn Result
EndProcedure

Open_Window_0()

Repeat
  Event=WaitWindowEvent()
    If Event=#PB_Event_Gadget
   
Select
EventGadget()
      Case #Button_0
        File.s=OpenFileRequester("","","Исполняемые файлы (exe)|*.exe|Все файлы|*.*",0)
        If File<>""
         
SetGadgetText
(#String_0, File)
        EndIf

      
Case #Button_1
        File.s=OpenFileRequester("","","Файлы иконок (ico)|*.ico|Все файлы|*.*",0)
        If File<>""
          SetGadgetText(#String_1, File)
        EndIf

     
Case #Button_2
        EXE.s=GetGadgetText(#String_0)
        ICO.s=GetGadgetText(#String_1)
        If FileSize(EXE)>0 And FileSize(ICO)>0
         
If
ReplaceIcon(EXE, ICO)<>0
            MessageRequester("Все ОК", "Иконка успешно замнена", #MB_OK|#MB_ICONINFORMATION)
          Else
           
MessageRequester
("", "Произошла ошибка при замене значка", #MB_OK|#MB_ICONWARNING)
          EndIf
        Else
          MessageRequester("Ошибка", "Не заполнено одно из полей"+Chr(10)+"либо задан не правильный путь к файлу", #MB_OK|#MB_ICONWARNING)
        EndIf
    EndSelect
 
EndIf

 
Until Event=#PB_Event_CloseWindow
End
Работа с ресурсами программы, а значит замена значка, выполняется в процедуре ReplaceIcon.

Вот как выглядит окно запущенной программы.


Скачать файлы
Категория: Начинающим | Добавил: fils (17.03.2011)
Просмотров: 8704 | Комментарии: 2 | Теги: замена значков, Значки, исполняемые файлы, exe | Рейтинг: 3.2/6
Всего комментариев: 2
0
2 Нина   [Материал]
Очень нравится программа

0
1 Valery   [Материал]
Огромное спасибо-мелкая, быстрая и полезная программка!=)

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Copyright MyCorp © 2022
Форма входа

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Поиск
Друзья сайта
  • Разработчики PureBasic
  • Русский сайт о PureBasic
  • pure-basic.narod.ru
  • mirashic.narod.ru
  • purebasic.ucoz.com
  • purebasic.org
  • purebasic.ru
  • Копировать материалы сайта без разрешения автора, ЗАПРЕЩЕНО!

    Сделать бесплатный сайт с uCoz