PDA

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


Страниц : 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 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170

vahe-91
29-10-2011, 15:10
как скрыто запустить батник, как в 7-zip sfx ?

kotkovets
29-10-2011, 15:27
vahe-91, Попробуй стандартный плагин

nsExec::Exec "file.cmd"
Pop $0

На офф.сайте есть плагин:
http://nsis.sourceforge.net/ExecCmd_plug-in
Пример создания SFX архива
ExecCmd::Exec 'COPY /b "Путь\7ZSD_LZMA2.sfx" + "Путь\config.txt" + "Путь\Archive.7z" "Путь\app.exe"'
В справочнике по NSIS->Работа с процессами с помощью NSIS (Запуск внешних приложений в режиме ожидания завершения приложения)

vahe-91
29-10-2011, 16:41
nsExec::Exec "file.cmd" »
спасибо, это то что нужно :) но зачем нужен Pop $0 ?

kotkovets
29-10-2011, 16:48
спасибо, это то что нужно но зачем нужен »
В стек возвращается код возврата запускаемой проги, и следует, что мы можем с
уверенностью сказать, как отработала прога.
Pop $0
MessageBox MB_OK "$0"
Сделай успешное выполнение команды, а затем заведомо не успешное. Сравни циферки...
У меня так конструктор на руборде организован на кодах возврата - и я узнаю сразу в чем проблема

vahe-91
29-10-2011, 20:53
kotkovets, еще хотел спросить, из-за чего может создание деинсталятора задержатся примерно на пол минуты ?

kotkovets
29-10-2011, 21:34
из-за чего может создание деинсталятора задержатся примерно на пол минуты ? »
Трудно судить почему, из-за вопроса только, может какие процессы до создания идут, скрипт в студию, а там видно будет...

vahe-91
29-10-2011, 21:59
Трудно судить почему, из-за вопроса только, может какие процессы до создания идут, скрипт в студию, а там видно будет... »
Скрипт не могу показать. В скрипте деинсталятора примерно две тысячи строк, для удаления ключей из реестра, это может быть причиной ?

kotkovets
29-10-2011, 22:03
vahe-91, закомментируй команды последовательно, пока не исчезнет "эффект"
удаление плагом аль стандартными командами? циклы есть?

vahe-91
29-10-2011, 22:10
удаление плагом аль стандартными командами? циклы есть? »
плагинов нет, есть goto
setregview 32
deleteregkey hklm "ключь"
setregview 64
deleteregkey hklm "ключь"
примерно тисяча строк под setregview 32 и одно и тоже под setregview 64. В секции деинсталятора только это и несколько rmdir и unregdll.

kotkovets
29-10-2011, 22:21
Ясно, если стока строк - то только оптимизация кода немного может.
Деинсталлятор то компилится на "горячую руку"...поэтому такая задержка.
есть goto »
:) Вообще не использую безусловные переходы в чистом ввиде, лишь только для выхода
из глубоких логических конструкций и циклов! посему советую использовать логические конструкции
(обертки переходов на уровне компилятора) работает быстрее, ведь код сразу компилится,
а при goto установщик прыгает в процессе установки!т.е установщик еще не знает, что ему подсунут :)

vahe-91
29-10-2011, 22:26
kotkovets, спасибо, попробую избавится от goto :)

kotkovets
29-10-2011, 22:45
Попробуй, но не гарантирую, что будет "существенно" быстрее, трудно судить не видя проблемного кода,
если все таки есть цикл - это и есть тормоз, ведь ему надо "двигать" прогресс - это существенно замедляет работу в целом
Здесь только поможет макрос писать с использованием хидера Util.nsh - который основан на функции и перехода
по абсолютной метке - это сильно ускоряет работу цикла. Если надо могу показать такой пример цикла.

vahe-91
29-10-2011, 22:59
kotkovets спасибо за советы,если сам не справлюсь, отправлю скрипт по ПМ, если у вас будет время, посмотрите ? :)

kotkovets
29-10-2011, 23:10
да ради бога, сейчас не буду смотреть - позже.

vahe-91
30-10-2011, 23:01
макрос FileAssociation.nsh скачанный отсюда http://nsis.sourceforge.net/File_Association пишет в HKCR, а мне нужно в HKLM \SOFTWARE\Classes. Если я в FileAssociation.nsh изменю все HKCR в HKLM "SOFTWARE\Classes", то будет все корректно работать ? если уже есть исправленная версия дайте ссылку пожалуйста.

kotkovets
31-10-2011, 03:58
макрос FileAssociation.nsh скачанный отсюда http://nsis.sourceforge.net/File_Association пишет в HKCR, »
Особой такой разницы нету, HKCR или HKLM - все равно записи продублируются.
Ну коль зачесалось, то меняй HKCR или HKLM
расставь для отладки в макросе сообщения для наглядного просмотра и правки макроса, если нужно:
MessageBox MB_OK "$$R0 = $R0$\n$$R1 = $R1"
$R0 или $R1 могут(не проверял) - SOFTWARE\Classes или какой ты там ключ укажешь в аргументах макроса,
нетрудно сопоставить с нужными тебе ветками реестра. Еще имеет смысл $R0 - в кавычки одеть.
WriteRegStr HKCR "$R1" "" "$R0"
и так далее.

CyberMaster
31-10-2011, 04:52
Чет не врубаюсь, почему InstallDirRegKey не хочет брать путь из реестра? 100500 раз проверял путь в реестре - все правильно и запись существует. Если закомментировать InstallDir "$PROGRAMFILES\Directory", тогда поле "Папка установки" в ингаляторе вообще пустое.
!define PRODUCT_NAME "TeamSpeak 3 Client"
!define PRODUCT_VERSION "3.0.1"
!define pkgdir "C:\TeamSpeak\package"

;Name and file
Name "${PRODUCT_NAME}"
OutFile "TeamSpeak3-Client-win64-${PRODUCT_VERSION}.exe"

SetCompressor /FINAL ZLIB

;Default installation folder
InstallDir "$PROGRAMFILES\Directory"

;Get installation folder from registry if available
InstallDirRegKey HKLM "Software\TeamSpeak 3 Client" ""

RequestExecutionLevel user
;--------------------------------
;Interface Settings
!include "MUI.nsh"
!define MUI_ABORTWARNING
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "Russian"
;--------------------------------

Section
SectionEnd

kotkovets
31-10-2011, 08:37
Чет не врубаюсь, почему InstallDirRegKey не хочет брать путь из реестра? 100500 раз проверял путь в реестре - все правильно и запись существует »
Потому что, гладиолус :)
;Default installation folder
InstallDir "$PROGRAMFILES\Directory"

;Get installation folder from registry if available
InstallDirRegKey HKLM "SOFTWARE\NSIS" ""
При любом раскладе все работает!
А ваш InstallDirRegKey не соответсвует, тому что нужно, 100%
InstallDirRegKey HKLM "Software\TeamSpeak 3 Client" ""
100500 раз проверял »
Можно ключ по умолчанию проверить 100501 раз
ReadRegStr $0 HKLM "SOFTWARE\TeamSpeak 3 Client" ""
MessageBox MB_OK "$0"

CyberMaster
31-10-2011, 15:42
ReadRegStr $0 HKLM "SOFTWARE\TeamSpeak 3 Client" ""
MessageBox MB_OK "$0"
Так тоже выводит пустое сообщение, но вот экспортировал запись из своего реестра:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\TeamSpeak 3 Client]
@="P:\\Program Files\\TeamSpeak"
"InstallMode"="AllUsers"
"ConfigLocation"="1"
"Start Menu Folder"="TeamSpeak 3 Client"
Как видите запись существует и путь к ней правильный. В чем же тогда дело? Это может быть связано с ОС? У меня Windows 7 x64

kotkovets
31-10-2011, 16:21
У меня Windows 7 x64 »
С этого и надо бы начинать!
InstallDirRegKey - имеет доступ только к 32-разрядному виду реестра.
Поэтому нужно редирект делать в первой функции.
Для начало подключаем хедер к телу скрипта - !include x64.nsh
Function .OnInit
${If} ${RunningX64}
SetRegView 64 ;включаем 64-разрядный вид
ClearErrors
ReadRegStr "$INSTDIR" HKLM "SOFTWARE\TeamSpeak 3 Client" ""
${If} ${Errors}
${OrIf} "$INSTDIR" == ""
StrCpy "$INSTDIR" "$PROGRAMFILES\Directory"
${EndIf}
SetRegView 32 ;включаем 32-разрядный вид (для 32-битных приложений)
${EndIf}
FunctionEnd
Этот код почти аналог - InstallDirRegKey в х64




© OSzone.net 2001-2012