Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.
хочу снять защиту notepad.exe на XP для замены на свой »
Дык и снимай тогда защиту (если включена) с Notepad.exe и заменяй файл на свой. Заменяют обычно в c:\windows\system32\dllcache , в
c:\windows\system32 , в C:\WINDOWS\ServicePackFiles\i386 и в c:\windows - опять же, по обстановке.
Отключить защиту ( на время замены) можно в реестре :
поменять значение [HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Winlogon] "SfcDisable"
на "dword:ffffff9d".
Для того чтобы включить его обратно, этот же ключ надо изменить на 0.
Защита отключится только после перезагрузки, которую надо организовать в скрипте.
Защищён ли файл , можно проверить с помощью функции SfcIsFileProtected - как то так :
System::Call "sfc::SfcIsFileProtected(i 0, w R4) i.R0"
каллбак в $R0 - если 0 - файл незащищен
Также повсеместно предлагают для этого батник http://geekswithblogs.net/robz/archive/2008/09/13/replacing-notepad-with-notepad2-on-windows-xp-sp3.aspx
Так гласит Гугл. :)
хотелось бы без перезагрузки, причем такая возможность есть: »
То что ты написал - никаким боком "не возможность"...
Теоретически можно , как описано здесь : http://xaknotdie.org/22h/5/11.html
в разделе "Отключение Windows File Protection на лету"
Только гемор это ещё тот. Не проще ли один раз перезагрузиться ? Или блокнот предполагается менять ежедневно ? :)
в NSIS нельзя слить arc и exe как в Inno Setup ? :dont-know
Чтобы не копировать куда-то перед распаковкой.
Завершить все процессы в данный момент использующие библиотеку dll не используя утилиту taskkill, то есть силами самого NSIS »
Сделать это можно, но как уже говорилось, сложно в NSIS. Почитай как это делается в принципе :
http://www.transl-gunsmoker.ru/2012/02/blog-post_18.html
http://www.transl-gunsmoker.ru/2012/02/blog-post_19.html
Может быть когда нибудь, какой добрый программер и реализует это для NSIS... Готовых решений - похоже нет.
kotkovets
13-10-2013, 23:23
Обновленный winver2.nsh (http://forum.oszone.net/post-2533558-1712.html)
1. Исправлена определение редакции в win7
2. Добавлена поддержка win8 и win8.1
в определение редакции операционной системы добавлены сл. значения:
${WinType} $var
$var = Windows 8
$var = Windows 8 N
$var = Windows 8 China
$var = Windows 8 Single Language
редакция Core: $var = Windows 8 - так официально задокументировано.
;;;
;;;
в определении названия ОС добавлены сл. значения:
${WinName} $var
$var = Win8
$var = Win8.1
$var = Server 2012
$var = Server 2012 R2
---
как пользоваться, подробно читаем в справке по NSIS - ссылка в шапке
Как пользоваться читаем в нашем справочнике.
Limonica
14-10-2013, 15:15
А Server 2012 R2 ? :(
Тестируем, отписываемся о работе.. »
На Win8 x86, Win8.1 x64 Win8.1 x86 пробовал, все было гладко :)
kotkovets
14-10-2013, 19:11
А Server 2012 R2 ? »
ну можно всего лишь так подправить, добавить, где происходит определение "Win8.1" - R2:
${If} $0 == 6 ;MajorVersion
${AndIf} $1 == 3 ;MinorVersion
${If} $8 == ${VER_NT_WORKSTATION}
Push "Win8.1"
${Else}
Push "Server 2012 R2"
${EndIf}
kotkovets, подскажи пожалуйста, можно ли средствами NSIS определить семейство процессора машины AMD или Intel. (вот как идет определение ОС)
определить семейство процессора машины AMD или Intel »
http://nsis.sourceforge.net/CPUFeatures_plug-in
MKN, спасибо, но есть еще один вопрос, в описании пишет:
${CPUFeatures.GetVendor} out_var
Result: "Intel", "AMD" or "Other"
Но в ходе выполнения скрипта результат вместо "Intel" просто буква "I" это возможно поправить как то?
Проблема решена, плаг не той кодировки скинул в папку.
Вот код может кому пригодится:
!include "LogicLib.nsh" - первым делом
!include "CPUFeatures.nsh"
${CPUFeatures.GetFlags} $0
${CPUFeatures.GetCount} $0
DetailPrint "CPU Count: $0"
${CPUFeatures.GetVendor} $1
DetailPrint "CPU Vendor: $1"
MessageBox MB_OK "У вас установлен $0-ядерный процессор $1."
${If} ${CPUIsIntel}
MessageBox MB_OK "Інтел проц."
${EndIf}
${If} ${CPUIsAMD}
MessageBox MB_OK "Амд проц."
${EndIf}
Хедер ToolTips
Как и что - видно из примера :
!AddIncludeDir .
!include "ToolTips.nsh"
OutFile "ToolTips_test.exe"
InstallDir "$TEMP"
;Текст на кнопке
MiscButtonText "" "" "" "Готово"
!include "MUI2.nsh"
!define MUI_CUSTOMFUNCTION_GUIINIT onGUIInit
!define MUI_PAGE_CUSTOMFUNCTION_SHOW DirShow
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"
Section
${SetCtlToolTips} $mui.Button.Next $R0 "Нажмите для выхода"
SectionEnd
Function DirShow
${CreateBalloonToolTip} $mui.DirectoryPage $0
${SetCtlToolTips} $mui.DirectoryPage.BrowseButton $0 "Нажмите для выбора папки"
${SetCtlToolTips} $mui.DirectoryPage.Directory $0 "Путь установки"
SendMessage $0 ${TTM_SETTITLE} ${TTI_INFO} "STR:Заголовок сообщения-подсказки"
FunctionEnd
Function onGUIInit
${CreateToolTip} $HWNDPARENT $R0
${SetCtlToolTips} $mui.Button.Cancel $R0 "Нажмите для отмены установки"
${SetCtlToolTips} $mui.Button.Next $R0 "Нажмите для продолжения установки"
FunctionEnd
alexfinik
18-10-2013, 19:20
Друзья, ситуация такая:
!include nsDialogs.nsh
!include LogicLib.nsh
!include zipdll.nsh
!include MUI2.nsh
!include NSISArray.nsh
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE English
Name "Формирование установочных файлов -"
OutFile testik.exe
XPStyle on
Var Dialog
Var Label1
Var Label2
Page custom Test0 Test0Leave
Page custom Test1 Test1Leave
Page custom Test2 Test2Leave
Page instfiles
Function Test0
nsDialogs::Create 1018
Pop $Dialog
${If} $Dialog == error
Abort
${EndIf}
${NSD_CreateLabel} 0 0 100% 12u "Тестирование №0"
Pop $Label1
${NSD_CreateLabel} 0 13u 100% 12u "Задаем количество менеджерских"
Pop $Label2
${NSD_CreateText} 0 25u 100% 13u "1"
Pop $R4
nsDialogs::Show
FunctionEnd
Function Test0Leave
${NSD_GetText} $R4 $R4
MessageBox MB_OK "R4=$R4" ;выдает R4=1
FunctionEnd
Function Test1
nsDialogs::Create 1018
Pop $Dialog
${If} $Dialog == error
Abort
${EndIf}
nsDialogs::Show
FunctionEnd
Function Test1Leave
${NSD_GetText} $R4 $R4
FunctionEnd
Function Test2
nsDialogs::Create 1018
Pop $Dialog
${If} $Dialog == error
Abort
${EndIf}
nsDialogs::Show
FunctionEnd
Function Test2Leave
${NSD_GetText} $R4 $R4
MessageBox MB_OK "R4=$R4" ;выдает R4=
FunctionEnd
Section
SectionEnd
Не знаю как сделать, чтобы переменная выдавала R4=1 в функции Test2Leave
Если Function .onInit поместить впереди всех секций, то невозможно будет из него управлять флагами секций, а если после всех секций, то при запуске установщика идет какая-то распаковка файлов. Так и должно быть ? :dont-know
http://4put.ru/pictures/max/756/2323109.jpg
kotkovets
19-10-2013, 20:29
Function .onInit поместить впереди всех секций, то невозможно будет из него управлять флагами секций »
при таком раскладе (управлять флагами секций) -> Function .onInit поместить ПОСЛЕ всех секций.
Это нужно для компилятора NSIS - время когда создается проект.
при таком раскладе (управлять флагами секций) -> Function .onInit поместить ПОСЛЕ всех секций. »
это уже понял, мне больше интересует распаковка данных, которое не было раньше (до перемещения Function .onInit после секций) или это может быть связано с увеличением размера словаря компрессора до 128 мб ?
icq99999999
20-10-2013, 11:34
рядом с exe лежит ini в зависимости от значения в нём нужно выполнить разные действия
например в секции "setup" параметр "user" значение "q"
нужно выполнить
Rename $INSTDIR\P.dll $INSTDIR\rbp.dll
например в секции "setup" параметр "user" значение "w"
нужно выполнить
Rename $INSTDIR\E.dll $INSTDIR\rbe.dll
icq99999999, в справочнике, что в шапке, описано, как работать с ini файлами
ReadINIStr $0 "$EXEDIR\что-то.ini" "setup" "user"
${If} $0 == q
Rename $INSTDIR\P.dll $INSTDIR\rbp.dll
${ElseIf} $0 == w
Rename $INSTDIR\E.dll $INSTDIR\rbe.dll
${EndIf}
kotkovets
20-10-2013, 15:42
или это может быть связано с увеличением размера словаря компрессора до 128 мб »
легко..
icq99999999
20-10-2013, 20:58
почему нельзя Два раза проверять файлы?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.