Ru-Board.club
← Вернуться в раздел «Программы»

» NSIS (Nullsoft Scriptable Install System)

Автор: ab10001
Дата сообщения: 26.02.2009 12:48
спасибо за помощь, помогло !!!

Добавлено:
а как сделать так, чтобы в конце установки не появлялась строка с предлежением о запуске программы?

скрип создавал с помощью "Мастер сценарии NSIS" который является частью HM NIS Edit
Автор: Victor_VG
Дата сообщения: 26.02.2009 18:35
ab10001

По дефолту NSIS ставит SetShellVarContext current, для использования SetShellVarContext all директиву надо прописать явно. Вот смотри пример моего кода:

Цитата:
SetShellVarContext all
!insertmacro MUI_STARTMENU_GETFOLDER "Application" $ICONS_GROUP
Delete "$DESKTOP\setup.lnk"
Delete "$SMPROGRAMS\$ICONS_GROUP\setup.lnk"
Delete "$SMPROGRAMS\$ICONS_GROUP\Uninstall.lnk"
RMDir /r "$SMPROGRAMS\$ICONS_GROUP"

Макрос связанный с MUI возвращает путь к каталогу группы, затем удаляются ярлыки и директивой RMDir /r "$SMPROGRAMS\$ICONS_GROUP" удаляется сам каталог группы со всеми вложенными подкаталогами и файлами. Но, с ключом /r надо быть очень осторожным он удаляет сразу всю вложенную структуру каталогов, в RMDir "$SMPROGRAMS\$ICONS_GROUP" удалит каталог только если он будет пустым.

Элементарно: в директиве !define MUI_FINISHPAGE_RUN "$INSTDIR\myapp.exe" убрать элемент "$INSTDIR\myapp.exe", а можно и её саму удалить заменив строкой SetAutoClose /true в последней перед директивой SectionEnd строке секции Post. И если ещё убрать директиву !insertmacro MUI_PAGE_WELCOME, то можно удалить и директиву !define MUI_WELCOMEFINISHPAGE_BITMAP "modern-wizard.bmp" сократив тем самым размер программы.
Автор: alroy
Дата сообщения: 27.02.2009 10:58
Всем привет не любитель я писать на форумах стараюсь сам разобраться но тут туплю не имоверно. Теперь вопрос могу ли я использовать переменную для того что бы в нее поместить путь к каталогу установки а потом подставить ее в InstallDir примерно так


Код:

var in_pyTb ; Обьявить переменную

StrCpy $in_pyTb "c:\temp" ; присвоить ей путь

InstallDir $in_pyTb ; А потом использовать ее

Автор: Victor_VG
Дата сообщения: 27.02.2009 15:39
alroy

Начало верное - переменную надо объявить явно. А дальше мы можем сделать нужные нам операции - переопределить её например в функции .onInit, иной функции/секции, можем присвоить ей значение регистра или прямо считать в неё строку Реестра, например так:

Код: ReadRegStr HKLM "Software\MyProg\Path" "InstDirPatch" $INSTDIR
SetOupPath $INSTDIR
File $INSTDIR\myprog.exe
Автор: ab10001
Дата сообщения: 28.02.2009 16:10
Всем привет! тут такой вопрос: как сделать так что бы во время установки пользователю предоставлялся выбор создавать иконку на рабочем столе или нет, и чтобы по умолчанию она была отключена, т.е. чтобы вовремя тихой установки она не создавалась ??

что и где надо добавить или исправить??

; Shortcuts
SetShellVarContext all
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
CreateDirectory "$SMPROGRAMS\$ICONS_GROUP"
CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\MyApp.lnk" "$INSTDIR\MyApp.exe"
CreateShortCut "$DESKTOP\MyApp.lnk" "$INSTDIR\MyApp.exe"
!insertmacro MUI_STARTMENU_WRITE_END
SectionEnd


Заранее всем спасибо !!!
Автор: Victor_VG
Дата сообщения: 28.02.2009 16:36
ab10001

Например так:

Цитата:
; Shortcuts
SetShellVarContext all
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
CreateDirectory "$SMPROGRAMS\$ICONS_GROUP"
CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\MyApp.lnk" "$INSTDIR\MyApp.exe"
StrCmp $LANGUAGE 1049 +2
MessageBox MB_ICONQUESTION|MB_YESNO "Create Desktop icon?" IDYES +2 IDNO +4
MessageBox MB_ICONQUESTION|MB_YESNO "Создать иконку на рабочем столе?" IDYES +1 IDNO +2

CreateShortCut "$DESKTOP\MyApp.lnk" "$INSTDIR\MyApp.exe"
!insertmacro MUI_STARTMENU_WRITE_END
SectionEnd

А для случая Silent надо выводить не запрос в диалоге, а использовать логику с выбором секций и переменной-семафором. Когда мне такие фокусы требуются я просто просчитываю нужную СДНФ или СКНФ используя аппарат дискретной математики. Именно поэтому мои решения иной раз не универсальны - они рассчитываются каждый раз заново с использованием математической модели. Для меня такой метод давно стал привычен, хотя он и не самый простой в применении.
Автор: ab10001
Дата сообщения: 28.02.2009 17:48
Спасибо за помощь, но это не то что надо, так как во время тихой установки задается вопрос о создании иконки, а мне надо чтобы все по тихому проходило и иконки не создавала, а при обычной установки можно было поставить галочку, чтобы иконка была создана.
Спасибо за помощь!!!
Автор: Victor_VG
Дата сообщения: 28.02.2009 18:03
ab10001

Используй создание иконки в не выбранной по умолчанию секции (ключ /о в директиве Section). В ней ставим команду изменения состояния семафора:

var sem

Function .onInit
StrCpy sem 0
FunctionEnd

....

Section /o "Desk" SEC001
StrCpy $sem 1
SectionEnd


....

Shortcuts
SetShellVarContext all
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
CreateDirectory "$SMPROGRAMS\$ICONS_GROUP"
CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\MyApp.lnk" "$INSTDIR\MyApp.exe"
StrCmp $sem 1 +1 +2
CreateShortCut "$DESKTOP\MyApp.lnk" "$INSTDIR\MyApp.exe"
!insertmacro MUI_STARTMENU_WRITE_END
SectionEnd


После секции Post и вне секций, перед UNINSTALL!

!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
!insertmacro MUI_DESCRIPTION_TEXT ${SEC01} "Install Desktop icon"
!insertmacro MUI_FUNCTION_DESCRIPTION_END


Вся структура создаётся автоматом если указать мастеру в HM NIS создание скрипта с возможностью выбора компонент.
Автор: MaGoth
Дата сообщения: 01.03.2009 17:53
@Victor_VG:

Цитата:
2All
Ребята, забирайте мой подарок к Празднику: NSIS 2.44 Kit включая пакет Обновления для NSIS 2.44 версии 1.0.0.1

Данный пакет содержит:

Примечание:

При обновлении NSIS с более старой версии согласитесь с её удалением. Так Вы сможете избежать многих проблем вызванных изменением структуры новой версии компилятора! Лучше потом всё заново подстроить...
Страницы закачки
Зеркало 1
Зеркало 2
Зеркало 3

P.S.
"Тянул кота за хвост" я - надо было разобраться с ошибками в Far Manager и в ряде других пакетов, и я решил выпустить всё вместе, а NSIS именно сегодня, как подарок к Празднику.


С вашей странички не смог загрузить обновку программы,
Ожидание в 30 сек, про которые вы писали ничего не дает, файлик не подгружается, как висела так и висит эта инфа на страничке:
Для скачивания файла вам необходимо
бесплатно зарегистрироваться
или
войти под своим паролем


Скачал только после регистрации...



***
Теперь по скриптам NSIS'а:
Есть одна задачка установить модификацию на игру, а именно:

1. Установка мода на игру Готика2 с проверкой пути и верификации ехешника(реализовано)
2. В процессе установки найти на компе пользователя игру Готика 1 (не реализовано)
2.1 Распаковать файлы томов VDFs Готики 1 во временный каталог устанавливаемого мода на игру Готика2 (реализацию представляю и сделаю)
2.3 Собрать VDFs тома с обновленными материалами (реализовано)
3. Продолжить и завершить установку модификации на игру.(реализовано)

Здесь, вопросы вызавает пункт 2, как определить при установке каталог с другой игрой и выпотрошить ее содержимое, во временный каталог другой игры в который устанавливается мод???
Причем, сама игра, поиск пути для которой требуется идет в 2-х лицензиях, первая от 1C/SnowBall, вторая от Russobit-M?

Если у кого есть соображения по этому вопросу?
Или же отпишите в какую сторону рыть при решении этой проблемы(примеры, ссылки и т.д.).
Буду очень благодарен.

Ps. Скрипт своего инсталера могу скинуть если что, ибо там не все так просто...

Pss. Victor_VG, если нужно, то смогу выделить место у себя на нормальном Хосте.
Автор: Victor_VG
Дата сообщения: 01.03.2009 19:44
MaGoth

Поиск реализуется с помощью плугина Locate, но к нему надо в заголовке использовать инклюд Locate.ins. Этот [more=плугин]*****************************************************************
*** Locate NSIS plugin v1.8 ***
*****************************************************************

2007 Shengalts Aleksander aka Instructor (Shengalts@mail.ru)


Features:
1. Search for directories or empty directories and/or files
-search with wildcard
-search with names filter (include/exclude)
-search with extensions filter (include/exclude)
-search with path filter
-search with times filter
-search with size filter
-search with attributes filter
-sort files and/or directories by name, type, size, date (with reverse or not)
-output first files or directories
-search with subdirectories or not
-search with banner support
-return path\name
-return path
-return name
-return size of file
-return date of file or directory
-return attributes of file or directory
2. Find the size of a file, files wildcard or directory (locate::GetSize)
3. Find the sum of the files, directories and subdirectories (locate::GetSize)
4. Remove empty directories and/or subdirectories (locate::RMDirEmpty)


**** Open for search ****

${locate::Open} "[Paths]" "[Options]" $var

"[Paths]" - Paths to search in ("D:\Temp", "D:\Temp|C:\WINDOWS", ...)

"[Options]" - Search options

    /F=[1|0]
        /F=1 - Locate Files (default)
        /F=0 - Don't locate Files
    /D=[1|0]
        /D=1 - Locate Directories (default)
        /D=0 - Don't locate Directories
    /DE=[0|1]
        /DE=0 - Don't locate Empty Directories (default)
        /DE=1 - Locate Empty Directories (if /DE=1 then /D=0 will be set)
    /M=[wildcard]
        /M=*.* - Locate all (default)
        /M=*.doc - Locate Work.doc, 1.doc ...
        /M=Pho* - Locate PHOTOS, phone.txt ...
        /M=win???.exe - Locate winamp.exe, winver.exe ...
        /M=winamp.exe - Locate winamp.exe only
    /N=[names]
         - Locate all (default)
        /N=readme.txt - Locate only "readme.txt"
        /N=Setup.exe|soft - Locate only "Setup.exe", "soft"
    /-N=[names]
        /-N=readme.txt - Don't locate "readme.txt"
        /-N=Setup.exe|soft - Don't locate "Setup.exe", "soft"
    /X=[extensions]
         - Locate all (default)
        /X= - Locate only files without extension
        /X=exe|com|bat - Locate only files *.exe, *.com, *.bat
    /-X=[extensions]
        /-X= - Don't locate files without extension
        /-X=exe|com|bat - Don't locate files *.exe, *.com, *.bat
    /-PF=[paths]
         - Locate all (default)
        /-PF=E:\Incoming - Don't locate in "E:\Incoming" path
        /-PF=D:\Temp|C:\WINDOWS - Don't locate in "D:\Temp", "C:\WINDOWS" paths
    /-PN=[directories]
         - Locate all (default)
        /-PN=Incoming - Don't locate in "Incoming" directory
        /-PN=Temp|WINDOWS - Don't locate in "Temp", "WINDOWS" directories
    /T=day.month.year:day.month.year,[Write|Creation|Access]
        /T=,Write - Locate all and Write time to output (default)
        /T=29.08.2005:29.08.2005,Creation - Locate files and directories created 29.08.2005
        /T=01.08.2005:29.08.2005,Creation - Locate files and directories created between 01.08.2005 and 29.08.2005
        /T=:28.08.2005,Creation - Locate files and directories created before 28.08.2005
        /T=01.12.1999:,Creation - Locate files and directories created after 01.12.1999
    /S=more:less,[Bytes|Kb|Mb|Gb]
        /S=,Bytes - Locate all and files size in Bytes to output (default)
        /S=0:0,Bytes - Locate only files of 0 Bytes exactly
        /S=5:9,Kb - Locate only files of 5 to 9 Kilobytes
        /S=:10,Mb - Locate only files of 10 Megabyte or less
        /S=1:,Gb - Locate only files of 1 Gigabyte or more
    /A=[READONLY|ARCHIVE|HIDDEN|SYSTEM|-READONLY|-ARCHIVE|-HIDDEN|-SYSTEM]
         - Locate all (default)
        /A=READONLY - Locate files and directories with attribute READONLY (e.g. "ra--")
        /A=READONLY|SYSTEM - Locate files and directories with attribute READONLY and SYSTEM (e.g. "r-hs")
        /A=READONLY|-SYSTEM - Locate files and directories with attribute READONLY and without SYSTEM (e.g. "r-h-")
        /A=READONLY|ARCHIVE|HIDDEN|SYSTEM - Locate files and directories with all attribute ("rahs")
        /A=-READONLY|-ARCHIVE|-HIDDEN|-SYSTEM - Locate files and directories with attribute NORMAL ("----")
    /SF=[NAME|TYPE|SIZE|DATE]
         - Don't sort files (default)
        /SF=NAME - Sort Files by name
        /SF=TYPE - Sort Files by type
        /SF=SIZE - Sort Files by syze
        /SF=DATE - Sort Files by date
    /-SF=[NAME|TYPE|SIZE|DATE]
        /-SF=NAME - Sort Files by name reverse order
        /-SF=TYPE - Sort Files by type reverse order
        /-SF=SIZE - Sort Files by syze reverse order
        /-SF=DATE - Sort Files by date reverse order
    /SD=[NAME|DATE]
         - Don't sort directories (default)
        /SD=NAME - Sort Directories by name
        /SD=DATE - Sort Directories by date
    /-SD=[NAME|DATE]
        /-SD=NAME - Sort Directories by name reverse order
        /-SD=DATE - Sort Directories by date reverse order
    /R=[0|1]
        /R=0 - Don't Reverse output - first Directories next Files (default)
        /R=1 - Reverse output - first Files next Directories
    /G=[1|0]
        /G=1 - Locate with subdirectories (default)
        /G=0 - Don't locate subdirectories
    /B=[0|1|2]
        /B=0 - Don't show searching path (default)
        /B=1 - Show in the details current searching path
        /B=2 - Banner is used. Return: "path", "", "", "", "", ""
         when starts to search in new directory

$var Handle, zero if error


**** Find first and next (call one or more times) ****

${locate::Find} "[handle]" $var1 $var2 $var3 $var4 $var5 $var6

"[handle]" handle returned by locate::Open

$var1 "path\name"
$var2 "path"
$var3 "name"
$var4 "size" ("" if directory founded)
$var5 "time" (e.g. "29.08.2005 14:27:18")
$var6 "attributes" (e.g. "r-h-", "rahs")


**** Close search (free memory) ****

${locate::Close} "[handle]"

"[handle]" handle returned by locate::Open


**** GetSize ****

${locate::GetSize} "[Path]" "[Options]" $var1 $var2 $var3

"[Path]" - Disk or Directory

"[Options]" - Search options

    /S=[Bytes|Kb|Mb|Gb]
        /S=Bytes - Return size in bytes (default)
        /S=Kb - Return size in kilobytes
        /S=Mb - Return size in megabytes
        /S=Gb - Return size in gigabytes
    /M=[mask]
        /M=*.* - Find all (default)
        /M=*.doc - Find Work.doc, 1.doc ...
        /M=Pho* - Find PHOTO.JPG, phone.txt ...
        /M=win???.exe - Find winamp.exe, winver.exe ...
        /M=winamp.exe - Find winamp.exe only
    /G=[1|0]
        /G=1 - Find with subdirectories (default)
        /G=0 - Find without subdirectories
    /B=[0|1]
        /B=0 - Don't show searching path (default)
        /B=1 - Show in the details current searching path

$var1 - Size ("-1" if error)
$var2 - Sum of files ("-1" if error)
$var3 - Sum of directories ("-1" if error)


**** Remove empty directories ****

${locate::RMDirEmpty} "[Path]" "[Options]" $var

"[Path]" - Disk or Directory

"[Options]" - Search options

    /M=[mask]
        /M=*.* - Remove all (default)
        /M=*th - Remove Math, LAUGH ...
        /M=Pho* - Remove PHOTOS, phones ...
        /M=win??? - Remove winamp, WinRAR ...
    /G=[1|0]
        /G=1 - Remove in subdirectories (default)
        /G=0 - Don't remove in subdirectories
    /B=[0|1]
        /B=0 - Don't show searching path (default)
        /B=1 - Show in the details current searching path

$var - Sum of removed directories ("-1" if error)


**** Unload plugin ****

${locate::Unload}[/more] реализует поиск по именам. Когда надо что-то найти, используй его. Я кинул его описание под тэг more.

Что касается регистрации, то и сам был удивлён - раньше её не требовалось. Видимо придётся решать вопрос с хостингом.
Автор: alroy
Дата сообщения: 02.03.2009 11:30
Victor_VG

Спасибо у меня то как раз проблема в том что я не знаю как сделать путь который у меня в переменной путем по умолчанию для установки !!!!!
Автор: Victor_VG
Дата сообщения: 02.03.2009 19:33
alroy

Это легко сделать - достаточно присвоить переменной $INSTDIR нужное значение. Это можно сделать или в функции .onInit либо в любом месте кода программы. Тут мы вольны в выборе.
Автор: alroy
Дата сообщения: 02.03.2009 19:51
Victor_VG
Спасибо за помощь и терпение
Автор: Victor_VG
Дата сообщения: 02.03.2009 21:27
alroy

Не за что. Всё в порядке. И меня когда-то учили тому что я не знал.
Автор: alroy
Дата сообщения: 05.03.2009 23:36
Вопрос такой Можно ли организовать то что я напишу ниже средствами Nsis.

1. Скачать файл с FTP (архив)
2. Распаковать его!
3. Очень желательно показывать индикатор копирования файла!!!!!!!!!
4. Нужно сделать так что б на экране было только окно с индикатором копирования, и при этом не спрашивала ничего (кликнул на ярлык на рабочем столе и прочес пошол)
Автор: Victor_VG
Дата сообщения: 06.03.2009 00:57
alroy

Да, можно. Для этого используем плугины. А логику пишем под свою задачу. С распаковкой могут быть проблемы если использовать распаковщики NSIS, а если через nsExec вызывать консольный распаковщик проблем не будет. Просто надо сначала расписать алгоритм и его проверить, а потом писать код. Обычная практика.
Автор: alroy
Дата сообщения: 06.03.2009 07:26
Victor_VG
ЕСли нетрудно дай Названия плугинов дай пожалуйста
Автор: Victor_VG
Дата сообщения: 06.03.2009 17:09
alroy

Часть найдёшь в подкаталоге /Plugins каталога NSIS, примеры в /Examples, описания в /Docs, необходимые файлы *.nsh в /Include. Полный список с описаниями на офсайте http://nsis.sourceforge.net/Category:Plugins .
Автор: Chukotka
Дата сообщения: 07.03.2009 17:25
Не подскажете, есть ли правила размещения в коде строки:
!insertmacro MUI_LANGUAGE "Russian"

Почему при размещении сразу после подключения заголовков (!include MUI.nsh etc) у меня перестает отображаться на страницах Caption\SubCaption и не работает MUI_ABORTWARNING?
Если размещаю эту строку в скрипте после описания страниц (!insertmacro MUI_PAGE_XXX) - все нормально.
Автор: Victor_VG
Дата сообщения: 07.03.2009 22:27
Chukotka

Вот демо-пример:

Код: !define PRODUCT_NAME "Моя программа"
!define PRODUCT_VERSION "1.0"
!define PRODUCT_PUBLISHER "Моя компания, LLC."
!define PRODUCT_WEB_SITE "http://www.mycompany.com"
!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\AppMainExe.exe"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"
!define PRODUCT_STARTMENU_REGVAL "NSIS:StartMenuDir"

SetCompressor lzma

; MUI 1.67 compatible ------
!include "MUI.nsh"

; MUI Settings
!define MUI_ABORTWARNING
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"

; Language Selection Dialog Settings
!define MUI_LANGDLL_REGISTRY_ROOT "${PRODUCT_UNINST_ROOT_KEY}"
!define MUI_LANGDLL_REGISTRY_KEY "${PRODUCT_UNINST_KEY}"
;Здесь задаётся многоязычный режим
!define MUI_LANGDLL_REGISTRY_VALUENAME "NSIS:Language"

; Welcome page
!insertmacro MUI_PAGE_WELCOME
; License page
!define MUI_LICENSEPAGE_RADIOBUTTONS
!insertmacro MUI_PAGE_LICENSE "c:\path\to\licence\YourSoftwareLicence.txt"
; Directory page
!insertmacro MUI_PAGE_DIRECTORY
; Start menu page
var ICONS_GROUP
!define MUI_STARTMENUPAGE_NODISABLE
!define MUI_STARTMENUPAGE_DEFAULTFOLDER "Моя программа"
!define MUI_STARTMENUPAGE_REGISTRY_ROOT "${PRODUCT_UNINST_ROOT_KEY}"
!define MUI_STARTMENUPAGE_REGISTRY_KEY "${PRODUCT_UNINST_KEY}"
!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "${PRODUCT_STARTMENU_REGVAL}"
!insertmacro MUI_PAGE_STARTMENU Application $ICONS_GROUP
; Instfiles page
!insertmacro MUI_PAGE_INSTFILES
; Finish page
!define MUI_FINISHPAGE_RUN "$INSTDIR\AppMainExe.exe"
!insertmacro MUI_PAGE_FINISH

; Uninstaller pages
!insertmacro MUI_UNPAGE_INSTFILES
;Здесь заканчивается формирование общих языковых структур
; Language files
!insertmacro MUI_LANGUAGE "Danish"
!insertmacro MUI_LANGUAGE "English"
!insertmacro MUI_LANGUAGE "Finnish"
!insertmacro MUI_LANGUAGE "Galician"
!insertmacro MUI_LANGUAGE "Hungarian"
!insertmacro MUI_LANGUAGE "Russian"
;Заданы языки сообщений
; Reserve files
!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS

; MUI end ------

Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "setup.exe"
InstallDir "$PROGRAMFILES\Моя программа"
InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" ""
ShowInstDetails show
ShowUnInstDetails show
;Pack installer start
!define HAVE_UPX
!ifdef HAVE_UPX
!packhdr tmpexe.tmp "UPX --best -q --compress-icons=0 tmpexe.tmp"
!endif
;Pack installer end

Function .onInit
!insertmacro MUI_LANGDLL_DISPLAY
;Здесь инициализируется текущий язык и $LANGUAGE:=%USER_LANGUAGE% определяемой переменными среды
FunctionEnd

Section "Main" SEC01
SetOutPath "$INSTDIR"
SetOverwrite ifnewer
File "c:\path\to\file\AppMainExe.exe"
File "c:\path\to\file\Example.file"

; Shortcuts
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
CreateDirectory "$SMPROGRAMS\$ICONS_GROUP"
CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\Моя программа.lnk" "$INSTDIR\AppMainExe.exe"
CreateShortCut "$DESKTOP\Моя программа.lnk" "$INSTDIR\AppMainExe.exe"
!insertmacro MUI_STARTMENU_WRITE_END
SectionEnd

Section -AdditionalIcons
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
WriteIniStr "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}"
CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\Website.lnk" "$INSTDIR\${PRODUCT_NAME}.url"
CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\Uninstall.lnk" "$INSTDIR\uninst.exe"
!insertmacro MUI_STARTMENU_WRITE_END
SectionEnd

Section -Post
WriteUninstaller "$INSTDIR\uninst.exe"
WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\AppMainExe.exe"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\AppMainExe.exe"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"
SectionEnd


Function un.onUninstSuccess
HideWindow
MessageBox MB_ICONINFORMATION|MB_OK "Удаление программы $(^Name) было успешно завершено."
FunctionEnd

Function un.onInit
!insertmacro MUI_UNGETLANGUAGE
MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "Вы уверены в том, что желаете удалить $(^Name) и все компоненты программы?" IDYES +2
Abort
FunctionEnd

Section Uninstall
!insertmacro MUI_STARTMENU_GETFOLDER "Application" $ICONS_GROUP
Delete "$INSTDIR\${PRODUCT_NAME}.url"
Delete "$INSTDIR\uninst.exe"
Delete "$INSTDIR\Example.file"
Delete "$INSTDIR\AppMainExe.exe"

Delete "$SMPROGRAMS\$ICONS_GROUP\Uninstall.lnk"
Delete "$SMPROGRAMS\$ICONS_GROUP\Website.lnk"
Delete "$DESKTOP\Моя программа.lnk"
Delete "$SMPROGRAMS\$ICONS_GROUP\Моя программа.lnk"

RMDir "$SMPROGRAMS\$ICONS_GROUP"
RMDir "$INSTDIR"

DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"
SetAutoClose true
SectionEnd
Автор: Chukotka
Дата сообщения: 07.03.2009 23:47
Victor_VG
Спасибо. А подобные правила где-то описаны? Я сколько в мануале не смотрел, нигде подобного не нашел. Просьба поделиться ссылкой, если у кого есть
Автор: Victor_VG
Дата сообщения: 08.03.2009 00:15
Chukotka

Особых правил не ищи. Открой исходники в /contrib/mui и сам посмотри. Они прекрасно комментированы. И совет, это по опыту - не хочешь сам потом ломать голову что и где наделал - ставь в программах подробные комментарии. У меня валяются исходники драйверов для OS/370 которые сам писал на Ассемблере ещё в 1984 году, так вот сейчас даже я не смогу без тщательного анализа восстановить тонкости алгоритма (а о диагностических микропрограммах которые я тогда писал для ЕС-1066/ЕС-1067 я вообще молчу - это несколько сотен тысяч микрокоманд длинной по 512 бит каждая выполняемых исключительно в привилегированном режиме работы процессора командой DIAG (иначе данная привилегированная команда не вызывается - только при PSW равном MODE=SUPERVISOR & KEY=0 - т.е. когда доступна вся система команд и вся оперативная память, а значения таких ключей на ЕС ЭВМ были от 0 до 15 (0x0 - 0xF) и каждый процесс имел собственных ключ защиты памяти от 1 до 15, а с ключом 0 работал только один компонент ядра системы - Главный Планировщик и его специальные драйвера и транзитные модули управлявшие всей работой комплекса ЕС ЭВМ), там вообще без комментариев чёрт ногу сломит). А там всего по 200 - 300 байт кода, т.е. "копейки", а более сложные программы иной раз проще переписать заново без ошибок, чем восстановить цепочку алгоритма в поисках какой либо тонкой пакости. А коли есть комментарии, то они здорово облегчают жизнь, особенно при отладке программ.
Автор: Chukotka
Дата сообщения: 08.03.2009 00:28
Victor_VG

Цитата:
Особых правил не ищи.

исходники и комментарии - это понятно, путь проверенный. Но получается, при написании скрипта можно поймать вот такой вот казус, как у меня случился - я думал мозги поплавятся. Сие не радует

Цитата:
ставь в программах подробные комментарии.

в этом я маниакален: комментарии + SourceSafe + ClearQuest для контроля.
Стажем с 80-х похвастаться не могу, но лет десять у меня "все ходы записаны"

Автор: Victor_VG
Дата сообщения: 08.03.2009 04:15
Chukotka

По большому счёту у нас под рукой: исходники, примеры /examples , /docs, help а больше ничего толком и нет кроме собственного опыта и мозгов. Всё в основном сам и делаешь. Хорошо если кто пример даст, а чаще - бумага+карандаш+ластик затем идея -> СДНФ/СКНФ или если лень сначала таблицы истинности, их оптимизация и в итоге кусок алгоритма и затем код. Иначе мне не удаётся, увы. Причём это уже давно привычное дело, такое ощущение что все боятся что славу украдут, Нобелевскую им за красивые глазки подавай. Ломоносовы с пол-класса ЦПШ, да и те с "коридором"...
Автор: ab10001
Дата сообщения: 08.03.2009 14:35
Привет, а не подскажите какую надо прописать команду в скрипте чтобы при удалении удалялся этот ключ из реестра

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run]
"uTorrent"="\"C:\\Program Files\\uTorrent\\uTorrent.exe\""

и если создать .reg файл то какую там надо прописать команду, что бы удолить данный параметр а не всю ветку?
Заранее спасибо за помощь и терпение!!
Автор: Victor_VG
Дата сообщения: 08.03.2009 14:52
ab10001

Используем любую форму команды (Справка NSIS, п. 4.9.2.4 DeleteRegValue) дописав данную команду в секцию UNINSTALL:

DeleteRegValue HKEY_CURRENT_USER "Software\Microsoft\Windows\CurrentVersion\Run" "uTorrent"
или
DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Run" "uTorrent"

А удаление значения в регистровом файле не получится - удаляется только подключ целиком.

Ну, кроме команды DeleteRegValue (самый простой вариант) можно использовать плугин Registry, но его использование в данном случае - из пушки по воробьям.
Автор: ab10001
Дата сообщения: 08.03.2009 21:53
Спасибо!!!
Автор: Victor_VG
Дата сообщения: 08.03.2009 23:03
ab10001

Не за что. Все мы когда-то учились.
Автор: Draik
Дата сообщения: 09.03.2009 14:49
Приветствую.
Подскажите пожалуйста, как перевести на русский язык вот эту ошибку NSIS. Где находится данный текст и как его отредактировать?
В языковых файлах (nlf) такого текста нет...

просто очень надо... Ибо задолбали. Не докачают установщик или еще чего и такая шняга вылазит... Если она хотя бы на русском будет, уже проще будет народу...

Надеюсь на вашу помощь.
Благодарю заранее.

Автор: Chukotka
Дата сообщения: 09.03.2009 18:08
Кто-то работал с файлами от FastReport? Они выполнены как xml-документы, но при попытке открыть файл с помощью nsisXML или XML всегда возвращается -1 (на всякий случай я пробовал указывать и полный путь к файлу, и $EXEDIR\filename и локальный путь)

Задача всего-то изменить один атрибут. Парсить вручную как-то ломит.

Есть идеи?

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364

Предыдущая тема: The Bat!


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.