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

wolkow70
30-05-2012, 08:25
Не видно и не пахнет такой задачей.
да еще размерам файлы равным 1024 байтам (/S=1K) ? »

Это я привел пример из Справки, по которому изучал функцию.
У меня условие прописано: ${Locate} "$PROGRAMFILES\CyberLink" "/L=F /M=PowerDVD* /S=" "Find"

флаг ошибки возникает, если
указанной папки для поиска - не существует, а если папка пуста, то флага ошибки нет. »

В таком случае, было бы полезно дополнить Справку по функции Locate таким пояснением, так как в Справке условие появления ошибки не разъяснено, что и привело к неверной интерпретации в моем случае, ибо я предположил, что флаг ошибки устанавливается при отсутствии искомого файла.

wolkow70
30-05-2012, 09:17
Сделал так:

Function Find
IntOp $R0 $R0 + 1
Push $0
FunctionEnd

Function .OnInit
StrCpy $R0 0
ClearErrors
${Locate} "$PROGRAMFILES\CyberLink" "/L=F /M=PowerDVD* /S=" "Find"
IfErrors Next
StrCmp $R0 "0" Next 0
MessageBox MB_OK "На этом компьютере установлен программый продукт CyberLink PowerDVD.$\nУстановка CyberLink Decoder Pack 2012 будет прекращена"
Abort
Next:
FunctionEnd

kotkovets
30-05-2012, 09:59
wolkow70, Лучше и надежнее так, сравнение, когда $R0 > 0, работа с целочисленным типом.
Function Find
IntOp $R0 $R0 + 1
Push $0
FunctionEnd

Function .OnInit
StrCpy $R0 0
ClearErrors
${Locate} "$PROGRAMFILES\CyberLink" "/L=F /M=PowerDVD* /S=" "Find"
ClearErrors
IntCmp $R0 0 +3 0 0
MessageBox MB_OK "На этом компьютере установлен программый продукт CyberLinkPowerDVD.$\n\
Установка CyberLink Decoder Pack 2012 будет прекращена"
Abort
FunctionEnd

Vincent7
30-05-2012, 22:13
Приветствую. Знающие люди, подскажите пожалуйста как реализовать следующие задачи:
1. Как сделать чтобы поле выбора папки установки было затемнено(неактивно)?
2. Как сделать чтобы инсталлятор брал файлы из той же папки где лежит он сам?

kotkovets
30-05-2012, 22:38
1. Как сделать чтобы поле выбора папки установки было затемнено(неактивно)? »
Сразу вопрос, а зачем тогда вам папка выбора директории? исключите из скрипта страничку выбора директории.2. Как сделать чтобы инсталлятор брал файлы из той же папки где лежит он сам? »
В шапке темы справочник по нсис.
ЗЫ.
че наверно за зря писал красным в шапке темы...

Vincent7
30-05-2012, 23:28
kotkovets, ну просто захотелось сделать недоступной выбор папки без искючения из скрипта. Это возможно? А справку я читал, не нашел там ответа на свой вопрос, ткните носом где там это описано. Я с nsis'ом знаком всего пару дней, не ругайте сильно за нубство:-)

kotkovets
30-05-2012, 23:50
захотелось сделать недоступной выбор папки без искючения из скрипта. Это возможно? »
Примеры кодов --> Оформление --> Интерфейс Modern --> » Стандартные функции
!include "MUI2.nsh"

!insertmacro MUI_PAGE_WELCOME
!define MUI_PAGE_CUSTOMFUNCTION_SHOW DIRECTORY_SHOW
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES

!insertmacro MUI_LANGUAGE "Russian"

OutFile "test.exe"
ShowInstDetails show
InstallDir $EXEDIR

Function DIRECTORY_SHOW
EnableWindow $mui.DirectoryPage.BrowseButton 0
EnableWindow $mui.DirectoryPage.Directory 0
FunctionEnd

Section
MessageBox MB_ICONINFORMATION|MB_OK "InstallDir = $EXEDIR" IDOK
SectionEnd

Vincent7
31-05-2012, 21:42
kotkovets, спасибо, запрет выбора папки работает, но второе не то что мне нужно, мне не надо чтобы файлы устанавливались туда же, где запущен инсталлятор.
Мой путь installdir берется из реестра. Мне нужно вот что: в папке с инсталятором лежит файл, нужно в секции прописать чтобы этот файл всегда брался из директории где лежит инсталлятор. Через File "$EXEPATH\мой файл.txt" не выходит, ошибка файл не найден

kotkovets
31-05-2012, 22:00
Vincent7, читайте до дыр команду - File

john_ylygovich_sora@vk
01-06-2012, 17:03
Во первых хочу поделиться примером вызова функций из библиотеки dll, написанной на vb .net.
Во вторых - может кто знает, как написать плагин для nsis на визуал бейсике .net.

K.A.V.
01-06-2012, 17:25
Подожду K.A.V'a, может быть он что-нибудь сообразит »
Я, честно говоря, не понял суть задачи
Вам нужно, чтобы при отметке отдельной секции (в примере "Независящая секция") не отмечалась секция в группе или что?

Во вторых - может кто знает, как написать плагин для nsis на визуал бейсике .net. »
Сомневаюсь, что здесь вам кто-то подскажет насчет написания плагинов на данном языке (разве что kotkovets может быть)
В основном же, плагины к NSIS написаны на С++ (ну а там впринципе ничего сложного для С программиста), возьмите поскачивайте плагины со странички http://nsis.sourceforge.net/Category:Plugins
Возможно, какой-либо плагин и написан на нужном вам языке, практически все плагины с исходниками
Либо задайте вопрос на англоязычном форуме в разделе NSIS :)

kotkovets
01-06-2012, 19:42
john_ylygovich_sora@vk,
на бейсике жесткая привязка к платформе .NET - что не гоже, размер библиотеки 13.5 кб!!!
Да еще таскать собой CLR.dll ?????????????????? если, честно в топку!
куда лучше, гибче в тысячи раз писать на с (с++) - примеров очень много.
такой пример на си как минимум 5 кб, т.е ничего лишнего не пихается в код, чем на бейсике.

Olef2387
01-06-2012, 19:53
Я, честно говоря, не понял суть задачи
Вам нужно, чтобы при отметке отдельной секции (в примере "Независящая секция") не отмечалась секция в группе или что? »
Именно так, Вы правильно поняли

Vincent7
02-06-2012, 13:29
kotkovets, изучил, все работает, спасибо. Теперь еще вопросы:
1. Можно ли увеличить окно выбора компонентов?
2. Как работать со строкой 'требуется на диске: ' как написать туда свое значение например при выборе одного компонента, приписывалось 2 mb, и к этому значению прибавлялись другие значения выбранных компонентов?

kotkovets
02-06-2012, 13:51
Vincent7, справкой для начала научитесь пользоваться.

Vincent7
02-06-2012, 14:56
А вам сложно ответить чтоли?

K.A.V.
02-06-2012, 20:04
А вам сложно ответить чтоли? »
1. А вам сложно прочитать подробнейшую документацию на русском языке, чтобы решить вопрос, который вам необходим?
2. А мы что, попугаи, чтобы повторять одно и тоже и здесь, и в справочнике?
3. А для чего создан справочник? Чтобы такие как вы (задам быстренько вопрос и воспользуюсь Ctrl+C) смогли найти ответы на большинство вопросов
4. Ленивых мы не любим, так что если вы сами не хотите ни в чем разбираться, а хотите "всё готовенькое", то вы ошиблись форумом

Именно так, Вы правильно поняли »
Написал собственный "обработчик", который не даёт отметить несколько секций в группе, но он чисто для вашего скрипта, может кому и пригодится ещё
Возможно, можно будет его каким-то образом усовершенствовать для "универсальности", но пока что нет желания этим заниматься :)
Вроде бы, работает так как нужно ;)


OutFile "example.exe"

var hInst
var SecID

!include "MUI2.nsh"
!include "Sections.nsh"

#!insertmacro MUI_PAGE_WELCOME
;функция во время открытия странички компонентов
!define MUI_PAGE_CUSTOMFUNCTION_SHOW COMPONENTS_SHOW
;---------------------------------------------------
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE Russian

;макрос проверки секций, если одна из секций отмечена возврат - 1, иначе - 0;
;в intsec - указываем количество секций в скрипте
!macro CheckSection intsec ret
Push ${intsec}
System::Store SR2
${For} $R0 1 $R2
SectionGetFlags $R0 $R1
${IfThen} $R1 == 1 ${|}${Break}${|}
${Next}
Push $R1
System::Store L
Pop ${ret}
!macroend

Section /o "Независящая секция" FREE
SectionEnd

SubSection /e test IDS_1

Section /o "Компонент №1" ID_1
SectionEnd

Section /o "Компонент №2" ID_2
SectionEnd

Section /o "Компонент №3" ID_3
SectionEnd

Section /o "Компонент №4" ID_4
SectionEnd

Section /o "Компонент №5" ID_5
SectionEnd

Section /o "Компонент №6" ID_6
SectionEnd

SubSectionEnd


Function .onSelChange
call GetSelectedSection
call UnSelectSections

!insertmacro CheckSection 7 $R0
StrCmp $R0 0 0 +2
EnableWindow $hInst ${SW_HIDE} ;отключаем кнопку "установить"
StrCmp $R0 1 0 +2
EnableWindow $hInst ${SW_SHOW} ;включаем кнопку "установить"
FunctionEnd

Function .OnInit
StrCpy $1 ${ID_1}
SectionSetFlags ${IDS_1} ${SECTION_OFF} ;фиктивно отключаем группу
FunctionEnd


Function GetSelectedSection
StrCpy $R0 0
st:
IntOp $R0 $R0 + 1
StrCmp $R0 "1" st 0
StrCmp $R0 "8" end 0
SectionGetFlags $R0 $R1
StrCmp $R0 "$SecID" 0 +2
StrCpy $R1 0
StrCmp $R1 "1" 0 st
StrCpy $SecID "$R0"
end:
FunctionEnd

Function UnSelectSections
StrCpy $R1 0
st2:
IntOp $R1 $R1 + 1
StrCmp $R1 "1" st2 0
SectionSetFlags $R1 0
StrCmp $R1 "8" 0 st2
SectionSetFlags $SecID 1
FunctionEnd


Function COMPONENTS_SHOW
GetDlgItem $hInst $HWNDPARENT 1 ;находим HWND кнопки "установить"
!insertmacro CheckSection 7 $R0
StrCmp $R0 0 0 +2
EnableWindow $hInst ${SW_HIDE} ;отключаем кнопку "установить"
StrCmp $R0 1 0 +2
EnableWindow $hInst ${SW_SHOW} ;включаем кнопку "установить"
FunctionEnd

Vincent7
03-06-2012, 02:01
K.A.V,
1. Подробнейшая документация как вы изволили выразится, вовсе не такая подробная, или я не прав?
2. Я говорил, что я знаком с nsis всего несколько дней, поэтому справке могу что либо непонять, поэтому и спрашиваю сдесь.
3. Какой смысл в форуме если есть 'подробнейшая документация' , напишите в шапке темы 'обратитесь к документации чтобы решить вопрос, который вам необходим' , и попугаями быть не придется.
Извините. Я вас понимаю, но и вы поймите меня, не просто брать ответы на вопрос новичку из документации в которой еще не все понимаешь.

K.A.V.
03-06-2012, 09:16
1. Подробнейшая документация как вы изволили выразится, вовсе не такая подробная, или я не прав? »
Не правы конечно, документацию писал я и kotkovets, в ней мы как раз описываем всё так, чтобы было понятно начинающим кодерам на NSIS, для этого и создан справочник, для новичков, нам то он, зачем нужен? ;)

2. Я говорил, что я знаком с nsis всего несколько дней, поэтому справке могу что либо непонять, поэтому и спрашиваю сдесь. »
В справке к каждой команде есть готовый рабочий пример, вам только остаётся скопировать пример кода из справки, подставить нужные данные для теста команды и всё
В справке описано то, что вам нужно, поэтому мы из принципа не будем здесь заниматься копированием информации из файла справки

3. Какой смысл в форуме »
Смысл данной темы помогать в решении возникших вопросов/проблем у новичков в NSIS, поймите разницу, мы помогаем, а не делаем за вас, это огромная разница, когда вы что-то не понимаете и просите помощи или просите готовый код
Прочитайте эту тему, я уже не раз заводил разговор на эту тему, мы вам можем помочь на сколько у нас хватит знаний, но мы не желаем делать всё за вас, просто потому что вам просто напросто лень прочитать документацию на русском языке

не просто брать ответы на вопрос новичку из документации в которой еще не все понимаешь. »
А вы вообще даже не открывали эту документацию, раз задаёте вопросы, ответы на которые уже есть в справке


===
1. Можно ли увеличить окно выбора компонентов? »
Примеры кодов => Оформление => Интерфейс Modern => Страница выбора компонентов установки

Либо редактируйте с помощью ResHacker *.exe файл оболочки (по умолчанию modern.exe), диалог 104
Файлы оболочки находятся в папке
\NSIS\contrib\UIs


2. Как работать со строкой 'требуется на диске: ' как написать туда свое значение например при выборе одного компонента, приписывалось 2 mb, и к этому значению прибавлялись другие значения выбранных компонентов? »
Перевод справки NSIS => AddSize
Инсталлятор автоматически добавляет необходимое для файлов свободное место на диске при отметке секций, главное чтобы распаковка файлов была прописана в самой секции
Либо пользуйтесь командой AddSize в секции, чтобы добавить необходимое свободное место на диске для установки компонента

wolkow70
04-06-2012, 10:05
Уточните пожалуйста разницу по справке:

Параметр /oname позволяет переименовать файл:

SetOutPath "$INSTDIR"
File /oname=файл.exe file.exe

Если хотим распаковать переименованный файл, к примеру в папку Windows, то пишем:
File /oname=$WINDIR\файл.exe "C:\Install\file.exe"

Если я пишу в скрипте:

SetOutPath "$LOCALAPPDATA\LightAlloy"
File /oname=$LOCALAPPDATA\LightAlloy\LA.xml "${pkgdir}\Light Alloy\LA1.xml"

Это ошибка или не рациональный код?




© OSzone.net 2001-2012