Войти

Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 [30] 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146

MKN
11-10-2013, 17:30
хочу снять защиту 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
Так гласит Гугл. :)

MKN
11-10-2013, 17:52
хотелось бы без перезагрузки, причем такая возможность есть: »
То что ты написал - никаким боком "не возможность"...
Теоретически можно , как описано здесь : http://xaknotdie.org/22h/5/11.html
в разделе "Отключение Windows File Protection на лету"
Только гемор это ещё тот. Не проще ли один раз перезагрузиться ? Или блокнот предполагается менять ежедневно ? :)

vahe-91
11-10-2013, 20:45
в NSIS нельзя слить arc и exe как в Inno Setup ? :dont-know
Чтобы не копировать куда-то перед распаковкой.

MKN
12-10-2013, 13:36
Завершить все процессы в данный момент использующие библиотеку 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 ? :(

vahe-91
14-10-2013, 15:25
Тестируем, отписываемся о работе.. »
На 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}

diakov
15-10-2013, 09:22
kotkovets, подскажи пожалуйста, можно ли средствами NSIS определить семейство процессора машины AMD или Intel. (вот как идет определение ОС)

MKN
15-10-2013, 09:31
определить семейство процессора машины AMD или Intel »
http://nsis.sourceforge.net/CPUFeatures_plug-in

diakov
15-10-2013, 10:07
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}

MKN
16-10-2013, 15:51
Хедер 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

vahe-91
19-10-2013, 19:04
Если Function .onInit поместить впереди всех секций, то невозможно будет из него управлять флагами секций, а если после всех секций, то при запуске установщика идет какая-то распаковка файлов. Так и должно быть ? :dont-know
http://4put.ru/pictures/max/756/2323109.jpg

kotkovets
19-10-2013, 20:29
Function .onInit поместить впереди всех секций, то невозможно будет из него управлять флагами секций »
при таком раскладе (управлять флагами секций) -> Function .onInit поместить ПОСЛЕ всех секций.
Это нужно для компилятора NSIS - время когда создается проект.

vahe-91
19-10-2013, 20:32
при таком раскладе (управлять флагами секций) -> 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

vahe-91
20-10-2013, 13:42
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