Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.
Не поверите, но в интернете все равны, у всех одинаковые возможности
Я, например, ни разу ничего не тестировал в уникодной версии NSIS даже будучи автором справочника, т.к. »
Ну, равны или не равны, суть то точно не в этом, а вот то что в справке мало Юнику уделяется внимание, это упущение лично на мой взгляд. И дело здесь даже не в том, пользует ли его кто, или нет. Просто там действительно могут быть существенные различия.
Если в справке будет развиваться это направление, то возможно смогу чем-то помочь... :)
Определение SID пользователя
( в справочнике немного по другому)
OutFile "sid-Test.exe"
;SID – Security ID-SID - идентификатор безопасности текущего пользователя
; http://subscribe.ru/archive/comp.soft.prog.delphint/200207/29175902.html
; http://winadm.wordpress.com/2012/07/23/sid-security-identifier/
Section
System::Call "advapi32::GetUserName(t .r0, *i ${NSIS_MAX_STRLEN} r1) i.r2"
System::Call 'netapi32.dll::NetUserGetInfo(w n, w "$0", i 23, *i .R8)i.r4'
System::Call '*$R8(w .R1, w .R2, w .R3, i .R4, i .R9)'
System::Call advapi32::ConvertSidToStringSid(iR9,*t.R0)
DetailPrint "The SID is $R0"
System::Free $R8
SectionEnd
kotkovets
16-08-2014, 18:55
Адаптировал ProcessFunc.nsh (https://yadi.sk/d/KJ8IBBCzZn87w) под 3 версию NSIS
---
как пользоваться читаем внимательно в справочнике по NSIS (ссылка на справочник в шапке темы)
kotkovets,
Согласно справочника
Ожидание завершения запущенного процесса заданное время
Данный макрос заставит установщик ждать завершение запущенного процесса или ждать заданное время, не ожидая завершения процесса.
Будет ли работать ожидание окончания процесса , если основной контролируемый процесс создал ещё несколько дочерних процессов ? Т.е. нужно дождаться окончания всех возникших процессов.
И возвращаясь к перечислению дисковых устройств с занесением их всех в переменную :
Function .onInit
System::Call 'kernel32::GetLogicalDrives()i.r0'
StrCpy $2 0
StrCpy $4 65 ; 'A'
loop:
IntOp $3 $0 & 1
${If} $3 <> 0
IntFmt $3 "%c:\" $4
System::Call 'kernel32::GetDriveType(tr3)i.r5'
DetailPrint "$3=$5"
StrCpy $R0 "$R0 $3$5"
${EndIf}
IntOp $4 $4 + 1
IntOp $0 $0 >> 1
StrCmp $0 0 "" loop
FunctionEnd
Возможно ли занести каждое найденное устройство в свою отдельную переменную ? Т.е. сколько устройств (кол-во их, заранее ессно не известно) - столько и переменных.
Будет ли работать ожидание , когда основной контролируемый процесс создал ещё несколько дочерних процессов ? »
Да, а почему нет то? Как я понимаю, функция ожидания ждёт, пока существует "хэндл процесса", а не проверяет наличие указанного образа процесса, образ указывается для первоначального поиска процесса
Возможно ли занести каждое найденное устройство в свою отдельную переменную ? Т.е. сколько устройств - столько и переменных. »
Ну, переменными мы ограничены в NSIS, ты бы сразу тоже указал, в какие переменные ты хочешь заносить данные? В стандартные или в свои созданные?
Либо, как я предлагал здесь давныыым давно (не помню уже для чего, но вроде бы тебе тоже код предлагал), хранить несколько значений в одной переменной и считывать данные из "подпеременных" командой ${GetOptions}
Хотел, кстати, добавить небольшую статью-пример с хранением нескольких значений в одной переменной в справочник, да что-то передумал, идея вдруг показалась бредовой :blush2:
в какие переменные ты хочешь заносить данные? В стандартные или в свои созданные? »
Лучше в собственные...
раз поправил сообщение, дополню
Т.е. нужно дождаться окончания всех возникших процессов. »
В таком случае нет, функция дождётся завершения указанного процесса, завершения дочерних процессов функция ждать не будет
Возможно ли занести каждое найденное устройство в свою отдельную переменную ? Т.е. сколько устройств (кол-во их, заранее ессно не известно) - столько и переменных. »
Для твоего кода необходимо именно отдельные переменные, или можно сделать что-то типа массива?
Если делать отдельными переменными, то там просто заносить данные не совсем удобно (если на каждую букву диска делать сравнение), так не пойдёт?
!include "logiclib.nsh"
!include "FileFunc.nsh"
var var_Sum
var var_Drives
Name "test"
OutFile "!test.exe"
InstallDir "$TEMP"
Function .onInit
call GetDrivesFunc
StrCpy $0 0
GetList:
IntOp $0 $0 + 1
${GetOptions} "$var_Drives" "/$0=" $1
${GetOptions} "$var_Drives" "/$0_type=" $2
MessageBox MB_OK|MB_ICONINFORMATION "Всего устройств: $var_Sum$\n$1 = $2"
StrCmp $0 "$var_Sum" 0 GetList
MessageBox MB_OK|MB_ICONINFORMATION "готово$\n$\n$var_Drives"
quit
FunctionEnd
Function GetDrivesFunc
StrCpy $var_Sum 0
StrCpy $var_Drives ""
System::Call 'kernel32::GetLogicalDrives()i.r0'
StrCpy $2 0
StrCpy $4 65 ; 'A'
loop:
IntOp $3 $0 & 1
${If} $3 <> 0
IntFmt $3 "%c:\" $4
System::Call 'kernel32::GetDriveType(tr3)i.r5'
DetailPrint "$3=$5"
IntOp $var_Sum $var_Sum + 1
StrCpy $var_Drives "$var_Drives /$var_Sum=$3 /$var_Sum_type=$5"
; плюсуем значение переменной, в которой хранится общее количество найденных устройств
; заносим данные о букве диске и о его типе в подпеременные
StrCpy $R0 "$R0 $3$5"
${EndIf}
IntOp $4 $4 + 1
IntOp $0 $0 >> 1
StrCmp $0 0 "" loop
FunctionEnd
Section
SectionEnd
В итоге, в одной переменной $var_Drives будет хранится инфа о всех найденных устройствах и их типы, а в переменной $var_Sum общее количество найденных устройств
Формат данных будет такой:
/1=C:\ /1_type=2 /2=D:\ /2_type=4
Вытащить данных не сложно, достаточно обратиться командой ${GetOptions} с указанием порядкового номера:
${GetOptions} "$var_Drives" "/1=" $1
${GetOptions} "$var_Drives" "/1_type=" $2
в переменной $1 - буква диска
в переменной $2 - тип устройства
kotkovets
18-08-2014, 02:15
Будет ли работать ожидание окончания процесса , если основной контролируемый процесс создал ещё несколько дочерних процессов ? Т.е. нужно дождаться окончания всех возникших процессов. »
дожидаться будет основного процесса, все равно дочерние процессы под контролем основного процессы, на то они и дочерние ))
--
добавлю еще одну функцию к хидеру:
запуск любого процесса скрытно, с ожиданием и без ожидания, ну если нужно кому то :)
Dodakaedr
18-08-2014, 17:52
Подкиньте, пожалуйста, примерчик как с помощью nsis создать портативную версию программы. Спасибо!
Подкиньте, пожалуйста, примерчик как с помощью nsis создать портативную версию программы. Спасибо! »
А что, там в скрипте должно быть что-то сложное, чтобы давать пример?
1. Распаковка файлов (если требуется)
2. Если программа требует лицензию, вносим информацию в реестр (если просто файл ключа, то, соответственно, пропускаем пункт)
3. Запуск приложения с ожиданием
4. Удаление следов после использования приложения (временные файлы, настройки приложения в app/local app папках и т.д., записи в реестре)
Dodakaedr
18-08-2014, 21:10
А что, там в скрипте должно быть что-то сложное, чтобы давать пример? »
Нет, но я никогда nsis не пользовался и поэтому хочу на примере разобратся что к чему. Раз там ничего сложного то что мешает привести пример?
Как создать портабл на подобии этой ссылка (http://rghost.ru/private/57541755/e32255d66a0392e0dd34fb7a5b2430c8)
Как узнать группу администратров и внести название в переменную?
Раз там ничего сложного то что мешает привести пример? »
Отсутствие времени
Как создать портабл »
Начнём с того, что для каждого приложения запускаемый EXE будет с разными командами (думаю, что вы это понимаете), затем нужно узнать, где программа хранит свои настройки и информацию о регистрации (если таковая имеется), в общем собрать всю необходимую информацию. Разбираться в софте, который в архиве только ради примера - у меня нет желания
Затем продумаем последовательность команд, которые должны будут выполнены, вы знаете, какие команды хотите видеть в скрипте?
У нас есть Справочник по NSIS (http://forum.oszone.net/thread-168287.html), раз с NSIS не работали - для начала качайте и читайте "от корки до корки"
Небольшой пример скрипта запускаемого файла (все описания команд есть в справочнике):
Name "test"
OutFile "test.exe"
; имя выходного файла
InstallDir "$TEMP\MyPortableApp"
; Каталог установки
Function .onInit ; самая первая функция в скрипте NSIS, которая выполняется при запуске установщика
SetOutPath "$INSTDIR"
; Установить распаковку всех последующих файлов в папку установки
File /r "MyApp"
; упаковываем в тело EXE файла папку "MyApp" (папка с нашей программой), которая находится на одном уровне с файлом скрипта
; при исполнении скрипта на этом этапе будет происходить распаковка файлов
execwait '$windir\regedit.exe /s "$INSTDIR\settings.reg"'
; при необходимости импортируем настройки программы в реестр из файла, который лежит в папке "MyApp"
execwait '$INSTDIR\MyApplication.exe'
; запускаем наше приложение с ожиданием завершения
DeleteRegKey HKCU "Software\MyKey\bla bla bla"
; удаляем ветку программы в реестре, подчищаем за собой при необходимости
quit
; прекращаем исполнение нашего установщика, завершая процесс
FunctionEnd
Section
SectionEnd
Dodakaedr
19-08-2014, 18:26
Разбираться в софте, который в архиве только ради примера »
Это не только для примера но и для дальнейшего изучения метода создания портабл с помощью nsis. Самое что есть интересное это как указать папку куда сохраняются настройки программы и чтобы программа обращалась к ней в течение использования и как прописать регистрационные данные в reg файл и чтобы программа обращалась именно к нему, а не к реестру системы?
Это не только для примера но »
Чтобы вам самому не разбираться?
для дальнейшего изучения метода создания портабл с помощью nsis »
Лично мне данная тема не интересна. Нужен особый функционал? Не знаете как продумать логику для написания функции? - Здесь я могу помочь, а в чем-то разбираться, как всё устроено - пусть это делает тот, кому это нужно и кому это интересно.
Здесь тема помощи по скриптам NSIS, а не по изучению чего-либо, не связанного с NSIS
Вы приходите в эту тему задать вопрос по языку NSIS, а не для того, чтобы вас чему-то научили за рамками скриптов NSIS
Самое что есть интересное это как указать папку куда сохраняются настройки программы »
Начнём с того, что каждое приложение, которое хотят сделать "портабельным" - не портабельное, приложение хранит свои данные в большинстве случаев в реестре, некоторые программы хранят данные либо в своей папке, либо в папке данных текущего пользователя
Соответственно, вам необходимо сначала настроить программу, затем найти ветку в реестре, куда она сохраняет свои настройки (Process Monitor (http://technet.microsoft.com/ru-ru/sysinternals/bb896645.aspx) в помощь), затем экспортировать эту ветку реестра в REG-файл и при запуске вашего portable EXE импортировать REG-файл в реестр, чтобы ваша программа после этого подцепила все настройки, которые вы сами выставили.
и как прописать регистрационные данные в reg файл и чтобы программа обращалась именно к нему, а не к реестру системы? »
Выше ответил. Если программа хранит данные о регистрации в реестре, то перед запуском программы импортируете данные о лицензии в реестр, ждёте, пока пользователь завершит работу с программой и затем удаляете данные из реестра, чтобы не оставлять следов
Я не занимался созданием portable приложений и не интересовался этим вопросом, возможно, это всё делается как-то иначе (скажу больше, мне даже лень гуглить по этому вопросу, т.к. 0% интереса)
Dodakaedr
19-08-2014, 21:32
не связанного с NSIS »
Здесь как раз прямая связь, все делается скриптингом nsis.
чтобы вас чему-то научили »
Учить не обязательно, я самоучка, но если есть пример.
при запуске вашего portable EXE импортировать REG-файл в реестр »
Это уже не портабл будет.
Выше ответил. Если программа хранит данные о регистрации в реестре, то перед запуском программы импортируете данные о лицензии в реестр, ждёте, пока пользователь завершит работу с программой и затем удаляете данные из реестра, чтобы не оставлять следов
Я не занимался созданием portable приложений и не интересовался этим вопросом, возможно, это всё делается как-то иначе (скажу больше, мне даже лень гуглить по этому вопросу, т.к. 0% интереса) »
Вы правы, там все по другому делается, только вот как?! Ну и на этом спасибо!
Здесь как раз прямая связь, все делается скриптингом nsis. »
Ну так скажите, какие команды вы хотите видеть в скрипте? Или вы просто сами не знаете? С этого и начните, я же вам не зря сказал, что эта тема обсуждения NSIS скриптов
Это уже не портабл будет. »
Вы правы, там все по другому делается, только вот как?! Ну и на этом спасибо! »
Откуда у вас такая уверенность, что это делается "по другому", если вы сами не знаете, как именно делаются portable приложения?
Приходите, когда у вас будут вопросы по NSIS скрипту и когда вы будете сами знать, что вам вообще нужно конкретно от NSIS, остальные обсуждаемые темы уже считается флудом
изучения метода создания портабл с помощью nsis »
Создавать портабл ПО (вернее - псевдопортабл) с помощью NSIS - идея крайне не удачная. Для этого есть конкретное специальное ПО, с помощью которого портабл делается гораздо быстрее и заведомо правильнее.
А если уж рассматривать методику создания псевдопортабла в NSIS, то
вариант, когда приложение после запуска сначала распаковывает файлы куда надо, затем пишет ключи в реестр, далее регистрирует, если надо DLL и т.д. , а после закрытия приложения удаляются все следы установки - это ведь по сути всё равно что запустить обыкновенный классический NSIS инсталлятор, а после окончания работы приложения - запустить обыкновенный Uninstaller для удаления следов установки + всё это в псевдопортабле надо контролировать для автоудаления после завершения работы приложения. Короче получается - дурь полная, а не портабл.
Во-первых, вышеописанное - это просто обыкновенный запуск, установка, работа и удаление приложения (установи, поработай и удали - в чём проблема ? ), а это к портаблу вообще не имеет отношения.
(разве что за исключением, что всю эту канитель ещё надо ещё контролировать для автоудаления хвостов после закрытия). Т.е. смысла - ноль.
Во-вторых, распаковка файлов после запуска приложения - это уже лажа. В нормальном портабле, находящимся в папке на любом носителе, всё уже готово для работы и ничего распаковывать не надо ! Просто запустил исполняемый файл (или загрузчик) - и сразу работай на здоровье. Никаких следов в ОС и реестре не при запуске, не при закрытии, ессно не будет. Об этом заботятся средства виртуализации спец ПО, с помощью которого портабл был создан.
Про второй вариант псевдопортабла c помощью NSIS. Это когда ПО не требует установки и все файлы программы находятся в одной папке где угодно, откуда и запускается программа. Повторяю - ничего никуда после запуска не распаковывается и не устанавливается ! Пачкается при запуске только реестр, ну и иногда добавляются в "пользовательские места" некоторые данные (файлы настроек и пр), которые после закрытия программы и чистятся. Организовать в скрипте это не сложно. Собственно про такой псевдопортабл и можно говорить. Всё остальное - лажа, не имеющая смысла.
Здравствуйте.
Подскажите, пожалуйста, как в NSIS 3b0 создать лог-файл установки?
Пример из справки не компилириутся из-за ошибки:
!define: "LVM_GETITEMCOUNT" already defined!
Подскажите, пожалуйста, как в NSIS 3b0 создать лог-файл установки?
Пример из справки не компилириутся из-за ошибки:
!define: "LVM_GETITEMCOUNT" already defined! »
Удалите из кода строку
!define LVM_GETITEMCOUNT 0x1004
Всё дело в том, что на момент написания примера кода, данных констант не было в хидерах NSIS той версии, а сейчас есть, соответственно и выползает ошибка, т.к. данная константа уже существует
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC