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

sawe
06-06-2011, 23:02
Я сам спрашивал по этой теме (http://forum.oszone.net/post-1684737-1229.html), но пока не получил ответ, брал основу с Wansis plug-in (http://nsis.sourceforge.net/Wansis_plug-in).
Или вот этот пример я перевёл, демонстрация NSIS плагина Wansis (http://rghost.ru/9680301).dll .
Есть такой SkinCrafter plug-in (http://nsis.sourceforge.net/NSIS_SkinCrafter_Plugin_plug-in),
пример его использования описан в Справочнике по NSIS (http://forum.oszone.net/thread-168287.html),
плагин красивый но совершенно бесполезен для компактных пакетов.
Можешь попробовать UltraModernUI (http://nsis.sourceforge.net/UltraModernUI)
или
SkinnedControls plug-in (http://nsis.sourceforge.net/SkinnedControls_plug-in)
ButtonEvent plug-in (http://nsis.sourceforge.net/ButtonEvent_plug-in)
nsDialogs_setImageOle.nsh (http://nsis.sourceforge.net/NsDialogs_SetImageOLE)

или заполнение картинкой
Image in installer window background (http://nsis.sourceforge.net/Image_in_installer_window_background)
вот я спрашивал по использованию этой картинки
по этой же теме (http://forum.ru-board.com/topic.cgi?forum=5&topic=0595&start=1080)

MaGoth
07-06-2011, 05:16
Flix, Может у кого здесь уже есть наработки в этом направлении, будет приятно с ними познакомиться и разобрать ко косточкам.
Попробуй это, может подойдет - ЕxperienceUI (http://experienceui.enanocms.org/experienceui/index) ?!
Скины в ней тоже можно свои клепать, насколько я помню...

Flix
07-06-2011, 11:21
sawe, MaGoth - спасибо, что отозвались. Теперь буду изучать матчасть.

wolkow70
09-06-2011, 15:37
Уважаемый kotkovets, может быть Вы дадите точную интерпретацию таким строкам из скрипта AIMP:

StrCpy $ClassName "AIMP.${extenstion}"
StrCmp ${extenstion} "AUDIOCD" 0 noaudio
WriteRegStr HKCR "${extenstion}" "" "$ClassName"
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\${extenstion}\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\${extenstion}\UserChoice" "Progid" "$ClassName"
noaudio:
WriteRegStr HKCR ".${extenstion}" "" "$ClassName"

Смущает вот, что :
WriteRegStr HKCR "${extenstion}" "" "$ClassName"
WriteRegStr HKCR ".${extenstion}" "" "$ClassName"

Интуитивно я понял, что это связано с наличием расширения AUDIOCD, так?

kotkovets
09-06-2011, 22:12
Интуитивно я понял, что это связано с наличием расширения AUDIOCD, так? »
А зачем интуитивно, обычный макрос, ничего сверхсложного.
!macro RegisterExtension extenstion
StrCpy $ClassName "AIMP.${extenstion}"
StrCmp ${extenstion} "AUDIOCD" 0 noaudio
WriteRegStr HKCR "${extenstion}" "" "$ClassName"
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\${extenstion}\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\${extenstion}\UserChoice" "Progid" "$ClassName"
noaudio:
;---
;---
!macroend
extenstion - заданное некое расширение (mp3, wav, aac)
StrCmp ${extenstion} "AUDIOCD" 0 noaudio - если заданное расширение AUDIOCD, то по скрипту выполнить 3 команды,
иначе перейти к метке noaudio (перепрыгнуть через три команды по скрипту).
Смущает вот, что »
а че здесь смущаться...xex
$ClassName -> равносильно AIMP.${extenstion} команда явно жежь указана - StrCpy $ClassName "AIMP.${extenstion}" . Просто сделано, чтобы покороче записывать в скрипте.
Надеюсь понятно...если внимательно почитали и применили на практике

wolkow70
10-06-2011, 07:32
Надеюсь понятно...если внимательно почитали и применили на практике »

На практике применяю и все работает, но самому разобраться до конца хоцца...

WriteRegStr HKCR "${extenstion}" "" "$ClassName"
WriteRegStr HKCR ".${extenstion}" "" "$ClassName"
В первой строке нет точки перед ${extenstion}
Во второй есть .${extenstion}

Получается, что значение "$ClassName" меняется.

Кстати, в скрипте KMPlayer так:
StrCpy $ClassName "KMPlayer.${extenstion}"
/* StrCmp ${extenstion} "AUDIOCD" 0 noaudio
WriteRegStr HKCR "${extenstion}" "" "$ClassName"
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\${extenstion}\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\${extenstion}\UserChoice" "Progid" "$ClassName"
noaudio:*/
WriteRegStr HKCR ".${extenstion}" "" "$ClassName"

То есть, если нет расширения AUDIOCD можно удалить эти строки?

kotkovets
10-06-2011, 09:16
То есть, если нет расширения AUDIOCD можно удалить эти строки? »
Если не применяете это расширение, то конечно же нет. к тому же две дублирующие записи, не ошибка, но не нужно так делать:
WriteRegStr HKCR "${extenstion}" "" "$ClassName"
;---
;---
noaudio:
WriteRegStr HKCR ".${extenstion}" "" "$ClassName"
;---
;---

wolkow70
10-06-2011, 13:35
kotkovets,
На китайском сайте скачал скрипт для Winamp.
Такая секция автозапуска дисков:

Section "Автозапуск CD дисков" CDAUTORUN
SectionIn 1 2 3
SetOutPath "$INSTDIR"
ReadRegStr $0 HKCR "AudioCD\shell\play\command" ""
StrCpy $1 $0 "" 14
StrCmp $1 'Winamp.exe" %1' +3
WriteRegStr HKCR "AudioCD\shell\play\command" "Winamp_Back" $0
WriteRegStr HKCR "AudioCD\shell\play\command" "" '"$INSTDIR\Winamp.exe" %1'
SectionEnd

В принципе работает, создает запись для восстановления.
Но при деинсталляции не удаляется и не восстанавливается, при таких строках скрипта:

ReadRegStr $R0 HKCR “AudioCD\shell\play\command” “Winamp_Back”
${IfThen} $R0 != “” ${|} WriteRegStr HKCR “AudioCD\shell\play\command” “” $R0 ${|}
DeleteRegValue HKCR “AudioCD\shell\play\command” “Winamp_Back”

Не пойму, вообще в чем дело. Может Вам сразу видно?

kotkovets
10-06-2011, 14:31
Комментарии по командам
ReadRegStr $0 HKCR "AudioCD\shell\play\command" "" »
Читаем из реестра значение по умолчанию, значение записываем в $0.
Здесь очевидно, получаем путь к Winamp.exe
StrCpy $1 $0 "" 14 »
А вот это лажа полная! Зачем из строки пути отсекать первые 14 символов :o для получения имени модуля...
Пути разнообразные бывают, в итоге кашу получим. Для получения имени модуля делается так:
!include "FileFunc.nsh"
;--
${GetFileName} "$0" "$1" ; т.е взамен StrCpy $1 $0 "" 14

${IfThen} $R0 != "" ${|} WriteRegStr HKCR “AudioCD\shell\play\command" "" $R0 ${|} »
Читаем эту команду так:
Если $R0 не равно пустому значению, тогда выполняем команду записи в реестр
WriteRegStr HKCR "AudioCD\shell\play\command" "" $R0 - запись значения по умолчанию
а дальше удаляется значение бэкапа реестра.

wolkow70
10-06-2011, 15:16
а дальше удаляется значение бэкапа реестра. »
Значение бэкапа удалилось, но по умолчанию после деинсталляции остался Winamp.exe, хотя в бэкап переписывался WMP (был по умолчанию). То есть запись из бэкапа не переписывается в дефолт.

После инсталляции Winamp
http://s005.radikal.ru/i210/1106/9f/6e07a91f9a43.jpg

После деинсталляции Winamp
http://s46.radikal.ru/i112/1106/2f/89f3d66f8abe.png

В секции удаления так:
ReadRegStr $R0 HKCR “AudioCD\shell\play\command" "Winamp_Back"
${IfThen} $R0 != "" ${|} WriteRegStr HKCR “AudioCD\shell\play\command" "" $R0 ${|}
DeleteRegValue HKCR "AudioCD\shell\play\command" "Winamp_Back"

kotkovets
10-06-2011, 18:24
Просмотрев на офф. сайте плагины которые работают с процессами, для себя посчитал наиболее удачный и даже лучший nsProcess (http://nsis.sourceforge.net/NsProcess_plugin).
Но ни один из них не умеет завершать оболочку системы, с ошибками работают в WIN7 и т.д
Решил написать свой плагин, за основу взял вышеупомянутый плагин...
В общем долго "мучил" свой проект. И вот что получилось:
---
Плагин предназначен для ANSI версии NSIS, кроссплатформенный (х86/x64), только для систем Windows NT начиная от Win2000 и выше.
Никаких дополнительных приложений, библиотек не требуется. Плагин полностью идентичен по функционалу стандартного диспетчера задач. (использованы не документированные функции Win API)
1. Поиск запущенного процесса
nsRestart::FindProcess "процесс.exe"
Pop $var

Где $var принимает следующие значения:
$var = 1 -> процесс не найден, не запущен
$var = 0 -> процесс запущен
2. Запись в файл *.ini список процессов с идентификаторами
nsRestart::ListProcess "Путь\файл.ini"
Pop $var

Где $var принимает следующие значения:
$var = error -> ошибка
$var =0 -> список успешно создан
3. Получение полного пути запущенного процесса
nsRestart::PathProcess "процесс.exe"
Pop $var

Где $var принимает следующие значения:
$var = 1 -> процесс не найден, не запущен
$var -> путь к запущенному процессу
4. Получение полного пути и командной строки запущенного процесса
Если запущеный процесс не имеет аргументов командной строки, то получаем путь к процессу.
Работает эта функция только с 32-битными процессами.
Достойного рещения для 64-битных процессов пока не нашел.
nsRestart::CmdPathProcess "процесс.exe"
Pop $var

Где $var принимает следующие значения:
$var = 1 -> процесс не найден, не запущен
$var -> путь к запущенному процессу + аргументы процесса
5. Перезапуск с аргументами командной строки запущенного процесса.
Перезапуск делается с задержкой в одну секунду.
Естественно кроме, специфических процессов (служб и т.д).
64-битные процессы будут перезапущены без аргументов командной строки.
Я категорически не рекомендую делать перезапуск системных процессов !!!
Во избежания потерь данных и получения "синих" экранов смерти !!!!
nsRestart::RestartProcess "процесс.exe"
Pop $var

Где $var принимает следующие значения:

$var = 0 -> процесс успешно перезапущен
$var = 1 -> процесс не запущен, не найден
$var = 2 -> процесс невозможно завершить
$var = 3 -> процесс завершен, но невозможно запустить

6. Завершение процесса
Я категорически не рекомендую "прибивать" системные процессы !!!
Во избежания потерь данных и получения "синих" экранов смерти !!!!
nsRestart::KillProcess "процесс.exe"
Pop $var

Где $var принимает следующие значения:

$var = 0 -> процесс успешно завершен
$var = 1 -> процесс не запущен, не найден

wolkow70
11-06-2011, 10:18
kotkovets,
Ну Вы мне то подскажите, что у меня не так:


ReadRegStr $R0 HKCR “AudioCD\shell\play\command" "Winamp_Back"
${IfThen} $R0 != "" ${|} WriteRegStr HKCR “AudioCD\shell\play\command" "" $R0 ${|}
DeleteRegValue HKCR "AudioCD\shell\play\command" "Winamp_Back"

wolkow70
11-06-2011, 20:13
kotkovets,

Получилось сделать удаление записи Winamp , а восстановление не получается.

ReadRegStr $0 HKCR "AudioCD\shell\play\command" ""
StrCmp $0 "$\"$PROGRAMFILES\Winamp\Winamp.exe$\" %1" 0 +2
DeleteRegValue HKCR "AudioCD\shell\play\command" ""

kotkovets
12-06-2011, 00:00
Получилось сделать удаление записи Winamp , а восстановление не получается.
ReadRegStr $0 HKCR "AudioCD\shell\play\command" ""
StrCmp $0 "$\"$PROGRAMFILES\Winamp\Winamp.exe$\" %1" 0 +2
DeleteRegValue HKCR "AudioCD\shell\play\command" "" »
дык тут и записи в реестр нету...)))
че тут думать, если $0 не равно "$\"$PROGRAMFILES\Winamp\Winamp.exe$\" %1",
то пропустить ниже две команды относительно оператора StrCmp, иначе выполнить две команды

ReadRegStr $0 HKCR "AudioCD\shell\play\command" ""
StrCmp $0 "$\"$PROGRAMFILES\Winamp\Winamp.exe$\" %1" 0 +3
DeleteRegValue HKCR "AudioCD\shell\play\command" ""
;здесь одна команда записи в реестр...

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

wolkow70
12-06-2011, 07:00
дык тут и записи в реестр нету...))) »

Дак, ниже запись была такая..


ReadRegStr $R0 HKCR “AudioCD\shell\play\command" "Winamp_Back"
${IfThen} $R0 != "" ${|} WriteRegStr HKCR “AudioCD\shell\play\command" "" $R0 ${|}
DeleteRegValue HKCR "AudioCD\shell\play\command" "Winamp_Back"

sawe
15-06-2011, 20:23
Можно ли, создать кустомную страницу используя nsDialog для отображения страницы СтартМеню,
или альтернативный метод без использования плагина StartMenu.dll.

kotkovets
15-06-2011, 22:00
можно на основе этих примеров: http://nsis.sourceforge.net/Header_file_for_Listview
Естественно нужно попотеть, изучить парочку функций WinApi

sawe
15-06-2011, 22:49
А более упрощённую, в одну линию, где только будет
${NSD_CreateDirRequest} и ${NSD_CreateBrowseButton}

funtykin
16-06-2011, 14:47
Здравствуйте! помогите пожалуйста.

необходимо реализовать диалоговое окно в котором нужно указать фаил и скопировать его в дальнейшем в путь установки.
Если уже обсуждалось извиняюсь не нашел(

сам не совсем понимаю как вызвать диалог выбора файла..
с остальным в принципе понятно

sawe
16-06-2011, 22:43
необходимо реализовать диалоговое окно в котором нужно указать фаил и скопировать его в дальнейшем в путь установки. »
Не совсем понятен смысл этих действий, если я правильно понял, то попробуй покрути такой вариант.

!include MUI.nsh ; интерфейс MUI2.nsh не катит!
SetCompressor /SOLID lzma
XPStyle on

Name "MMM"
OutFile Test_file.exe

InstallDir "$PROGRAMFILES\MMM" # папка установки по умолчанию!
InstallDirRegKey HKLM "Software\MMM" "" # получить установку папки из реестра если доступно!
RequestExecutionLevel user

;Спец страницы!
!define MUI_PAGE_CUSTOMFUNCTION_PRE WelcomePageSetupLinkPre
!define MUI_PAGE_CUSTOMFUNCTION_SHOW WelcomePageSetupLinkShow
!define MUI_WELCOMEPAGE_TITLE "Вас приветствует установщик $(^Name)"
!define MUI_TEXT_WELCOME_INFO_TEXT "Пожалуйста закройте все работающие приложения. \
$\nЭто обновит системные файлы без перезагрузки.$\n$\n$\nВыберите файл для вашей установки."
;Последовательность открытия страниц!
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE Russian

Function WelcomePageSetupLinkPre
var /global Filic
StrCpy $Filic "$EXEDIR\Text.txt"

!insertmacro MUI_INSTALLOPTIONS_WRITE "ioSpecial.ini" "Settings" "Numfields" 4 # счетчик увеличения!
!insertmacro MUI_INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 3" "Bottom" 100 # ограничение размера верхней метки!

!insertmacro MUI_INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Type" FileRequest # тип!
!insertmacro MUI_INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Text" ""
; Определите фильтр, для элементов которые можно выбрать, разделять чертой | без пробелов
!insertmacro MUI_INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Filter" "Filter=Text Files|*.txt|Programs|*.exe;*.com|All Files|*.*"
!insertmacro MUI_INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "State" "$Filic" # состояние!
!insertmacro MUI_INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Left" 120 # отступ слева!
!insertmacro MUI_INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Top" 100 # отступ от верха!
!insertmacro MUI_INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Right" 320 # длина вправо!
!insertmacro MUI_INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Bottom" 112 # высота строки!
!insertmacro MUI_INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Flags" "NOTABSTOP|FILE_EXPLORER" # флаг!
!insertmacro MUI_INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "HWND" "" # высота строки!
FunctionEnd
Function WelcomePageSetupLinkShow
!insertmacro MUI_INSTALLOPTIONS_SHOW
FunctionEnd

Section -bbbbbb # секция установки файлов!
/*------- MMM ---------*/
SectionEnd




© OSzone.net 2001-2012