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

» NSIS (Nullsoft Scriptable Install System)

Автор: raer000r
Дата сообщения: 28.10.2012 15:44
Если после установки нужна перезагрузка - сказать пользователю
Если после удаления программы нужна перезагрузка (файлы заблокированы) - сказать пользователю?


Кстати, насчет FreeArc тоже не отказался бы узнать.
Автор: Victor_VG
Дата сообщения: 28.10.2012 15:50
KloneBADGuY

Отдельного плагина нет, это надо Булата просить чтобы его написал коли у него буде свободное время, но архив можно распаковать консольной версией архиватора взяв например последнюю альфу 0.67 с http://freearc.org/Download-Alpha.aspx .
Вызов её как и всех консольных утилит через nsExec с проверкой кода возврата утилиты.
Автор: KloneBADGuY
Дата сообщения: 28.10.2012 15:59
Victor_VG, спасибо, про консоль знаю, но это не
то. Нет прогресс бара и прочие "радости". Если бы не баг
с архивами в 4 гб, то я бы SFX'ом ограничился. Булату
писал [деньги даже предлагал], но он явно дал понять,
что ему это неинтересно.

Про плагин спрашивал, так как наткнулся на такие посты:
Ссылка
Ссылка
Автор: kot280379
Дата сообщения: 28.10.2012 17:12
когда писали с krinkels плаг распаковки архивов arc..

можно распаковывать и без библотеки, вызовами функций библиотеки unarc.dll
с помощью коробочного плагина System.. но медленно..
[more]
Код: !include "MUI2.nsh"
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

OutFile "ns_setup.exe"
ShowInstDetails show

!macro ANSIToUTF8 SOURCE_STRING OUTPUT_STRING
     Push `${SOURCE_STRING}`
     System::Store SR2
     System::Call "kernel32::MultiByteToWideChar(i0,i0,tR2,i-1,i0,i0)i.R1"
     IntOp $R1 $R1 * 2
     System::Alloc $R1
     Pop $R0
     System::Call "kernel32::MultiByteToWideChar(i0,i0,tR2,i-1,iR0,iR1)"
     System::Call "kernel32::WideCharToMultiByte(i65001,i0,iR0,i-1,t.s,iR1,i0,i0)"
     System::Free $R0
     System::Store L
     Pop `${OUTPUT_STRING}`
!macroend

Function .OnInit
InitPluginsDir
File "/oname=$PLUGINSDIR\unarc.dll" "unarc.dll"
FunctionEnd

Section
!insertmacro ANSIToUTF8 "$EXEDIR\MiniGames.arc" "$R8" ;указываем путь к архиву..
Call ArcAbout
Call ArcExtract
SectionEnd

Function ArcAbout
System::Get "(t.r1,i.r4,i.r3,iR6)iss"
Pop $R0
System::Call "$PLUGINSDIR\unarc::FreeArcExtract(kR0,t'l',t'--',tR8,t,t,t,t,t,t,t)i.s"
${Do}
Pop $0
${IfThen} $0 == "1" ${|}${Break}${|}

${If} $1 == "password?"
abort
${ElseIf} $1 == "origsize"
System::Call "shlwapi::StrFormatByteSize64(lr3,t.r3,i${NSIS_MAX_STRLEN})"
StrCpy $7 $3
${Break}
${ElseIf} $1 == "total_files"
StrCpy $6 $4
${EndIf}
Push 1
System::Call $R0
${Loop}
FunctionEnd

Function ArcExtract
SetDetailsPrint textonly
GetDlgItem $R5 $HWNDPARENT 1037
GetDlgItem $R6 $HWNDPARENT 1038
System::Get "(t.r1,i.r2,i.r3,t.r4)iss"
Pop $R0
System::Call "$PLUGINSDIR\unarc::FreeArcExtract(kR0,t'x',t'-o+',tR8,t'-dp$R9',t,t,t,t,t)i.s"
StrCpy $5 0
${Do}
Pop $0
${IfThen} $0 == "1" ${|}${Break}${|}
${IfThen} $0 == "-1" ${|}${Break}${|}
${Select} $1
${Case2} "error" ""
MessageBox MB_ICONSTOP|MB_OK "$4" IDOK
${Break}
${Case} "filename"
IntOp $5 $5 + 1
${If} $3 <> 0
System::Call "user32::OemToChar(tr4,t.r4)"
System::Call "shlwapi::StrFormatByteSize64(lr3,t.r8,i${NSIS_MAX_STRLEN})"
DetailPrint "$4 [$8]"
${EndIf}
${Case} "write"
System::Call "shlwapi::StrFormatByteSize64(lr3,t.r3,i${NSIS_MAX_STRLEN})"
${If} $3 != $R1
SendMessage $R5 ${WM_SETTEXT} 0 `STR:Размер архива $3/$7`
StrCpy $R1 $3
${EndIf}
${If} $5 != $R2
SendMessage $R6 ${WM_SETTEXT} 0 `STR:Файлов и папок: $5/$6`
StrCpy $R2 $5
${EndIf}
${EndSelect}
Push 1
System::Call $R0
${Loop}
System::Free $R0
StrCmp $2 0 +3
MessageBox MB_ICONSTOP "Error code $2 $1 -$0"
Abort
SetDetailsPrint lastused
FunctionEnd
Автор: KloneBADGuY
Дата сообщения: 28.10.2012 17:44
kot280379, так плагина уже нет в живых, я правильно понял?
И насколько медленно распаковка таким методом? Хуже вашего плагина?

В любом случае, спасибо за помощь. Буду пробовать все доступные способы.
Автор: kot280379
Дата сообщения: 28.10.2012 17:50

Цитата:
так плагина уже нет в живых, я правильно понял?

ну почему же есть...
обращайтесь в личку.
Автор: KloneBADGuY
Дата сообщения: 28.10.2012 18:02
kot280379, в коде не хватает функции:

Код: Invalid command: ${NSD_SetText}
Автор: kot280379
Дата сообщения: 28.10.2012 18:11

Цитата:
Invalid command: ${NSD_SetText}

!include "nsDialogs.nsh"
Автор: raer000r
Дата сообщения: 28.10.2012 19:31
File: "unarc.dll" -> no files found.
Usage: File [/nonfatal] [/a] ([/r] [/x filespec [...]] filespec [...] |
/oname=outfile one_file_only)
Error in script "C:\Users\Admin\Documents\заметка\заметка.nsi" on line 25 -- aborting creation process
Автор: kot280379
Дата сообщения: 28.10.2012 19:42
raer000r
скрипт нужно читать, а не тупо копипастить..
unarc.dll должна рядом со скриптом валятся.
---
это скрипт пример распаковки архивов... работает медленно.
Автор: KloneBADGuY
Дата сообщения: 28.10.2012 19:47
kot280379, на счет скрипта. По-моему он все-же не дописан.
Где указывать папку установки? При распаковке выдает Error: --1

Кстати, совместимость с юникодом имеется, а то может в этом причина?
Автор: raer000r
Дата сообщения: 28.10.2012 20:22

Цитата:

unarc.dll должна рядом со скриптом валятся.

а я думал в папке плагин.


Цитата:
работает медленно.

а 7zip нормально работает?
Автор: kot280379
Дата сообщения: 28.10.2012 20:24

Цитата:
Кстати, совместимость с юникодом имеется

нет, только анси нсис.

Цитата:
Где указывать папку установки?

не нужно
рапаковка в текущей папке установщика..
скрипт работает..
unarc.dll - должна быть самая свежая, ищите на офф. сайте
Автор: raer000r
Дата сообщения: 28.10.2012 20:30
а в скрипте как видно один будет прогрес-бар? а два можно сделать?
Автор: kot280379
Дата сообщения: 28.10.2012 21:46

Цитата:
а два можно сделать?

нет, это скрипт для возможности распаковки..
на скрине работа плага...
Автор: raer000r
Дата сообщения: 28.10.2012 23:10

Цитата:
на скрине работа плага...

то есть сделать два прогресса-бар можно только с помощью твоей плаги? вроде есть у nsdialog контрол ProgressBar

Хотел бы так: первый бар показывает общий прогресс, а второй прогресс распаковки текущего архива.
Но в nsis этот как всегда сделать геморно.
Автор: C0USIN
Дата сообщения: 02.11.2012 09:31
Помогите написать скрипт, пожалуйста.

Есть такая задача:Имеем папку с системными шрифтами Arial, Calibri, Cambria, Consolas, Courier, Meiryo, Segoe UI, Tahoma, Times New Roman
Необходимо обновить их в системе.
Если в системе присутствует более свежая версия шрифта, то не заменять.
Почти все они заблокированы системой, поэтому замена должна быть с перезагрузкой компа
Если шрифта не было в системе, то корректно зарегистрировать его в реестре.
Автор: raer000r
Дата сообщения: 09.11.2012 13:51
нет, чувак, тебе придется читать про это в справке. и похер всем если нужной информации там нет. читай справку.

Добавлено:
нет, чувак, тебе придется читать про это в справке. и похер всем если нужной информации там нет. читай справку.
Автор: Victor_VG
Дата сообщения: 09.11.2012 19:12
raer000r

Мат в любой форме на портале запрещён. Пообщаетесь с администратором.

C0USIN

Это очень не сложно сделать. Достаточно поставить условие перезаписи:

SetOverwrite ifnewer
SetOutPatch $FONTS
...
IfFileExists $FONTS\<fontfil.ext> +
File /oname=<source_dir>\<fontname.ext>
Goto +4
Rename $FONTS\<fontname.ext> $FONTS\<fontname.ext.bak>
Rename /REBOOTOK <SOURCE_DIR>\<fontname.exe> $FONTS\<fontname.ext>
...

и в скрипте нужна функция отработки события REBOOT в которой ставим как одну из команд Delete $FONTS\*.bak для чистки мусора. В общем и целом идея такая. Блок кода что я привёл есть смысл оформить как функцию получающую как параметр имя обновляемого шрифтового файла. Это сократит размер кода, а главное число возможных ошибок в нём.
Автор: Destino
Дата сообщения: 04.12.2012 20:38
Есть репак, сделанный с помощью NSIS. Мне надо в нём заменить 1 файл. Как лучше это сделать? Есть ли программа, чтобы просто открыть этот инсталлятор, добавить файл и пересохранить? Или надо распаковывать инсталлятор полностью, потом добавлять файл и затем пересобирать? Тут вопрос тогда: у меня нет скрипта, которым он собирался. Можно этот скрипт узнать из имеющегося инсталлятора?
Автор: aftertime
Дата сообщения: 05.12.2012 06:28
Destino
если коротко, то нет, просто заменить файл невозможно. и скрипт вытащить тоже не получится. подробнее тут
можно с помощью какой-то программы-анинсталлера отловить все действия установщика, чтобы их потом воспроизвести
Автор: Victor_VG
Дата сообщения: 05.12.2012 10:45
Destino

Вы не сможете полностью декомпилировать скрипт - инклюды и макросы разворачиваемые компилятором не имея всех исходников не восстановить.
Автор: Habib2302
Дата сообщения: 06.12.2012 09:15
люди.подскажите как распаковать nsis инсталляторы?
Автор: Victor_VG
Дата сообщения: 06.12.2012 09:28
Habib2302

Два варианта - 7-Zip v4.65+ (т.е. от 4.65 и новее) или связка Far Manager + плагины Observer v1.8x или входящий в дистрибутив Far Manager v2.0.1807 STABLE или любой версии Far Manager 3.x плагин arclite - он основан на библиотеке 7z.dll из состава 7-Zip v9.xx, а потому умеет распаковывать и инсталляторы NSIS в том числе.

Выбирайте тот, вариант который Вам лично удобнее, но сразу говорю - NSIS скрипт ни одним распаковщиком полностью декомпилировать до уровня исходных текстов не удастся - причины я называл выше.
Автор: MikeZ
Дата сообщения: 11.12.2012 16:53
Здравствуйте!

Подскажите, как организовать вызов ф-ций из внешней dll.
Ф-ции есть 2 типов:
const char *GetStr(void)
INT64 GetInt(void)

т.е. ф-ции параметров не принимают, а возвращают значения: указатель на буфер и число int64.

Фишкой есть то, что память под буфер выделяется dll-кой.

Тупо в лоб
File /oname=Test.dll "Test.dll"
System::Call "Test::GetStr t.r0"
System::Call "Test::GetInt l.r1"

не получается.

Как правильно такие ф-ции заюзать?
Автор: kot280379
Дата сообщения: 12.12.2012 19:21
MikeZ

Код: System::Call "Test::GetStr(t.r0)"
Автор: Lex_from_Belarus
Дата сообщения: 14.12.2012 16:29
А кто-нибудь может подсказать код для определения запущена ли программа или нет, к которой идёт установка, например дополнений или обновлений, а так же код для определения куда установлена обновляемая программа. Что-то много всего перерыл, но так и не нашёл ответа.
Автор: Victor_VG
Дата сообщения: 14.12.2012 22:09
Lex_from_Belarus

[more=Легко]/*
**************************************************************
* ProcLib - procedure library for NSIS v2.11 *
**************************************************************

This library writing is VictorVG @ VikSoft.Ru, Russia, Moscow.
Writes is 12:20 02 Mar 2006, last updated at 02 Aug 2012 at 00:00

Please, write as ProcLib.nsh in to /$NSISDIR/Include dir and add in to script string !include ProcLib.nsh!
*/
!include "nsProcess.nsh"
!include "TextReplace.nsh"
!include "WordFunc.nsh"
!include "Registry.nsh"
!verbose 3
!verbose push
!ifndef _PROCLIB_VERBOSE
!define _PROCLIB_VERBOSE 3
!endif
!verbose ${_PROCLIB_VERBOSE}
!define PROCLIB_VERBOSE `!insertmacro _PROCLIB_VERBOSE`
!define SIDtU `!insertmacro StdInstDtU`
!define SIDtG `!insertmacro StdInstDtG`
!define SIDtI `!insertmacro StdInstDtI`
!define SIDtS `!insertmacro StdInstDtS`
!define TermProc `!insertmacro TermProc`
!define TrmPrc `!insertmacro TrmPrcc`
!define ErrDec `!insertmacro ErrDetCall`
!define PrDet `!insertmacro PrDetCall`
!define RplSet `!insertmacro ReplSeting`
!define MinVer `!insertmacro MinOSVer`
!define RngVer `!insertmacro RngOSVer`
!define PrcReg `!insertmacro PrcFndReg`
!define WriteEnvStr `!insertmacro WrtEnvStr`
!verbose pop
/*
;
Standard function templates for write new user defended functions.
;
!ifmacrondef CallMacroName ; Call'g macro
!macro CallMacroName [_PARAM1 ... _PARAMn]
; any code
Call CallFunctions
; any code
!macroend
!endif
!ifndef CallFunctName
    !define CallFunctName `!insertmacro CallMacroName`
Function CallFunctions ; internal function
; Function code
FunctionEnd
!endif
*/

!macro StdInstDtU
/*
Standart installer running detector for Update. $R1 == errolevel code is:
If standart installer not running $R1 == 0, then $R1 == 1
*/
Push $R0
${nsProcess::FindProcess} "setup.exe" $R0
StrCmp $R0 0 +8
${nsProcess::FindProcess} "install.exe" $R0
StrCmp $R0 0 +6
${nsProcess::FindProcess} "upgrade.exe" $R0
IntCmp $R0 0 +4
${nsProcess::FindProcess} "msiexec.exe" $R0
StrCmp $R0 0 +1 +4
StrCpy $R1 1
Goto +5
StrCmp $R0 603 +1 +4
StrCpy $R1 0
Goto +2
StrCpy $R1 $R0
Pop $R0
${nsProcess::Unload}
!macroEnd

!macro StdInstDtG
/*
Standart installer running detector for Upgrade. $R1 == errolevel code is:
If standart installer not running $R1 == 0, then $R1 == 1
*/
Push $R0
${nsProcess::FindProcess} "setup.exe" $R0
StrCmp $R0 0 +8
${nsProcess::FindProcess} "update.exe" $R0
StrCmp $R0 0 +6
${nsProcess::FindProcess} "install.exe" $R0
IntCmp $R0 0 +4
${nsProcess::FindProcess} "msiexec.exe" $R0
StrCmp $R0 0 +1 +4
StrCpy $R1 1
Goto +5
StrCmp $R0 603 +1 +4
StrCpy $R1 0
Goto +2
StrCpy $R1 $R0
Pop $R0
${nsProcess::Unload}
!macroEnd

!macro StdInstDtS
/*
Standart installer running detector for Setup. $R1 == errolevel code is:
If standart installer not running $R1 == 0, then $R1 == 1
*/
Push $R0
${nsProcess::FindProcess} "install.exe" $R0
StrCmp $R0 0 +8
${nsProcess::FindProcess} "update.exe" $R0
StrCmp $R0 0 +6
${nsProcess::FindProcess} "upgrade.exe" $R0
IntCmp $R0 0 +4
${nsProcess::FindProcess} "msiexec.exe" $R0
StrCmp $R0 0 +1 +4
StrCpy $R1 1
Goto +5
StrCmp $R0 603 +1 +4
StrCpy $R1 0
Goto +2
StrCpy $R1 $R0
Pop $R0
${nsProcess::Unload}
!macroEnd

!macro StdInstDtI
/*
Standart installer running detector for Install. $R1 == errolevel code is:
If standart installer not running $R1 == 0, then $R1 == 1
*/
Push $R0
${nsProcess::FindProcess} "setup.exe" $R0
StrCmp $R0 0 +8
${nsProcess::FindProcess} "update.exe" $R0
StrCmp $R0 0 +6
${nsProcess::FindProcess} "upgrade.exe" $R0
IntCmp $R0 0 +4
${nsProcess::FindProcess} "msiexec.exe" $R0
StrCmp $R0 0 +1 +4
StrCpy $R1 1
Goto +5
StrCmp $R0 603 +1 +4
StrCpy $R1 0
Goto +2
StrCpy $R1 $R0
Pop $R0
${nsProcess::Unload}
!macroEnd

!macro StdInstDtA
/*
Standart installer running detector for any name.
Output varuiables $R1 == errolevel code is:
If any standart installer not running $R1 == 0, then $R1 == 1
*/
Push $R0
${nsProcess::FindProcess} "install.exe" $R0
StrCmp $R0 0 +15
StrCmp $R0 603 +16 +20
${nsProcess::FindProcess} "setup.exe" $R0
StrCmp $R0 0 +12
StrCmp $R0 603 +13 +17
${nsProcess::FindProcess} "update.exe" $R0
StrCmp $R0 0 +9
StrCmp $R0 603 +10 +14
${nsProcess::FindProcess} "upgrade.exe" $R0
IntCmp $R0 0 +6
StrCmp $R0 603 +7 +11
${nsProcess::FindProcess} "msiexec.exe" $R0
StrCmp $R0 0 +2
StrCmp $R0 603 +4 +8
StrCpy $R1 1
Goto +2
StrCpy $R1 0
${nsProcess::Unload}
Goto +2
${ErrDec} $R0
Pop $R0
!macroEnd

!macro TermProc _PROCNAME _TXTFILE
/*
This macros is finde indicated process and kill it if running.
If needed, macros output error code on display. See ${NSISDIR}\Docs\nsProcess\readme.txt for details.

Parameters:

_PROCNAME full process name include extensions
_TXTFILE full diagnostics messages list file name include extensions
*/
Push $0
${nsProcess::FindProcess} _PROCNAME $0
StrCmp $0 603 +16
IntCmp $0 604 +11 +1 +11
StrCpy $0 0
${nsProcess::CloseProcess} _PROCNAME $0
IntCmp $0 603 +12 +1 +8
IntCmp $0 0 +11
StrCmp $0 602 +6 +1
StrCmp $LANGUAGE 1049 +2
MessageBox MB_ICONSTOP|MB_OK "Your don't have permission to terminate process _PROCNAME. Error code 601." IDOK +2
MessageBox MB_ICONSTOP|MB_OK "У Вас нет прав для удаления процесса _PROCNAME. Код ошибки 601." IDOK +1
Quit
StrCmp $LANGUAGE 1049 +2
MessageBox MB_ICONSTOP|MB_OK "System error $0. Setup terminated. See _TXTFILE for error code details." IDOK +2
MessageBox MB_ICONSTOP|MB_OK "Системная ошибка $0. Установка прервана. Расшифровку кодов ошибок смотрите в _TXTFILE." IDOK +1
Quit
${nsProcess::Unload}
Pop $0
!macroend

!macro TrmPrcc _PRCS
/*
This macros is finde indicated process and kill it if running.
If needed, macros output error messages on display.
Input parameters: _PRCS full process name include extensions.
*/
Push $0
${nsProcess::FindProcess} ${_PRCS} $0
StrCmp $0 0 +2
StrCmp $0 603 +9 +12
StrCmp $LANGUAGE 1049 +2
MessageBox MB_ICONQUESTION|MB_YESNO 'Waring! Process ${_PRCS} already runing.$\nPress "Yes" for terminate it or "No" for quit.' IDYES +4 IDNO +2
MessageBox MB_ICONQUESTION|MB_YESNO 'Внимание! Процесс ${_PRCS} запущен.$\nНажмите "Да" для его завершения или "Нет" для выхода.' IDYES +2 IDNO +1
Quit
${nsProcess::CloseProcess} ${_PRCS} $0
StrCmp $0 0 +2
StrCmp $0 603 +1 +5
${nsProcess::Unload}
Pop $0
Goto +65
StrCmp $0 601 +1 +7
StrCmp $LANGUAGE 1049 +4
StrCpy $1 "Your do not have permission to terminate process"
Goto +2
StrCpy $1 "У Вас нет права прекращения процессов"
Goto +55
StrCmp $1 602 +1 +7
StrCmp $LANGUAGE 1049 +4
StrCpy $1 "Not all processes terminated successfully"
Goto +2
StrCpy $1 "Не все процесы завершены успешно"
Goto +49
StrCmp $0 604 +1 +7
StrCmp $LANGUAGE 1049 +4
StrCpy $1 "Unable to identify system type"
Goto +2
StrCpy $1 "Не удалось определить тип системы"
Goto +43
StrCmp $0 605 +1 +7
StrCmp $LANGUAGE 1049 +4
StrCpy $1 "Unsupported OS"
Goto +2
StrCpy $1 "Не поддерживаемая ОС"
Goto +37
StrCmp $0 606 +1 +7
StrCmp $LANGUAGE 1049 +4
StrCpy $1 "Unable to load NTDLL.DLL"
Goto +2
StrCpy $1 "Ошибка загрузки NTDLL.DLL"
Goto +31
StrCmp $0 607 +1 +7
StrCmp $LANGUAGE 1049 +4
StrCpy $1 "Unable to get procedure address from NTDLL.DLL"
Goto +2
StrCpy $1 "Ошибка вызова процедуры из NTDLL.DLL"
Goto +25
StrCmp $0 608 +1 +7
StrCmp $LANGUAGE 1049 +4
StrCpy $1 "NtQuerySystemInformation failed"
Goto +2
StrCpy $1 "Ошибка вызова NtQuerySystemInformation"
Goto +19
StrCmp $0 609 +1 +7
StrCmp $LANGUAGE 1049 +4
StrCpy $1 "Unable to load KERNEL32.DLL"
Goto +2
StrCpy $1 "Ошибка загрузки KERNEL32.DLL"
Goto +13
StrCmp $0 610 +1 +7
StrCmp $LANGUAGE 1049 +4
StrCpy $1 "Unable to get procedure address from KERNEL32.DLL"
Goto +2
StrCpy $1 "Ошибка вызова процедуры из KERNEL32.DLL"
Goto +7
StrCmp $0 611 +1
StrCmp $LANGUAGE 1049 +4
StrCpy $1 "CreateToolhelp32Snapshot failed"
Goto +2
StrCpy $1 "Ошибка вызова CreateToolhelp32Snapshot"
StrCmp $LANGUAGE 1049 +2 +1
MessageBox MB_OK|MB_ICONEXCLAMATION "Waring! System error status is $0, $1 setup can't continue." IDOK +2
MessageBox MB_OK|MB_ICONEXCLAMATION "Внимание! Возникла системная ошибка $0, $1 установка прекращена." IDOK +1
Quit
!macroend

!macro ErrDetCall _ERRCODE
/*
${ErrDec} function for nsProcess error code decode and user alarm.
If Error Code detected this function generated user alarm and terminated
terminated current installation.
Usage ${ErrDec} $var
$var - input variable contaned analasing code.
*/
StrCpy $0 ${_ERRCODE}
StrCmp $0 601 +1 +7
StrCmp $LANGUAGE 1049 +4
StrCpy $1 "Your do not have permission to terminate process"
Goto +2
StrCpy $1 "У Вас нет права прекращения процессов"
Goto +55
StrCmp $1 602 +1 +7
StrCmp $LANGUAGE 1049 +4
StrCpy $1 "Not all processes terminated successfully"
Goto +2
StrCpy $1 "Не все процесы завершены успешно"
Goto +49
StrCmp $0 604 +1 +7
StrCmp $LANGUAGE 1049 +4
StrCpy $1 "Unable to identify system type"
Goto +2
StrCpy $1 "Не удалось определить тип системы"
Goto +43
StrCmp $0 605 +1 +7
StrCmp $LANGUAGE 1049 +4
StrCpy $1 "Unsupported OS"
Goto +2
StrCpy $1 "Не поддерживаемая ОС"
Goto +37
StrCmp $0 606 +1 +7
StrCmp $LANGUAGE 1049 +4
StrCpy $1 "Unable to load NTDLL.DLL"
Goto +2
StrCpy $1 "Ошибка загрузки NTDLL.DLL"
Goto +31
StrCmp $0 607 +1 +7
StrCmp $LANGUAGE 1049 +4
StrCpy $1 "Unable to get procedure address from NTDLL.DLL"
Goto +2
StrCpy $1 "Ошибка вызова процедуры из NTDLL.DLL"
Goto +25
StrCmp $0 608 +1 +7
StrCmp $LANGUAGE 1049 +4
StrCpy $1 "NtQuerySystemInformation failed"
Goto +2
StrCpy $1 "Ошибка вызова NtQuerySystemInformation"
Goto +19
StrCmp $0 609 +1 +7
StrCmp $LANGUAGE 1049 +4
StrCpy $1 "Unable to load KERNEL32.DLL"
Goto +2
StrCpy $1 "Ошибка загрузки KERNEL32.DLL"
Goto +13
StrCmp $0 610 +1 +7
StrCmp $LANGUAGE 1049 +4
StrCpy $1 "Unable to get procedure address from KERNEL32.DLL"
Goto +2
StrCpy $1 "Ошибка вызова процедуры из KERNEL32.DLL"
Goto +7
StrCmp $0 611 +1
StrCmp $LANGUAGE 1049 +4
StrCpy $1 "CreateToolhelp32Snapshot failed"
Goto +2
StrCpy $1 "Ошибка вызова CreateToolhelp32Snapshot"
StrCmp $LANGUAGE 1049 +2 +1
MessageBox MB_OK|MB_ICONEXCLAMATION "Waring! System error status is - $0, $1 setup can't continue." IDOK +2
MessageBox MB_OK|MB_ICONEXCLAMATION "Внимание! Возникла системная ошибка - $0, $1 установка прекращена." IDOK +1
Quit
!MacroEnd

/*
Function ${PrDet}. Detector if process is ruining.
Usage: ${PrDet} _ProcName _ReturnCode
_ProcName = full process name include extension
_ReturnCode =
is "0" if process not running
or "1" if process running
or Error Code if detected any system error.
All Error Code equivalents ${nsProcess:FindProcess} error code list.
*/
!macro PrDetCall _PRCNM _Erorl
${nsProcess::FindProcess} ${_PRCNM} $0
IntCmp $0 603 +4 +1 +6
StrCpy ${_Erorl} 1
Goto +5
StrCpy ${_Erorl} 0
Goto +2
StrCpy ${_Erorl} $0
!macroend

!macro ReplSeting _KEY _SKEY _VALUE _REGFI _REGFO _STR _ERR
/*
This macro is replace value in saved .REG-file using existing Registry value.
If macro detected error, then Error flags is set On, and returned error code.

Parameters:

_KEY HKCU|HKLM|HKCR... - root Registry key for find setting
_SKEY subkey for find setting
_VALUE value for find setting
_REGFI - input .REG-file
_REGFO - output .REG-file
_STR - replaced string value
_ERR - variable for output error

Examples:

${RplSet} HKCU "Software\Mysoft\ModuleDir\MyModule" "Value" "$INSTDIR\configdir\default.reg" "$INSTDIR\configdir\default.reg" "C:\\Program Files\\MyPogram\\SubDir\\ModuleDir\\Module.exe" $1

or

${RplSet} HKLM "Software\MyProg" "InstallDir" "$INSTDIR\configdir\default.reg" "$INSTDIR\configdir\default.reg" "C:\\Program Files\\MyProgram" $1

*/
Push $0
ReadRegStr $0 ${_KEY} "${_SKEY}" "${_VALUE}"
${WordReplace} "$0" "\" "\\" "+" $0
${textreplace::ReplaceInFile} "${_REGFI}" "${_REGFO}" "${_STR}" "$0" "/PO=0" ${_ERR}
IntCmp ${_ERR} "-1" +1 +1 +4
SetErrors
Goto +4
ClearErrors
StrCpy "${_ERR}" 0
Pop $0
!macroend

!macro MinOSVer _minver _retn
/*
This macro detected OS version, compared to _mimver and retuned "1" if OS version
equivalents or highest then _minver, or "0" if less in to users variables _retn

Parameters:

_minver - minimal version, two digits, example 51
_retn - user variables for returned results, exclude registers $0 and $1

Rescriptions:

Your can't use register $0 and $1 as _retn variables

Examples:

; added on to script header:

...
!include "ProcLib.nsh"
var s1
...

Section "Code"
...
${MinOSVer} 51 $s1
...
SectionEnd

*/
Push $0
Push $1
StrCpy ${_retn} 0
nsisos::osversion
StrCmp $0 "" +1 +2
StrCpy $0 0
StrCmp $1 "" +1 +2
StrCpy $1 0
StrCpy $0 $0$1
IntCmp $0 ${_minver} +1 +2
StrCpy ${_retn} 1
Pop $0
Pop $1
!macroend

!macro RngOSVer _minver _maxver _retn
/*
This macro gets the operating system version and service pack number, checks
whether it is in the range _minver and _maxver, and if the version of the
system with installed service pack number, located in the specified range,
it returns "1" in the variable _retn, in other cases it returns "0".

Parameters:

_minver - min version and service pack number, always free digits, example 510
_minver - max version and service pack number, always free digits, example 513
_retn - user variables for returned results, exclude registers $0 and $1

Notes: if any digit not existing You mast replace this symbol use "0" digit.

Rescriptions:

Your can't use register $0 - $1 as _retn variables

Examples:

!include "ProcLib.nsh"
var s1
...

Section "Code"
...
${RngOSVer} 500 619 $s1
...
SectionEnd
*/
Push $0
Push $1
StrCpy ${_retn} 0
Version::GetWindowsVersion
Pop $0
StrCmp $0 "" +1 +2
StrCpy $0 0
Pop $1
StrCmp $1 "" +1 +2
StrCpy $1 0
StrCpy $0 $0$1
Pop $1
Pop $1
Pop $1
StrCmp $1 "" +1 +2
StrCpy $1 0
StrCpy $1 $1 1 -1
StrCpy $0 $0$1
IntCmp $0 ${_maxver} +1 +1 +4
IntCmp $0 ${_minver} +1 +2
StrCpy ${_retn} 1
Pop $0
Pop $1
!macroend

!macro PrcFndReg _rkey1 _key1 _value1 _rkey2 _key2 _value2 _ofset _mode _retn
/*
This function detected and terminate any process use path saved in to Registry.

_rkey1 - Registry root key to checked programm full path
_key1 - Registry key to checked programm full path
_value1 - Registry value to checked programm full path
_rkey2 - Registry root key to checked programm path
_key2 - Registry key to checked programm path
_value2 - Registry value to checked programm path
_ofset - additional ofset if needed, if ofset can't needed mast be is 0
_mode - calling mode: if T - find and terminate process, else - only find
_retn - process detect code: if process currenly running is "running", else is "success"

Rescriptions:

Thsis macros used and restored registers $0, $1, $2, $3 and Your cann't use it as parameters.

Examples:

PrcFndReg HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\WinGimp-2.0_is1" \
"DisplayIcon" HKLM \
"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\WinGimp-2.0_is1" \
"InstallLocation" 0 $4
*/
Push $3
Push $2
Push $1
Push $0
ReadRegStr $3 ${_rkey1} ${_key1} ${_value1}
ReadRegStr $1 ${_rkey2} ${_key2} ${_value2}
StrLen $2 $1
IntOp $2 $2 + ${_ofset}
StrCpy $3 $3 "" $2
StrCpy ${_retn} "running"
${nsProcess::FindProcess} $3 $2
IntCmp $2 604 +14 +1 +14
StrCmp $2 0 +2
StrCpy ${_retn} "success"
StrCmp ${_mode} "T" +1 +6
StrCmp ${_retn} "success" +5
${nsProcess::CloseProcess} $3 $2
IntCmp $2 603 +1 +1 +8
StrCpy ${_retn} "success"
Pop $0
Pop $1
Pop $2
Pop $3
Goto +65
StrCmp $2 601 +1 +7
StrCmp $LANGUAGE 1049 +4
StrCpy $1 "Your do not have permission to terminate process"
Goto +2
StrCpy $1 "У Вас нет права прекращения процессов"
Goto +55
StrCmp $1 602 +1 +7
StrCmp $LANGUAGE 1049 +4
StrCpy $1 "Not all processes terminated successfully"
Goto +2
StrCpy $1 "Не все процесы завершены успешно"
Goto +49
StrCmp $2 604 +1 +7
StrCmp $LANGUAGE 1049 +4
StrCpy $1 "Unable to identify system type"
Goto +2
StrCpy $1 "Не удалось определить тип системы"
Goto +43
StrCmp $2 605 +1 +7
StrCmp $LANGUAGE 1049 +4
StrCpy $1 "Unsupported OS"
Goto +2
StrCpy $1 "Не поддерживаемая ОС"
Goto +37
StrCmp $2 606 +1 +7
StrCmp $LANGUAGE 1049 +4
StrCpy $1 "Unable to load NTDLL.DLL"
Goto +2
StrCpy $1 "Ошибка загрузки NTDLL.DLL"
Goto +31
StrCmp $2 607 +1 +7
StrCmp $LANGUAGE 1049 +4
StrCpy $1 "Unable to get procedure address from NTDLL.DLL"
Goto +2
StrCpy $1 "Ошибка вызова процедуры из NTDLL.DLL"
Goto +25
StrCmp $2 608 +1 +7
StrCmp $LANGUAGE 1049 +4
StrCpy $1 "NtQuerySystemInformation failed"
Goto +2
StrCpy $1 "Ошибка вызова NtQuerySystemInformation"
Goto +19
StrCmp $2 609 +1 +7
StrCmp $LANGUAGE 1049 +4
StrCpy $1 "Unable to load KERNEL32.DLL"
Goto +2
StrCpy $1 "Ошибка загрузки KERNEL32.DLL"
Goto +13
StrCmp $2 610 +1 +7
StrCmp $LANGUAGE 1049 +4
StrCpy $1 "Unable to get procedure address from KERNEL32.DLL"
Goto +2
StrCpy $1 "Ошибка вызова процедуры из KERNEL32.DLL"
Goto +7
StrCmp $2 611 +1
StrCmp $LANGUAGE 1049 +4
StrCpy $1 "CreateToolhelp32Snapshot failed"
Goto +2
StrCpy $1 "Ошибка вызова CreateToolhelp32Snapshot"
StrCmp $LANGUAGE 1049 +2 +1
MessageBox MB_OK|MB_ICONEXCLAMATION "Waring! System error status is - $2, $1 setup can't continue." IDOK +2
MessageBox MB_OK|MB_ICONEXCLAMATION "Внимание! Возникла системная ошибка - $2, $1 установка прекращена." IDOK +1
Quit
!macroend

!macro WrtEnvStr _HKR _Key _ValueName _Value _Sep
/*
This function detected existing enveronment variables and appen it or create new enveronment variables record if needed.

Parameters:

_HKR - Registry root key for variable
_Key - Registry key for variable
_ValueName - Registry value for variable
_Value - variable value
_Sep - value separator. If _Sep not used, then _Sep mast be defined as "".

Examples:

WrtEnvStr HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "CYGWIN" "nodosfilewarning" " "
*/
Push $1
Push $0
ClearErrors
ReadEnvStr $0 ${_ValueName}
StrCmp $0 "" +1 +4
WriteRegStr ${_HKR} "${_Key}" "${_ValueName}" "${_Value}"
Goto +5
${WordFind} $0 "${_ValueName}" "#" $1
StrCmp $1 0 +1 +2
${registry::WriteExtra} "${_HKR}\${_Key}" "${_ValueName}" "${_Sep}${_Value}" $1
Pop $0
Pop $1
!macroend[/more] - я для этого в своё время даже кусок в ProcLib вставил который именно это дело и ловит. [more=Инструкция] **************************************************************
* ProcLib - process management tools library for NSIS v2.xx *
**************************************************************

This library writing is VictorVG @ VikSoft.Ru, Russia, Moscow.
Writes is 12:20 02 Mar 2006, updated to v2.6 at 06 May 2010 at 09:55
---------------------------------------------------------------------

Required:

Before use ProcLib please, insert command into header in to Your script:

!include "ProcLib.nsh"

NOTES:

Before use ProcLib.nsh in to Your project script, Your mast always
remove directive !include "nsProcess.nsh" then this directive already
included on "ProcLib.nsh" for prevent compilation stop and generation
"Duplicate !include "nsProcess.nsh"." error messages.

In to ProcLib.nsh v.2.0 added standard template for write user factions.

ProcLib.nsh provided is flowing macros and functions:

Old functions:
==============

SIDtU, SIDtG, SIDtI, SIDtS
--------------------------

Standard installer running detector:

SIDtU - is standart installer running filter-detector for use on Update.
SIDtG - is standart installer running filter-detector for use on Upgrade.
SIDtI - is standart installer running filter-detector for use on Setup.
SIDtS - is standart installer running filter-detector for use on Install.

All this macro returned status
code on register $R1 if checked process is:

not running - 0
running - 1

Usage:

${SIDtU} or ${SetDetU} or ${SIDtG} or ${SetDetG} or ${SIDtI}
or ${SetDetI} or ${SIDtS} or ${SetDetS}

NOTES:

If this macro use in .onInit function, then this macros mast write in
to starting block on this function!

This macros can use .onInit function or main program.

TermProc
--------

This macros is find selected process and kill it if running. Macros
display system error code is use standart messages box and terminated
install procedure:

601 No permission to terminate process
602 Not all processes terminated successfully
604 Unable to identify system type
605 Unsupported OS
606 Unable to load NTDLL.DLL
607 Unable to get procedure address from NTDLL.DLL
608 NtQuerySystemInformation failed
609 Unable to load KERNEL32.DLL
610 Unable to get procedure address from KERNEL32.DLL
611 CreateToolhelp32Snapshot failed

If macro is the display a system error code you owe:

601 - Please, contact Your system administrator - Your don't have
right for terminate this process;
602 - Please, use Task Manager or equivalents tool for handled
terminate all running copy on this process and restart Setup.
on 604 up to 611 - Please, contact Your system administrator or
operating system engineer for correct this system error.

Usage: ${TermProc} _PROCNAME _TXTFILE

Parameters:

_PROCNAME full process name include extensions
_TXTFILE full diagnostics messages list file name include extensions


This macros can use .onInit function or main program.

TrmPrc
------

This macros is find indicated process and kill it if running. If
needed, macros output error messages on display use ErrDcd function.
This macro required only one parameter: "_PRCNM" - full process
executable file name include extensions. Messages languages is only
English and Russian.

NOTES:

If Your use ${SetDet} function at .onInit/.unInit function, I recommended
write this function in to starting block on .onInit/.unInit function!

Usage: ${TrmPrc} _PRCNM,

Parameter:

_PRCNM - process executable name include extension.

This macros can use .onInit function or main program.

ErrDec
------

${ErrDec} is function for nsProcess error code decode and user alarm.
If Error Code detected this function generated user alarm and
terminated terminated current installation.

Usage: ${ErrDec} _var

Parameters:

_var - input variable contaned analasing code.

This function can use .onInit/.unInit function or main program.

PrDet
-----

Function ${PrDet}. Detector if checked process is ruining.

Usage: ${PrDet} _ProcName _ReturnCode

Parameters:

_ProcName - full process name include extension
_ReturnCode - is "0" if process not running or "1" if process running
or Error Code if detected any system error.

All Error Code equivalents ${nsProcess:FindProcess} error code list.


RplSet
------

This function is replace value in saved .REG-file using existing Registry value.
If function is detected error, then Error flags is set On, and returned error code.

Usage: ${RplSet} KEY _SKEY _VALUE _REGFI _REGFO _STR _ERR

Parameters:

_KEY HKCU|HKLM|HKCR... - root Registry key for find setting
_SKEY subkey for find setting
_VALUE value for find setting
_REGFI - input .REG-file
_REGFO - output .REG-file
_STR - replaced string value
_ERR - variable for output error

Examples:

${RplSet} HKCU "Software\Mysoft\ModuleDir\MyModule" "Value" "$INSTDIR\configdir\default.reg" \
"$INSTDIR\configdir\default.reg" "C:\\Program Files\\MyPogram\\SubDir\\ModuleDir\\Module.exe" $1

or

${RplSet} HKLM "Software\MyProg" "InstallDir" "$INSTDIR\configdir\default.reg" \
"$INSTDIR\configdir\default.reg" "C:\\Program Files\\MyProgram" $1


MinVer
------

This function is simply detected OS version, compared to _mimver and returned "1"
if OS version eqvalents or highest then requiremens, or "0" if letter in to users
variables _retn

Usage: ${MinVer} _minver _retn

Parameters:

_minver - minimal version, two digits, example 51
_retn - user variables for returned results, exclude registers $R0 - $R2

Rescriptions:

Your can't use register $R0 - $R2 as _retn variables

Examples:

; added on to script header:

...
!include "ProcLib.nsh"
var s1
...

Section "Code"
...
${MinVer} 51 $s1
...
SectionEnd

RngVer
------

This functions gets the operating system version and service pack number,
checks whether it is in the range _minver and _maxver, and if the version
of the system with installed service pack number, located in the specified
range, it returns "1" in the variable _retn, in other cases it returns "0".

Usage: ${RngVer} _minver _maxver _retn

Parameters:

_minver - min version and service pack number, always free digits, example 510
_minver - max version and service pack number, always free digits, example 513
_retn - user variables for returned results, exclude registers $0 and $1

Notes: if any digits not existing You mast replace this symbol use "0" digit.

Rescriptions:

Your can't use register $0 - $1 as _retn variables

Examples:

var s1

...

${RngVer} 501 513 $s1

; added on to script header:

...
!include "ProcLib.nsh"
var s1
...

Section "Code"
...
${RngVer} 500 619 $s1
...
SectionEnd

Detect OS version and service pack number then check that OS is Windows 2000 or
Windows XP/2003, or Windows Vista/2008, or Windows 7/2008 R2 and return "1" if
true. Else this function returned "0" if comparison is failure.

PrcReg
------

This function detected and terminate any process use path saved in to Registry.

Usage: ${PrcFndReg} _rkey1 _key1 _value1 _rkey2 _key2 _value2 _ofset _mode _retn

Parameters:

_rkey1 - Registry root key to checked programm full path
_key1 - Registry key to checked programm full path
_value1 - Registry value to checked programm full path
_rkey2 - Registry root key to checked programm path
_key2 - Registry key to checked programm path
_value2 - Registry value to checked programm path
_ofset - additional ofset if needed, if ofset can't needed mast be is 0
_mode - calling mode: if T - find and terminate process, else - only find
_retn - process detect code: if process currenly running is "running", else is "success"

Rescriptions:

Thsis macros used and restored registers $0, $1, $2, $3 and Your cann't use it as parameters.

Examples:

PrcFndReg HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\WinGimp-2.0_is1" \
"DisplayIcon" HKLM \
"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\WinGimp-2.0_is1" \
"InstallLocation" 0 $4

WriteEnvStr
-----------

This function detected existing enveronment variables and appen it or create new enveronment
variables record if needed.

Usage: ${WriteEnvStr} _HKR _Key _ValueName _Value _Sep

Parameters:

_HKR - Registry root key for variable
_Key - Registry key for variable
_ValueName - Registry value for variable
_Value - variable value
_Sep - value separator. If _Sep not used, then _Sep mast be defined as "".

Examples:

WrtEnvStr HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" \
"CYGWIN" "nodosfilewarning" " " $R0[/more] по применению библиотеки ProcLib.nsh. Только рекомендую заменить стандартные стубы на специальные с поддержкой строк длинной до 8К чтобы проблем не вылезло. Что до пути к установке - [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall] и там же [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths] - обычно все инсталляторы туда пишут пути к каталогу установки. Или ищите ключи Реестра по имени программы либо производителю.
Автор: Lex_from_Belarus
Дата сообщения: 16.12.2012 09:19

Цитата:
Lex_from_Belarus   Легко - я для этого в своё время даже кусок в ProcLib вставил который именно это дело и ловит. Инструкция по применению библиотеки ProcLib.nsh. Только рекомендую заменить стандартные стубы на специальные с поддержкой строк длинной до 8К чтобы проблем не вылезло. Что до пути к установке - [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall] и там же [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths] - обычно все инсталляторы туда пишут пути к каталогу установки. Или ищите ключи Реестра по имени программы либо производителю.

ох, чёрт побери, фиг я тут разберусь, думал есть полегче способ
Автор: zertyuiop
Дата сообщения: 16.12.2012 10:59
Редактор скриптов Venis: Ссылка

Ключ ищите на этой же странице

Добавлено:
Русиикация меню + улучшенный русский в инсталляторах от Polesoft: #

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364

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


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