Показать полную графическую версию : [архив].: NSIS - все вопросы :.
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. В деинсталляторе считывать путь из реестра. »
Так и сделал.
Привет 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
спасибо счас буду пробовать!
если есть активное подключение к сети - знаю. »
Тогда как сделать такое если подключение сети активное 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
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, следовательно нужно настраивать антивири - давать добро.
kotkovets, не в курсе случайно, где Advanced SystemCare PRO хранит настройки активации, а то прогу активирую и не могу понять где изменения...в реестре ничего нет!
Подскажите, пожалуйста, как сделать:
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"
Не подскажет кто как средствами 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"
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. Можно подсчитать количество совпадений части общих символов строки: аа..
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 читайте сначала сначала значение 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" - не прокатывает =(
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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC