Ru-Board.club
← Вернуться в раздел «Программы»

» NSIS (Nullsoft Scriptable Install System)

Автор: kot280379
Дата сообщения: 13.10.2010 22:59
Кстати Victor_VG, существует ли визуальный редактор для кастомных страниц?
С помощью nsDialogs весьма неудобно рисовать! C этим многие согласятся!
и вроде бы в сети нигде не встречал...
Автор: Victor_VG
Дата сообщения: 13.10.2010 23:04
kot280379

Я лично такой инструмент не искал - не было нужды. Но, такие инструменты входят в пакет NIS Editor. Я его периодически привожу в соответствие с текущей версией компилятора - обычно приходится править индексы справки.
Автор: kot280379
Дата сообщения: 13.10.2010 23:10

Цитата:
Но, такие инструменты входят в пакет NIS Editor

Но там идет редактор для InstallOptions, он удобный не спорю..а то подставлять размер с ini файла,
тож как то...
кстати HM NIS Edit частенько вылетает с кодом ошибки, пока стабильно, на дом.компьютере и рабочем компьютере тоже.
Автор: Victor_VG
Дата сообщения: 14.10.2010 01:00
kot280379

Есть у него такое явление при очень больших скриптах. Тогда использую MakeNSISW для запуска компиляции, а в нём только код пишу.
Автор: kot280379
Дата сообщения: 14.10.2010 11:11
Victor_VG

Цитата:
него такое явление при очень больших скриптах

Тут я с вами не совсем соглашусь, чаще всего, вылетает при открытии скрипта,
проверено на многих компах, и не важно какой скрипт.
Вы как то им занимаетесь, могли бы вы исправить сей ошибку.
Так как NIS Edit считаю наиболее простым и удобным редактором

Автор: Victor_VG
Дата сообщения: 14.10.2010 13:22

Возьмите мой вариант - он всегда доступен на моих серверах. У меня он вылетает сверх редко, но если компилировать им мегабайтные скрипты GCC в которых число строк достигает 30 - 40 тысяч, то на них да, зависает. Да и куда ему бедняге дется когда надо скомпилировать список из 15 - 20 тысяч файлов раскиданных по тысяче подкаталогов? И ведь это для компилятора нормально - библиотеки, вспомогательные модули, бинарники, чистка от предыдущих версий - в общем хватает кода.
Автор: kot280379
Дата сообщения: 14.10.2010 22:46
Victor_VG
Благодарю стянул ваш NIS Edit
Цитата:
в общем хватает кода

Как то не подумал, что с подключением доп.библиотеки добавляется немалый кусок кода...
Автор: Victor_VG
Дата сообщения: 14.10.2010 23:56
kot280379

Ещё как приходится добавлять - например те же проверки для предотвращения ошибок - иные увеличивают код очень прилично, а сами библиотеки надо описать в #define это как минимум. Если всё поручить автоматике, она такое натворит. Проще по старинке, ручками и заодно добавить программе толику мозгов, дабы совсем уж полной дурой не выглядела.
Автор: kot280379
Дата сообщения: 15.10.2010 01:04

Цитата:
Если всё поручить автоматике, она такое натворит

Ну самый лучший и гибкий, только РУЧКАМИ.
Victor_VG
Как то меня спрашивали, возможно ли на NSIS написать сетап, который бы разварачивал
структуру подсунутого скрипта на секции, функции и на кастомной странице рисовались
бы с соответствием числом секций, функций - чебоксы, радиобутоны с последующим редактированием и
и компиляцией подсунутого скрипта
Я в свою очередь, хочу спросить, (лично мне это никчему) но все же...возможно такую функцию добавить в мастер создания скриптов?

Автор: Victor_VG
Дата сообщения: 15.10.2010 01:32
kot280379

Думаю, что с имеющимся на сегодня парсером эта задача не решается.
Автор: kot280379
Дата сообщения: 15.10.2010 01:39
Victor_VG
т.е вы хотите сказать, что анализатор текста, придется переписывать заново?
Автор: qazwsxe
Дата сообщения: 26.10.2010 12:57
нужна помощь по работе с флагами...

Есть у меня три секции, например, section1, section2, section3
Мне необходимо, чтобы при выборе любой секции, устанавливался на других тот же флаг. Тобишь выбрал или снял я чек бокс с section1 (или section2 или section3), и на других секциях, тоже снялся чек бокс... а если установлю чек бокс, то на других установился...
Если можно пример...
Автор: Victor_VG
Дата сообщения: 27.10.2010 13:40
qazwsxe

Пример не нужен. Подобную задачу я для себя решал кодом на основе семафоров. Идея такая - срабатывание условия приводит к установке семафора, а дальнейший код только проверяет его состояние и в зависимости от этого происходит ветвление алгоритма. Для упрощения возни я использую простой приём - расписываю таблицы истинности для условий и смотрю какие дадут логическую 1 и когда. Можно конечно и СДНФ/СКНФ расписать, но иногда их приводить к решению дольше чем таблички составить, да и не все дискретную математику знают чтобы СДНФ/СКНФ расписать - больно длинные они обычно выходят, и пока их к простой форме распишешь много времени тратится, потому таблицы и быстрее, и нагляднее, да и ошибок меньше делаешь.

Что надо учитывать?

1) семафоры должны быть определены как глобальные константы в операторах !define
2) отработка секций если нет перехода в NSIS-программе идёт по линейной схеме от первой к последней и без пропусков;
3) перед первым использованием семафоры надо обязательно про инициализировать в функции .onInit/.unInit (для семафоров времени удаления) иначе их состояние будет не предсказуемо. Код установки обычное присваивание, к примеру - strcpy $sem1 0.
Автор: dimbat
Дата сообщения: 27.10.2010 19:11
qazwsxe
Наверное [more=где то так]Page Custom pre fn
Var dialog
Var C1
Var C2
Var C3
Function pre
nsDialogs::Create 1018
Pop $dialog
${NSD_CreateCheckBox} 0 3u 100% 13u "Первый чекбокс"
Pop $C1
${NSD_OnClick} $C1 fn1
${NSD_CreateCheckBox} 0 24u 100% 13u "Второй чекбокс"
Pop $C2
${NSD_OnClick} $C2 fn2
${NSD_CreateCheckBox} 0 43u 100% 13u "Третий чекбокс"
Pop $C3
${NSD_OnClick} $C3 fn3
nsDialogs::Show
FunctionEnd
Function fn1
${NSD_GetState} $C1 $0
${If} $0 == 1
${NSD_Check} $C2
${NSD_Check} $C3
${Else}
${NSD_UnCheck} $C2
${NSD_UnCheck} $C3
${EndIf}
FunctionEnd
Function fn2
${NSD_GetState} $C2 $1
${If} $1 == 1
${NSD_Check} $C1
${NSD_Check} $C3
${Else}
${NSD_UnCheck} $C1
${NSD_UnCheck} $C3
${EndIf}
FunctionEnd
Function fn3
${NSD_GetState} $C3 $2
${If} $2 == 1
${NSD_Check} $C1
${NSD_Check} $C2
${Else}
${NSD_UnCheck} $C1
${NSD_UnCheck} $C2
${EndIf}
FunctionEnd
Function fn
${NSD_GetState} $C1 $0
${NSD_GetState} $C2 $1
${NSD_GetState} $C3 $2
MessageBox MB_OK "Смотрим отработку каждого чекбокса 0/1 - выкл/вкл: $0 $1 $2"
FunctionEnd
Section
Sectionend[/more], если требуются и визуальные изменения чекбоксов. Хотя, наверняка можно и проще написать...
Автор: Victor_VG
Дата сообщения: 27.10.2010 19:53
dimbat

Да, можно и так, но я просто задаю в заголовке ряд семафоров, и когда секцию выберут в списке компонент сразу ставлю семафоры в соответствии с просчитанной для данной задачи логикой. А потом их использую. Пока вроде этот приём достаточно надёжно работает. Проблемы у меня были когда писал хитрые ИИ для кучи языков с авто выбором и отработкой ситуации "не выбрано ничего". Вот там и были случаи не отработки на иных машинах. Приходилось упрощать алгоритмы в блоке логики - похоже, что иногда они могут произвольно не срабатывать, что естественно не допустимо.
Автор: kot280379
Дата сообщения: 27.10.2010 20:53
У меня получилось как то так, кривоватый код, но работает ,вот не знаю как избавиться от фиксации sec_1
[more=Пример]
Код: ;---------------------------------
;фиктивная секция, должна быть самой первой!!!!
Section -секция sec_1
SectionEnd
    ;------------------------------
Section секция_1 sec_2
SectionEnd    

Section секция_2 sec_3
SectionEnd

Section секция_3 sec_4
SectionEnd


Function .onSelChange
    SectionGetFlags ${sec_1} $0
IntOp $0 $0 ^ ${SF_SELECTED}
    SectionSetFlags ${sec_1} $0
SectionSetFlags ${sec_2} $0
    SectionSetFlags ${sec_3} $0
    
    SectionGetFlags ${sec_2} $2
IntOp $1 $1 ^ ${SF_SELECTED}
SectionSetFlags ${sec_1} $2
    SectionSetFlags ${sec_2} $2
    SectionSetFlags ${sec_3} $2
    SectionSetFlags ${sec_4} $2
    
    SectionGetFlags ${sec_3} $1
IntOp $0 $0 ^ ${SF_SELECTED}
SectionSetFlags ${sec_1} $1
    SectionSetFlags ${sec_2} $1
    SectionSetFlags ${sec_3} $1
    SectionSetFlags ${sec_4} $1
    
    SectionGetFlags ${sec_4} $3
IntOp $1 $1 ^ ${SF_SELECTED}
SectionSetFlags ${sec_1} $3
    SectionSetFlags ${sec_2} $3
    SectionSetFlags ${sec_3} $3
    SectionSetFlags ${sec_4} $3
FunctionEnd

Function .OnInit
StrCpy $0 ${sec_1}
StrCpy $1 ${sec_2}
StrCpy $2 ${sec_3}
StrCpy $3 ${sec_4}
FunctionEnd
Автор: Victor_VG
Дата сообщения: 28.10.2010 00:25
kot280379

Есть тут одна особенность - функции должны быть объявлены явно и до блока процедур (секций) - компилятор должен их первыми обраьотать, как и макросы если есть. А избавится от фиксации фиктивной секции не удастся, но объявляется она так например:

Код: Section "-Main" SEC01
SectionEnd
Автор: kot280379
Дата сообщения: 28.10.2010 00:44
Victor_VG

Цитата:
от фиксации фиктивной секции не удастся

Я так тоже подумал...


Добавлено:
Victor_VG
Подскажите, как задать прозрачный цвет левого верхнего пикселя bmp в nsDialogs?
В InstallOptions c этим нет проблем..
А через графические редакторы тоже, как то выход, но хотелось бы узнать как же через nsDialogs?
Автор: Victor_VG
Дата сообщения: 28.10.2010 04:42
kot280379

С этим не связывался - никогда не создаю украшений. Для меня важнее создать логику и добавить проекту "мозгов", а внешние украшения я не применяю из принципа.
Автор: DmitryV
Дата сообщения: 09.11.2010 19:22
Вопрос, подскажите, где почитать подробно про встроенные константы и директивы, и как реализовать на NSIS программу обновления программы, когда необходимо перезаписать несколько файлов + удалить файлы кэша в директории пользователя, и ещё вопрос а как диалог и формы править а то попробовал через мастера HM NIS Edit тексты заголовка и т д в форме при сборке от куда тянет стандартные русские, и мне их нужно заменить на свои как это реализуется, спасибо за подсказки заранее.
Автор: Victor_VG
Дата сообщения: 09.11.2010 20:10
DmitryV

В справке самого NSIS - там по переменным и константам целый раздел имеется. А реализация своих страниц возможна только через средства MUI , и описана подробно в его доках и самих скриптах - там каждое действие прокомментировано, но не будет лишним и сделать для себя небольшую тестовую программку и на ней идеи отрабатывать. Сам так вечно делаю. Отлаженные куски кода переношу потом в основной проект.
Автор: DmitryV
Дата сообщения: 09.11.2010 20:23
Victor_VG
Спасибо порою подробно...
чет не понял как окна редактировать и поля в них размеры...
или все через внешнии программы?
Автор: kot280379
Дата сообщения: 10.11.2010 21:19
DmitryV

Цитата:
Спасибо порою подробно...

много чего интересного уже есть...может поможет
http://narod.ru/disk/1645638001/NSIS_Help.zip.html
Автор: MaGoth
Дата сообщения: 12.11.2010 04:29
kot280379
Что-то твой справочник у меня не открывается вообще?
По всем доступным страницам пишет:

Переход на веб-страницу отменен

Попробуйте сделать следующее:
Повторите ввод адреса.


Ты в чем компилил NSIS_Help.chm файл?
Зы. Может попробуешь его скомпилить в другой какой ни будь программе, и скинь линк в ЛС плиз.
Автор: Tim72
Дата сообщения: 12.11.2010 11:46
MaGoth

Автор: MaGoth
Дата сообщения: 12.11.2010 18:14
Мда.., про это я совсем забыл.
Искал решение там где его нет и быть не может.

Tim72 Спасибо.
Автор: sawerx
Дата сообщения: 29.11.2010 01:26
Привет всем ГУРУ-нам!
Посмотрел я ваш NSIS_Help.chm - мне кажется, это не совсем Справка, а скорее хорошее наглядное Пособие.
У меня такой вопрос? У кого нибудь, есть хороший русский перевод от старой версии makensis.html

И ещё один вопрос?
Как можно передать внешнему прикреплённому архиву 7Z или на его основ SFX, директорию извлечения, как путь $INSTDIR
Автор: Alexsandrius
Дата сообщения: 09.12.2010 11:10
Как то так: ExecWait '7z e "archive_name" -o"$INSTDIR" *.*'
Все ключи к 7z описаны в хелпе к нему.

У меня тоже вопрос, создаю поле текст:
    ${NSD_CreateText} 20% 90u 40% 15u "Мой MAC"
    Pop $MACAddress
Как это поле сделать недоступным для редактирования, невидимым и видимым?
Делаю настройку сети для виртуальной машины. С некоторыми полями необходимо так поступать. Или ссылку на Help. Примеров не нашел
Автор: dimbat
Дата сообщения: 09.12.2010 11:51
Alexsandrius

Цитата:
сделать недоступным для редактирования

Путем сендмессадж с нужным параметром. Вот пример прям на вики.
Автор: sawerx
Дата сообщения: 11.12.2010 01:14
Ни когда не занимался украшательством, вот решил попробовать, взял на вики один такой пример и простенькую игру.
Но вот, с доводкой появились проблемы.
Хотел оставить только окно выбора директории и хода установки, а при удалении только окно хода удаления. Выбивает ошибку сразу в первой же страничной функции FindWindow.
И при удалении одна область не заполняется цветом.

Код:
;Определения пользователя!
!define VERSION 1.0.5 # Версия ${VERSION}
!define APP_NAME "Beat Hazard" # Имя программы ${APP_NAME}
!define PUBLISHER "Cold Beam Games" # Имя компании ${PUBLISHER}
!define REG_UNINSTALL "Software\Microsoft\Windows\CurrentVersion\Uninstall\Beat Hazard" # ${REG_UNINSTALL}
!define /date FIXTIME "%d-%m-%Y_%H:%M:%S" # формат (13-07-2007_21:49:00) ${FIXTIME}

; ---- Подпись файла инсталлятора ---!
VIProductVersion "1.0.5.0" # версия только в формате X.X.X.X
VIAddVersionKey "FileVersion" "${VERSION}" # полная версия!
VIAddVersionKey "ProductName" "Beat Hazard" # имя продукта!
VIAddVersionKey "CompanyName" "Cold Beam Games" # имя компании!
VIAddVersionKey "LegalTrademarks" "Cold Beam Games" # юридическая торговая марка!
VIAddVersionKey "LegalCopyright" "CopyRights © 2008 Cold Beam Games" # юридический копирайт!
VIAddVersionKey "FileDescription" "The Games Beat Hazard" # краткое описание!
; ---- Конец подписи файла инсталлятора ---!

SetCompressor /FINAL /SOLID lzma # вид компресии!
XPStyle on # стиль WinXP включён
SetOverwrite try
ShowInstDetails show
ShowUninstDetails show
AutoCloseWindow true

!include MUI.nsh
!include WinMessages.nsh

!define HAVE_UPX
!ifdef HAVE_UPX
!packhdr temp.dat '"${NSISDIR}\UPX\upx.exe" -9 -q temp.dat'
!endif

Name "Beat Hazard"
OutFile "Beat.Hazard_${VERSION}.exe"

InstallDir "C:\Games\Beat Hazard"
InstallDirRegKey HKLM "${REG_UNINSTALL}" "InstallLocation"
RequestExecutionLevel user
DirText "$\r" # псевдо затирание!

!define BITMAP_FILE "Res\fores.bmp" # фоновое!
!define MUI_ICON "Res\BeatHazard.ico"
!define MUI_UNICON "Res\BeatHazard.ico"
!define MUI_WELCOMEFINISHPAGE_BITMAP "Res\for.bmp" # боковое!
!define MUI_LICENSEPAGE_BGCOLOR 455545
!define MUI_DIRECTORYPAGE_BGCOLOR 455545
!define MUI_INSTFILESPAGE_COLORS "FFFFFF 455545"
;!define MUI_INSTFILESPAGE_PROGRESSBAR {"00FF00 455545"|colored|smooth}
!define MUI_CUSTOMFUNCTION_GUIINIT myGUIInit

!define LR_LOADFROMFILE 0x0010
!define LR_CREATEDIBSECTION 0x2000
!define IMAGE_BITMAP 0

!define SS_BITMAP 0x0000000E
!define WS_CHILD 0x40000000
!define WS_VISIBLE 0x10000000
!define HWND_TOP 0
!define SWP_NOSIZE 0x0001
!define SWP_NOMOVE 0x0002

!define IDC_BITMAP 1500
!define stRECT "(i, i, i, i) i"

Var HBitmap
; !define MUI_UI_HEADERIMAGE ".\modern_headed.exe"
!define MUI_INNERTEXT_LICENSE_TOP "$\r" # затирание!
!define MUI_INNERTEXT_LICENSE_BOTTOM "$\r" # затирание!
!define MUI_PAGE_CUSTOMFUNCTION_SHOW LicensePageShow
!insertmacro MUI_PAGE_LICENSE "Res\License.txt"
!define MUI_TEXT_DIRECTORY_TITLE "Компания Cold Beam Games представляет вам игру Опасность Удара"
!define MUI_TEXT_DIRECTORY_SUBTITLE "Пожалуйста выберите папку для установки аркадной игры $(^NameDA)."
!define MUI_PAGE_CUSTOMFUNCTION_SHOW DirectoryPageShow
!insertmacro MUI_PAGE_DIRECTORY
!define MUI_PAGE_CUSTOMFUNCTION_SHOW InstFilesPageShow
!insertmacro MUI_PAGE_INSTFILES
!define MUI_PAGE_CUSTOMFUNCTION_SHOW FinishPageShow
!insertmacro MUI_PAGE_FINISH

!define MUI_CUSTOMFUNCTION_UNGUIINIT un.myGuiInit
!define MUI_UNPAGE_CUSTOMFUNCTION_SHOW insFilesPageShow
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_LANGUAGE Russian

;Уничтожить окно!
!macro DestroyWindow HWND IDC
GetDlgItem $R0 ${HWND} ${IDC}
System::Call `user32::DestroyWindow(i R0)`
!macroend

;Придать окну прозрачный фон!
!macro SetTransparent HWND IDC
GetDlgItem $R0 ${HWND} ${IDC}
SetCtlColors $R0 0xFFFFFF transparent
!macroend

;Обновление окна!
!macro RefreshWindow HWND IDC
GetDlgItem $R0 ${HWND} ${IDC}
ShowWindow $R0 ${SW_HIDE}
ShowWindow $R0 ${SW_SHOW}
!macroend

Function myGUIInit
;Извлечение BMP изображения!
InitPluginsDir
ReserveFile "${BITMAP_FILE}"
File "/ONAME=$PLUGINSDIR\bg.bmp" "${BITMAP_FILE}"
; Получить размер окна!
System::Call `*${stRECT} .R0`
System::Call `user32::GetClientRect(i $HWNDPARENT, i R0)`
System::Call `*$R0${stRECT} (, , .R1, .R2)`
System::Free $R0
;Создать контроль над BMP изображением!
System::Call `kernel32::GetModuleHandle(i 0) i.R3`
System::Call `user32::CreateWindowEx(i 0, t "STATIC", t "", i ${SS_BITMAP}|${WS_CHILD}|${WS_VISIBLE}, i 0, i 0, i R1, i R2, i $HWNDPARENT, i ${IDC_BITMAP}, i R3, i 0) i.R1`
System::Call `user32::SetWindowPos(i R1, i ${HWND_TOP}, i 0, i 0, i 0, i 0, i ${SWP_NOSIZE}|${SWP_NOMOVE})`
;Установка BMP изображения!
System::Call `user32::LoadImage(i 0, t "$PLUGINSDIR\bg.bmp", i ${IMAGE_BITMAP}, i 0, i 0, i ${LR_CREATEDIBSECTION}|${LR_LOADFROMFILE}) i.s`
Pop $HBitmap
SendMessage $R1 ${STM_SETIMAGE} ${IMAGE_BITMAP} $HBitmap
;Устанавить прозрачный фон!
!insertmacro SetTransparent $HWNDPARENT 3
!insertmacro SetTransparent $HWNDPARENT 1
!insertmacro SetTransparent $HWNDPARENT 2
!insertmacro SetTransparent $HWNDPARENT 1034
!insertmacro SetTransparent $HWNDPARENT 1035
!insertmacro SetTransparent $HWNDPARENT 1036
!insertmacro SetTransparent $HWNDPARENT 1037
!insertmacro SetTransparent $HWNDPARENT 1038
!insertmacro SetTransparent $HWNDPARENT 1039
!insertmacro SetTransparent $HWNDPARENT 1040
!insertmacro SetTransparent $HWNDPARENT 1044
;Удаление нежелательных областей контроля!
!insertmacro DestroyWindow $HWNDPARENT 1256
!insertmacro DestroyWindow $HWNDPARENT 1000
!insertmacro DestroyWindow $HWNDPARENT 1028
!insertmacro DestroyWindow $HWNDPARENT 1029
!insertmacro DestroyWindow $HWNDPARENT 1035
!insertmacro DestroyWindow $HWNDPARENT 1036
!insertmacro DestroyWindow $HWNDPARENT 1039
!insertmacro DestroyWindow $HWNDPARENT 1040
FunctionEnd
;Обновить родительские контрольные окона, если у них есть прозрачный фон!
Function RefreshParentControls
!insertmacro RefreshWindow $HWNDPARENT 1037
!insertmacro RefreshWindow $HWNDPARENT 1038
FunctionEnd
;Для страницы лицензии!
Function LicensePageShow
;Устанавить прозрачный фон!
FindWindow $MUI_HWND "#32770" "" $HWNDPARENT
SetCtlColors $MUI_HWND 0xFFFFFF transparent
!insertmacro SetTransparent $MUI_HWND 1040
!insertmacro SetTransparent $MUI_HWND 1000
!insertmacro SetTransparent $MUI_HWND 1006
!insertmacro SetTransparent $MUI_HWND 1034
Call RefreshParentControls ;Обновление управления!
FunctionEnd

;Для страницы деректории!
Function DirectoryPageShow
;Устанавить прозрачный фон.
FindWindow $MUI_HWND "#32770" "" $HWNDPARENT
SetCtlColors $MUI_HWND 0xFFFFFF transparent
!insertmacro SetTransparent $MUI_HWND 1001
!insertmacro SetTransparent $MUI_HWND 1024
!insertmacro SetTransparent $MUI_HWND 1008
!insertmacro SetTransparent $MUI_HWND 1023
!insertmacro SetTransparent $MUI_HWND 1006
!insertmacro SetTransparent $MUI_HWND 1020
SendMessage $R0 ${WM_SETTEXT} 0 STR: # папка установки"
Call RefreshParentControls ;Обновление управления!
FunctionEnd
;Для страницы хода выполнения!
Function InstFilesPageShow
;Устанавить прозрачный фон!
FindWindow $MUI_HWND "#32770" "" $HWNDPARENT
SetCtlColors $MUI_HWND 0xFFFFFF transparent
!insertmacro SetTransparent $MUI_HWND 1027
!insertmacro SetTransparent $MUI_HWND 1000
!insertmacro SetTransparent $MUI_HWND 1004
!insertmacro SetTransparent $MUI_HWND 1006
!insertmacro SetTransparent $MUI_HWND 1016
!insertmacro SetTransparent $MUI_HWND 1029
Call RefreshParentControls ;Обновление управления!
FunctionEnd
;Для конечной страницы!
Function FinishPageShow
;Устанавить прозрачный фон!
SetCtlColors $MUI_HWND 0xFFFFFF transparent
!insertmacro SetTransparent $MUI_HWND 1200
!insertmacro SetTransparent $MUI_HWND 1201
!insertmacro SetTransparent $MUI_HWND 1202
!insertmacro SetTransparent $MUI_HWND 1203
!insertmacro SetTransparent $MUI_HWND 1204
!insertmacro SetTransparent $MUI_HWND 1205
!insertmacro SetTransparent $MUI_HWND 1206
FunctionEnd

Section
SetOutPath $INSTDIR
SetDateSave off
File "Beat Hazard\BeatHazard.exe"
File "Beat Hazard\Content.res"
File "Beat Hazard\*.dll"

;Установка изображения для папки!
WriteINIStr "$INSTDIR\Desktop.ini" ".ShellClassInfo" "IconFile" "$INSTDIR\BeatHazard.exe" # имя файла с иконкой!
WriteINIStr "$INSTDIR\Desktop.ini" ".ShellClassInfo" "IconIndex" 0 # номер индекса иконки!
SetFileAttributes "$INSTDIR\Desktop.ini" ARCHIVE|HIDDEN|SYSTEM # присвоить атрибут файлу!
SetFileAttributes "$INSTDIR" ARCHIVE|SYSTEM # присвоить атрибут папке!

;Запись удоляемых строк!
WriteRegStr HKLM "${REG_UNINSTALL}" "InstallLocation" $INSTDIR # путь установки!
WriteRegStr HKLM "${REG_UNINSTALL}" "InstallDate" "${FIXTIME}" # время создания установки!
WriteRegStr HKLM "${REG_UNINSTALL}" "DisplayIcon" "$INSTDIR\BeatHazard.exe"
WriteRegStr HKLM "${REG_UNINSTALL}" "DisplayName" "$(^Name)"
WriteRegStr HKLM "${REG_UNINSTALL}" "DisplayVersion" "${VERSION}"
WriteRegStr HKLM "${REG_UNINSTALL}" "Publisher" "${PUBLISHER}"
WriteRegStr HKLM "${REG_UNINSTALL}" "Comments" "Космическое аркадное сражение"
WriteRegDWORD HKLM "${REG_UNINSTALL}" "NoModify" 1 # без изменения!
WriteRegDWORD HKLM "${REG_UNINSTALL}" "NoRepair" 1 # без изменения!
WriteRegStr HKLM "${REG_UNINSTALL}" "UninstallString" '"$INSTDIR\UinstallGame.exe"'
WriteUninstaller "$INSTDIR\UinstallGame.exe" # создание деинстолятора!
Sleep 400
CreateShortCut "$DESKTOP\$(^Name).lnk" "$INSTDIR\BeatHazard.exe" "" "$INSTDIR\BeatHazard.exe" 0 "" "" "Космическое аркадное сражение"
Sleep 400
Sleep 400
SectionEnd
Function .onGUIEnd # уничтожить BMP изображение!
System::Call `gdi32::DeleteObject(i s)` $HBitmap
FunctionEnd

Function un.myGUIInit
MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "Вы желаете удалить $(^Name) и все компоненты?" IDYES +2
Abort # это сообщение заменяет окно подготовки удаления!

;Извлечение BMP изображения!
InitPluginsDir
ReserveFile `${BITMAP_FILE}`
File `/ONAME=$PLUGINSDIR\bg.bmp` `${BITMAP_FILE}`
; Получить размер окна!
System::Call `*${stRECT} .R0`
System::Call `user32::GetClientRect(i $HWNDPARENT, i R0)`
System::Call `*$R0${stRECT} (, , .R1, .R2)`
System::Free $R0
;Создать контроль над BMP изображением!
System::Call `kernel32::GetModuleHandle(i 0) i.R3`
System::Call `user32::CreateWindowEx(i 0, t "STATIC", t "", i ${SS_BITMAP}|${WS_CHILD}|${WS_VISIBLE}, i 0, i 0, i R1, i R2, i $HWNDPARENT, i ${IDC_BITMAP}, i R3, i 0) i.R1`
System::Call `user32::SetWindowPos(i R1, i ${HWND_TOP}, i 0, i 0, i 0, i 0, i ${SWP_NOSIZE}|${SWP_NOMOVE})`
;Установка BMP изображения!
System::Call `user32::LoadImage(i 0, t "$PLUGINSDIR\bg.bmp", i ${IMAGE_BITMAP}, i 0, i 0, i ${LR_CREATEDIBSECTION}|${LR_LOADFROMFILE}) i.s`
Pop $HBitmap
SendMessage $R1 ${STM_SETIMAGE} ${IMAGE_BITMAP} $HBitmap
;Устанавить прозрачный фон!
!insertmacro SetTransparent $HWNDPARENT 3
!insertmacro SetTransparent $HWNDPARENT 1
!insertmacro SetTransparent $HWNDPARENT 2
!insertmacro SetTransparent $HWNDPARENT 1006
!insertmacro SetTransparent $HWNDPARENT 1018
!insertmacro SetTransparent $HWNDPARENT 1034
!insertmacro SetTransparent $HWNDPARENT 1035
!insertmacro SetTransparent $HWNDPARENT 1036
!insertmacro SetTransparent $HWNDPARENT 1037
!insertmacro SetTransparent $HWNDPARENT 1038
!insertmacro SetTransparent $HWNDPARENT 1039
!insertmacro SetTransparent $HWNDPARENT 1044
;Удаление нежелательных областей управления!
!insertmacro DestroyWindow $HWNDPARENT 1256
!insertmacro DestroyWindow $HWNDPARENT 1000
!insertmacro DestroyWindow $HWNDPARENT 1006
!insertmacro DestroyWindow $HWNDPARENT 1028
!insertmacro DestroyWindow $HWNDPARENT 1029
!insertmacro DestroyWindow $HWNDPARENT 1035
!insertmacro DestroyWindow $HWNDPARENT 1036
!insertmacro DestroyWindow $HWNDPARENT 1038
!insertmacro DestroyWindow $HWNDPARENT 1039

!insertmacro RefreshWindow $HWNDPARENT 1018
!insertmacro RefreshWindow $HWNDPARENT 1037
!insertmacro RefreshWindow $HWNDPARENT 1038
FunctionEnd

Section Uninstall # секция удаления!
DeleteRegKey HKLM "${REG_UNINSTALL}"
Delete "$INSTDIR\UinstallGame.exe"
Delete "$INSTDIR\BeatHazard.exe"
Delete "$INSTDIR\Content.res"
Delete "$INSTDIR\*.dll"
RMDir /r "$INSTDIR"
SetShellVarContext Current # для текущего пользователя!
Delete "$DESKTOP\$(^Name).lnk"
RMDir /r "$APPDATA\Beat Hazard"
SectionEnd

Function un.onGUIEnd # уничтожить BMP изображение!
System::Call `gdi32::DeleteObject(i s)` $HBitmap
FunctionEnd

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364

Предыдущая тема: The Bat!


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.