K.A.V.,
Да. Замена стиля в ресурсе работает.
И, к слову, об изменении ресурсов. Кроме стилей, чаще всего в modern.exe пользователи изменяют размеры окон страниц, кнопок и других элементов (или скрывают не нужные элементы).
Вполне можно было бы сделать на NSIS программку, упрощающую изменение ресурсов в
modern.exe Dialog.
Ввёл нужные значения размеров, отметил нужные стили и нажал кнопку, сохранив modern.exe , скажем, как - modern_correct.exe . Было бы весьма полезно.
Но нигде в сети не обнаружил даже намёка, как с помощью NSIS можно изменить/заменить ресурсы файлов.
Хотя... Однажды
kotkovets рассказывал, как это делается (правда только для битмапов)... Вот, что я понял из его рассказа-примера и использовал в таком примере (+ добавил некоторые описания...) :
Пример замены ресурса в WinRar 5.21x32 рус (
http://www.rarlab.com/rar/wrar521ru.exe )
Заменим ресурс Bitmap 104 в RarLng.dll. Это - цветная картинка-лейба WinRAR из "Справка" -> "О программе..."
Заменяем эту цветную картинку на черно-белую - из файла 104.bmp :
читать дальше »
Код:
!include "logiclib.nsh"
ShowInstDetails show
OutFile "replacement_of_ resources_ BMP-test.exe"
!define RT_BITMAP 2 ;Bitmap resource.
/* при необходимости используем :
!define RT_CURSOR 1 ;Hardware-dependent cursor resource.
!define RT_ICONH 3 ;ardware-dependent icon resource.
!define RT_MENU 4 ;Menu resource.
!define RT_DIALOG 5 ;Dialog box.
!define RT_STRING 6 ;String-table entry.
!define RT_FONTDIR 7 ;Font directory resource.
!define RT_FONT 8 ;Font resource.
!define RT_ACCELERATOR 9 ;Accelerator table.
!define RT_RCDATA 10 ;Application-defined resource (raw data).
!define RT_MESSAGETABLE 11 ;Message-table entry.
!define /math RT_GROUP_CURSOR ${RT_CURSOR} + ${RT_MESSAGETABLE}
!define /math RT_GROUP_ICON ${RT_ICONH} + ${RT_MESSAGETABLE}
!define RT_VERSION 16 ;Version resource.
!define RT_DLGINCLUDE 17 ;include heder file
!define RT_PLUGPLAY 19 ;Plug and Play resource.
!define RT_VXD 20 ;DWORD cbData
!define RT_ANICURSOR 21 ;Animated cursor.
!define RT_ANIICON 22 ;Animated icon.
!define RT_HTML 23 ;HTML resource.
!define RT_MANIFEST 24 ;Side-by-Side Assembly Manifest.
*/
Section
System::Store S
FileOpen $0 "$EXEDIR\104.bmp" r
${Unless} ${Errors}
System::Call "kernel32::GetFileSizeEx(ir0,*l.r1)"
;Т.к. мы заменяем растровое изображение (BMP файл), то для его правильной обработки
;сначала необходимо устранить первые 14 байт заголовка растрового изображения.
IntOp $1 $1 - 14
System::Call "kernel32::SetFilePointer(ir0,i14,i0,i0)"
System::Alloc $1
Pop $2
System::Call "kernel32::ReadFile(ir0, ir2, ir1, *i.r3, i0)"
FileClose $0
; BeginUpdateResource - создает описатель для EXE или DLL файла, в котором нужно заменить ресурс
; UpdateResource - используя описатель файла добавляет, удаляет или заменяет в нем ресурсы
; EndUpdateResource - закрывает описатель файла
System::Call "kernel32::BeginUpdateResource(t'$EXEDIR\RarLng.dll', i0)i.r0"
${Unless} $0 == 0
System::Call "kernel32::UpdateResource(ir0, i${RT_BITMAP}, i104, i1033, ir2, ir3)" ; 104 - ресурс , 1033 - язык
System::Call "kernel32::EndUpdateResource(ir0,i0)"
${Else}
DetailPrint "файла для изменения не существует!"
${EndUnless}
System::Free $2
${Else}
DetailPrint "файл для замены не существует!"
${EndUnless}
System::Store L
SectionEnd
Section
SectionEnd
В итоге :
Но как заменить в modern.exe Dialog 105 - на откорректированный... Вроде сначала, сохранённый-откорректированный .rc файл надо конвертировать в бинарный вид, а потом уже заменять ресурс...
(Если напрямую заменять .rc ,то заменяться то он вроде как заменяется (точнее изменяется, но без внесённых изменений и при этом получается черт те что) )...
И скорее всего, не так это делается... Тогда как ?
ps Во вложении черно-белая картинка - файл 104.bmp :