Показать полную графическую версию : [архив].: NSIS - все вопросы :.
wolkow70
13-05-2012, 11:44
вроде бы по русскому говорю... »
Не "по русскому", а "по русски" :).
А сделал я все ориентируясь на пример из справки.
wolkow70
13-05-2012, 13:42
ну тут же очевидно, идет запись в реестр, сам макрос MUI_STARTMENU_WRITE_END »
Я так сделал, все работает как надо.
Section "Создать ярлыки в меню Пуск" StartMenu
${If} ${RunningX64}
SetRegView 64
SetShellVarContext all
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
CreateDirectory "$SMPROGRAMS\$StartMenuFolder"
CreateShortCut "$SMPROGRAMS\$StartMenuFolder\Удалить ${PRODUCT_NAME}.lnk" "$INSTDIR\Uninstall.exe" 0
CreateShortCut "$SMPROGRAMS\$StartMenuFolder\${PRODUCT_NAME}.lnk" "$INSTDIR\MyApp.exe"
!insertmacro MUI_STARTMENU_WRITE_END
SetRegView 32
${Else}
SetShellVarContext all
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
CreateDirectory "$SMPROGRAMS\$StartMenuFolder"
CreateShortCut "$SMPROGRAMS\$StartMenuFolder\Удалить ${PRODUCT_NAME}.lnk" "$INSTDIR\Uninstall.exe" 0
CreateShortCut "$SMPROGRAMS\$StartMenuFolder\${PRODUCT_NAME}.lnk" "$INSTDIR\MyApp.exe"
!insertmacro MUI_STARTMENU_WRITE_END
${EndIf}
SectionEnd
kotkovets
13-05-2012, 14:08
wolkow70, можно проще, зачем повторно прописывать команды?
Section "Создать ярлыки в меню Пуск" StartMenu
${IfThen} ${RunningX64} ${|}SetRegView 64${|}
SetShellVarContext all
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
CreateDirectory "$SMPROGRAMS\$StartMenuFolder"
CreateShortCut "$SMPROGRAMS\$StartMenuFolder\Удалить ${PRODUCT_NAME}.lnk" "$INSTDIR\Uninstall.exe" 0
CreateShortCut "$SMPROGRAMS\$StartMenuFolder\${PRODUCT_NAME}.lnk" "$INSTDIR\MyApp.exe"
!insertmacro MUI_STARTMENU_WRITE_END
${IfThen} ${RunningX64} ${|}SetRegView 32${|}
SectionEnd
Olef2387
13-05-2012, 23:07
Привет.
Продолжаю изучение NSIS... Задачка
Есть 20 компонентов. При установке юзер должен выбрать 1 из этих 20.
На эту тему нашёл информацию в справке. И всё работает.
Пример на 6 компонентах
Section /o "Компонент №1" ID_1
SectionEnd
Section /o "Компонент №2" ID_2
SectionEnd
Section /o "Компонент №3" ID_3
SectionEnd
Section /o "Компонент №4" ID_4
SectionEnd
Section /o "Компонент №5" ID_5
SectionEnd
Section /o "Компонент №6" ID_6
SectionEnd
Function .onSelChange
!insertmacro StartRadioButtons $1
!insertmacro RadioButton ${ID_1}
!insertmacro RadioButton ${ID_2}
!insertmacro RadioButton ${ID_3}
!insertmacro RadioButton ${ID_4}
!insertmacro RadioButton ${ID_5}
!insertmacro RadioButton ${ID_6}
!insertmacro EndRadioButtons
FunctionEnd
Нужно дополнить...
1. Чтобы кнопка ДАЛЕЕ была неактивна пока не будет выбран 1 из компонентов.
2. Так как компонентов много, хотелось бы их объединить в группу... Команда SectionGroup объединяет их в группу, но там если галочку нажать - выбираются сразу все компоненты в группе... А у меня в данном случае только 1 компонент должен быть выбран.
Вот так. Извиняюсь, если опять что-то наиэлементарнейшее спросил :)
kotkovets
14-05-2012, 14:23
1. Чтобы кнопка ДАЛЕЕ была неактивна пока не будет выбран 1 из компонентов.
2. Так как компонентов много, хотелось бы их объединить в группу... Команда SectionGroup объединяет их в группу, но там если галочку нажать - выбираются сразу все компоненты в группе... А у меня в данном случае только 1 компонент должен быть выбран »
ну можно как-то так на скорую руку:
OutFile "example.exe"
var hInst
!include "MUI2.nsh"
!insertmacro MUI_PAGE_WELCOME
;функция во время открытия странички компонентов
!define MUI_PAGE_CUSTOMFUNCTION_SHOW COMPONENTS_SHOW
;---------------------------------------------------
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE Russian
;макрос проверки секций, если одна из секций отмечена возврат - 1, иначе - 0;
;в intsec - указываем количество секций в скрипте
!macro CheckSection intsec ret
Push ${intsec}
System::Store SR2
${For} $R0 1 $R2
SectionGetFlags $R0 $R1
${IfThen} $R1 == 1 ${|}${Break}${|}
${Next}
Push $R1
System::Store L
Pop ${ret}
!macroend
SubSection /e test IDS_1
Section /o "Компонент №1" ID_1
SectionEnd
Section /o "Компонент №2" ID_2
SectionEnd
Section /o "Компонент №3" ID_3
SectionEnd
Section /o "Компонент №4" ID_4
SectionEnd
Section /o "Компонент №5" ID_5
SectionEnd
Section /o "Компонент №6" ID_6
SectionEnd
SubSectionEnd
Function .onSelChange
!insertmacro StartRadioButtons $1
!insertmacro RadioButton ${ID_1}
!insertmacro RadioButton ${ID_2}
!insertmacro RadioButton ${ID_3}
!insertmacro RadioButton ${ID_4}
!insertmacro RadioButton ${ID_5}
!insertmacro RadioButton ${ID_6}
!insertmacro EndRadioButtons
!insertmacro CheckSection 6 $R0
StrCmp $R0 0 0 +2
EnableWindow $hInst ${SW_HIDE} ;отключаем кнопку "установить"
StrCmp $R0 1 0 +2
EnableWindow $hInst ${SW_SHOW} ;включаем кнопку "установить"
FunctionEnd
Function .OnInit
StrCpy $1 ${ID_1}
SectionSetFlags ${IDS_1} ${SECTION_OFF} ;фиктивно отключаем группу
FunctionEnd
Function COMPONENTS_SHOW
GetDlgItem $hInst $HWNDPARENT 1 ;находим HWND кнопки "установить"
!insertmacro CheckSection 6 $R0
StrCmp $R0 0 0 +2
EnableWindow $hInst ${SW_HIDE} ;отключаем кнопку "установить"
StrCmp $R0 1 0 +2
EnableWindow $hInst ${SW_SHOW} ;включаем кнопку "установить"
FunctionEnd
Olef2387
14-05-2012, 14:43
Блестяще, что тут ещё сказать. Большое спасибо
Правда, компоненты в группе раскрыты, как можно сделать чтоб по умолчанию они были свёрнуты?
Команду SubSection /e test IDS_1
изменил на SubSection test IDS_1
всё равно раскрыты компоненты..
kotkovets
14-05-2012, 15:58
всё равно раскрыты компоненты.. »
вместо:
SectionSetFlags ${IDS_1} ${SECTION_OFF}
прописать:
SectionSetFlags ${IDS_1} -290
wolkow70
19-05-2012, 08:48
kotkovets,
Можете помочь в таком вопросе:
Работает такая конструкция:
ReadRegStr $R6 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Opera 11.64.1403" "InstallLocation"
RMDir /r "$R6"
Стоит задача найти директорию установки независимо от версии и удалить.
Пробую так:
Function EnumReg
${If} $5 == "Opera"
;
DetailPrint "Раздел реестра: $1"
DetailPrint "Имя параметра: $2"
DetailPrint "Тип параметра: $4"
DetailPrint "Значение параметра: $3"
StrCpy "$5" "$1"
StrCpy $0 StopRegFind
${EndIf}
FunctionEnd
Не срабатывает.
${RegFind} "${HKLM}\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" "/T=REG_SZ /V=1" EnumReg
kotkovets
19-05-2012, 11:41
Не срабатывает.
${RegFind} "${HKLM}\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" "/T=REG_SZ /V=1" EnumReg »
А с какого перепугу????!!! нет же в реестре ключа -SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Opera
зато есть - SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Opera****
---
Читайте и изучайте - StrCpy - там все по полочкам с примерами расписано.
---
Section
${RegFind} "${HKLM}\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" "/T=REG_SZ /V=1" EnumReg
MessageBox MB_OK "$5" IDOK
SectionEnd
Function EnumReg
StrCpy $5 $1 5 52
${If} $5 == "Opera"
${AndIf} $2 == "InstallLocation"
StrCpy $5 $3
StrCpy $0 "StopRegFind"
${EndIf}
FunctionEnd
bugmenotagain
20-05-2012, 00:48
Доброй ночи. Пожалуйста, помогите разобраться. Пытаюсь с помощью плагина AccessControl зачистить хвосты от драйвера:
AccessControl::GrantOnRegKey \
HKLM "SYSTEM\CurrentControlSet\Enum\Root\LEGACY_SIMPLE" "(BU)" "Delete"
Код работает, но только под XP, а надо бы конечно мультиплатформу. Желательно бы XP-Vista-7.
Привет всем!
Прошу помочь с обработкой файла.
В ходе установки получаем файл - result.txt.
Файл содержит в себе:
STR
--------------------
0400
(обработано строк: 1)
Нужно узнать какое значение в нем стоит - 0400 или другое. (через сравнение)
kotkovets
23-05-2012, 18:45
В ходе установки получаем файл - result.txt. »
а подробней, почему в какой-то файл(еще нужно прочитать и обработать), а не сразу в указанную переменную?
а подробней, почему в какой-то файл(еще нужно прочитать и обработать), а не сразу в указанную переменную? »
Выполняю запрос к БД:
ExecWait '"sqlcmd" -S "$DB_server" -U "$DB_user" -P "$DB_password" -d "$DB_name" -i "$Temp\Fix_IIRF\get_revision.sql" -o "$Temp\Fix_IIRF\result.txt"'
Как полученный результат присвоить переменной не знаю.
kotkovets
24-05-2012, 11:02
DruOleg, И как прочитать содержимое файла, тоже не знаете?
И что в переменную $0 возвращает?
ExecWait '"sqlcmd" -S "$DB_server" -U "$DB_user" -P "$DB_password" -d "$DB_name" -i "$Temp\Fix_IIRF\get_revision.sql" -o ' $0
DruOleg, И как прочитать содержимое файла, тоже не знаете? »
Пробовал так:
ClearErrors
FileOpen $0 $INSTDIR\file.dat r
IfErrors done
FileRead $0 $1
DetailPrint $1
FileClose $0
done:
Прочитал только первую строку.
И что в переменную $0 возвращает? »
Возвращает - 0.
Если пароль неверно указать - возвращает - 1.
Нужно узнать какое значение в нем стоит - 0400 или другое. (через сравнение) »
Коряво, но вроде реализовал...
Section
ClearErrors
FileOpen $0 "$Temp\NS_Fix_IIRF\result.txt" r
IfErrors done
FileRead $0 $1
FileRead $0 $1
FileRead $0 $1
StrCpy "$REV" $1
FileClose $0
done:
SectionEnd
wolkow70
24-05-2012, 11:52
kotkovets,
Подскажите пожалуйста как в режиме генератора ответов избежать вывода некоторых страниц?
!define MUI_PAGE_CUSTOMFUNCTION_SHOW SHOWWELCOME
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE "${pkgdir}\Winamp\License.txt"
!define MUI_PAGE_CUSTOMFUNCTION_SHOW SHOWDIRECTORY
!insertmacro MUI_PAGE_DIRECTORY
!define MUI_PAGE_CUSTOMFUNCTION_SHOW SHOWCOMPONENTS
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_STARTMENU Application $StartMenuFolder
!define MUI_PAGE_CUSTOMFUNCTION_PRE PREINSTFILES
!insertmacro MUI_PAGE_INSTFILES
!define MUI_FINISHPAGE_RUN "$INSTDIR\winamp.exe"
!define MUI_FINISHPAGE_RUN_TEXT "Запустить Winamp"
!define MUI_FINISHPAGE_RUN_NOTCHECKED
!define MUI_FINISHPAGE_NOAUTOCLOSE
!define MUI_PAGE_CUSTOMFUNCTION_SHOW SHOWFINISH
!insertmacro MUI_PAGE_FINISH
Желательно бы не выводить страницу показа лицензии и выбора папки StartMenu
и не показывать на Finishpage опцию "запустить".
Коряво, но вроде реализовал... »
У кого-нибудь есть примеры с циклами? Чтобы так не извращаться...
У кого-нибудь есть примеры с циклами? Чтобы так не извращаться... »
Реализовал так:)
${While} $1 != "0400"
FileRead $0 $1
StrCpy "$1" "$1" 4
${EndWhile}
StrCpy "1""$REV" $1
Работает. Но если значение в файле нет такого значения - зацикливается:-(
Кто знает как поправить?
Прошу помочь с ведением лога.
Section ;Вывод первичной информации
${If} $OS_type != "WinXP"
MessageBox MB_OK "Данный фикc преднозначен только для ОС WindowsXP x32"
DetailPrint "Неподдерживаемый тип ОС: $OS_type"
;Abort
${Else}
DetailPrint "Тип ОС: $OS_type"
${EndIf}
${If} $Type != "МЕНЯ"
MessageBox MB_OK "Данный фикc преднозначен только для МЕНЯ!"
DetailPrint "Неподдерживаемый тип продукта: $Type"
;Abort
${EndIf}
${If} $Version != "7.10"
MessageBox MB_OK "Данный фикc преднозначен только для МЕНЯ!"
DetailPrint "Неподдерживаемый тип $Type: $Version"
;Abort
${Else}
DetailPrint "Версия $Type: $Version"
${EndIf}
SectionEnd
Данные считываются в Function .onInit
Если падает на первой секции в лог не чего не пишется.
Лог подключил методом из FAQ.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC