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

frostyland
04-01-2012, 12:44
MUI_PAGE_STARTMENU: В секции Uninstall теряется нештатное значение переменной ICONS_GROUP

Трабла.
В инсталляторе использую страничку MUI_PAGE_STARTMENU:

...
!insertmacro MUI_PAGE_STARTMENU Application $ICONS_GROUP
...
Section -post
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
SetShellVarContext all
...
CreateDirectory "$SMPROGRAMS\$ICONS_GROUP"
CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\$(UNINST_TEXT) ${PRODUCT_NAME}.lnk" "$INSTDIR\uninst.exe"
CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\${PRODUCT_NAME}.lnk" "$INSTDIR\run.bat"
!insertmacro MUI_STARTMENU_WRITE_END
...
SectionEnd
...

Section "Uninstall"
...
!insertmacro MUI_STARTMENU_GETFOLDER "Application" $ICONS_GROUP
...
RMDir /r "$SMPROGRAMS\$ICONS_GROUP" ; !Вот тут берется умолчательное $ICONS_GROUP, а не то, которое задал пользователь при установке
...
SectionEnd



Но проблема в том, что при деинсталляции значение $ICONS_GROUP не запоминается, а подставляется по умолчанию.
Как следствие, стоит переименовать умолчательную папку в Диалоге MUI_PAGE_STARTMENU, и ее удаление не происходит.

Как быть?

kotkovets
04-01-2012, 13:05
frostyland,
Из секций инсталлятора в секции деинсталлятора - никакие значения переменных не переносятся
и это очень правильно сделано.
Откуда узнать деинсталлятору, где юзер создал папку в меню Пуск ???
1. В инсталляторе записывать в реестр, путь к папке в меню Пуск.
2. В деинсталляторе считывать путь из реестра.
http://nsis.sourceforge.net/Frozen_Bubble
Но проблема в том, что при деинсталляции значение $ICONS_GROUP не запоминается, а подставляется по умолчанию. »
Берется значение по умолчанию, из значения команды - Name

frostyland
04-01-2012, 13:39
Из секций инсталлятора в секции деинсталлятора - никакие значения переменных не переносятся »
Уже понял, tnxx.
1. В инсталляторе записывать в реестр, путь к папке в меню Пуск.
2. В деинсталляторе считывать путь из реестра. »
Так и сделал.

diakov
07-01-2012, 12:40
Привет kotkovets, с Рождеством! Есть такой вопрос! Вот хочу перепаковать Advanced SystemCare, и здесь нужно прописывать 127.0.0.1 iobit.com в файл hosts, тоесть заменить его при инсталяции нет проблем, а как именно дописать нужные строки (тоесть внести изменения в уже существующий файл hosts)?

И возможно ли при инсталяции принудительно отключить подключение к интернету, а по завершению включить???

kotkovets
07-01-2012, 13:21
diakov, с Рождеством!
нужно прописывать 127.0.0.1 iobit.com в файл hosts »
!include "TextFunc.nsh"
#1933 (http://forum.oszone.net/post-1802470-1933.html) И возможно ли при инсталяции принудительно отключить подключение к интернету, а по завершению включить??? »
Не знаю, может быть, но проверку делать, если есть активное подключение к сети - знаю.
!define INTERNET_CONNECTION_MODEM 0x01
!define INTERNET_CONNECTION_LAN 0x02
!define INTERNET_CONNECTION_PROXY 0x04
!define INTERNET_RAS_INSTALLED 0x10
!define INTERNET_CONNECTION_OFFLINE 0x20
!define INTERNET_CONNECTION_CONFIGURED 0x40

OutFile GetInet.exe
ShowInstDetails show

Function FLAGS
IntOp $1 $2 & ${INTERNET_CONNECTION_CONFIGURED}
IntCmp $1 ${INTERNET_CONNECTION_CONFIGURED} +1 +2 +2
DetailPrint "Система настроена для соединения с Интернетом"

IntOp $1 $2 & ${INTERNET_CONNECTION_MODEM}
IntCmp $1 ${INTERNET_CONNECTION_MODEM} +1 +2 +2
DetailPrint "Для соединения с Интернетом используется модем"

IntOp $1 $2 & ${INTERNET_RAS_INSTALLED}
IntCmp $1 ${INTERNET_RAS_INSTALLED} +1 +2 +2
DetailPrint "Установлена служба удаленного доступа (RAS)"

IntOp $1 $2 & ${INTERNET_CONNECTION_PROXY}
IntCmp $1 ${INTERNET_CONNECTION_PROXY} +1 +2 +2
DetailPrint "Для соединения с Интернетом используется LAN"

IntOp $1 $2 & ${INTERNET_CONNECTION_OFFLINE}
IntCmp $1 ${INTERNET_CONNECTION_OFFLINE} +1 +2 +2
DetailPrint "Система находится в автономном режиме"

IntOp $1 $2 & ${INTERNET_CONNECTION_LAN}
IntCmp $1 ${INTERNET_CONNECTION_LAN} +1 +2 +2
DetailPrint "Для соединения с Интернетом используется LAN"
FunctionEnd

Section "GetInternet"
System::Call "wininet.dll::InternetGetConnectedState(*i.r2, i0) i.r3"
StrCmp $3 1 0 +2
DetailPrint "Имеется активное подключение к Интернету"
StrCmp $3 0 0 +2
DetailPrint "Отсутствует активное подключение к Интернету"
Call FLAGS
SectionEnd

diakov
07-01-2012, 13:28
спасибо счас буду пробовать!

если есть активное подключение к сети - знаю. »
Тогда как сделать такое если подключение сети активное MessageBox Отключите подключение к интернету, а если нет тода вперед!)

kotkovets
07-01-2012, 13:36
Тогда как сделать такое если подключение сети активное MessageBox »
System::Call "wininet.dll::InternetGetConnectedState(*i.r2, i0) i.r3"
StrCmp $3 1 0 +3
MessageBox MB_OK "Имеется активное подключение к Интернету!$\nОтключите модем и еще что нибудь!" IDOK
abort

diakov
07-01-2012, 13:45
kotkovets, а что бы каждое значение было с новой строки так правильно будет???


FileWrite $0 "127.0.0.1 www.iobit.com"
FileWrite $0 "$\r$\n"
FileWrite $0 "127.0.0.1 iobit.com"
FileWrite $0 "$\r$\n"
FileWrite $0 "127.0.0.1 98.129.229.186"
FileWrite $0 "$\r$\n"
FileWrite $0 "127.0.0.1 www.iana.org"
FileWrite $0 "$\r$\n"
FileWrite $0 "127.0.0.1 iana.org"

kotkovets
07-01-2012, 13:53
diakov, Правильно, но лучше писать так:
FileOpen $0 "$TEMP\temp.txt" w
FileWrite $0 "127.0.0.1 www.iobit.com$\r$\n\
127.0.0.1 iobit.com$\r$\n\
127.0.0.1 98.129.229.186$\r$\n\
127.0.0.1 www.iana.org$\r$\n\
127.0.0.1 iana.org$\r$\n"
FileClose $0
Имейте ввиду, что многие антивирусы не дают изменять файл hosts, следовательно нужно настраивать антивири - давать добро.

diakov
08-01-2012, 12:35
kotkovets, не в курсе случайно, где Advanced SystemCare PRO хранит настройки активации, а то прогу активирую и не могу понять где изменения...в реестре ничего нет!

romgun
08-01-2012, 12:45
Подскажите, пожалуйста, как сделать:
1) установщик должен добавить строку в файл "N.cfg" в раздел [Main]
В этом разделе у пользователя уже имеются записи:
аа.1=путь1
аа.2=путь2
...
аа.х=путь3
При этом количество пунктов мне неизвестно. Добавляемая строка должна быть "аа.х+1=мой путь". При этом "мой путь" определяется как папка в установленной $INSTDIR (берется из реестра).

2) установщик должен дописать определенный текст в конец файла "XX.xml" (encoding="Windows-1252")
<xx>
<Name>МММ</Name>
<Path>$INSTDIR\xx\МММ.exe</Path>
</xx>

kotkovets
08-01-2012, 14:12
kotkovets, не в курсе случайно, где Advanced SystemCare PRO хранит настройки активации »
не знаю и нет желания узнавать и не пользуюсь такими родами программ...
установщик должен добавить строку в файл "N.cfg" в раздел [Main] »
WriteIniStr - поможет
Добавляемая строка должна быть "аа.х+1=мой путь" »
InTop - математика в цикле поможет...
Приводите свою реализацию задачи, вместе разберем и подправим: толику мозги добавим скрипту :)
установщик должен дописать определенный текст в конец файла "XX.xml" »
(encoding="Windows-1252") »
UTF-8
http://nsis.sourceforge.net/XML_plug-in - пробуйте плагом

kotkovets
08-01-2012, 16:58
Наткнулся на плагин: InvokeShellVerb Plugin for NSIS (http://nsis.sourceforge.net/Invoke_Shell_Verb_plugin)
Этот плагин вызывает командную оболочку Shell: правой клавишей мышью - контектстное меню файлов и папок
и вызывает выбранный пункт меню на исполнение
Но напрямую использовать плагин совершенно неудобно, даже сказал бы - невозможно без определенных знаний.
Поэтому написал хедер для удобного использования плагина:
!ifndef INVOKESHELLVERB_INCLUDED
!define INVOKESHELLVERB_INCLUDED

!macro __DefineTaskbar Def ID
!define ${Def}Taskbar "!insertmacro Shellverb ${ID}"
!macroend
!insertmacro __DefineTaskbar "PinTo" "5386"
!insertmacro __DefineTaskbar "UnPin" "5387"

!macro __DefinePusk Def ID
!define ${Def}Pusk "!insertmacro Shellverb ${ID}"
!macroend

!insertmacro __DefinePusk "PinTo" "5381"
!insertmacro __DefinePusk "UnPin" "5382"

!macro __DefineAdmin Def ID
!define ${Def}Admin "!insertmacro Shellverb ${ID}"
!macroend
!insertmacro __DefineAdmin "Run" "8505"

!macro Shellverb ID filename
Push `${ID}`
Push `${filename}`
System::Store SR0R1
IfFileExists `$R0` 0 +5
System::Call "shlwapi::PathRemoveFileSpecW(wR0R3)"
System::Call "shlwapi::PathStripPathW(wR0R2)"
InvokeShellVerb::DoIt "$R3" "$R2" "$R1"
Pop $R0
System::Store L
!macroend

!endif
Сохраняем файл InvokeShellVerb.nsh (для юникодной NSIS - в любом юникоде) рядом со скриптом или в папке NSIS\Include
Скачиваем плагин, копируем InvokeShellVerb.dll (для юникодной NSIS файл берем из папки Unicode архива) в NSIS\Plugins
Далее подключаем хедер к телу скрипта:
!include "InvokeShellVerb.nsh"
- только для Vista и выше, в Win8 - работает, платформа любая: х86 или х64.
${PinToTaskBar} "$WINDIR\notepad.exe"
- только для Vista и выше, в Win8 - работает, платформа любая: х86 или х64.
${UnPinTaskBar} "$WINDIR\notepad.exe"

${PinToPusk} "$WINDIR\notepad.exe"

${UnPinPusk} "$WINDIR\notepad.exe"

${RunAdmin} "$WINDIR\notepad.exe"

XCV
09-01-2012, 15:37
Не подскажет кто как средствами nsis создать переменную среды? сколько ни искал как это делать через реестр или командную строку - безуспешно... все на что натыкаюсь: http://support.microsoft.com/kb/310519/ru но делать для этого AutoIt скрипт и запихивать его в инсталятор - ИМХО некрасиво, может есть другой способ? (если это можно сделать, то может можно еще и дополнить существующую переменную?)
через "set variablename=значение" переменная не создается, точнее не остается в системе после отработки команды....
Сори, столько искал не мог найти, написал вопрос - нашел сам, сделать можно через реестр в ветке HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\
Только до сих пор не понимаю как дописать переменную, тоесть к примеру есть переменная "path=c:\windows", а надо "path=c:\windows;c:\my_papka"

romgun
09-01-2012, 15:49
1) установщик должен добавить строку в файл "N.cfg" в раздел [Main]
В этом разделе у пользователя уже имеются записи:
аа.1=путь1
аа.2=путь2
...
аа.х=путь3
При этом количество пунктов мне неизвестно. Добавляемая строка должна быть "аа.х+1=мой путь". При этом "мой путь" определяется как папка в установленной $INSTDIR (берется из реестра)..
WriteIniStr - поможет InTop - математика в цикле поможет...

У меня была идея подсчитать кол-во упоминаний в файле выражения "аа.", добавить 1 и соответственно записать свое значение.
Но можно ли как то реализовать подсчет? Пока не могу найти ничего подходящего..

Сама строка вроде бы добавляется через WriteINIStr...


Section
SetOutPath "$INSTDIR"
GetFullPathName $0 ..
ReadINIStr $1 "$INSTDIR\1.cfg" "main" "аа"
IntOp $1 $1 + 1
WriteINIStr $INSTDIR\1.cfg main "аа.$1" "$0\хх\ххх"
FlushINI $INSTDIR\1.cfg
SectionEnd

kotkovets
09-01-2012, 20:33
к сожалению ближайшую неделю полноценно не смогу помочь - в командировке.
XCV читайте сначала сначала значение patch в переменную $0, а затем записывате в реестр: "$0;My papka"
rogmun смотрите в папке примеров - WordFunc. Можно подсчитать количество совпадений части общих символов строки: аа..

romgun
10-01-2012, 15:52
kotkovets, возвращайтесь скорее ))
Нужно применять WordFind?
В мануале вроде как речь идет о поиске файлов или я что-то не понял?

Example (Sum of words):

Section
${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" " C:\" "#" $R0
; $R0="3"
SectionEnd

Пробовал

${WordFind} "аа" "$INSTDIR\1.cfg" "#" $R0

в итоге дает $R0=0.

XCV
10-01-2012, 18:26
XCV читайте сначала сначала значение patch в переменную $0, а затем записывате в реестр: "$0;My papka" »
попробовал сделать так, натолкнулся на следующий косяк:
Изначально patch имеет тип "reg_expand_sz", а после того как я делаю:
ReadRegStr $0 HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path"
WriteRegStr HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path" "$0;$INSTDIR"
он становится "reg_sz" и как следствие система "перестает видеть" служебные утилиты находящиеся к примеру в "%SystemRoot%\system32" (хотя моя библиотеки которые я добавлял этим инсталятором видятся нормально =) ) ну это конечно не дело, я так понимаю чтобы параметр "Path" остался "правильным" его надо добавлять с помощью команды:
WriteRegBin HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path" значение
но как определить тогда какое должно быть значение? "$0;$INSTDIR" - не прокатывает =(

Lisabon
10-01-2012, 19:56
XCV, Изначально patch имеет тип "reg_expand_sz", а после того как я делаю: »
он становится "reg_sz" и как следствие система "перестает видеть" служебные утилиты »

Используй плагин Registry (http://nsis.sourceforge.net/Registry_plug-in), и будет нормально писаться именно reg_expand_sz . В своё время сам мучался... С этим плагином, работает без проблем.

kotkovets
10-01-2012, 22:30
XCV если ваша библиотека, то определите свой ключ в реестре, читаемый библиотекой,так проще наверно будет.
rogmun под рукой нет справочных материалов нет,вам нужно читать файл построчно в цикле - readfromend(по индек найдете в справке, в теме тоже есть примеры) в цикле вы можете обрезать строки до нужного значения в др. переменную(strcpy в $0) через strcmp или через оператор:
${if} $0 == "обр.строка"
Intop $1 $1 + 1
;в $R9 - цельная строка,точно не помню.
${endif}
В $1 количество совпадений




© OSzone.net 2001-2012