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

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
Почему я так сдвигаю конструкции, потому что хорошо видно
начало и конец каждой логики, чем лепить все в один столбик - легко запутаться.

yyv
20-10-2011, 13:50
у меня есть вопрос
вот я создаю контрол с линком
${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} не катит.
Смысл в том, что при установке подменяется файл с иконками типов файлов и надо его сразу подключить, а то почему-то старые отображаются (видимо сохраняются в системе от старой установки).

sawe
20-10-2011, 20:14
Товарищи, нет ли в 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 »

Пробовал, не то. Тут надо кэш иконок очищать.

XXXler
21-10-2011, 12:47
${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 скрипта.

XXXler
21-10-2011, 13:05
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

sawe
22-10-2011, 14:39
Да, пробовал. Пишет ассоциации в HKCR, что неправильно, быкап примитивный. Лучше самому макрос сделать. А потом многие программы ведут себя по разному при сопоставлении с типами файлов, универсальных решений почти нет. Для Windows 7 не подходит, так как не пишет в UserChoice.
Можно взять за основу макрос из скрипта от сборки AIMP (тут выложен на форуме) и доработать его. »
так переделай и всем будет хорошо!

wolkow70
22-10-2011, 18:03
Дак себе то я сделал :)
Прикрепил скрипт от своей сборки PotPlayer. Посмотрите, как там сделано . У меня все прекрасно работает.




© OSzone.net 2001-2012