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