Войти

Показать полную графическую версию : .: 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

f0r_ce
14-08-2019, 14:57
Привет, есть задача научить запускать скомпилированный exe nsis'ом только при наличии параметра, то есть:

Installer.exe -start - установщик запускается как положенно.
Installer.exe - без параметра, запуска не происходит.

Каким образом можно реализовать?

Begin2Fly
14-08-2019, 15:09
Привет, есть задача научить запускать скомпилированный exe nsis'ом только при наличии параметра »

Получаем параметры, ищем -start. Если есть, работаем, иначе завершение приложение.

${GetParameters} $CMDLINE
ClearErrors
${GetOptions} $CMDLINE "-start" $1
${IfNot} ${Errors}
MessageBox MB_OK "Параметр -start получен"
${Else}
Quit ; иначе - завершение приложения
${EndIf}

f0r_ce
14-08-2019, 19:10
Begin2Fly, благодарю, есть так же задача научить запускать скомпилированный exe nsis'ом только при определенном имени exe:

имя Installer.exe - запускается в обычном режиме
имя отличное от Installer.exe - завершаться

Каким образом можно реализовать?

Begin2Fly
14-08-2019, 19:15
${If} $EXEFILE == "Installer.exe"
MessageBox MB_OK "Обычный режим"
${Else}
Quit
${EndIf}

динозавра
15-08-2019, 08:23
Друзья, нужна помощь. Состряпал для эксперимента экзешник.
Как запустить установленный батник?
Вот код
!define PRODUCT_NAME "PRODUCT"
Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "setup.exe"
InstallDir "C:\Program Files\Proga"
Icon "icon.ico"
SilentInstall silent
!define RUN "C:\Program Files\Proga\1.bat"
Section "MainSection" SEC01
SetOutPath "C:\Program Files\Proga"
SetOverwrite on
File "..\1.bat"
SectionEnd
Section -Post
SectionEnd

Все, разобрался.
Exec '"$INSTDIR\1.bat"'

Теперь другая проблема. Как прописать, чтобы окошко батника не промилькивало?

MKN
17-08-2019, 11:56
обновился NSIS Dialog Designer
v.1.4.4 - 2019-08-01
FIX: Removed decimals from control coordinates in generated NSIS script.

Как прописать, чтобы окошко батника не промилькивало? »
почитай, к примеру https://stackoverflow.com/questions/45500072/run-a-batch-file-silentily-in-nsis

iglezz
18-08-2019, 14:15
Теперь другая проблема. Как прописать, чтобы окошко батника не промилькивало? »
nsExec::Exec '"$INSTDIR\1.bat"'

динозавра
18-08-2019, 16:23
iglezz,
Спасибо, все красиво и не мелькает.. А то я уже через .vbs слепил.

динозавра
21-08-2019, 06:47
Друзья, У меня опять супер проблема. Ну никак не работает удаление файла из папки System32 на Вин х64.
Уже пишу такое и никак:

!include "x64.nsh"
Section
Delete "$WINDIR\System32\1.txt
Delete "$SYSDIR\1.txt
Delete "C:\Windows\System32\1.txt"
SectionEnd

Но если я подсовываю 1.txt в SysWOW64 то оттуда удаляет. Что я делаю не так?

Begin2Fly
21-08-2019, 11:01
${DisableX64FSRedirection}

динозавра
22-08-2019, 05:34
Begin2Fly,
Спасибо.
Еще чуток лет и я постигну азы NSIS.

И еще вопрос, в NSIS есть такое, чтобы MessageBox было без MB_YESNO и т.д, а чтобы окошко показывалось, к примеру с моей фразой нужное количество секунд?

И, где вы берете все эти коды? Ведь в справке их нет.

iglezz
22-08-2019, 10:28
И, где вы берете все эти коды? Ведь в справке их нет. »
1. помимо справки полезно изучить содержимое каталога nsis:
Include\ содержит заголовочные файлы (.nsh), подключаемые через !include. Многие хорошо документированы
Examples\ -- примеры к nsh и плагинам
Docs\ -- документы к nsh и плагинам

2. https://nsis.sourceforge.io/Developer_Center -- дополнительные плагины, примеры

И еще вопрос, в NSIS есть такое, чтобы MessageBox было без MB_YESNO и т.д, а чтобы окошко показывалось, к примеру с моей фразой нужное количество секунд? »
Если совсем без кнопок и с таймером -- есть в базовой поставке плагин Banner

А вот пример MessageBox с таймаутом:
Name "MessageBoxTimeout"

OutFile "MessageBoxTimeout.exe"

RequestExecutionLevel user

Page instfiles

Section ""
SectionEnd

; заголовок
Var MsgBoxTitle
; текст
Var MsgBoxText
; таймаут в милисекундах
Var MsgBoxTimeout
; параметр uType (комбинация значений)
; https://docs.microsoft.com/ru-ru/windows/win32/api/winuser/nf-winuser-messageboxa
Var MsgBoxParams

Function .onInit
StrCpy $MsgBoxTimeout 3500 ; время в милисекундах
StrCpy $MsgBoxTitle "MessageBoxTimeoutA func test"
StrCpy $MsgBoxText "Timeout set to $MsgBoxTimeout msec."
StrCpy $MsgBoxParams 0x00001000 ; MB_SYSTEMMODAL
IntOp $MsgBoxParams $MsgBoxParams | 0x00010000 ; MB_SETFOREGROUND
IntOp $MsgBoxParams $MsgBoxParams | 0x00000030 ; MB_ICONEXCLAMATION
IntOp $MsgBoxParams $MsgBoxParams | 0x00000004 ; MB_YESNO

System::Call "user32::MessageBoxTimeoutA(p $HWNDPARENT, t '$MsgBoxText', t '$MsgBoxTitle', i $MsgBoxParams, i 0, i $MsgBoxTimeout)i.s"
Pop $0
MessageBox MB_OK|MB_ICONINFORMATION "result = $0"
Quit
FunctionEnd

MKN
22-08-2019, 13:15
чтобы MessageBox было без MB_YESNO и т.д, а чтобы окошко показывалось, к примеру с моей фразой нужное количество секунд? »
Кнопочку для закрытия сообщения всё же лучше оставить (может пользователь быстро прочёл, либо вовсе не желает читатать сообщение...)
Пример попроще(суть та же, что и выше) :

OutFile "MsgBoxTimeoutTest.exe"
!define MsgBoxTimeout "!insertmacro macro__MsgBoxTimeout"
!macro macro__MsgBoxTimeout text caption_text time
System::Call "user32::MessageBoxTimeout(i$HWNDPARENT, t`${text}`, t`${caption_text}`,i0,i0, i${time})"
!macroend
Section
${MsgBoxTimeout} "Сообщение закроется через 2 секунды" "MessageBoxTimeout" 2000
SectionEnd

помимо справки полезно изучить содержимое каталога nsis »
А также просмотреть тему. Всё, что динозавра спрашивал уже было рассмотрено.

динозавра
23-08-2019, 07:35
Всем привет.
Вот, что у меня получилось.

!define NAME "Registry cleaning"

VIProductVersion "0.0.0.1"
VIAddVersionKey "LegalCopyright" "© Lbyjpfdh"
VIAddVersionKey "FileVersion" "0.1"
VIAddVersionKey "FileDescription" "Cleaning and editing the registry"
VIAddVersionKey "ProductName" "For version Total Uninstall 6.27.0.565"
VIAddVersionKey "ProductVersion" "0.0.0.1"

Name "${NAME}"
Caption "${NAME}"
OutFile "Cleaning and editing the registry.exe"
InstallDir "$TEMP"
Icon "icon.ico"

!include x64.nsh
!include "FileFunc.nsh"
!include "LogicLib.nsh"

SilentInstall silent
SetCompress off

Section
SetOutPath "$TEMP"
SetOverwrite on
File "..\..\..\..\install\Registry cleaning.exe"
File "..\..\..\..\install\TrashRegFull.exe"
File "..\..\..\..\install\TrashRegX64Full.exe"
File "..\..\..\..\install\ACL.TXT"
File "..\..\..\..\install\ACLL.TXT"
File "..\f.bat"
Delete "$APPDATA\mntemp"
Delete "$WINDIR\System32\linjqbyk.kfl"
Delete "$SYSDIR\linjqbyk.kfl"
Delete "$WINDIR\SysWOW64\linjqbyk.kfl"
SectionEnd

Section
${DisableX64FSRedirection}
Delete "$WINDIR\System32\linjqbyk.kfl"
Delete "$SYSDIR\linjqbyk.kfl"
SectionEnd

Function .onInit
System::Call "kernel32::GetUserDefaultLCID() i.r0"
IntOp $LANGUAGE $0 & 0xFFFF
IntFmt $0 "%04X" $0
FunctionEnd

Section
${If} $0 = 0419
MessageBox MB_YESNO|MB_TOPMOST|MB_USERICON "Хотие очистить реестр от триальных ключей?" IDYES a IDNO b
Abort
a:
Exec '"$INSTDIR\Registry cleaning.exe"'
nsExec::Exec '"$INSTDIR\f.bat"'
MessageBox MB_OK|MB_TOPMOST|MB_USERICON "Реестр от триальных ключей очищен."
b:
Delete "$INSTDIR\*.*"
Abort
MessageBox MB_OK|MB_TOPMOST|MB_USERICON "Реестр от триальных ключей очищен."
Delete "$INSTDIR\*.*"
${EndIf}
${If} $0 != 0419
MessageBox MB_YESNO|MB_TOPMOST|MB_USERICON "Wanting to clear the registry of trial keys?" IDYES c IDNO d
Abort
c:
Exec '"$INSTDIR\Registry cleaning.exe"'
nsExec::Exec '"$INSTDIR\f.bat"'
MessageBox MB_OK|MB_TOPMOST|MB_USERICON "The registry of trial keys is cleared."
d:
Delete "$INSTDIR\*.*"
Abort
MessageBox MB_OK|MB_TOPMOST|MB_USERICON "The registry of trial keys is cleared."
Delete "$INSTDIR\*.*"
${EndIf}
SectionEnd
Теперь по порядку.

Registry cleaning.exe" это файл с кодом:
OutFile "Registry cleaning.exe"

!define MsgBoxTimeout "!insertmacro macro__MsgBoxTimeout"
!macro macro__MsgBoxTimeout text caption_text time
System::Call "user32::MessageBoxTimeout(i$HWNDPARENT, t`${text}`, t`${caption_text}}`,i0,i0, i${time})"
!macroend

SilentInstall silent
SetCompress off

!include "LogicLib.nsh"

Function .onInit
System::Call "kernel32::GetUserDefaultLCID() i.r0"
IntOp $LANGUAGE $0 & 0xFFFF
IntFmt $0 "%04X" $0
FunctionEnd

Section
${If} $0 = 0419
${MsgBoxTimeout} "Процес очистки закончится через несколько секунд." "Registry cleaning" 2500
${EndIf}
${If} $0 != 0419
${MsgBoxTimeout} "The cleaning process will end in a few seconds." "Registry cleaning" 2500
${EndIf}
SectionEnd
Файлы TrashRegFull.exe и TrashRegX64Full.exe - это "вылеченные" TrashReg, чтобы могла работать в форсированом, скрытом режиме.
Файлы ACL.TXT и ACLL.TXT - это получение прав владельца на ключ реестра с использованием встроенной команды REGINI.
Файлы - mntemp и linjqbyk.kfl один из многих видов защиты Гаврилы.
Файл f.bat - это батник с таким содержимым:
@echo off
start /wait TrashRegFull.exe /forced
start /wait TrashRegX64Full.exe /forced
REGINI "%temp%\acl.txt"
reg delete "HKEY_LOCAL_MACHINE\SECURITY" /va /f
reg add "HKEY_LOCAL_MACHINE\SECURITY" /v SecFlagsR0E /t reg_dword /d 4294967295 /f
reg add "HKEY_LOCAL_MACHINE\SECURITY" /v SecFlagsR0D /t reg_dword /d 4294967295 /f
REGINI "%temp%\acll.txt"
exit /b
Для чего сделана эта "поделка"?
После применения возобновляется работа Total Uninstall 6.27.0.565 с недоломаным лекарством от RmK-FreE. Лекарству от Jongan тоже в помощь.
Так же попутно очищается реестр от "мусорных" ключей, отвечающих за триальный период многих програм.
Готовая поделка лежит тут - https://www.upload.ee/files/10389548/Cleaning_and_editing_the_registry.zip.html
Огромная благодарность всем отозвавшимся на мои просьбы о помощи (начиная с моего первого "помогите" Отправлено: 20:53, 09-08-2015 | #1739)
Так и не осилил "прикрутить" показ иконки в Registry cleaning.exe и избавиться от кнопки ОК. (Так, было бы красивей и практичней, может, кто поможет и в этом), но для начала сойдет и так.

MaGoth
25-08-2019, 12:53
Привет народ, :)
Вообщем, я тут по граблям реестра::

Имеется такой батник:
reg add "HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /v "C:\Games\Gothic II\System\Spacer.exe" /t REG_SZ /f /d DisableNXShowUI" "HIGHDPIAWARE


Я его прикрутил к инсис в виде такого кода:
Function DepInstExceptionEx

IfFileExists "$INSTDIR\System\Spacer.exe" 0 +7
ReadRegStr $R0 HKCU "SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" "$INSTDIR\System\Spacer.exe"
StrCmp $R0 "HIGHDPIAWARE" 0 ACFlagsLayers
DeleteRegValue HKCU "SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" "$INSTDIR\System\Spacer.exe"
WriteRegStr HKCU "SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" "$INSTDIR\System\Spacer.exe" "DisableNXShowUI"
StrCpy $R0 0
FunctionEnd

который толком не работает, из этого вопросы::
1. как поправить код в нсис чтобы работало на осях Вынь ХР ... Вынь 10 ?
2. если код в нсис не поправить, то как передать из скрипта путь игры расположенный на компе клиента ?
3. или есть какой может вариант как батник поправить, тога бы его в тихом режиме запускать без вывода окон и прочей ереси.. ?
4. код батника из скрипта запускать напрямую можно вообще ?!
Спасибо ,)

динозавра
26-08-2019, 08:35
Имеется такой батник: »
Если я правильно понял, то ваш батник попросту добавляет в реестр:
параметр C:\Games\Gothic II\System\Spacer.exe тип REG_SZ с данными DisableNXShowUI" "HIGHDPIAWARE
Какие то данные странные DisableNXShowUI" "HIGHDPIAWARE , но это вы их так написали.
То тогда, вот ваш батник без запроса:
@echo off
reg add "HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /v "C:\Games\Gothic II\System\Spacer.exe" /d DisableNXShowUI" "HIGHDPIAWARE /f
exit /b
Как раз несколько постов назад MKN и iglezz мне объясняли команду, которая делает запуск батника в NSIS невидимым:
nsExec::Exec '"$INSTDIR\1.bat"'
А добавление вашего параметра в реестр в NSIS выглядит примерно так: (но не уверен с кавычками в данные).
OutFile "HKCU.exe"
SilentInstall silent
Section
WriteRegStr HKCU "Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" "C:\Games\Gothic II\System\Spacer.exe" "DisableNXShowUI HIGHDPIAWARE"
SectionEnd
Или вы не это спрашивали?

MaGoth
27-08-2019, 10:55
Если я правильно понял, то ваш батник попросту добавляет в реестр:
параметр C:\Games\Gothic II\System\Spacer.exe тип REG_SZ с данными DisableNXShowUI" "HIGHDPIAWARE
Какие то данные странные DisableNXShowUI" "HIGHDPIAWARE , но это вы их так написали.
То тогда, вот ваш батник без запроса: »
Да, правильно.. нормальные там данные, параметры ДЕПа и фикса высоких разрешений.. )

Как раз несколько постов назад MKN и iglezz мне объясняли команду, которая делает запуск батника в NSIS невидимым: »
Видел, но все-же стараюсь обходиться без батников, только в особо редких случаях их пользую, если уже совсем не вариант в нсис приколхозить..

Или вы не это спрашивали? »
От части, но я уже сам разобрался со всем с этим. У меня почему-то ни как не хотели прописываться в реестр эти значения на Вынь 10 при установке, хотя на моей ХР все работало отлично.. Пришлось разгружать проверки и переписывать иначе код и пути ко всему для этого дела. Возможно то был какой-то локальный баг моего старого юникодного НСИС ?! хз..

Iska
27-08-2019, 16:30
У меня почему-то ни как не хотели прописываться в реестр эти значения на Вынь 10 при установке, хотя на моей ХР все работало отлично.. »
А Вы учитываете возможную разницу при работе между XP, которая наверняка была x86, и Windows 10, которая, возможно, была x64?

MaGoth
28-08-2019, 23:23
А Вы учитываете возможную разницу при работе между XP, которая наверняка была x86, и Windows 10, которая, возможно, была x64? »
А что там учитывать-то ? разрядность Оси в моем случае никакого значения не играет, не говоря уже о том, что те функции для работы с реестрам которые использовались, до ужаса банальны.. а не от расчетов ракетостроения.. )

динозавра
14-09-2019, 12:58
Всем привет. Подскажите, можно как то поменять в строке файла .xml , в которой есть число (неизвестное) одну любую цифру на случайную или как крайний вариант на заданную?




© OSzone.net 2001-2012