Показать полную графическую версию : [архив].: NSIS - все вопросы :.
wolkow70
09-07-2011, 07:37
В блоге, на который вы давали ссылку на чисто русском языке, буквально на пальцах, объяснены нюансы проблемы с user для UAC плагина. »
Та статья в 2009 году написана для 01 версии плагина.
wolkow70
09-07-2011, 08:42
Если делаю так:
Function ExecAppFile
!insertmacro UAC_AsUser_ExecShell "" "$INSTDIR\KMPlayer.exe" "-firstrun" "$INSTDIR" ""
FunctionEnd
;
!insertmacro UAC_AsUser_ExecShell "" "$INSTDIR\KMPlayer.exe" "-firstrun" "$INSTDIR" ""
то ошибка такая:
!insertmacro: end of _UAC_IncL
Error: command goto not valid outside Section or Function
Error in macro UAC_AsUser_ExecShell on macroline 2
Error in script "D:\NSIS\kmplayer-new.nsi" on line 102 -- aborting creation process
Если делаю так:
Function ExecAppFile
!insertmacro UAC_AsUser_ExecShell "" "$INSTDIR\KMPlayer.exe" "-firstrun" "$INSTDIR"
FunctionEnd
;
!insertmacro UAC_AsUser_ExecShell "" "$INSTDIR\KMPlayer.exe" "-firstrun" "$INSTDIR"
то ошибка такая:
!insertmacro: UAC_AsUser_ExecShell
!insertmacro: macro "UAC_AsUser_ExecShell" requires 5 parameter(s), passed 4!
Error in script "D:\NSIS\kmplayer-new.nsi" on line 96 -- aborting creation process
А что касается примеров, то там так:
!insertmacro UAC_AsUser_ExecShell "" "calc.exe" "" "" ""
И что я из этого примера должен уяснить?
Подскажите пожалуйста на примере, каким образом запускать (устанавливать) и удалять сервисы (службы) с помощью
NSIS SERVICE LIBRARY — servicelib.nsh http://nsis.sourceforge.net/NSIS_Service_Lib ?
Или, может лучше использовать для этого NSIS Simple Service Plugin http://nsis.sourceforge.net/NSIS_Simple_Service_Plugin ?
kotkovets
09-07-2011, 15:10
Подскажите пожалуйста на примере, каким образом запускать (устанавливать) и удалять сервисы (службы) с помощью
NSIS SERVICE LIBRARY — servicelib.nsh »
Судя по описанию автора, я понял так, не проверял:
; Задаваемые типы параметров:
; Действие - создание, удаление, запуск, остановка, пауза
;
; Имя - имя сервиса
;
; Параметры - Задаваемые параметры действия; пример: var1=value1;var2=value2;....
; (разделять задаваемые параметры ';')
; Действия:
; create - создает новую службу windows
; Параметры create:
; path - путь для исполняемого файла службы
; autostart - автоматически запускать с системой IE. 1|0 (1 - запускать, 0 - нет)
; interact - взаимодействие с рабочим столом IE. 1|0 (1 - да, 0 - нет)
; depend - зависимости служб
; user - имя пользователя запускающий службу
; password - пароль пользователя запускающий службу
; display - отображаемое имя службы консоли
; description - Описание службы
; starttype - Тип запуска
; servicetype - Тип сервиса
;
; delete - Удаление службы windows
; start - запустить службу windows, если остановлена
; stop - Остановка запущенного сервиса (службы) windows
; pause - Приостановка работающей службы windows
; continue - возобновление работы службы если приостановлено
; installed - установка службы
; Параметры installed:
; action - Если возвращает истину (true = 1), то вызывает указанное действие
; running - выполнить запуск службы
; Параметры running:
; action - Если возвращает истину (true = 1), то вызывает указанное действие
; status - проверка статуса службы
; Пример:
(создаем службу)
; метод 1:
; Push "Действия" Push "create" ;помещаем значения в стек
; Push "Имя" Push "MKN"
; Push "Параметры" Push "path=$INSTDIR\service.exe;autostart=1;description=MKN Service;"
; Call Service Call Service
; Pop $0 Pop $0 ;возвращается значение со стека в $0 - успешно или нет
;
; метод 2:
; !insertmacro SERVICE "create" "MKN" "path=$INSTDIR\service.exe;autostart=1;description=MKN Service;"
;
MKN глянь этот http://nsis.sourceforge.net/NsSCM_plug-in , что бы понять как пользоваться без плагина...
wolkow70
09-07-2011, 17:53
kotkovets,
В общем бросил я возиться с этим UAC.
Спасибо Вам за то, что научили меня делать генератор ответов. В связи с этим у меня возник вопрос:
[DIRECTORY]
INSTALLDIR=Е:\Program Files\The KMPlayer
[Sections]
StartMenu=1
Desktop=1
QuickLaunch=1
Путь установки прописывается абсолютный. А буква диска может быть разной. Почему то не срабатывает механизм использования относительного пути в данном случае.
У меня две системы на диске :
С:\ Windows7
E:\ Windows XP
Пробовал устанавливать сборку на обеих системах в автоматическом режиме. В обоих случаях распаковка идет в папку Е:\Program Files\The KMPlayer, хотя сама инсталляция производится в первом случае на Windows7.
Сейчас еще раз просмотрел скрипт. Вроде не должно такого быть. Все, что нужно есть...
!include "WordFunc.nsh"
!include "TextFunc.nsh"
Var GMODE
Var INIFILE
Var SysDrive
Var SUCCES_SECTION
Var WindowCaption
Function PREINSTFILES
${If} $GMODE = 1
WriteINIStr "$INIFILE" "DIRECTORY" "INSTALLDIR" "$INSTDIR"
${EndIf}
FunctionEnd
Section "!${PRODUCT_NAME}" Install
SectionIn 1 2 3 RO
${If} $GMODE = 0
${AndIf} ${Silent}
${AndIf} ${FileExists} "$INIFILE"
ClearErrors
ReadINIStr "$R0" "$INIFILE" "DIRECTORY" "INSTALLDIR"
${WordReplace} $R0 "%programfiles%" "$PROGRAMFILES" "+" $R1
${WordReplace} $R1 "%windir%" "$WINDIR" "+" $R0
${WordReplace} $R0 "%appdata%" "$APPDATA" "+" $R1
${WordReplace} $R1 "%systemdrive%" "$SysDrive" "+" $R0
StrCpy $INSTDIR $R0
${EndIf}
${If} $GMODE = 0
SetOutPath "$INSTDIR"
И тем не менее...
kotkovets
09-07-2011, 20:09
[DIRECTORY]
INSTALLDIR=Е:\Program Files\The KMPlayer
[Sections]
StartMenu=1
Desktop=1
QuickLaunch=1
Путь установки прописывается абсолютный. А буква диска может быть разной. Почему то не срабатывает механизм использования относительного пути в данном случае. »
В файле конфигурациии нужно писать: INSTALLDIR=%programfiles%\The KMPlayer системная окружения подменится при чтении командой: ${WordReplace} $R0 "%programfiles%" "$PROGRAMFILES" "+" $R1 на путь к папке Program Files
wolkow70
09-07-2011, 21:58
В файле конфигурациии нужно писать: INSTALLDIR=%programfiles%\The KMPlayer системная окружения подменится при чтении командой: ${WordReplace} $R0 "%programfiles%" "$PROGRAMFILES" "+" $R1 на путь к папке Program Files »
Это мне понятно. Чую, что можно как-то сделать, чтобы в ручную не править. А с какой стороны
подобраться не дотягиваю.
Или на этапе записи?
WriteINIStr "$INIFILE" "DIRECTORY" "INSTALLDIR" "$INSTDIR"
или на этапе чтения и интерпретации
ReadINIStr "$R0" "$INIFILE" "DIRECTORY" "INSTALLDIR"
${WordReplace} $R0 "%programfiles%" "$PROGRAMFILES" "+" $R1
kotkovets
09-07-2011, 23:39
Это мне понятно. Чую, что можно как-то сделать, чтобы в ручную не править. А с какой стороны
подобраться не дотягиваю »
Можно так
Function PREINSTFILES ;это функция будет выполнена только в режиме генератора
${If} $GMODE = 1 ;режим генератора
StrCpy `$R0` "$INSTDIR"
${WordReplace} $R0 ":\Program Files" "%programfiles%" "+1" `$R1`
StrCmp `$R1` `$R0` +2
StrCpy `$R1` `$R1` "" 1
${WordReplace} `$R1` ":\Windows" "%windir%" "+1" `$R0`
StrCmp `$R0` `$R1` +2
StrCpy `$R0` `$R0` "" 1
${WordFind} `$R0` "Application Data" "E+2*}" `$R1`
StrCmp $R1 1 +2
StrCpy `$R0` "%appdata%$R1"
WriteINIStr "$INIFILE" "DIRECTORY" "ISTALLDIR" "$R0" ;создаем файл конфигурации
${EndIf}
FunctionEnd
Но здесь есть не доработка, если задать путь С:\Application Data\Soft, то подменится на %appdata%\Soft
В зависимости от SetShellVarContext current|all > %appdata% > возвращает путь к профилю текущего пользователя или всех пользователей.
Для других системных переменных подумайте, есть в папке Examples скрипт WordFunc.nsi, где можно потренироваться c строковыми функциями подставляя свои значения строк и настроек парсирования строк.
Подскажите пожалуйста на примере, каким образом запускать (устанавливать) и удалять сервисы (службы) »
Могу посоветовать плагин
Или, может лучше использовать для этого NSIS Simple Service Plugin »
Мне он понравился, именно его я использовал в своём твикере (http://kav-soft.3dn.ru/index/nastrojka_windows_xp/0-12) (написан на NSIS :)) для управления службами
Ну впринципе, на страничке описания плагина всё расписано подробно...ничего сложного я думаю
"[name_of_service]" указывается системное имя службы, как название раздела службы в реестре (не отображаемое)
wolkow70
11-07-2011, 15:01
kotkovets,
Хочу посоветоваться по поводу известного нам макроса ассоциации файлов.
Как известно Xp не видит HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\${extenstion}\UserChoice"
В тоже время некоторые программы ведут себя не грамотно и пописывают ассоциации
в HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "Progid" "$ClassName" (например KMPlayer), что создает проблемы со сменой ассоциаций при установке других программ.
Немного подумав сделал так в макросе:
!macro RegisterExtension extenstion
StrCpy $ClassName "VLC.${extenstion}"
WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "" "$ClassName"
GetVersion::WindowsName
Pop $R0
StrCmp $R0 "XP" 0 noxp
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "Progid" "$ClassName"
noxp:
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "Progid" "$ClassName"
;
WriteRegStr HKLM "SOFTWARE\Classes\$ClassName\shell" "" "Open"
WriteRegStr HKLM "SOFTWARE\Classes\$ClassName\shell\Open" "" "Воспроизвести"
WriteRegStr HKLM "SOFTWARE\Classes\$ClassName\shell\Open\command" "" "$OpenCommand"
;
;
!macroend
То есть, если установка идет на XP, то прописывать ассоциацию не в UserChoice, а в
HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "Progid" "$ClassName", что бы затереть запись другой программы.
На Cемерке и Viste такой проблемы нет, так как UserChoice имеет приоритет, а в ХР не присходит смена ассоциаций.
Как Вы считаете разумно ли так поступить, или есть более красивое решение?
kotkovets
11-07-2011, 16:53
wolkow70, да все правильно, че создавать ключ UserChoice в XP?(мое мнение), так как этот ключ предназначен для линейки NT6.x имеют такую функциональность, как "Программы по умолчанию"
А и WinXP - это линейка NT5.x А значит, только XP здесь не обойдешься, а у меня WinXp x64 еще - и по скрипту создаться ключ. Нужно так определять версию NT(без внешних плагинов):
!include "WinVer.nsh"
--
--
!macro RegisterExtension extenstion
StrCpy $ClassName "VLC.${extenstion}"
WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "" "$ClassName"
${WinVerGetMajor} $R0 ;определяем старшую цифру Windows
IntCmp $R0 5 +4 +4 0
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "Progid" "$ClassName"
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "Progid" "$ClassName"
;
WriteRegStr HKLM "SOFTWARE\Classes\$ClassName\shell" "" "Open"
WriteRegStr HKLM "SOFTWARE\Classes\$ClassName\shell\Open" "" "Воспроизвести"
WriteRegStr HKLM "SOFTWARE\Classes\$ClassName\shell\Open\command" "" "$OpenCommand"
;
;
!macroend
wolkow70
11-07-2011, 17:32
да все правильно, че создавать ключ UserChoice в XP?(мое мнение), так как этот ключ предназначен для линейки NT6.x имеют такую функциональность, как "Программы по умолчанию" »
Тут, еще вылез такой момент:
Затирая Progid установленной программы, затем удалив новую, мы не восстанавливаем прежних ассоциаций, и придется старую прогу переустанавливать.. или копаться с регистрацией типов из самой проги.
Где нибудь можно почитать по бэкап для таких случаев? Да и в HKLM "SOFTWARE\Classes\.${extenstion}" "" "$ClassName" тоже бэкапить надо, если по уму все делать.
Затирая Progid установленной программы, затем удалив новую, мы не восстанавливаем прежних ассоциаций, и придется старую прогу переустанавливать.. или копаться с регистрацией типов из самой проги.
Где нибудь можно почитать по бэкап для таких случаев? Да и в HKLM "SOFTWARE\Classes\.${extenstion}" "" "$ClassName" тоже бэкапить надо, если по уму все делать. »
Это правило хорошего тона!
Прямо в той же ветке следует создавать новый :
WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "" "$ClassName_Bak" или "$ClassName_Undo" или как вам угодно, но понятно.
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "$ClassName_Bak" или "Progid_Bak"
При деинсталляции прочитает из него, восстановит и удалится.
wolkow70
12-07-2011, 11:37
WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "" "$ClassName_Bak" или "$ClassName_Undo" или как вам угодно, но понятно.
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "$ClassName_Bak" или "Progid_Bak"
При деинсталляции прочитает из него, восстановит и удалится. »
Дак надо же еще прочитать, какой класс там прописан, занести в переменную, и ее значение прописать в "$ClassName_Bak" и внести в макрос де-регистрации соответвтующие строки. Или я чего-то не понимаю?
Прошу помочь с IIS 6...
1. Необходимо создать "Виртуальный каталог" в существующем Веб-узле;
(использовал ExecWait 'cscript "$SYSDIR\iisvdir.vbs" /Create "SiteName" moodle C:\moodle\web')
2. В свойствах созданного вирт-каталога установить "Разрешен запуск: Только сценарии";
(по умолчанию этот параметр выбран, но хотелось бы подстраховаться)
3. В свойствах созданного вирт-каталога установить "Задать страницу содержания по умолчанию" - index.php;
4. В свойствах сайта добавить сопоставление расширений:
расширение - php;
путь - "C:\Windows\system32\inetsrv\fcgiext.dll";
команды - "GET,POST,HEAD" (сократитьь до)
Спасибо!
wolkow70
18-07-2011, 11:40
kotkovets, ${WinVerGetMajor} $R0 ;определяем старшую цифру Windows
IntCmp $R0 5 +4 +4 0
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "Progid" "$ClassName"
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "Progid" "$ClassName" »
На практике оказалось работает все наоборот: при установке на XP,
прописывается:
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "Progid" "$ClassName"
и не прописывается:
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "Progid" "$ClassName"
;
;
Тут еще возникла идейка при установке на XP
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "Progid" "$ClassName"
прописывать по выбору Пользователя.
Пока сделал так:
Section "Особые параметры сопоставления файлов" ProgID
SectionIn 1 2
WriteINIStr "$temp\tmpfile.dat" "tmp" "execute_1" "1"
SectionEnd
В макросе:
ReadINIStr $0 "$temp\tmpfile.dat" "tmp" "execute_1"
StrCmp $0 "1" 0 +2
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "Progid" "$ClassName"
Может можно как то по другому без временного файла привязать комманду к значению определенной секции (более красиво)?
kotkovets
18-07-2011, 14:17
Section "Особые параметры сопоставления файлов" ProgID
SectionIn 1 2
WriteINIStr "$temp\tmpfile.dat" "tmp" "execute_1" "1"
SectionEnd
В макросе:
ReadINIStr $0 "$temp\tmpfile.dat" "tmp" "execute_1"
StrCmp $0 "1" 0 +2
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "Progid" "$ClassName" »
Вот тока я не понимаю, зачем плодить секции ради одной команды ?
Может можно как то по другому без временного файла привязать комманду к значению определенной секции (более красиво)?»
А переменные на что в NSIS? почитайте... ага хранить значения
Особенно про StrCpy - оператор присваивания...
var ProgID
Function .OnInit
StrCpy $ProgID 0 #на всяк случай иницилизируем переменную, помещаем в 0
FunctionEnd
Section "Особые параметры сопоставления файлов" ProgID
SectionIn 1 2
StrCpy $ProgID 1
SectionEnd
#StrCmp $ProgID 1 0 +2
#WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "Progid" "$ClassName"
wolkow70
18-07-2011, 15:34
Вот тока я не понимаю, зачем плодить секции ради одной команды ? »
Для XP регистрация через этот ключ не является общепринятой. Доп.секцию ввел для выбора: с обычными параметрами установить ассоциации или с особыми. Иногда это нужно, иногда нет.
Для win 7 это не имеет значения. Там это правило. А с приоритетом ставится через UserChoice.
wolkow70
18-07-2011, 16:56
Товарищи, вопрос возник интересный.
Имею в скрипте такие секции:
Section "Хранить настройки программы в реестре" Registry
SectionIn 1 2 3
WriteRegDWORD HKCU "Software\Daum\PotPlayerMini\Settings" "CheckAutoUpdate" 0x0
; бла-бла
; бла-бла
SectionEnd
Section /o "Хранить настройки программы в INI файле" Ini
SectionIn 1 2 3
IfFileExists "$EXEDIR\PotPlayerMini.ini" 0 NoThere
IfSilent +2
MessageBox MB_OK "Файл настроек есть, он будет скопирован в директорию установки"
CopyFiles /silent "$EXEDIR\PotPlayerMini.ini" "$INSTDIR\PotPlayerMini.ini"
Goto Done
NoThere:
IfSilent +2
MessageBox MB_OK "Файла настроек нет, он будет создан в минимальной конфигурации"
SetOutPath "$INSTDIR"
WriteINIStr "$INSTDIR\PotPlayerMini.ini" "Settings" "CheckAutoUpdate" "0"
; бла
; бла
Done:
SectionEnd
;
Function .onSelChange
!insertmacro StartRadioButtons $1
!insertmacro RadioButton ${Registry}
!insertmacro RadioButton ${Ini}
!insertmacro EndRadioButtons
FunctionEnd
При запуске инсталлятора вижу, что полного типа установки уже не получается, так как
Section /o "Хранить настройки программы в INI файле" Ini
Вопрос в связи с с этим возник такой: возможно ли включить секцию /o в полный тип установки, если она входит в функцию .onSelChange ?
kotkovets
18-07-2011, 17:12
wolkow70,
1. А что мешает создать свою страничку с двумя радиобутонами?
2. И флаги выбора типа установки в этих секциях расставлять смысла нет, здесь выбор опциональный - захотел настройки в реестре или в ini файле.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC