Показать полную графическую версию : [архив].: NSIS - все вопросы :.
kotkovets
06-09-2011, 16:35
Кликабельный BrandingText »
Уж лучше использовать BrandingURL plug-in (http://nsis.sourceforge.net/BrandingURL_plug-in)
И не нужно ничего править и свой цвет ссылки можно задавать
BrandingURL::Set /NOUNLOAD "0" 0" "255" "mailto:contact@test.com" ;синий цвет ссылки
PPS как BrandingText показать на первой странице? MUI_PAGE_WELCOME »
Нужно еще править в 105 диалоге 1044 ресурс - чуть поднять нижний край.
!include "MUI2.nsh"
OutFile test.exe
!define MUI_CUSTOMFUNCTION_GUIINIT myGuiInit
!define MUI_PAGE_CUSTOMFUNCTION_SHOW WELCOMESHOW
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE Russian
Function myGuiInit
BrandingURL::Set /NOUNLOAD "255" 0" "0" "mailto:vasya@provider.ru"
FunctionEnd
Function WELCOMESHOW
GetDlgItem $0 $HWNDPARENT 1028
ShowWindow $0 ${SW_SHOW}
FunctionEnd
Function .onGUIEnd
BrandingURL::Unload
FunctionEnd
Section
SectionEnd
А лучше всего нарисовать свою страничку, вариантов очень много, можно программно сместить контролы текста и повесить линк.
Вы, как то раньше спрашивали о радио кнопках в nsDialog.
Делал это для себя, но думаю будет очень полезно для многих.
Переключение с обычной установким на портабельную с обнулением чекбоксов и запретом редактирования.
QTest_Hide.zip (http://shareflare.net/download/11456.16af91ee408f284bfb00034748e2/QTest_Hide.zip.html)
Нужно еще править в 105 диалоге 1044 ресурс - чуть поднять нижний край. »
Спасибо, то что нужно было.
Вы, как то раньше спрашивали о радио кнопках в nsDialog. »
Я так понимаю это мне? Спасибо я уже решил этот вопрос. Нечто подобное реализовал.
блин засада.. :( как оказалось ни Linker ни BrandingURL не открывают почтовик в WIN 7 возможно это из-за того что не указана программа по умолчанию для почты.
сейчас буду выяснять это
Ps в стоковой семерке (и в висте тоже) по умолчанию нет почтовика (в отличие от ХР) так что все работает если есть почтовик
wolkow70
07-09-2011, 13:10
kotkovets,
Как бы еще оптимизировать такой код?
ReadRegStr $2 HKLM "SOFTWARE\Classes\.${extenstion}" "Winamp_Back" (читаем в $2 значение бэкапа)
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" "Winamp_Back" (удаляем значение бэкапа)
WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "" "$2" (прописывавем значение бэкапа в значение расширения по умолчанию)
StrCmp "$2" "$ClassName" 0 +2 (сравниваем значение бэкапа с текущим значением)
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" "" (если совпадает, то удаляем текущее значение)
Это нужно, что бы программа не прописала из быкапа свое же значение (так бывает ,если прога переустанавливалась). Хочется сделать, чтобы вообще не прописывалось, если совпадает, что бы не пришлось удалять, так было бы рациональней, но как еще сделать не соображу...
kotkovets
07-09-2011, 13:36
Хочется сделать, чтобы вообще не прописывалось, если совпадает, что бы не пришлось удалять, так было бы рациональней, но как еще сделать не соображу.. »
StrCmp "$2" "$ClassName" +2 0 ;если $2 = $ClassName > то пропустить команду записи
WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "" "$2"
Судя по логике можно и так, не проверял.
ReadRegStr $2 HKLM "SOFTWARE\Classes\.${extenstion}" "Winamp_Back" ;(читаем в $2 значение бэкапа)
${Unless} ${Errors}
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" "Winamp_Back"
StrCmp "$2" "$ClassName" +2 0
WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "" "$2"
StrCmp "$2" "$ClassName" 0 +2
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" ""
${Else} ;если нет параметра Winamp_Back
WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "Winamp_Back" "$ClassName"
${EndUnless}
wolkow70
07-09-2011, 14:42
kotkovets,
1. Я полагал, что возможны команды только типа
StrCmp "$2" "$ClassName" 0 +2
Оказывается можно и
StrCmp "$2" "$ClassName" +2 0
Какие нибудь особенности имеются?
2.
${Unless} ${Errors}
${EndUnless}
Такая конструкция мне еще не известна.
kotkovets
07-09-2011, 15:19
wolkow70, читайте внимательно справку
StrCmp "значение 1" "значение 2" [метка перехода, если 'значение 2' = 'значение 1'] [метка перехода, если не равны значения]
${Unless} ${Errors}
${EndUnless}
Такая конструкция мне еще не известна
Если ключа, параметра не существует - то ReadRegStr устанавливает флаг ошибки,
а также другие команды NSIS работающие с реестром, флаг ошибки определяется через Iferrors
${Unless} ${Errors}
#тут пишется код, если нету флага ошибки
${Else}
#тут пишется код, если есть флаг ошибки
${EndUnless}
или так
${If} ${Errors}
#тут пишется код, если есть флаг ошибки
${Else}
#тут пишется код, если нету флага ошибки
${EndIf}
wolkow70
07-09-2011, 15:47
wolkow70, читайте внимательно справку »
Спасибо за новую справку (Вам с соавторами). Появилось много полезного, чего ранее не было.
wolkow70
07-09-2011, 18:28
kotkovets
В общем, макрос дерегистрации в окончательном виде у меня вышел такой:
!macro UnRegisterExtension extenstion
;
Push $1
Push $2
;
StrCpy $ClassName "Winamp.File.${extenstion}"
;
ReadRegStr $1 HKLM "SOFTWARE\Classes\.${extenstion}" ""
StrCmp "$1" "$ClassName" 0 +2
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" ""
DeleteRegKey HKLM "SOFTWARE\Classes\$ClassName"
;
ReadRegStr $2 HKLM "SOFTWARE\Classes\.${extenstion}" "Winamp_Back"
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" "Winamp_Back"
StrCmp "$2" "$ClassName" +2 0
WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "" "$2"
;
ReadRegStr $1 HKCU "Software\Classes\.${extenstion}" ""
StrCmp "$1" "$ClassName" 0 +2
DeleteRegValue HKCU "Software\Classes\.${extenstion}" ""
DeleteRegKey HKCU "Software\Classes\$ClassName"
;
ReadRegStr $2 HKCU "Software\Classes\.${extenstion}" "Winamp_Back"
DeleteRegValue HKCU "Software\Classes\.${extenstion}" "Winamp_Back"
StrCmp "$2" "$ClassName" +2 0
WriteRegStr HKCU "Software\Classes\.${extenstion}" "" "$2"
;
DeleteRegKey /ifempty HKCU "Software\Classes\.${extenstion}"
;
ReadRegStr $1 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "Progid"
StrCmp "$1" "$ClassName" 0 +2
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice"
;
ReadRegStr $2 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "Winamp_Back"
DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "Winamp_Back"
StrCmp "$2" "" +3
StrCmp "$2" "$ClassName" +2 0
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "Progid" "$2"
;
DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\OpenWithProgids" "$ClassName"
${DelRegValue} HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\OpenWithList" "winamp.exe"
;
Pop $1
Pop $2
!macroend
Тут еще такой казус вышел:
Файл ответов Winamp.ini по наименованию совпадает с подхватываемым файлом настроек Winamp.ini , что исключает их нахождение в одной директории.
Думаю, как лучше выйти из положения, можно ли изменить наименование файла ответов? Или проще наименование файла изменить?
kotkovets
07-09-2011, 18:42
Думаю, кака выйти из положения, можно ли изменить наименование файла ответов? Или проще наимнование файла изменить? »
Изменить имя установщика - изменится и имя файла ответов
OutFile Winamp_5.xx.exe
#файл ответов получится: Winamp_5.xx.ini
wolkow70
07-09-2011, 18:58
Изменить имя установщика - изменится и имя файла ответов »
Это понятно, но будет не красиво менять Winamp.exe.
Думаю, надо наименование файла настроек изменить, но при копировании восстанавливать оригинальное наименование.
Секция такая:
Section "Конфигурация и базовые настройки программы" Settings
SectionIn 1 2 3 4
${GetSecWriteSucces} Settings
${If} $SUCCES_SECTION = 1
${If} ${FileExists} "$EXEDIR\Winamp.ini"
${If} ${FileExists} "$INSTDIR\paths.ini"
ExpandEnvStrings $R9 "%USERNAME%"
MessageBox MB_OK 'Обнаружен файл настроек Winamp, он будет скопирован в папку учётной записи пользователя: "$R9"' /SD IDOK
SetShellVarContext current
CreateDirectory "$APPDATA\Winamp"
CopyFiles /silent "$EXEDIR\Winamp.ini" "$APPDATA\Winamp\Winamp.ini"
${Else}
MessageBox MB_OK "Обнаружен файл настроек Winamp, он будет скопирован в директорию установки" /SD IDOK
CopyFiles /silent "$EXEDIR\Winamp.ini" "$INSTDIR\Winamp.ini"
${EndIf}
${Else}
MessageBox MB_OK "Файл настроек Winamp не обнаружен, он будет создан в минимальной конфигурации" /SD IDOK
${If} ${FileExists} "$INSTDIR\paths.ini"
SetShellVarContext current
SetOutPath "$APPDATA\Winamp"
${Else}
SetOutPath "$INSTDIR"
${EndIf}
WriteINIStr "$OUTDIR\Winamp.ini" "WinampReg" "WAVer" "5.62"
WriteINIStr "$OUTDIR\Winamp.ini" "WinampReg" "skin" ""
WriteINIStr "$OUTDIR\Winamp.ini" "WinampReg" "Stats" "00000009,000000DF,000000DF,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,0 0000000,00000030,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00 000000,00000000,00000000,00000000,"
WriteINIStr "$OUTDIR\Winamp.ini" "WinampReg" "NeedReg" "0"
WriteINIStr "$OUTDIR\Winamp.ini" "Winamp" "utf8" "1"
WriteINIStr "$OUTDIR\Winamp.ini" "Winamp" "skin" ""
WriteINIStr "$OUTDIR\Winamp.ini" "Winamp" "newverchk" "0"
WriteINIStr "$OUTDIR\Winamp.ini" "Winamp" "newverchk2" "0"
WriteINIStr "$OUTDIR\Winamp.ini" "Winamp" "newverchk3" "11886"
WriteINIStr "$OUTDIR\Winamp.ini" "Winamp" "uid" "BF6E26157956844CAB619C346A072AFF7D"
WriteINIStr "$OUTDIR\Winamp.ini" "Winamp" "langpack" "Winamp-ru-ru.wlz"
${EndIf}
${EndIf}
SectionEnd\
Забыл как файлы переименовывать при копировании :)
kotkovets
07-09-2011, 19:12
wolkow70, смотрю уже разбираетесь в конструкциях, явный прогресс... :yes:
с безусловными метками в раз бы запутались :biggrin:
можно программно сместить контролы текста »
А не подскажите кусочек примера кода?
а то я умею менять текст на контролах, делать их активными/неактивными, показывать/убирать а вот смещать как не знаю...
kotkovets
08-09-2011, 15:42
А не подскажите кусочек примера кода? »
Что я имел ввиду? на примере MUI2 страничка приветствия
Смотрим в папке NSIS файл Contrib\Modern UI 2\Pages\welcome.nsh
!include MUI2.nsh
OutFile "test_mui2.exe"
!define MUI_PAGE_CUSTOMFUNCTION_SHOW WELCOMESHOW ;функция при открытии странички приветствия
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE WELCOMELEAVE ;функция при закрытии странички приветствия
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_WELCOME ;намеренно еще страничка приветствия
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE Russian
Var CheckBox
Var Link
Function WELCOMESHOW
ShowWindow $mui.WelcomePage.Title ${SW_HIDE} ;скрываем стандартный верхний контрол
${NSD_CreateLabel} 120u 10u 195u 40u "Это тест смещения верхнего титульного контрола"
Pop $mui.WelcomePage.Title
SetCtlColors $mui.WelcomePage.Title "" "FFFFE1"
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ShowWindow $mui.WelcomePage.Text ${SW_HIDE} ;скрываем стандартный нижний контрол
${NSD_CreateLabel} 120u 70u 195u 40u "Это тест смещения нижнего титульного контрола"
Pop $mui.WelcomePage.Text
SetCtlColors $mui.WelcomePage.Text "" "FFFFE1"
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
${NSD_CreateCheckBox} 120u 120u 140u 15u "Можно отметить флажком"
Pop $CheckBox
SetCtlColors $CheckBox "" FFFFFF
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
${NSD_CreateLink} 120u 140u 80u 15u "Кликни меня"
Pop $Link
SetCtlColors $Link "0000FF" transparent
${NSD_OnClick} $Link fnLink
FunctionEnd
Function fnLink
ExecShell open "http://forum.oszone.net"
FunctionEnd
Function WELCOMELEAVE
${NSD_GetState} $CheckBox $R0 ;снимаем статус чекбокса
FunctionEnd
Section
StrCmp $R0 1 +1 +2
MessageBox MB_OK "Чекбокс отмечен"
SectionEnd
kotkovets,
ShowWindow $mui.WelcomePage.Text ${SW_HIDE} ;скрываем стандартный нижний контрол
${NSD_CreateLabel} 120u 70u 195u 40u "Это тест смещения нижнего титульного контрола"
Pop $mui.WelcomePage.Text
»
те мы скрываем "стандартный" контрол, рисуем свой, и "назначаем" его в переменную стандартного контрола?
Я правильно принцип понял?
kotkovets
08-09-2011, 16:56
Я правильно принцип понял? »
да, т.е нет необходимости объявлять новую переменную, когда есть объявленные welcome.nsh
Сдвигая размер контролов - имеем возможность дополнить страничку приветствия - исключительно для удобства
вот такая хитрость, причем такой способ, косвенно используют плагины для украшения NSIS
Я правильно принцип понял »
В MUI-3 пока не сработало!
Подправим!
wolkow70
09-09-2011, 17:59
kotkovets,
Нашел в своей конструкции макроса де-регистрации серьезную логическую ошибку
StrCpy $ClassName "Winamp.File.${extenstion}"
;
ReadRegStr $1 HKLM "SOFTWARE\Classes\.${extenstion}" ""
StrCmp "$1" "$ClassName" 0 +2
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" ""
DeleteRegKey HKLM "SOFTWARE\Classes\$ClassName"
;
ReadRegStr $2 HKLM "SOFTWARE\Classes\.${extenstion}" "Winamp_Back"
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" "Winamp_Back"
StrCmp "$2" "$ClassName" +2 0
WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "" "$2"
Если после установки программы, ассоциации были изменены к другой программе, то строки
ReadRegStr $2 HKLM "SOFTWARE\Classes\.${extenstion}" "Winamp_Back"
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" "Winamp_Back"
StrCmp "$2" "$ClassName" +2 0
WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "" "$2"
вообще не должны выполняться....
.
Думаю, как это сделать лучше...
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC