Показать полную графическую версию : [архив].: NSIS - все вопросы :.
Добрый день.
У меня возникло пара вопросов, ответьте пожалуйста:
1) Как предотвратить повторный запуск инсталлятора? (без плагинов и прочего)
2) Как сделать, чтоб файлы после инсталляции, были с атрибутами скрытый и системный?
ps в другом инсталляторе ставил атрибуты, а потом собирал инсталлятор и атрибуты сохранялись. а в этом так не получается.
3) Как можно добиться максимального сжатия? может есть какой то плагин позволяющий очень сильно сжимать?
Или можно как то сжимать файлы несколько раз?
ps winrar сильнее сжимает.
pss в nsis'e ставлю максимальное... но всё равно не сильно жмет
Спасибо!
wolkow70
17-06-2011, 10:08
Копаюсь с функцией InstallFolderInternal из любимого VLC.
И вот, что интересно:
Var UninstallLog
!macro OpenUninstallLog
FileOpen $UninstallLog "$INSTDIR\uninstall.log" a
FileSeek $UninstallLog 0 END
!macroend
!macro CloseUninstallLog
FileClose $UninstallLog
SetFileAttributes "$INSTDIR\uninstall.log" HIDDEN
!macroend
!macro InstallFile FILEREGEX
File "${FILEREGEX}"
!define Index 'Line${__LINE__}'
FindFirst $0 $1 "$INSTDIR\${FILEREGEX}"
StrCmp $0 "" "${Index}-End"
"${Index}-Loop:"
StrCmp $1 "" "${Index}-End"
FileWrite $UninstallLog "$1$\r$\n"
FindNext $0 $1
Goto "${Index}-Loop"
"${Index}-End:"
!undef Index
!macroend
;
!macro InstallFolder FOLDER
File /r "${FOLDER}"
Push "${FOLDER}"
Call InstallFolderInternal
!macroend
;
Function InstallFolderInternal
Pop $9
!define Index 'Line${__LINE__}'
FindFirst $0 $1 "$INSTDIR\$9\*"
StrCmp $0 "" "${Index}-End"
"${Index}-Loop:"
StrCmp $1 "" "${Index}-End"
StrCmp $1 "." "${Index}-Next"
StrCmp $1 ".." "${Index}-Next"
IfFileExists "$9\$1\*" 0 "${Index}-Write"
Push $0
Push $9
Push "$9\$1"
Call InstallFolderInternal
Pop $9
Pop $0
Goto "${Index}-Next"
"${Index}-Write:"
FileWrite $UninstallLog "$9\$1$\r$\n"
"${Index}-Next:"
FindNext $0 $1
Goto "${Index}-Loop"
"${Index}-End:"
!undef Index
FunctionEnd
;
Section "!${PRODUCT_NAME}" Install
SectionIn 1 2 3 RO
SetShellVarContext all
SetOutPath "$INSTDIR"
!insertmacro OpenUninstallLog
ЕСЛИ файл скрипта лежит в одной директории с файлами установки и при этом прописать так:
!insertmacro InstallFile vlc.exe
!insertmacro InstallFile vlc.exe.manifest
!insertmacro InstallFile libvlc.dll
!insertmacro InstallFile libvlc.dll.manifest
То при установке устанавливаемые файлы в логе UninstallLog прописываются .
А, если файл скрипта поместить в другую папку и прописать пути к файлам:
!insertmacro InstallFile "${FILEPATH}\vlc\vlc.exe"
!insertmacro InstallFile "${FILEPATH}\vlc\vlc.exe.manifest"
!insertmacro InstallFile "${FILEPATH}\vlc\libvlc.dll"
!insertmacro InstallFile "${FILEPATH}\vlc\libvlc.dll.manifest"
То инсталляция происходит нормально, но списка файлов в UninstallLog нет
В чем дело не пойму .... Может кто знает в чем заковырка?
Krinkels
17-06-2011, 10:30
Tankan
1. Можно сделать так: System::Call "kernel32::CreateMutexA(i 0, i 0, t '$(^Name)') i .r0 ?e"
Pop $0
StrCmp $0 0 launch
StrLen $0 "$(^Name)"
IntOp $0 $0 + 1
loop:
FindWindow $1 '#32770' '' 0 $1
IntCmp $1 0 +4
System::Call "user32::GetWindowText(i r1, t .r2, i r0) i."
StrCmp $2 "$(^Name)" 0 loop
System::Call "user32::SetForegroundWindow(i r1) i."
Abort
launch:
3. Для NSIS есть плагин для распаковки 7z архивов, используй его. Так же могу скинуть плагин для распаковки FreArc архивов.
funtykin
17-06-2011, 11:01
sawe,
Спасибо! то что нужно!
funtykin
17-06-2011, 12:11
!include MUI.nsh ; интерфейс MUI2.nsh не катит!
SetCompressor /SOLID lzma
XPStyle on
Name "MMM"
OutFile Test_file.exe
InstallDir "$PROGRAMFILES\MMM" # папка установки по умолчанию!
InstallDirRegKey HKLM "Software\MMM" "" # получить установку папки из реестра если доступно!
RequestExecutionLevel user
;Спец страницы!
!define MUI_PAGE_CUSTOMFUNCTION_PRE WelcomePageSetupLinkPre
!define MUI_PAGE_CUSTOMFUNCTION_SHOW WelcomePageSetupLinkShow
!define MUI_WELCOMEPAGE_TITLE "Вас приветствует установщик $(^Name)"
!define MUI_TEXT_WELCOME_INFO_TEXT "Пожалуйста закройте все работающие приложения. \
$\nЭто обновит системные файлы без перезагрузки.$\n$\n$\nВыберите файл для вашей установки."
;Последовательность открытия страниц!
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE Russian
Function WelcomePageSetupLinkPre
var /global Filic
StrCpy $Filic "$EXEDIR\Text.txt"
!insertmacro MUI_INSTALLOPTIONS_WRITE "ioSpecial.ini" "Settings" "Numfields" 4 # счетчик увеличения!
!insertmacro MUI_INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 3" "Bottom" 100 # ограничение размера верхней метки!
!insertmacro MUI_INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Type" FileRequest # тип!
!insertmacro MUI_INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Text" ""
; Определите фильтр, для элементов которые можно выбрать, разделять чертой | без пробелов
!insertmacro MUI_INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Filter" "Filter=Text Files|*.txt|Programs|*.exe;*.com|All Files|*.*"
!insertmacro MUI_INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "State" "$Filic" # состояние!
!insertmacro MUI_INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Left" 120 # отступ слева!
!insertmacro MUI_INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Top" 100 # отступ от верха!
!insertmacro MUI_INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Right" 320 # длина вправо!
!insertmacro MUI_INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Bottom" 112 # высота строки!
!insertmacro MUI_INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Flags" "NOTABSTOP|FILE_EXPLORER" # флаг!
!insertmacro MUI_INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "HWND" "" # высота строки!
FunctionEnd
Function WelcomePageSetupLinkShow
!insertmacro MUI_INSTALLOPTIONS_SHOW
FunctionEnd
Section -bbbbbb # секция установки файлов!
/*------- MMM ---------*/
SectionEnd
а как тут выцарапать путь указанного файла?
или он в какую переменную передается?
Krinkels,
1. Как так? конкретный код дай, который мне можно встатвить в свой.
2. По этому вопросу что скажите? Как установить атрибуты на файлы, чтоб извлекались и билы скрытие и системные.
3. А при чем тут распаковка? если мне нужна упаковка с сильным скажитем.
Возможно даже, что сжимать несколько раз, чтоб добиться меньшего размера инсталлятора.
Пожалуйства ответьте, кто хорошо понимает в nsis, как можно сдлать этакое.
а как тут выцарапать путь указанного файла? »
Объясни подробно, что и как вам нужно и для какой цели, очень часто бывает, что решение намного проще чем вы его себе представляете в начале!
По этому вопросу что скажите? Как установить атрибуты на файлы, чтоб извлекались и билы скрытие и системные. »
NORMAL или FILE_ATTRIBUTE_NORMAL (или просто 0)
ARCHIVE или FILE_ATTRIBUTE_ARCHIVE
HIDDEN или FILE_ATTRIBUTE_HIDDEN
OFFLINE или FILE_ATTRIBUTE_OFFLINE
READONLY или FILE_ATTRIBUTE_READONLY
SYSTEM или FILE_ATTRIBUTE_SYSTEM
TEMPORARY или FILE_ATTRIBUTE_TEMPORARY
Пример применения:
SetFileAttributes "$INSTDIR\имя_файл.exe" ARCHIVE|HIDDEN|SYSTEM|READONLY
3. А при чем тут распаковка? если мне нужна упаковка с сильным скажитем. »
Штатными средствами NSIS можно увеличить сжатие
SetCompressor /FINAL /SOLID lzma
Можно так же положи в папку со скриптом файл upx.exe и вставь этот код
!define HAVE_UPX
!ifdef HAVE_UPX
!packhdr tmpexe.tmp "UPX --best -q --compress-icons=0 tmpexe.tmp"
!endif
Есть очень хороший плагин для архивов FreeArc - распаковка arc-архивов, несколько страниц назад пролистайте и найдёте его.
Я в таких случаях использую 7-Zip архиватор, попробуй мою сборку этого архиватора Zip 9.22 с последним SFX (http://dn1.berloga.net/176413/7-Zip_9.22_tool_1.5_x86_x64.exe) или с сайта автора SFX (http://7zsfx.info/ru/).
NSIS имеет ограничение на файл размером более 2GB, и при большом размере файла инсталлятора иконка не видна, поэтому лучше прикреплять большие файлы, и что бы сильно не мудрить, можно использовать такой код:
Copyfiles /SILENT "$EXEDIR\Имя_файла.exe" "$INSTDIR\Имя_файла.exe" # паравозик!
ExecWait "$INSTDIR\Имя_файла.exe" # извлечь ожидая завершения!
Delete "$INSTDIR\Имя_файла.exe" # если более не нужен!
Здесь на форуме в разделе InnoSetup (http://forum.ru-board.com:9000/topic.cgi?forum=5&topic=30239&start=1860) используют Утилиту Precomp (http://schnaader.info/precomp.php#d), которая разбирает файл на бинарник а потом собирает его в Патч, но уже намного меньшего размера, после инсталляции производит эту операцию в обратном порядке.
--
funtykin
18-06-2011, 10:18
sawe, Спасибо я вчера еще разобрался.. то что вы мне первый раз написали оказалось достаточным чтобы начать понимать как это работает.
оказалось достаточным чтобы начать понимать как это работает. »
Ну тогда читай \Docs\InstallOptions\Readme.html
kotkovets
18-06-2011, 17:53
Можно ли, создать кустомную страницу используя nsDialog для отображения страницы СтартМеню »
Вот пример, сливаем архив Listview.zip отсюда (http://nsis.sourceforge.net/Header_file_for_Listview) подключаем библиотеку CommCtrl.nsh
!include "MUI2.nsh"
!include "CommCtrl.nsh"
!include "FileFunc.nsh"
!insertmacro Locate
Name "ListView"
Caption "ListView DetailPrint"
OutFile StartMenu.exe
ShowInstDetails show
!define PROGRAMS "Test ListView"
Page custom CreatePage LeavePage
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"
Var Dialog
Var ListView
Var Text
Var Item
Var CheckBox
Var STARTMENUFOLDER
Var Check
Function CreatePage
!insertmacro MUI_HEADER_TEXT `Listview control SMPROGRAMS` \
`A ListView control created by nsDialogs plugin`
nsDialogs::Create 1018
Pop $Dialog
${NSD_CreateText} 0 0u 100% 12u `${PROGRAMS}`
Pop $Text
${NSD_SetFocus} $Text
${NSD_CreateListView} 0 20u 100% 75% ``
Pop $ListView
${NSD_LV_InsertColumn} $ListView 0 425 `« меню Пуск -> Программы »`
${NSD_CreateCheckBox} 0u 130u 200u 12u "Не создавать ничего в « меню Пуск -> Программы »"
Pop $CheckBox
${NSD_OnClick} $CheckBox fnCheckBox
SetShellVarContext all
System::Alloc 512
Pop $R5
System::Call `comctl32::ImageList_Create(i16,i16,i${ILC_MASK}|${ILC_COLOR32},i0,i0)i.R4` ; создаем массив изображений
StrCpy $Item "-1"
${Locate} "$SMPROGRAMS" "/L=D /G=0" "SMPROGRAMS"
SendMessage $ListView ${LVM_SETIMAGELIST} ${LVSIL_SMALL} $R4 ;ложим ImageList на ListView
SendMessage $ListView ${LVM_SETEXTENDEDLISTVIEWSTYLE} ${LVS_EX_LABELTIP} ${LVS_EX_LABELTIP} ;подсказка, если текст за выходит заграницу ListView
SendMessage $ListView ${LVM_SETEXTENDEDLISTVIEWSTYLE} ${LVS_EX_FULLROWSELECT} ${LVS_EX_FULLROWSELECT} ;полное выделение
;SendMessage $ListView ${LVM_SETEXTENDEDLISTVIEWSTYLE} ${LVS_EX_GRIDLINES} ${LVS_EX_GRIDLINES} ;добавляем линии в ListView
${NSD_OnNotify} $ListView GetNamePROGRAMS
nsDialogs::Show
System::Call `comctl32::ImageList_Destroy(iR4)`
System::Free $R5
FunctionEnd
Function fnCheckBox
Pop $CheckBox
${NSD_GetState} $CheckBox $Check
${If} $Check = 1
EnableWindow $Text 0
EnableWindow $ListView 0
${ElseIf} $Check = 0
EnableWindow $Text 1
EnableWindow $ListView 1
${EndIf}
FunctionEnd
Function SMPROGRAMS
IntOp $Item $Item + 1
System::Call 'shell32::SHGetFileInfo(tR9,i0,iR5,i352,\
i${SHGFI_ICON}|${SHGFI_SMALLICON}|${SHGFI_DISPLAYNAME})' ;выдергиваем иконки из папки через кэш проводника
System::Call "*$R5(i.R3)" ;массив иконок
System::Call "comctl32::ImageList_AddIcon(iR4,iR3)" ;добавляем иконку в ImageList
System::Call `user32::DestroyIcon(iR3)`
System::Call `kernel32::FreeLibrary(iR4)`
${NSD_LV_InsertItem} $ListView $Item $R7 ;создаем итемы в ListView
${NSD_LV_SetItemImage} $ListView $Item $Item
Push $0
FunctionEnd
Function GetNamePROGRAMS ;обработка события отметки
System::Store SR1R1R0 ;приватный стек с идентификаторами
${Select} $R1
${Case} ${LVN_ITEMCHANGED} ; признак, событие отметки итема
System::Call "*$R0(i,i,i,i.R2,i,i,i,i,i,i)" ; находим индекс отмеченного итема
${NSD_LV_GetItemText} $ListView $R2 0 "$STARTMENUFOLDER" ;по найденному индексу считываем текст итема
${NSD_SetText} $Text "$STARTMENUFOLDER\${PROGRAMS}" ; кидаем текст в поле ввода
${CaseElse}
${EndSelect}
System::Store L
FunctionEnd
Function LeavePage
${NSD_GetState} $CheckBox $Check
${If} $Check = 0
${NSD_GetText} $Text "$STARTMENUFOLDER"
${EndIf}
FunctionEnd
Section Main
${If} $Check = 0
DetailPrint $SMPROGRAMS\$STARTMENUFOLDER
CreateDirectory "$SMPROGRAMS\$STARTMENUFOLDER" ;создаем папку в меню Пуск -> Программы
${EndIf}
SectionEnd
необходимо реализовать диалоговое окно в котором нужно указать фаил и скопировать его в дальнейшем в путь установки. »
Пример на интерфейсе MUI2
OutFile "setup.exe"
ShowInstDetails show
InstallDir "$PROGRAMFILES\TEsT"
!include "MUI2.nsh"
!include "FileFunc.nsh"
!insertmacro GetFileName
Page custom SelectFile
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"
Var Dialog
Var Button
Var FILEPATH
Var FILENAME
Function SelectFile
!insertmacro MUI_HEADER_TEXT `Диалог выбора файла для копирования` `Сontrol created by nsDialogs plugin`
nsDialogs::Create 1018
Pop $Dialog
${NSD_CreateButton} 0 0 60u 14u "Выбор файла"
Pop $Button
${NSD_OnClick} $Button Button ;обработка события на клик кнопки
nsDialogs::Show
FunctionEnd
Function Button ;функция обработки события
Pop $Button
nsDialogs::SelectFileDialog "" "*.*" ;диалог выбора файла
Pop $FILEPATH ;в переменной FILEPATH - путь к выбранному файлу
FunctionEnd
Section "CopyFile"
SetOutPath "$INSTDIR"
${If} $FILEPATH != '' ;если не выбран файл, то пропустить копирование
${GetFileName} "$FILEPATH" "$FILENAME" ;из пути к файлу вытаскиваем имя файла
CopyFiles /Silent "$FILEPATH" "$INSTDIR\$FILENAME"
${EndIf}
SectionEnd
если мне нужна упаковка с сильным сжатием»
Я всегда пакую файлы таким образом, и чаще всего 7-zip отдыхает:
SetCompressor /SOLID LZMA
SetCompressorDictSize 64 ;или 128, зависит от оперативки компа, максимум 170
SetDatablockOptimize on
Вот пример, сливаем архив Listview.zip отсюда подключаем библиотеку CommCtrl.nsh »
Нуууу - вы просто монстр!
Сначала пропал куда-то, тут резко появился, как дед мороз с подарками, и все довольны.
Я такого подарка, даже не ожидал, спасибо будем доводить по месту.
Вот если бы помог разобраться с 1cd theme (http://rghost.ru/8483541). На форуме WinAmp тоже не совсем разобрались с этим, посоветовали две короткие строки добавить, но оно не срабатывает.
kotkovets
18-06-2011, 20:25
sawe,
Я скинами не занимаюсь, но думаю, что проблема в плагине и в ресурсах диалога NSIS - не очень дружат, то они.
К тому же плагин требует отключения стиля - вот это ни в какие ворота не лезет! к разрабу плагина обратитесь...
Я пытался, но они полностью переключились на ExperienceUI, мне не очень-то нравиться скино-творение, но для классического, как мне кажется просто необходимо. Wansis мне понравился из за самого маленького размера и простой реализации.
Можно ли, создать кустомную страницу используя nsDialog для отображения страницы СтартМеню »
Есть проблема, когда ни чего не выбрано всё работает OK, когда выбрана папка, инсталлятор создаёт в выбранной папке ярлыки но предварительно не создаёт папку с именем программы.
При таком изменении начинает работать но не удаляет папку:
${If} $Check3 = 0
CreateDirectory "$SMPROGRAMS\$StartMenuFolder\${AppName}" ;создаем папку в меню Пуск -> Программы
CreateShortCut "$SMPROGRAMS\$StartMenuFolder\${AppName}\${AppName}.lnk" "$INSTDIR\${ExeName}" "" "$INSTDIR\${ExeName}" 0
CreateShortCut "$SMPROGRAMS\$StartMenuFolder\${AppName}\Справка.lnk" "$INSTDIR\Languages\russian.chm" "" "$WINDIR\hh.exe" 0
WriteINIStr "$SMPROGRAMS\$StartMenuFolder\${AppName}\${AppName}.url" "InternetShortcut" "URL" "${Website}"
CreateShortCut "$SMPROGRAMS\$StartMenuFolder\${AppName}\Удаление.lnk" "$INSTDIR\Uninstall.exe"
${EndIf}
---
kotkovets
20-06-2011, 17:01
Есть проблема »
Все ярлыки и папки создаются для всех пользователей, если нужно для текущего, то вместо SetShellVarContext all пишем SetShellVarContext current в кастомной страничке
предварительно не создаёт папку с именем программы»
эту проблему исправил еще вчера и сейчас подправил подстановку константы.
!define PROGRAMS "Test ListView" - ${PROGRAMS} -> значение меняем на нужное название
---
${NSD_SetText} $Text "$STARTMENUFOLDER\${PROGRAMS}" ; кидаем текст в поле ввода
на выходе получаем: $STARTMENUFOLDER = $STARTMENUFOLDER\${PROGRAMS}
т.е достаточно:
CreateDirectory "$SMPROGRAMS\$StartMenuFolder
CreateShortCut "$SMPROGRAMS\$StartMenuFolder\link.lnk" "$INSTDIR\*.exe" "" "$INSTDIR\*.exe" 0
---
Зачем усложнять самого себя еще больше...
Если чебокс отмечен - ничего не будет создаваться.
Все работает, создаются папки и ярлыки - сделано по аналогии с стандартным плагином
Друзья, помогите пожалуйста.
Мне необходимо установить IIS инсталятором NSIS.
Я пытаюсь выполнять соответствующую команду при помощи ExecCmd::exec. Соответсвующий плагин установлен.
Одна из секций инстолятора имеет следующий вид
Section "IIS" IISSection
ExecCmd::exec /TIMEOUT=10000 '"start /w pkgmgr /iu:IIS-WebServerRole;IIS-WebServer;IIS-CommonHttpFeatures;IIS-StaticContent;IIS-DefaultDocument;IIS-DirectoryBrowsing;IIS-HttpErrors;IIS-HttpRedirect;IIS-ApplicationDevelopment;IIS-ASPNET;IIS-NetFxExtensibility;IIS-ISAPIExtensions;IIS-ISAPIFilter;"'
SectionEnd
При установки появляется сообщение об ошибке (см. прикрепленный файл)
Windows Package Manager
Operation failed with 0x8007000B
An attemt to make a program with an incorrect format.
Подскажите пожалуйста что я делаю не так!
Через командную строку команда успешно выполняется и все нужные компоненты IIS устанавливаются.
kotkovets
21-06-2011, 14:43
Eneten, покажите содержимое батника
kotkovets, батника нет!
Есть одна команда которую я хочу вызвать
start /w pkgmgr /iu:IIS-WebServerRole;IIS-WebServer;IIS-CommonHttpFeatures;IIS-StaticContent;IIS-DefaultDocument;IIS-DirectoryBrowsing;IIS-HttpErrors;IIS-HttpRedirect;IIS-ApplicationDevelopment;IIS-ASPNET;IIS-NetFxExtensibility;IIS-ISAPIExtensions;IIS-ISAPIFilter;
Подскажите пожалуйста, как мне сделать регистрацию таких файлов
ac3filter.ax
CLLine21.ax
CLDemuxer.ax
CLNAVX.ax
CLVSD.ax
CoreAVCDecoder.ax
CoreVorbis.ax
divxdec.ax
DivX.dll
voxmsdec.ax
vsfilter.dll
xvid.ax
в скрипте.
делаю свой кодек пак
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC