PDA

Показать полную графическую версию : [архив].: NSIS - все вопросы :.


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 [67] 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170

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" "" "" ""

И что я из этого примера должен уяснить?

MKN
09-07-2011, 12:40
Подскажите пожалуйста на примере, каким образом запускать (устанавливать) и удалять сервисы (службы) с помощью
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 строковыми функциями подставляя свои значения строк и настроек парсирования строк.

K.A.V.
10-07-2011, 08:42
Подскажите пожалуйста на примере, каким образом запускать (устанавливать) и удалять сервисы (службы) »

Могу посоветовать плагин
Или, может лучше использовать для этого 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" тоже бэкапить надо, если по уму все делать.

sawe
11-07-2011, 21:36
Затирая 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" и внести в макрос де-регистрации соответвтующие строки. Или я чего-то не понимаю?

DruOleg
14-07-2011, 17:38
Прошу помочь с 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