Показать полную графическую версию : [архив].: NSIS - все вопросы :.
Я сам спрашивал по этой теме (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)
Flix, Может у кого здесь уже есть наработки в этом направлении, будет приятно с ними познакомиться и разобрать ко косточкам.
Попробуй это, может подойдет - ЕxperienceUI (http://experienceui.enanocms.org/experienceui/index) ?!
Скины в ней тоже можно свои клепать, насколько я помню...
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"
Можно ли, создать кустомную страницу используя nsDialog для отображения страницы СтартМеню,
или альтернативный метод без использования плагина StartMenu.dll.
kotkovets
15-06-2011, 22:00
можно на основе этих примеров: http://nsis.sourceforge.net/Header_file_for_Listview
Естественно нужно попотеть, изучить парочку функций WinApi
А более упрощённую, в одну линию, где только будет
${NSD_CreateDirRequest} и ${NSD_CreateBrowseButton}
funtykin
16-06-2011, 14:47
Здравствуйте! помогите пожалуйста.
необходимо реализовать диалоговое окно в котором нужно указать фаил и скопировать его в дальнейшем в путь установки.
Если уже обсуждалось извиняюсь не нашел(
сам не совсем понимаю как вызвать диалог выбора файла..
с остальным в принципе понятно
необходимо реализовать диалоговое окно в котором нужно указать фаил и скопировать его в дальнейшем в путь установки. »
Не совсем понятен смысл этих действий, если я правильно понял, то попробуй покрути такой вариант.
!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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC