Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.
Так тоже не работает? »
Не работает. Заголовок , как прилип...
ps Выяснил, почему не работает. В "визуальных эффектах" обязательно должна быть включена опция "включение композиции рабочего стола".
У меня была отключена, т.к. почти все визуальные эффекты я всегда отключаю за ненадобностью. И не только я один... Т.е. в скрипте с манипуляциями стилями, придётся принудительно включать композицию на время установки...
А вообще , это лажа со строны MS. Пользовательские настройки не должны принципиально влиять на работу программ...
Есть вроде как спец функция для манипуляций с композицией... Обсуждалось, к примеру, здесь http://www.gamedev.ru/code/forum/?id=168231
ps Выяснил, почему не работает. В "визуальных эффектах" обязательно должна быть включена опция "включение композиции рабочего стола".
У меня была отключена, т.к. почти все визуальные эффекты я всегда отключаю за ненадобностью »
Ну, вот видишь...А я работаю со всеми включенными эффектами :)
Есть вроде как спец функция для манипуляций с композицией... »
Зачем ты всё усложняешь функциями, смотри:
1. Берёшь файл интерфейса modern.exe из папки Contrib\UIs
2. Копируешь в папку со скриптом
3. Открываешь его в ResHacker
4. Переходишь в диалог 105
5. Ставишь свой стиль окна, убирая WS_CAPTION и добавляя, например, WS_BORDER
105 DIALOGEX 0, 0, 331, 222
STYLE DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_BORDER | WS_SYSMENU
CAPTION ""
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
FONT 8, "MS Shell Dlg"
{
CONTROL "", 3, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 166, 201, 50, 14
CONTROL "", 1, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 216, 201, 50, 14
CONTROL "", 2, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 273, 201, 50, 14
CONTROL "", 1018, STATIC, SS_BLACKRECT | WS_CHILD | WS_GROUP, 15, 45, 300, 140
CONTROL "", 1044, STATIC, SS_BLACKRECT | WS_CHILD | WS_GROUP, 0, 0, 331, 193
CONTROL "", 1035, STATIC, SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE | WS_GROUP, 5, 193, 321, 1
CONTROL "", 1036, STATIC, SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE | WS_GROUP, 0, 35, 340, 1
CONTROL "", 1045, STATIC, SS_ETCHEDHORZ | WS_CHILD | WS_GROUP, 0, 193, 340, 1
CONTROL "", 1256, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 5, 188, 322, 8
CONTROL "", 1028, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_DISABLED | WS_GROUP, 5, 188, 322, 8
CONTROL "", 1034, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 0, 0, 332, 35
CONTROL "", 1037, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 10, 5, 280, 10
CONTROL "", 1038, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 15, 16, 275, 16
CONTROL 103, 1039, STATIC, SS_ICON | WS_CHILD | WS_VISIBLE | WS_GROUP, 300, 8, 21, 20
}
6. Компилируешь/сохраняешь свои изменения
7. В NSIS скрипте прописываешь в самом начале
!define MUI_UI "modern.exe"
8. Наслаждаешься
Просто баг появляется не из-за того, что в MS косячники (ну, в меньшей степени, я думаю), а из-за того, что мы модифицируем созданное окно, создай его изначально без заголовка - и такой проблемы не будет
ps
не знаю насчет пункта 4, достаточно ли будет изменений только в диалоге 105, лень тестить, оставлю это дело тебе :wink:
psps
Включить
System::Call "Dwmapi::DwmEnableComposition(i1)i.r0"
Отключить
System::Call "Dwmapi::DwmEnableComposition(i0)i.r0"
вроде работает :)
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 из "Справка" -> "О программе..."
http://s009.radikal.ru/i308/1502/bd/859628a86f6e.jpg
Заменяем эту цветную картинку на черно-белую - из файла 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
В итоге :
http://s017.radikal.ru/i427/1502/d8/abaaf9002dcb.jpg
Но как заменить в modern.exe Dialog 105 - на откорректированный... Вроде сначала, сохранённый-откорректированный .rc файл надо конвертировать в бинарный вид, а потом уже заменять ресурс...
(Если напрямую заменять .rc ,то заменяться то он вроде как заменяется (точнее изменяется, но без внесённых изменений и при этом получается черт те что) )...
И скорее всего, не так это делается... Тогда как ?
ps Во вложении черно-белая картинка - файл 104.bmp :
Но нигде в сети не обнаружил даже намёка, как с помощью NSIS можно изменить/заменить ресурсы файлов. »
Вот ты сам подумай, зачем системе создания инсталляторов копаться в содержимом файлов, заменяя их ресурсы? Это явно не задача таких систем.
А если нужно заменить ресурсы - юзай командную строку приложений, которые умеют заменить ресурсы (тот же ResHacker, справка в помощь)
Но как заменить в modern.exe Dialog 105 - на откорректированный... Вроде сначала, сохранённый-откорректированный .rc файл надо конвертировать в бинарный вид, а потом уже заменять ресурс...
(Если напрямую заменять .rc ,то заменяться то он вроде как заменяется (точнее изменяется, но без внесённых изменений и при этом получается черт те что) )...
И скорее всего, не так это делается... Тогда как ? »
Я что-то не понял, ты не можешь через ResHacker сохранить изменения в диалоге 105? Или что? :unsure:
И я не совсем понимаю, зачем менять ресурс непосредственно через NSIS код, если можно произвести все изменения в файле и запихнуть в инсталлер уже готовый файл с изменёнными ресурсами...Или ты делаешь своего рода патчер по замене ресурсов в файлах??
зачем системе создания инсталляторов копаться в содержимом файлов, заменяя их ресурсы? »
Не системе инсталлятора, а автономной программе на NSIS.
Задачи с заменой ресурсов могут быть разные, к примеру :
интереующая меня (и полезная для многих) программа для удобного и быстрого изменения размеров и пр. у окон конструированного инсталлятора NSIS , в ресурсах modern.exe . Как я уже говорил выше. Конечно всё это можно делать редактором ресурсов - но оч долго и оч не удобно, особенно , если регулярно. :)
И, как ты правильно заметил - разнообразные патчеры ресурсов, как для простой замены какого либо ресурса, так и для корректировки, локализации и т.д.
Оч. полезно в применении для программ с часто меняющимися версиями, где постоянно приходится обновлять ресурсы...
Не нужно каждый раз возиться с ResHacker_ом, особенно если надо заменять десятки параметров в ресурсах... А тут один раз повозился, а далее просто вводи данные (если надо) и жми кнопку :)
Я что-то не понял, ты не можешь через ResHacker сохранить изменения в диалоге 105? »
Сохранить ессно можешь (как файл .rc). Как изменить-заменить его потом, после корректировки, с помощью кода NSIS ?
kotkovets
26-02-2015, 09:56
А каким образом добавить к получившемуся "лысому" окну - рамку ? (пробовал добавлять "рамочные" стили WS_BORDER , WS_THICKFRAME , посылал окну сообщение ${CM_BORDERCHANGED} - без эффекта ) »
насколько помню )), нужно считать в переменную текущие свойства окна и прибавить (IntOp) нужное свойство в форточку.
и применить, все действия в GUIInit.
нужно считать в переменную текущие свойства окна и прибавить (IntOp) нужное свойство в форточку.
и применить, все действия в GUIInit. »
С этим вроде разобрались - все API манипуляции со стилями окна, перечёркивает отключение композиции раб стола...
Подскажи пожалуйста - как изменить-заменить сохранённый и откорректированный .rc ресурс в modern.exe , с помощью кода NSIS ?
kotkovets
26-02-2015, 16:00
Подскажи пожалуйста - как изменить-заменить сохранённый и откорректированный .rc ресурс в modern.exe , с помощью кода NSIS ? »
Дело в том, что у штатного system.dll проблемы работы со структурами, что требует WinAPi работу с ресурсами,
все это сводит на нет штатными инструментами редактирование ресурсов...
Этот "косяк" сильно ограничивает функциональность расширенных кодов для продвинутого в этом плане NSIS
Не системе инсталлятора, а автономной программе на NSIS. »
Пошел по моим стопам? :biggrin: Ну, тогда понятно :) Работы то уже есть готовые?
интереующая меня (и полезная для многих) программа для удобного и быстрого изменения размеров и пр. у окон конструированного инсталлятора NSIS , в ресурсах modern.exe . Как я уже говорил выше. Конечно всё это можно делать редактором ресурсов - но оч долго и оч не удобно, особенно , если регулярно. »
Для этого и были созданы такие программы, как ResHacker, какой смысл в создании велосипеда? И я что-то не замечал трудностей при изменении интерфейса через "хакера", всё довольно быстро и удобно делается там...
И, как ты правильно заметил - разнообразные патчеры ресурсов, как для простой замены какого либо ресурса, так и для корректировки, локализации и т.д.
Оч. полезно в применении для программ с часто меняющимися версиями, где постоянно приходится обновлять ресурсы... »
А патчеры по какому принципу работают? Разве не по принципу использования внешних приложений для обновления ресурсов в файлах? Не интересовался этой темой, поэтому не в курсе всех тонкостей
Сохранить ессно можешь (как файл .rc). Как изменить-заменить его потом, после корректировки, с помощью кода NSIS ? »
rc-файл - это формат ResHacker (хоть и обычный текстовый файл), поэтому и заменить данным файлом ресурс можно только через него, используя либо интерфейс, либо обратившись к ResHacker через командую строку
Дело в том, что у штатного system.dll проблемы работы со структурами, что требует WinAPi работу с ресурсами,
все это сводит на нет штатными инструментами редактирование ресурсов... »
Не в теме по функциям api, работающим с ресурсами, но раз такое дело, то в крайнем случае выход для NSIS - написать плагин, только вот браться за это, думаю, мало кто захочет, ибо спрос на такой функционал не велик, как мне кажется
Пошел по моим стопам? »
Хороший пример - заразителен. :)
rc-файл - это формат ResHacker »
Нет, это общий формат скрипта ресурса (rc script), по сути - просто описание ресурса... Используется повсеместно, как редакторами ресурсов так и программистами при манипуляциях с ресурсами в коде... Но нам с того, применимо для NSIS, не легче... :)
либо обратившись к ResHacker через командную строку »
А вот это попробуем. :) Раз другого выхода нет...
Товарищи подскажите пожалуйста, есть программа "Фабрика Форматов", инсталлятор на NSIS, устанавливаю с параметров /S для тихой установки, незаметно от пользователей, но инсталлятор по дефолту ставит программу и ярлыки к ней для одного пользователя, а не для всех, есть ли какая то команда для установки "для всех"
есть ли какая то команда для установки "для всех" »
Стандартно - нет, если автор сборки инсталлятора закладывает в скрипт такие возможности - то будут, и о доступных ключах установки, обычно, сообщается
Что касается конкретно Format Factory - в исходном коде NSIS-скрипта этого продукта такой возможности не заложено, нет упоминания о команде SetShellVarContext, которая бы создавала ярлыки для всех/только для текущего
SetOutPath $_OUTDIR
SetOutPath $INSTDIR\FFModules\Package
File Readme.txt
SetOutPath $INSTDIR\FFModules\Package\BaiDu
File Baidu-TB-ASBar.exe
File hao123inst.exe
SetOutPath $INSTDIR\FFModules\Package\Ask
File AskPIP_FF_.exe
SetOutPath $INSTDIR
StrCmp $_28_ 0 label_417
CreateDirectory $SMPROGRAMS\ёсКЅ№¤і§
CreateShortCut $SMPROGRAMS\ёсКЅ№¤і§\ёсКЅ№¤і§.lnk $INSTDIR\FormatFactory.exe
CreateShortCut $SMPROGRAMS\ёсКЅ№¤і§\°пЦъ.lnk $INSTDIR\FormatFactory.exe /help $INSTDIR\FormatFactory.exe 2
CreateShortCut $DESKTOP\ёсКЅ№¤і§.lnk $INSTDIR\FormatFactory.exe
CreateShortCut $SENDTO\ёсКЅ№¤і§.lnk $INSTDIR\FormatFactory.exe
Goto label_422
label_417:
CreateDirectory $SMPROGRAMS\FormatFactory
CreateShortCut $SMPROGRAMS\FormatFactory\FormatFactory.lnk $INSTDIR\FormatFactory.exe
CreateShortCut $SMPROGRAMS\FormatFactory\Help.lnk $INSTDIR\FormatFactory.exe /help $INSTDIR\FormatFactory.exe 2
CreateShortCut "$DESKTOP\Format Factory.lnk" $INSTDIR\FormatFactory.exe
CreateShortCut "$SENDTO\Format Factory.lnk" $INSTDIR\FormatFactory.exe
label_422:
SectionEnd
либо обратившись к ResHacker через командую строку »
К сожалению ком строка ResHacker работает только с .res файлами, от которых толка нет ( для поставленной задачи... )
Ведь надо (точнее - возможно) редактировать данные именно в скриптах .rc
Если бы .rc можно было бы преобразовать в файлы .res - тогда другое дело. И вроде как для того существует консольная утилитка brcc32.exe ( из пакета Delphi). Но ни черта она у меня не работает (может требуются какие то доп DLL или ещё что. Про то, не известно...)
И вроде как для того существует консольная утилитка brcc32.exe ( из пакета Delphi). Но ни черта она у меня не работает (может требуются какие то доп DLL или ещё что »
Ну так, а ты пробовал её запустить без параметров?
Я так всегда делаю, создаю cmd файл и запускаю консольное приложение без параметров, в основном они ругаются, если им что-то нужно
brcc32
pause
В итоге видим в окне консоли:
Fatal error could not create interface with rw32core.dll
достаём нужные файлы и вуаля!
brcc32 "My file.rc"
pause
rc в res компилируется без проблем :)
Интересно, возможно ли в NSIS скрипте, записывать несколько переменных - в одну строку ? Просто для компактности скрипта... А то, когда назначаешь под сотню собственных переменных получается ну очень огромный столб из переменных... Вроде как, некоторые языки программирования позволяют так делать...
Просто для компактности скрипта... А то, когда назначаешь под сотню собственных переменных получается ну очень огромный столб из переменных... »
Создай nsh файл, пропиши туда только свои переменные и в основном скрипте подключи этот файл
Если бы я в своём SFX Creator всё пихал в один nsi файл - я бы с ума уже сошел, только главный файл насчитывает 6200 строк кода и это без дополнительных nsh файлов, которые к нему относятся, в котором валяются функции, которые не изменяются...
Подскажите пожалуйста, каким образом в EXE файле определить - есть ли в нём конкретная HEX строка ?
Например, для этого файла надо определить есть ли в нём такая строка :
A3484BBE986C4AA9994C530A86D6487D (это признак для определения файлов AutoIt3 compiled script executable, для которых классический метод определения по сигнатуре - не подходит...)
этот файл : http://rghost.ru/private/6zgqqPykN/efff5945544c291a4bfe25f76010300c
http://s017.radikal.ru/i426/1503/5a/736e35174534.jpg
Причём у разных файлов, offset разный, но строка A3484BBE986C4AA9994C530A86D6487D - неизменна
http://s019.radikal.ru/i627/1503/e9/65d4d01ec7a2.jpg
Чтение побайтово очень долго проходит, если искомая строка не в начале файла и если сам файл больше 5-10 Мб...
Готовый код:
Function test
; Используются следующие переменные
; $0 - $7
; $R0, $R1, $R2, $R3
Banner::show /NOUNLOAD ""
Banner::getWindow /NOUNLOAD
var /global banner
Pop $0
GetDlgItem $banner $0 1030
StrCpy $R1 "A3484BBE986C4AA9994C530A86D6487D"
StrCpy $R2 "C:\Windows\Explorer.exe"
strcpy $0 $0 0
StrCpy $R0 "$R1"
stget:
intop $0 $0 + 1
StrCpy $R0 "$R0" -2
StrCmp $R0 "" 0 stget
StrCpy $R0 "$R1" 2 ; записываем первые 2 символа, с них будем начинать чтение байтов подряд, если встретятся в файле
intop $R3 $0 - 1 ; нам нужно знать, сколько последовательно байт считать, чтобы точно сверить всю последовательность байт
StrCpy $1 "0" ; начальный
StrCpy $5 ""
FileOpen $0 "$R2" r
now:
StrCpy $6 0
IntOp $1 $1 + 1
FileSeek $0 "$1" SET $1
IntFmt $2 "0x%08X" $1
SendMessage $Pop2 ${WM_SETTEXT} 0 "STR:[$2] $1"
FileReadByte $0 $3
StrCmp $3 "" no 0
IntFmt $4 "%02X" $3
StrCmp $4 "$R0" 0 now
StrCpy $5 "$4"
getBytes:
IntOp $6 $6 + 1
FileReadByte $0 $3
IntFmt $4 "%02X" $3
StrCpy $5 "$5$4"
StrCmp $6 "$R3" 0 getBytes
StrCmp $5 "$R1" 0 now
MessageBox MB_OK|MB_ICONINFORMATION "$R1$\n$\nНайдено, начиная со смещений:$\nHEX - $2$\nDEC - $1" idok end
no:
MessageBox MB_OK|MB_ICONSTOP "в данном файле нет таких данных"
end:
FileClose $0
Banner::destroy
FunctionEnd
Тебе остаётся только подставить нужную строку и путь к файлу
Код универсальный и не привязан конкретно к твоей строке, можешь вбивать для поиска другие значения любой длины (от 4 символов), вроде работает :)
сори за бардак в переменных, некогда прихорашивать, если нужно, думаю сам в макрос загонишь...?
Чтение побайтово очень долго проходит, если искомая строка не в начале файла »
Действительно, очень долго... Для практики надо бы побыстрее... Интересно, можно как то по иному реализовать поиск ?
Может подойдёт плагин http://wiz0u.free.fr/prog/nsisFile/ ?
Интересно, можно как то по иному реализовать поиск ? »
Я в NSIS новичок, поэтому всех тонкостей не знаю, может, можно как-то и быстрее :)
Может подойдёт плагин http://wiz0u.free.fr/prog/nsisFile/ ? »
Подошел
Function test
FileOpen $2 "$EXEDIR\VirtualBox-4.3.24-98716-Win.exe" r
nsisFile::FileFindBytes "$2" "A3484BBE986C4AA9994C530A86D6487D" "-1"
pop $1
FileClose $2
MessageBox MB_OK|MB_ICONINFORMATION "$1"
FunctionEnd
Если не найдено $1 = "-1"
Если найдено $1 = смещение по DEC
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC