Показать полную графическую версию : [архив].: NSIS - все вопросы :.
kotkovets
19-10-2011, 20:46
Но там и так эта функция гигантская и в какое место тогда логичнее вставить? »
Function .OnInit
;--
;--
${If} ${Silent}
${If} ${FileExists} "файл конфигурации созданный генератором"
!insertmacro SelectSection ${AllUser}
;----
${EndIf}
${EndIf}
FunctionEnd
Еще вам нужно читать файл конфигурации, проверить, а не отметил ли юзер нужную секцию,
если узнаем, что юзер отметил - отмечаем программно нужную секцию.
Это вам задачка будет поучиться...
wolkow70
20-10-2011, 09:29
Еще вам нужно читать файл конфигурации, проверить, а не отметил ли юзер нужную секцию,
если узнаем, что юзер отметил - отмечаем программно нужную секцию. »
Изначально задачка так и сформулирована, так как, файл конфигурации по любому будет находиться в директории инсталлятора, и проверять его наличие нет смысла.
Имеет значение секция с каким типом установки выбрана и прописана в файле конфигурации.
Что-то так примерно...
Function .OnInit
StrCpy $1 ${MultiUser}
StrCpy $WindowCaption "${PRODUCT_NAME} ${PRODUCT_VERSION}"
StrCpy $SysDrive $WINDIR 2
StrCpy $GMODE 0 ;если обычный режим, то $GMODE = 0
StrCpy $WindowCaption "${PRODUCT_NAME} ${PRODUCT_VERSION}"
${WordReplace} "$EXEFILE" ".exe" ".ini" "+" "$INIFILE" ;подменяем расширение на ini c тем же именем, что и установщик
StrCpy $INIFILE "$EXEDIR\$INIFILE" ;$INIFILE - путь, где будет создан файл конфигурации
${GetOptions} $CMDLINE "/G" $0
${IfNot} ${Silent} ; условие работы генератора, если не тихий режим
${AndIfNot} ${Errors} ; И не установлен флаг ошибки
;здесь команды выполняться будут в режиме генератора, до конца конструкции ${EndIf}
StrCpy $GMODE 1 ;с ключом /G, $GMODE = 1, режим генератора
StrCpy $WindowCaption "Генератор ответов ${PRODUCT_NAME} ${PRODUCT_VERSION}" ;меняем название заголовка
IfFileExists "$INIFILE" 0 +2
Delete "$INIFILE" ;удаляем предыдущий файл конфигурации
${EndIf}
;==========================================================================================
;${If} ${Silent}
${If} ${FileExists} "$EXEDIR\FSImage.ini"
MessageBox MB_OK "файл конфигурации есть"
ReadINIStr $0 "$EXEDIR\FSImage.ini" "Sections" "AllUser"
MessageBox MB_OK $0
StrCmp $0 "1" 0 +2
!insertmacro SelectSection ${AllUser}
${EndIf}
FunctionEnd
Проверил. Работает. Но кажется, что-то подредактировать еще нужно..
${EndIf}
${EndIf}
FunctionEnd
так не компилируется, пришлось расставить ${EndIf}
${If} ${Silent}
и так не компилируется, пришлось закоментировать.
kotkovets
20-10-2011, 11:23
так не компилируется, »
А у вас конструкция не была закрыта.
${If} ${Silent}
${If} ${FileExists} "$EXEDIR\FSImage.ini"
MessageBox MB_OK "файл конфигурации есть"
ReadINIStr $0 "$EXEDIR\FSImage.ini" "Sections" "AllUser"
StrCmp $0 "1" 0 +2
!insertmacro SelectSection ${AllUser}
${EndIf}
${EndIf}
Это че за хрень:
StrCmp $0 "1" 0 +2
!insertmacro SelectSection ${AllUser}
макрос в скрипте - не рассматривается как одна команда!
wolkow70
20-10-2011, 11:45
А у вас конструкция не была закрыта. »
Дак пробовал так:
${EndIf}
${EndIf}
FunctionEndмакрос в скрипте - не рассматривается как одна команда! »
Тогда как увязать выполнение макроса со значением параметра?
И почему-то с ${If} ${Silent} показывает логическую ошибку
kotkovets
20-10-2011, 11:57
wolkow70, на глупые вопросы не буду отвечать, ищите ляпы в своем скрипте,
все компилится и работает.
И функию .OnInit следует прописать в скрипте, после определения всех секций,
это нужно компилятору.
wolkow70
20-10-2011, 12:03
И функию .OnInit следует прописать в скрипте, после определения всех секций,
это нужно компилятору. »
Так и сделано.
Если конструкцию закрыть так
${EndIf}
${EndIf}
FunctionEnd
, то компилиться, но секция АllUser не отрабатывает.
А если расставить как у меня , то отрабатывает.
wolkow70
20-10-2011, 12:35
${If} ${Silent}
${If} ${FileExists} "$EXEDIR\FSImage.ini"
MessageBox MB_OK "файл конфигурации есть"
ReadINIStr $0 "$EXEDIR\FSImage.ini" "Sections" "AllUser"
MessageBox MB_OK $0
${If} $0 == 1
!insertmacro SelectSection ${AllUser}
${Else}
${EndIf}
${EndIf}
${EndIf}
${EndIf}
FunctionEnd
Вот так компилируется, но секция не отрабатывает все равно...
wolkow70
20-10-2011, 12:53
kotkovets,
${EndIf}
;==========================================================================================
${If} ${Silent}
${If} ${FileExists} "$EXEDIR\FSImage.ini"
MessageBox MB_OK "файл конфигурации есть"
ReadINIStr $0 "$EXEDIR\FSImage.ini" "Sections" "AllUser"
MessageBox MB_OK $0
${If} $0 == 1
!insertmacro SelectSection ${AllUser}
${Else}
${EndIf}
${EndIf}
${EndIf}
FunctionEnd
Вот так работает. Я через логическую конструкцию стал запускать макрос.
Но, если ${EndIf} сверху перетащить вниз, то секция перестает отрабатывать.
То есть, первую логическую конструкцию приходится закрывать перед открытием второй. Видимо конфликтует что-то внутри функции..
kotkovets
20-10-2011, 13:30
wolkow70, Ну слава богу!
${If} ${Silent}
${If} ${FileExists} "$EXEDIR\FSImage.ini"
ReadINIStr $0 "$EXEDIR\FSImage.ini" "Sections" "AllUser"
${If} $0 == 1
!insertmacro SelectSection ${AllUser}
${EndIf}
${EndIf}
${EndIf}
FunctionEnd
Почему я так сдвигаю конструкции, потому что хорошо видно
начало и конец каждой логики, чем лепить все в один столбик - легко запутаться.
у меня есть вопрос
вот я создаю контрол с линком
${NSD_CreateLink} 235u 220u 40u 15u "${TERMS_LINK}"
идет обработчик клика на линк
${NSD_OnClick} $Custom_Page_link onClickMyLink
ну и соответственно функция onClickMyLink которая открывает в браузере линк
Function onClickMyLink
ExecShell "open" "http://www."
FunctionEnd
вопрос такой, если у меня на странице несколько линков, мне для обработки нужно делать для каждого контрола свою функцию?
или можно как то передать параметрами?
что тот типа
${NSD_OnClick} $Custom_Page_link onClickMyLink (link)
и затем
Function onClickMyLink (link)
ExecShell "open" "link"
FunctionEnd
можно что-то подобное реализовать?
kotkovets
20-10-2011, 14:19
можно что-то подобное реализовать? »
!include "MUI2.nsh"
outfile test.exe
ShowInstDetails show
Page custom fnCustomInit
!insertmacro MUI_LANGUAGE "Russian"
var Dialog
var Link
var Link_1
Function fnCustomInit
nsDialogs::Create 1018
Pop $Dialog
${NSD_CreateLink} 15u 20u 40u 15u "LINK"
Pop $Link
nsDialogs::SetUserData $Link link ;назначаем идентификатор link
${NSD_CreateLink} 15u 40u 40u 15u "LINK 1"
Pop $Link_1
nsDialogs::SetUserData $Link_1 Link_1 ;назначаем идентификатор link_1
${NSD_OnClick} $Link onClickMyLink
${NSD_OnClick} $Link_1 onClickMyLink
nsDialogs::Show
FunctionEnd
Function onClickMyLink
Pop $Link_1
nsDialogs::GetUserData $Link_1 ;считываем заданный идентификор
Pop $Link
${If} $Link == link
MessageBox MB_ICONINFORMATION|MB_OK "Вы кликнули: $Link" IDOK
${ElseIf} $Link == link_1
MessageBox MB_ICONINFORMATION|MB_OK "Вы кликнули: $Link" IDOK
${EndIf}
FunctionEnd
Section
SectionEnd
wolkow70
20-10-2011, 16:06
Товарищи, нет ли в NSIS комманды обновить все иконки в системе.
${RefreshShellIcons} не катит.
Смысл в том, что при установке подменяется файл с иконками типов файлов и надо его сразу подключить, а то почему-то старые отображаются (видимо сохраняются в системе от старой установки).
Товарищи, нет ли в NSIS комманды обновить все иконки в системе. »
Может это вам подойдёт?
Refresh Desktop (http://nsis.sourceforge.net/Refresh_Desktop)
или это
Refresh shell icons (http://nsis.sourceforge.net/Refresh_shell_icons)
или это
RfshDktp plug-in (http://nsis.sourceforge.net/RfshDktp_plug-in)
Кто нибудь пробовал File Association (http://nsis.sourceforge.net/File_Association) ?
...
wolkow70
21-10-2011, 11:57
Кто нибудь пробовал File Association ? »
Да, пробовал. Пишет ассоциации в HKCR, что неправильно, быкап примитивный. Лучше самому макрос сделать. А потом многие программы ведут себя по разному при сопоставлении с типами файлов, универсальных решений почти нет. Для Windows 7 не подходит, так как не пишет в UserChoice.
Можно взять за основу макрос из скрипта от сборки AIMP (тут выложен на форуме) и доработать его.
Refresh Desktop
или это
Refresh shell icons
или это
RfshDktp plug-in »
Пробовал, не то. Тут надо кэш иконок очищать.
${RefreshShellIcons} »
под Vista+ достаточно и этого, для XP кэш без перезапуска оболочки сбрасывается только так:
+ изменение размера иконки в HKCU\Control Panel\Desktop\WindowMetrics\Shell Icon Size
+ рассылка оповещения WM_SETTINGCHANGE
+ восстановление исходного размера иконки в HKCU\Control Panel\Desktop\WindowMetrics\Shell Icon Size
+ рассылка оповещения WM_SETTINGCHANGE
wolkow70
21-10-2011, 12:59
под Vista+ достаточно и этого, для XP кэш без перезапуска оболочки сбрасывается только так:
Код:
+ изменение размера иконки в HKCU\Control Panel\Desktop\WindowMetrics\Shell Icon Size
+ рассылка оповещения WM_SETTINGCHANGE
+ восстановление исходного размера иконки в HKCU\Control Panel\Desktop\WindowMetrics\Shell Icon Size
+ рассылка оповещения WM_SETTINGCHANGE »
Тут речь идет о подмене файла PotIcons.dll. После ${RefreshShellIcons} значки все равно отражаются от старой установки. Перезапуск эксплорера ничего не дает. В самом Pot-е есть кнопка, помогающая обновить иконки.
А мне нужна такая комманда в формате NSIS скрипта.
wolkow70, первой-же ссылкой - http://lmgtfy.com/?q=%22Shell+Icon+Size%22+NSIS
wolkow70
21-10-2011, 13:56
wolkow70, первой-же ссылкой - http://lmgtfy.com/?q=%22Shell+Icon+Size%22+NSIS »
Да, так сработало.
ReadRegStr $0 HKCU "Control Panel\Desktop\WindowMetrics" "Shell Icon Size"
IntOp $0 $0 + 1
WriteRegStr HKCU "Control Panel\Desktop\WindowMetrics" "Shell Icon Size" $0
SendMessage 0xffff 0x001A 42 0 /TIMEOUT=100000
IntOp $0 $0 - 1
WriteRegStr HKCU "Control Panel\Desktop\WindowMetrics" "Shell Icon Size" $0
SendMessage 0xffff 0x001A 42 0 /TIMEOUT=100000
PS: Thank You
Да, пробовал. Пишет ассоциации в HKCR, что неправильно, быкап примитивный. Лучше самому макрос сделать. А потом многие программы ведут себя по разному при сопоставлении с типами файлов, универсальных решений почти нет. Для Windows 7 не подходит, так как не пишет в UserChoice.
Можно взять за основу макрос из скрипта от сборки AIMP (тут выложен на форуме) и доработать его. »
так переделай и всем будет хорошо!
wolkow70
22-10-2011, 18:03
Дак себе то я сделал :)
Прикрепил скрипт от своей сборки PotPlayer. Посмотрите, как там сделано . У меня все прекрасно работает.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC