PDA

Показать полную графическую версию : .: 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
26-05-2015, 11:33
какими привилегиями обладает аккаунт (как UserInfo) пользователя? »
Посмотри здесь http://nsis.sourceforge.net/Enumerate_User_Privileges
или используй команду SHOW GRANTS (Просмотр привилегий http://www.dbaguru.ru/users-privileges.html )

Kopejkin
27-05-2015, 18:36
Сколько процессов можно убить за один сеанс?

Например, в таком виде отлично убиваются все разноименные (у меня - 6) процессы и несколько одноименных (в моем случае одноименных процессов - 7). Но за один сеанс убиваются только 4 одноименных. Остальные остаются.
Одноименные процессы могут создавать как разные однотипные программы, так и одна программа (множественный запуск).
Можно ли их убить все за раз?


Function .OnInit
${KillProcess} "proc1.exe" $0
${KillProcess} "proc2.exe" $0
${KillProcess} "proc3.exe" $0
${KillProcess} "proc4.exe" $0
${KillProcess} "proc5.exe" $0
${KillProcess} "proc6.exe" $0
${KillProcess} "run.exe" $0
${KillProcess} "run.exe" $0
${KillProcess} "run.exe" $0
${KillProcess} "run.exe" $0
${KillProcess} "run.exe" $0
${KillProcess} "run.exe" $0
${KillProcess} "run.exe" $0




Также интересует, как определить текущие региональные настройки. В частности - формат и расположение?

Flix
30-05-2015, 10:26
Также интересует, как определить текущие региональные настройки. В частности - формат и расположение? »
Необходимые данные можно узнать в разделе реестра [HKEY_CURRENT_USER\Control Panel\International]. Считываешь значения желаемых параметров и, в зависимости от полученных результатов, выполняешь необходимые действия.

K.A.V.
30-05-2015, 11:01
Сколько процессов можно убить за один сеанс? »
Смотря как напишите код, в таком виде как у вас - не больше 7 одноименных процессов, если же сделать циклом, то будут завершены все процессы с указанным образом
!include "Logiclib.nsh"

${While} ${ProcessExists} "notepad.exe"
${KillProcess} "notepad.exe" $0
${If} $0 == "1"
Detailprint "процесс завершен"
${ElseIf} $0 == "2"
Detailprint "процесс не завершен"
${ElseIf} $0 == "none"
Detailprint "процесс не найден"
${ElseIf} $0 == "error"
Detailprint "ошибка получения снимка запущенных процессов"
${EndIf}
${EndWhile}

Либо использовать
taskkill /f /im "notepad.exe"
эта команда за одно выполнение завершает все процессы с указанным образом

Kopejkin
30-05-2015, 15:41
эта команда... »
Сорри, а как её использовать в сценарии?

Спрашиваю для общего развития, т.к. выше описанный вами сценарий успешно справляется с задачей. Спасибо еще раз.

K.A.V.
30-05-2015, 15:48
Сорри, а как её использовать в сценарии? »
exec 'taskkill /f /im "notepad.exe"'
taskkill - из состава операционной системы, живёт в System32 папке...

ya_dukenukem
02-06-2015, 14:38
Добрый
Подскажите чайнику: можно ли изменить размер главного окна инсталлятора? т.е. отличный от 300*140
Заранее спасибо

K.A.V.
02-06-2015, 14:53
можно ли изменить размер главного окна инсталлятора? »
в папке <NSIS>\Contrib\UIs лежат EXE файлы с ресурсами диалогов, ковыряйте редактором ресурсов (ResHacker, Restorator) и изменяйте что хотите

Подскажите чайнику »
Раз такое дело, то сразу предложу прочитать Справочник по NSIS (http://forum.oszone.net/thread-168287.html)

Kopejkin
02-06-2015, 21:15
Подскажите, если так выглядит запись для обычного ярлыка,

CreateShortCut "$SMPROGRAMS\Software\Maker\Сайт Maker.lnk" "http://www.maker.com" "" "$INSTDIR\maker.exe" "" "" "" "Посетить веб-сайт програмы Maker"

то как записать Ярлык Интернета (.url)
(и чтобы с пиктограммкой дефолтного браузера)?

K.A.V.
02-06-2015, 22:37
то как записать Ярлык Интернета (.url) »
Ну url файл это вообще "не ярлык" сам по себе (если можно так выразиться), это файл формата INI, соответственно и создавать нужно либо командами WriteINIStr в файл с расширением url, либо просто распаковывать заранее подготовленный файл
Содержание файла такое:

[InternetShortcut]
URL=http://vk.com/sfxcreator
IconFile=путь к файлу иконки
IconIndex=индекс иконки (если exe/dll файл)

соответственно, записываем нужные данные и url файл готов, можно создать его сразу на рабочем столе (например), либо создать в папке с программой и уже к этому файлу создавать ярлык на рабочем столе

и чтобы с пиктограммкой дефолтного браузера »
Определить нужно сначала дефолтный браузер :)
Не особо вникал в этот вопрос (правильное ли это определение или нет):

ReadRegStr $1 HKCR "http\DefaultIcon" ""
WriteINIStr "$DESKTOP\TEST.url" "InternetShortcut" "URL" "http://vk.com/sfxcreator"
WriteINIStr "$DESKTOP\TEST.url" "InternetShortcut" "IconFile" "$1"

проверку на отсутствие записи и запись другого значка, сами уже сделаете, как нужно
На примере Firefox - там иконка html-файла (значение параметра путь к firefox.exe и с индексом 1, firefox.exe,1)
Забегая вперёд и включая вангу, предположу возникновение вопроса о том, как отсечь с конца строки символ запятой вместе с индексом иконки :)
!include "Logiclib.nsh"
!include "StrFunc.nsh"
${StrLoc}
ReadRegStr $1 HKCR "http\DefaultIcon" ""
${StrLoc} $0 "$1" "," "<" ; получаем в $0 количество символов после знака запятой
${If} $0 != "" ; если $0 = '' (пустое значение), значит символа запятой нет, соответственно, отсекать символы не нужно
IntOp $0 $0 + 1 ; к количеству символов после запятой прибавляем 1, получаем общее количество символов (индекс+символ запятой) которое мы будем отрезать с конца строки
StrCpy $1 $1 -$0 ; отрезаем $0 символов с конца строки
${EndIf}
WriteINIStr "$DESKTOP\TEST.url" "InternetShortcut" "URL" "http://vk.com/sfxcreator"
WriteINIStr "$DESKTOP\TEST.url" "InternetShortcut" "IconFile" "$1"

Kopejkin
03-06-2015, 09:26
...Не особо вникал »
Оказывается, не так все и просто. А я думал, что это я вникал... :lamer:
Спасибо еще раз.

Возник вопрос по удалению папки установленной программы.
Например, файлы устанавливаются в C:\Program Files (x86)\Aleo Software\Flash Intro and Banner Maker\ = $INSTDIR, по умолчанию.
Для того, чтобы удалить папку [Aleo Software], приходится устанавливать (как написано в Руководстве) текущий рабочий каталог, являющийся родителем папки [Aleo Software], т.е. C:\Program Files (x86):
SetOutPath "$PROGRAMFILES"
RMDir /r "$PROGRAMFILES\Aleo Software"
А если я не знаю, куда пользователь захочет установить программу? Нужно будет извлекать пользовательский путь, отсекать каталог установки, оставляя путь к "родительской" папке и назначать как SetOutPath. Или я опять чего-то не учитываю (несу чушь)?

K.A.V.
03-06-2015, 10:00
Для того, чтобы удалить папку [Aleo Software], приходится устанавливать (как написано в Руководстве) текущий рабочий каталог, являющийся родителем папки [Aleo Software] »
Не сказано там такого :) Там говорится, что вы не сможете удалить папку, которая установлена сейчас "текущим каталогом"
Так, например, удаление не сработает:
SetOutPath $TEMP\dir
RMDir $TEMP\dir

Хотя если указать ключ /r то содержимое папки $TEMP\dir всё-равно будет очищено полностью
Т.е. перед удалением какой-либо папки можете установить текущим каталогом левую папку, например временную папку $TEMP

Нужно будет извлекать пользовательский путь, отсекать каталог установки, оставляя путь к "родительской" папке и »
и удалять родительскую папку? Забавный инсталлер получится, если я установлю вашу программу в папку на рабочем столе, вы мне деинсталлятором потом весь рабочий стол затрёте? :up
Ничего отсекать/отрезать не нужно от пути установки, выполняйте действия только с $INSTDIR и не придумывайте лишнего, по-крайней мере, так безопасней для личных файлов пользователя, вам потом спасибо не скажут за удаление файлов, не относящихся к программе, запомнят ваш ник и не будут потом ставить от вас репаки :)

Kopejkin
03-06-2015, 21:05
..выполняйте действия только с $INSTDIR »
Собственно, так и делал до сих пор. Только "не аккуратненько как-то получается" :)

K.A.V.
03-06-2015, 21:40
Только "не аккуратненько как-то получается" »
Это да, но никто пользователя и не заставляет вводить кучу путей для установки с заведомо пустыми папками, чтобы сама программа была в каких-то дебрях :)

В голову пришла такая идея, можно реализовать опять же циклом такую штуку: проверяем, является ли каталог пустым, начиная с $INSTDIR, если пустой - удаляем и "поднимаемся вверх" по дереву папок, делая аналогичную проверку, если папка снова пустая - снова удаляем и ползём ещё выше :)
разомни пальчики комбинациями ctrl+c и ctrl+v :teeth:
!include "FileFunc.nsh"
!include "Logiclib.nsh"

StrCpy $0 "$INSTDIR"
${While} $0 != "" ; если $0 = пустое значение, значит каталог либо с файлами, либо не существует
${DirState} "$0" $1 ; получаем статус директории (пустая/с файлами)
${If} $1 == "1" ; если с файлами, то обнуляем $0 и тем самым выходим из цикла
${OrIf} $1 == "-1"" ; или если папка не существует, то обнуляем $0 и тем самым выходим из цикла
DetailPrint "папка '$0' с файлами или не существует => прекращаем проверку"
StrCpy $0 "" ; обнуляем переменную с путём, чтобы завершить цикл
${ElseIf} $1 == 0 ; если папка пустая
RMDir "$0" ; удаляем пустую папку
DetailPrint "папка '$0' пустая => удаляем"
${GetParent} "$0" $0 ; получаем родителя папки, которую удалили, записываем значение в эту же переменную
DetailPrint "следующая папка => '$0'"
${EndIf}
${EndWhile}

Конечно же, прописывать нужно самым последним действием в секции деинсталлятора, чтобы при начале цикла папка $INSTDIR была пустой, а то цикл сразу завершится...

Kopejkin
03-06-2015, 22:27
если я установлю ... на рабочем столе, ... деинсталлятором ... весь рабочий стол затрёте? »

Я озаботился "безопасностью файлов" пользователя и сначала сделал так:

Function .onVerifyInstDir
Var /Global MyPath
StrCpy $MyPath "$PROGRAMFILES\Aleo Software\Flash Intro and Banner Maker"
StrLen $0 $MyPath
StrCpy $0 $INSTDIR $0
StrCmp $0 $MyPath PathGood 0
Abort
PathGood:
FunctionEnd

Но подумал, что это будет выглядеть глупо, и решил вообще не давать пользователю никакой возможности смены пути установки. Если автор программы хочет иметь общую папку для всех своих продуктов, то почему я должен быть против этого?
В итоге, страница выбора папки установки в инсталляторе была отключена :teeth: И не затрется ничего.

WesternLight
17-06-2015, 21:42
Доброго времени всем! Прошу помощи - второй день только разбираю NSIS и столкнулся с, на мой взгляд, неразрешимой проблемой :(

Требуется в процессе работы инсталлятора создать ярлык на рабочем столе, который будет содержать следующую команду, к примеру:

"C:\Program Files (x86)\Opera\launcher.exe" "http://google.com"

При этом часть:

C:\Program Files (x86)\Opera\launcher.exe

будет в виде переменной и может принимать разные значения (разные браузеры). Может есть какое-то решение?

Вообще конечная цель - ярлык на рабочем столе, который будет открывать определенный URL с помощью конкретно указанного браузера, отличного от дефолтного. Может есть какой-то обходной путь?

K.A.V.
18-06-2015, 05:01
столкнулся с, на мой взгляд, неразрешимой проблемой »
Персонально для тех, кому лень прочитать шапку темы: Справочник по NSIS (http://forum.oszone.net/thread-168287.html)
Приходите с прочитанным справочником, кидать вам код таких простых команд - не вижу смысла

WesternLight
18-06-2015, 17:32
Приходите с прочитанным справочником, кидать вам код таких простых команд - не вижу смысла »
Почему-то думал что именно вы сразу поймете в чем кроется суть проблемы, ну, чтож...

Справочник по NSIS изучил в нужной для этого части в первую очередь (и сразу заметил некоторые неточности), много прочел в других источниках. Видимо, проблему придется описать подробнее. Мой код:

; Define your application name
!define APPNAME "Полезные ссылки"
!define APPNAMEANDVERSION "Полезные ссылки 1.0"

; Main Install settings
Name "${APPNAMEANDVERSION}"
InstallDir "$PROGRAMFILES\Полезные ссылки"
InstallDirRegKey HKLM "Software\${APPNAME}" ""
OutFile "d:\Links\Полезные ссылки.exe"

; Modern interface settings
!include "MUI.nsh"
!include "LogicLib.nsh"
!include "nsDialogs.nsh"

!define MUI_WELCOMEPAGE_TITLE_3LINES

!define MUI_ABORTWARNING

!insertmacro MUI_PAGE_WELCOME
Page custom fnCustomInit fnCustomDestroy
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH

!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES

; Set languages (first is default language)
!insertmacro MUI_LANGUAGE "Russian"
!insertmacro MUI_RESERVEFILE_LANGDLL

Var Dialog
Var Label1
Var Label2
Var Label3
Var Label4
Var Label5
Var Label6
Var RadioButton1
Var RadioButton2
Var RadioButton3
Var RadioButton4
Var RadioButton5
Var Browser

Function fnCustomInit
nsDialogs::Create 1018
Pop $Dialog

;Label 1
${NSD_CreateLabel} 0 0 100% 15u "Выберите браузер, в котором будет открываться страница $\"Полезные ссылки$\":"
Pop $Label1

;RadioButton 1
${NSD_CreateRadioButton} 0 20 100% 15u "В браузере по умолчанию (рекомендуется*)"
Pop $RadioButton1

;Если файл есть, то создаем RadioButton 2, иначе создаем надпись, что браузер не установлен
IfFileExists "$PROGRAMFILES\Google\Chrome\Application\chrome.exe" 0 notcreate2
${NSD_CreateRadioButton} 0 50 100% 15u "В Google Chrome"
Pop $RadioButton2
Goto rb3
notcreate2:
${NSD_CreateLabel} 0 55 100% 15u " X Браузер Google Chrome не установлен"
Pop $Label2

rb3:
;Если файл есть, то создаем RadioButton 3, иначе создаем надпись, что браузер не установлен
IfFileExists "$PROGRAMFILES\Mozilla Firefox\firefox.exe" 0 notcreate3
${NSD_CreateRadioButton} 0 80 100% 15u "В Mozilla Firefox"
Pop $RadioButton3
Goto rb4
notcreate3:
${NSD_CreateLabel} 0 85 100% 15u " X Браузер Mozilla Firefox не установлен"
Pop $Label3

rb4:
;Если файл есть, то создаем RadioButton 4, иначе создаем надпись, что браузер не установлен
IfFileExists "$PROGRAMFILES\Opera\launcher.exe" 0 notcreate4
${NSD_CreateRadioButton} 0 110 100% 15u "В Opera"
Pop $RadioButton4
Goto rb5
notcreate4:
${NSD_CreateLabel} 0 115 100% 15u " X Браузер Opera не установлен"
Pop $Label4

rb5:
;Если файл есть, то создаем RadioButton 5, иначе создаем надпись, что браузер не установлен
IfFileExists "$PROGRAMFILES\Internet Explorer\iexplore.exe" 0 notcreate5
${NSD_CreateRadioButton} 0 140 100% 15u "В Internet Explorer"
Pop $RadioButton5
Goto rb6
notcreate5:
${NSD_CreateLabel} 0 145 100% 15u " X Браузер Internet Explorer не установлен"
Pop $Label5

rb6:
${NSD_CreateLabel} 0 170 100% 35u "* Браузер, выбранный по умолчанию в системе. Пользователь в любой момент может его изменить и после этого страница может перестать открываться корректно. Если это произойдет, просто запустите программу установки еще раз и выберите нужный браузер."
Pop $Label6

nsDialogs::Show
FunctionEnd

Function fnCustomDestroy

;Состояние RadioButton 1
${NSD_GetState} $RadioButton1 $RadioButton1

;Если файл есть, то получаем состояние RadioButton 2, иначе идем далее
IfFileExists "$PROGRAMFILES\Google\Chrome\Application\chrome.exe" 0 +2
${NSD_GetState} $RadioButton2 $RadioButton2

;Если файл есть, то получаем состояние RadioButton 3, иначе идем далее
IfFileExists "$PROGRAMFILES\Mozilla Firefox\firefox.exe" 0 +2
${NSD_GetState} $RadioButton3 $RadioButton3

;Если файл есть, то получаем состояние RadioButton 4, иначе идем далее
IfFileExists "$PROGRAMFILES\Opera\launcher.exe" 0 +2
${NSD_GetState} $RadioButton4 $RadioButton4

;Если файл есть, то получаем состояние RadioButton 5, иначе идем далее
IfFileExists "$PROGRAMFILES\Internet Explorer\iexplore.exe" 0 +2
${NSD_GetState} $RadioButton5 $RadioButton5

IntCmp $RadioButton1 1 equal1 notequal1
equal1:
StrCpy $Browser ""
Goto End1
notequal1:

IntCmp $RadioButton2 1 equal2 notequal2
equal2:
StrCpy $Browser "$PROGRAMFILES\Google\Chrome\Application\chrome.exe"
Goto End1
notequal2:

End1:

FunctionEnd

Section "Полезные ссылки" Section1

;Set Section properties
SetOverwrite on

;Set Section Files and Shortcuts
SetOutPath "$INSTDIR\"
File "Links\fs.ico"

;Создание файлов

SetShellVarContext all
CreateShortCut "$DESKTOP\Полезные ссылки.lnk" "$Browser http://google.com" "" "$INSTDIR\fs.ico" "0"
CreateDirectory "$SMPROGRAMS\Полезные ссылки"
CreateShortCut "$SMPROGRAMS\Полезные ссылки\Полезные ссылки.lnk" "$Browser http://google.com" "" "$INSTDIR\fs.ico" 0
CreateShortCut "$SMPROGRAMS\Полезные ссылки\Uninstall.lnk" "$INSTDIR\uninstall.exe"

SectionEnd

Section -FinishSection

WriteRegStr HKLM "Software\${APPNAME}" "" "$INSTDIR"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "DisplayName" "${APPNAME}"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "UninstallString" "$INSTDIR\uninstall.exe"
WriteUninstaller "$INSTDIR\uninstall.exe"

SectionEnd

;Uninstall section
Section Uninstall

;Remove from registry...
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}"
DeleteRegKey HKLM "SOFTWARE\${APPNAME}"

;Delete self
Delete "$INSTDIR\uninstall.exe"

;Delete Shortcuts
SetShellVarContext all
Delete "$DESKTOP\Полезные ссылки.lnk"
Delete "$SMPROGRAMS\Полезные ссылки\Полезные ссылки.lnk"
Delete "$SMPROGRAMS\Полезные ссылки\Uninstall.lnk"

;Clean up Полезные ссылки
Delete "$INSTDIR\Полезные ссылки.url"
Delete "$INSTDIR\fs.ico"

;Remove remaining directories
RMDir "$SMPROGRAMS\Полезные ссылки"
RMDir "$INSTDIR\"

SectionEnd

;On initialization
Function .onInit

!insertmacro MUI_LANGDLL_DISPLAY

;Предотвращает множественость запуска инсталлятора
System::Call 'kernel32::CreateMutexA(i 0, i 0, t "$(^Name)") i .r1 ?e'
Pop $R0
${IfNot} $R0 == 0
MessageBox MB_OK|MB_ICONEXCLAMATION "Вы уже запустили установку $(^Name)! Проверьте открытые окна!"
Abort
${EndIf}

FunctionEnd

; eof
Первый вопрос риторический - я читал ваш справочник? Отвечать не нужно. А второй вопрос, за которым я обратился к мудрости участников этого форума заключается в том, что команды выделенные жирным, при выборе пункта "В Google Chrome" не создают ярлык на рабочем столе, у которого в свойствах в поле объект будет присутствовать следующая строка (обратите внимание на кавычки):

"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" "http://google.com"

Мало того, что все команды попадают только в одни кавычки "" (я пробовал ставить дополнительные кавычки, экранируя их - не помогло), которые объединяют путь к исполняемому файлу с URL, так еще из URL удаляются двоеточие и слэши. Как следствие, такой ярлык не выполняет своего назначения - открыть указанную страницу в выбранном браузере, т.е. попросту не работает. Вот и прошу помощи...

K.A.V.
18-06-2015, 18:00
Почему-то думал что именно вы сразу поймете в чем кроется суть проблемы »
Почему то думал, что вы вообще не читали справочник, раз задаёте вопрос в стиле "как использовать переменную в команде создания ярлыка", попробуйте перечитать ваше сообщение от моего лица, как поставили вопрос - так его и поняли, такой ответ и дали

я читал ваш справочник? Отвечать не нужно »
Может, и читали, утверждать наверняка не буду, но то, что читали невнимательно - это факт

не создают ярлык на рабочем столе, у которого в свойствах в поле объект будет присутствовать следующая строка »
Ну и правильно, что не создаёт, т.к. такого файла не существует на диске, к какому файлу ярлык то будет создаваться?

Ещё раз откройте описание команды CreateShortCut и прочтите её описание
Расположение_ярлыка.lnk Путь_до_файла.exe [параметры_запуска
1-ый параметр
Путь до папки ярлыка+его имя+расширение lnk

2-ой параметр
Путь до файла, который существует на диске, к которому создаётся ярлык

3-тий параметр
параметры запуска

В вашем случае, адрес сайта - это параметр запуска
CreateShortCut "$DESKTOP\Полезные ссылки.lnk" "$Browser" "http://google.com" "$INSTDIR\fs.ico" "0"

Мало того, что все команды попадают только в одни кавычки "" (я пробовал ставить дополнительные кавычки, экранируя их - не помогло), которые объединяют путь к исполняемому файлу с URL »
Ответ дал выше - путь к файлу, к которому создаётся ярлык и адрес сайта - 2 разных параметра в команде создания ярлыка, 2ой параметр для пути к файлу и 3ий параметр как "параметры запуска приложения"

WesternLight
18-06-2015, 19:10
Спасибо!!! Просто в вашем справочнике про создание ярлыка очень мало написано - там упоминаются параметры запуска, но нет примера использования... Не сообразил, что URL нужно передавать как параметр... Еще раз спасибо!




© OSzone.net 2001-2012