Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Автоматическая установка приложений (http://forum.oszone.net/forumdisplay.php?f=61)
-   -   [архив].: NSIS - все вопросы :. (http://forum.oszone.net/showthread.php?t=67386)

kotkovets 17-06-2006 23:35 452038

[архив].: NSIS - все вопросы :.
 
Тема закрыта!
Лимит страниц.
Продолжение тут:
.: NSIS - все вопросы :. часть 2.
Старая шапка:
читать дальше »

Данная тема предназначена для обсуждения вопросов, связанных с инсталлятором Nullsoft Scriptable Install System, или просто NSIS. Сайт приложения.

Описание:
читать дальше »
NSIS (Nullsoft Scriptable Install System) - профессиональная система для создания инсталляторов в среде Windows с октрытым исходным кодом. При своем малом размере система очень гибкая, и при с широкими возможностями. Генерируемый ею инсталлятор также имеет очень маленький размер и идеально подходит для распространения продукта через Интернет.


Текущая версия: 2.46 от 6 декабря 2009 года
Скачать | Архив сборок версии 2 | Архив сборок версии 1

ВНИМАНИЕ! Созданный в NSIS инсталлятор является ANSI-приложением. Есть возможность использовать UNICODE-сборку системы, но при этом ваши дистрибутивы не будут работать в ANSI-системах, таких, как Windows 9x. Для загрузки UNICODE-сборки системы посетите сайт: http://www.scratchpaper.com/

ВНИМАНИЕ! прежде, чем задать вопрос, почитайте, где Вы найдете ответы на большинство вопросов:
Справочник по NSIS - создан силами нашего сообщества.
Руководство пользователя. Перевод – Поляков А.В, зеркало

Документация

Утилиты разработчика
Расширение функциональности
читать дальше »

Плагины и полезности к NSIS: http://nsis.sourceforge.net/Category:Plugins

Интерфейс Venis GUI: http://www.spaceblue.com/products/venis
Интерфейс ExperienceUI GUI http://experienceui.xx0r.info/oldeng...erienceui/home
Пример:


Интерфейс SkinCrafter Plugin - http://www.skincrafter.com/
Пример:

Инструкция по использованию от K.A.V.

Примеры скриптов на нашем форуме
Скрипт NSIS для перепаковки AIMP2+Сборки
Тема для Notepad++(пример парсинга XML)

Достоинства
читать дальше »


◦ Очень маленький размер установочного блока (около 34 Кбайт)
◦ zlib, bzip2 и LZMA-сжатие
◦ Гибкая система скриптов (спецально разработанная для инсталляторов)
◦ Поддержка многоязычности, точнее 53 языка, есть возможность ввода нового языка
◦ Поддержка плагинов
◦ Скрипт Препроцессор
◦ Создание Web-инсталляторов

Ещё немного полезной информации:
читать дальше »

▫ История создания установщика

NSIS создан как альтернатива InstallShield, предназначенного для коммерческих продуктов.

NSIS был создан для распространения Winamp. Он базируется на предыдущем продукте Nullsoft — PiMP (plugin Mini Packager), иначе известным как SuperPiMP. После версии 2.0a0, проект был перемещён на SourceForge.net, где к работе над ним присоединились и сторонние разработчики. NSIS 2.0 был выпущен в свет 2 года спустя.

NSIS версии 1 был очень похож на классический Windows Installer, но он был более управлемым с помощью скриптов и поддерживал другие форматы сжатия. NSIS версии 2 поддерживает новый графический интерфейс пользователя, LZMA-сжатие, многоязычность и имеет хорошую систему плагинов.

Версия 2.01 была первой версией, поддерживающей компиляцию на любой из POSIX-платформ. Это позволило создавать Windows-инсталляторы на GNU/Linux и FreeBSD без использования эмулятора Wine. На данный момент поддерживается компиляция только для Windows.

▫ Описание

Компилятор NSIS — программа makensis — компилирует скрипты в исполняемый код. Каждая строчка скрипта содержит одну команду. Пример:
Код:

# Пример скрипта
 Name "Example1"
 OutFile "example1.exe"
 InstallDir "$PROGRAMFILES\Example1"
 Page Directory
 Page InstFiles
 Section
  SetOutPath $INSTDIR
  File ..\makensis.exe
 SectionEnd


Modern User Interface

В версии 2.0 был введён новый графический интерфейс пользователя, названный Modern UI (MUI). MUI очень похож на интерфейс мастеров, он поддерживает splash screen, выбора языка, выбор компонентов для установки и более широкие возможности настройки по сравнению со своим предшественником. Пример:
Код:

# Пример скрипта с Modern UI
 !include MUI.nsh
 Name "Example 2"
 OutFile Example2.exe
 !insertmacro MUI_PAGE_WELCOME
 !insertmacro MUI_PAGE_LICENSE "license.rtf"
 !insertmacro MUI_PAGE_DIRECTORY
 !insertmacro MUI_PAGE_COMPONENTS
 !insertmacro MUI_PAGE_INSTFILES
 !insertmacro MUI_PAGE_FINISH
 !insertmacro MUI_LANGUAGE "English"
 !insertmacro MUI_LANGUAGE "German"
 !insertmacro MUI_LANGUAGE "French"
 Section "Extract makensis"
  SetOutPath $INSTDIR
  File ..\makensis.exe
 SectionEnd

NSIS может быть расширен при помощи плагинов, которые могут быть написаны на C++, Си, и Delphi. Плагины могут быть использованы для улучшения функциональности и интерфейса инсталлятора. Плагины могут быть вызваны в любой части кода NSIS скрипта.

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

▫ Программы, использующие NSIS


◦ Антивирус Касперского
◦ Qip
◦ 3DNA Desktop
◦ 7-Zip
◦ ATI Display Driver
◦ CDex
◦ Dev-C++
◦ DivX
◦ eMule FileZilla
◦ Google Picasa
◦ Google Talk
◦ Intel C (компилятор)
◦ IrfanView
◦ LightAllow
◦ LyX
◦ Miranda IM Mozilla Firefox 2.0
◦ NASA World Wind
◦ Notepad++
◦ OpenOffice.org для Windows
◦ Pidgin
◦ VLC Player
◦ Winamp

● Чем я могу распаковать инсталлятор, созданный в NSIS?

В настоящее время инсталляторы NSIS не могут быть полностью декомпилированы. Сам инсталлятор не содержит в себе никаких функций для того, чтобы извлечь сценарий и/или файлы без инсталляции. Это - выбор разработчика, доступны ли исходный текст и/или файлы для инсталлятора для публики или нет. Есть, однако, внешние инструментальные средства, которые позволяют это сделать. 7-zip поддерживает частичную распаковку NSIS инсталляторов с алгоритмом сжатия lzma или bzip. Так же существует мульти-архивный плагин для TotalCommander.
Небольшая заметка для разработчиков: используйте DCryptDll, если хотите скрыть некоторые файлы в вашей инсталляции.


===========
тема прикрепляется, шапка будет дорабатыватся... Volk1234, hb860

boss911 18-06-2006 01:33 452079

desperate
Извиняюсь, а чем Inno не устраивает?

desperate 18-06-2006 01:38 452081

boss911
ответ прост - Inno я вообще в глаза не видел(саму прогу для сборки инсталяторов)

boss911 18-06-2006 02:05 452093

desperate

Компилятор - Inno Setup + русификатор
Дополнительная программа для удобного редактирования скрипта Inno - ISTool

desperate 18-06-2006 14:42 452171

boss911
Inno Setup убился после установки руссификатора на него.... где можно взять русский help???

boss911 18-06-2006 16:07 452183

desperate

Убился наверное потому, что русик и версия Inno не соответствуют версиям файла!!
Русский хелп тут!
Если мы обсуждаем Inno , то может и переберемся в похожую по смыслу тему !!

desperate 20-06-2006 09:31 452447

boss911
мне все же хотелось бы узнать про NSIS больше

kirillkr 20-06-2006 09:48 452454

desperate
Я могу помочь. Было бы чем. Поставь задачу себе, а я тебе помогу ее выполнить.
Надо решить для себя какой режим инсталятора использовать. В данном случае лучше конечно использовать стандартный а не MUI-интерфейс, экономия нескольких килобайт.

desperate 20-06-2006 10:58 452481

kirillkr
у меня есть задача... ПРЕПАКОВАТЬ ВИНАМП, сделать его, как говориться под себя, добавить руссификатор сразу и по умолчанию, и чтобы при установке была ассоциация с файлами. Да и вообще, а его примере разобраться как работать с NSIS

vek 20-06-2006 13:15 452568

desperate
А почему именно NSIS? Если особых навыков нет можно начать с какого нибудь простенького инсталятора, например VSIC (http://www.vsic-online.com/eng/index.htm) -для русских бесплатно. Делов-то 5 сек. Добавить в проект папку с файлами и рег файлик. Тихо ставится с ключом /s.

desperate 20-06-2006 18:26 452732

vek
делов то, а как ты предлагаешь с него винамп ставить???

boss911 20-06-2006 18:28 452733

desperate

Цитата:

Цитата vek
А почему именно NSIS? Если особых навыков нет можно начать с какого нибудь простенького инсталятора

Обсолютно согласен, так как я тебе порекомендовал Inno , а он намного проще в создании инсталяторов и возможностей не как не меньше чем у NSIS !!
Чем он мне ненравитса, так ето его скриптовый язык (для меня сложно и не понятно) , да из nsis'а (инсталятора) невозможно вытащить скрипт для последующиго его редактирования под свои нужды и он не очень гибок с ключами для автоустановок, нельзя указать тот или инной компонент, задачу и ярлыки, которые ты хочеш\нехочеш ставить!! Начни сперва с чего-то простого (прадва Inno я не считаю уж таким простым, если не вникать в паскаль), а потом глядиш и научишся создавать свои msi'ашки!! :)

desperate 20-06-2006 18:38 452737

boss911
спасибо за совет Pascal, я знаю с 7 класса... все - таки меня интересует NSIS и где взять скрипт, с помощью которого собирался инсталятор winampa (интересует меня именно то, что откуда и куда добавляеться, прописываеться и инсталируеться)

boss911 20-06-2006 18:59 452745

desperate
Цитата:

спасибо за совет Pascal, я знаю с 7 класса...
Ну тогда ты много теряеш, что нехочеш использовать Inno , если ты знаеш паскаль, то ты такие чудеса сможеш творить с Inno , что NSIS будет долго отдыхать!! К сожалению я паскаль не знаю, но видел обалденные инсталяторы с кодом паскаль в сркипте!!
Цитата:

и где взять скрипт, с помощью которого собирался инсталятор winampa
Негде, кроме как самому написать, вот если бы он был упакован Inno , то тогда можно было бы без проблем вытащить скрипт из инсталятора и собрать все по новому, вот в чем изюминка Inno и не только!!

vampik 20-06-2006 22:05 452809

Цитата:

то тогда можно было бы без проблем вытащить скрипт из инсталятора и собрать все по новому, вот в чем изюминка Inno
Просто для Inno кто-то не поленился создать нормальный анпакер, а для NSIS код можно получить только частично.
Для тех, кто знает Паскаль, лучше пользоваться Inno.
Я вот Паскаль не перевариваю, поэтому использую NSIS, если каких-либо возможностей в нем не хватает - можно за 5 минут написать плагин на C++ - не намного сложнее, чем написать код на Паскаль для Inno.

desperate 20-06-2006 22:10 452812

vampik
Цитата:

за 5 минут написать плагин на C++
можно на этом по подробнее, т.к. С и С++ это мой профиль, то с чем я сталкиваюсь ежедневно... а вот файлик скрипта для винампа не помешал бы все равно.

vampik 20-06-2006 22:22 452815

Вот примеры моих простеньких плагинов, которые мне понадобились при создании некоторых инсталляшек, с исходниками (под VS 2003) -
http://vampik.net.ru/files/time.7z
http://vampik.net.ru/files/proc.7z
http://vampik.net.ru/files/cpu.7z

И таких при необходимости можно настрочить десятками.

В принципе, отдельные функции из библиотек можно вызывать и стандартными средствами, часто используемый пример -

Код:

System::Call 'shell32::SHChangeNotify(i 0x08000000, i 0, i 0, i 0) v'
(для обновления значков после смены ассоциаций)

A LogicLib.nsh позволяет писать NSIS-скрипты с использованием конструкций типа if...else, switch...case...endswitch, select...case...endselect, операторов do, while, for.

Скрипт для Winamp у меня для себя есть, но пока очень простой - только установка всех файлов, кроме Winamp Agent, запись данных в реестр, подхватывание серийника из ini-файла и ярлыки в меню "Пуск". Никаких ассоциаций файлов, параметров и т.п.

desperate 20-06-2006 22:38 452819

vampik
спасибо за идею...буду браться и клепать на С++ плагины для NSIS... потому что с самим инсталятором, чую никто не поможет

vek 21-06-2006 09:06 452941

desperate
Цитата:

делов то, а как ты предлагаешь с него винамп ставить???
Вопрос немного не понял. А в чем там сложность? Просто я винамп вообще не использую.

kirillkr 21-06-2006 10:15 452965

desperate
А смысл перепаковать. Вообще хороший скрипт идет с самим NSIS'ом.
Если бы знать, что делает WinAmp при установке, то и скрипт можно с нуля написать, но я им не пользуюсь.

coderman 19-07-2006 14:00 462859

Если честно то некоторые здесь задолбали со своим Inno!!!
Вопрос остался открытым - скрипт для перепаковки Winamp нужен или софтина какая вытаскивающая сей скрипт из дистриба. Софта я пока такого не нашел. Есть идеи - пишите.

boss911 20-07-2006 16:51 463122

coderman
Цитата:

Если честно то некоторые здесь задолбали со своим Inno!!!
Долбают дятлы, Вы не туда попали, Вам в зоопарк! Выбирайте вырожение плиз, тут стараютса помочь, а некого-то "задолбать"!!

Lesder2 24-01-2008 15:59 724585

Вопрос... Возможно при автоматической установки выбирать компоненты? в NSIS...
Или как ниудь отредактировать ехе сделаный в nsis?

unikum111 28-01-2008 03:37 727077

Lesder2, нужна конкретная задача, какую программу, версию и т.д.

Lesder2 29-01-2008 01:46 727807

unikum111, Вот например Регет поменял свой инсталятор на NSIS... Теперь настройки его хранятся в ini файлах которые при запуске распаковываются... Я бы хотел как нибудь их изменить... Просто что менять я знаю... как распаковыть тоже =)... А вот как редактить... ну или хотябы запаковать после распаковки... незнаю..

Master of Magic 14-02-2008 00:04 739778

Lesder2, расскажи
Цитата:

Цитата Lesder2
как распаковыть тоже

Чем NSIS инсталлятор можно распаковать? Желательно, что б сам скрипт тоже остался.

Собрал инсталлятор для Strong DC++ 2.11, прокомментировал и выложил скрипт сюда:
читать дальше »
Код:

;NSIS Modern User Interface version 1.70
;Example Script
;Written by Master of Magic

;--------------------------------
;Include Modern UI
  !include "MUI.nsh"
;--------------------------------
;Главная секция

  ;Название программы
  Name "Strong DC++ v.2.11"
  ; Заголовок которой будет отображаться при установки программы
  Caption "Strong DC++ v.2.11 DeepNet"
  ; Название файла который получится на выходе (после компиляции скрипта)
  OutFile "SDC.exe"
 
  ;Папка установки файлов по умолчания
  InstallDir "$PROGRAMFILES\StrongDC++"
  ;Требования к правам пользователя для установки данной программы
  RequestExecutionLevel user
  ; Устанавливаем компрессор lzma по умолчанию
  SetCompressor /FINAL lzma
 
  ;--------------------------------
;Установки интерфейса
 
  !define MUI_ABORTWARNING ; Вы действительно хотите прекратить установку данной программы
  !define MUI_ICON "C:\Documents and Settings\Администратор\Рабочий стол\HubikStrongDC\StrongDC\modern-install-colorful.ico" ; Иконка для собранного инсталлятора
  !define MUI_UNICON "C:\Documents and Settings\Администратор\Рабочий стол\HubikStrongDC\StrongDC\modern-uninstall-colorful.ico" ; Иконка для деинсталлятора
  !define MUI_FINISHPAGE_NOAUTOCLOSE ; Последняя страница установщика не закрывается автоматически
  !define MUI_FINISHPAGE_RUN ; Запускает последнюю страницу установщика
  !define MUI_FINISHPAGE_RUN_CHECKED ; Ставит флажок в положение Вкл по умолчанию
  !define MUI_FINISHPAGE_RUN_TEXT "Запустить программу" ; Надпись рядом с флажком
  !define MUI_FINISHPAGE_RUN_FUNCTION "LaunchLink" ; Запускаем функцию под именем LaunchLink

;--------------------------------
;Станицы

  !insertmacro MUI_PAGE_LICENSE "data\License.txt" ; Вставляем файл с лицензией
  !insertmacro MUI_PAGE_COMPONENTS
  !insertmacro MUI_PAGE_DIRECTORY
  !insertmacro MUI_PAGE_INSTFILES
  !insertmacro MUI_PAGE_FINISH ; Вставляет в ваш инсталлятор страницу завершения установки (функциональность управляется в Установках интерфейса см.Выше)

  !insertmacro MUI_UNPAGE_CONFIRM
  !insertmacro MUI_UNPAGE_INSTFILES
  !insertmacro MUI_UNPAGE_FINISH ; Вставляет в ваш инсталлятор страницу завершение деинсталляции (перезагрузить систему и т.д.)
  ;--------------------------------
;Язык
 
  !insertmacro MUI_LANGUAGE "Russian"

;--------------------------------
;Секция установки

Section "Strong DC++" SecMainProgram

  SectionIn RO
 
  ; Устанавливаем путь для копирования файлов
  SetOutPath $INSTDIR
 
  ; Сюда записываем файлы

File data\changelog-dc.txt
File data\changelog-en.txt
File data\changelog.txt
File data\dcppboot.xml
File data\License.txt
File data\russian.xml
File data\StrongDC.exe
File data\unicows.dll
File data\home.url

; Поскольку папок много приходится менять путь установки

SetOutPath $INSTDIR\EmoPacks

File data\EmoPacks\Kolobok.xml

SetOutPath $INSTDIR\EmoPacks\Kolobok

File /r data\EmoPacks\Kolobok\*.* ; Копируем все файлы в этой папке, /r - означает что копируем полностью все файлы в этой папке

SetOutPath $INSTDIR\Settings

File /r data\Settings\*.*

SetOutPath $INSTDIR\Settings\Certificates

File /r data\Settings\Certificates\*.*

SetOutPath $INSTDIR\Settings\HubLists

File /r data\Settings\HubLists\*.*
  SetOverwrite on
  SetOutPath $INSTDIR

writeuninstaller "$INSTDIR\uninstall.exe" ; Создаем файл деинсталляции в папке Program Files\StrongDC++, при компиляции скрипта uninstall.exe создается сам

  SectionEnd
;--------------------------------
; Вызов этой функции прописан в Установке интерфейса, если влажок вкл. функция запускает exe файл.
Function LaunchLink
  ExecShell "" "$INSTDIR\StrongDC.exe"
FunctionEnd


;--------------------------------

; Пользователь сам выбирает, какие ярлыки ему нужны, по умолчанию все включено
Section "Ярлык в меню Пуск" MenuProgramsShortcut

  CreateDirectory "$SMPROGRAMS\StrongDC++"
  CreateShortCut "$SMPROGRAMS\StrongDC++\Strong DC++ DeepNet.lnk" "$INSTDIR\StrongDC.exe" "" "$INSTDIR\StrongDC.exe" 0
  CreateShortCut "$SMPROGRAMS\StrongDC++\Наш сайт.lnk" "$INSTDIR\home.url" ""
  CreateShortCut "$SMPROGRAMS\StrongDC++\Удаление.lnk" "$INSTDIR\uninstall.exe" ""
 
SectionEnd
;--------------------------------

Section "Ярлык на рабочем столе" SecDesctopShortcut

  CreateShortCut "$DESKTOP\Strong DC++ DeepNet.lnk" "$INSTDIR\StrongDC.exe" "" "$INSTDIR\StrongDC.exe" 0
 
SectionEnd
;--------------------------------
;
Section "Ярлык в панели быстрого запуска" SecQlaunchShortcut

  CreateShortCut "$QUICKLAUNCH\Strong DC++ DeepNet.lnk" "$INSTDIR\StrongDC.exe" "" "$INSTDIR\StrongDC.exe" 0
 
SectionEnd
;--------------------------------
;
Section "Добавить программу в автозапуск" SecArlaunchShortcut

  CreateShortCut "$SMSTARTUP\Strong DC++ DeepNet.lnk" "$INSTDIR\StrongDC.exe" "" "$INSTDIR\StrongDC.exe" 0
  SectionEnd
;--------------------------------
; Деинсталляция
; Функция подтверждающая желание пользователя удалить приложение
Function un.onInit
  MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "Вы уверены в том, что желаете удалить $(^Name) и все компоненты программы?" IDYES +2
  Abort
FunctionEnd

Section "Uninstall"

SetOutPath $INSTDIR

KillProcDLL::KillProc "StrongDC.exe" ; Перед тем как удалить программу необходимо завршить пработу программы, непосредственно NSIS не имеет средств для этого придется качать Plug-In отсюда
Sleep 700 ; Делаем паузу потому, что программа убивается не сразу

; Удаляем ярлыки RmDir /r - удаляем директорию со всем её содержимым
  RmDir /r "$SMPROGRAMS\StrongDC++" 
  Delete "$QUICKLAUNCH\Strong DC++ DeepNet.lnk"
  Delete "$SMSTARTUP\Strong DC++ DeepNet.lnk"
  Delete "$DESKTOP\Strong DC++ DeepNet.lnk"
  Delete "$SMPROGRAMS\StrongDC++\Uninstall.lnk"
; Удаление программы

Delete "changelog-dc.txt"
Delete "changelog-en.txt"
Delete "changelog.txt"
Delete "dcppboot.xml"
Delete "License.txt"
Delete "russian.xml"
Delete "StrongDC.exe"
Delete "unicows.dll"
Delete "home.url"
RmDir /r "$INSTDIR\Settings"
RmDir /r "$INSTDIR\EmoPacks"
RmDir /r "$INSTDIR\Logs"

Delete "Uninstall.exe" ; удаляем сам файл деинсталяции
RmDir /rebootok "$INSTDIR" ; Директория удаляется только после перезагрузки компьютера, без перезагрузки удалить папку не получилось, толи глюк инсталлятора, то ли у меня руки кривые

SetAutoClose true ; Автозакрытие окна после завершения деинсталляции

SectionEnd

;--------------------------------
;Descriptions

  ;Language strings
  ;LangString DESC_SecDummy ${LANG_ENGLISH} "Ярлык на рабочем столе"

  ;Здесь находится описание ярлыков
  !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
    !insertmacro MUI_DESCRIPTION_TEXT ${SecMainProgram} "Программа для общения и обмена файлами в сети"
    !insertmacro MUI_DESCRIPTION_TEXT ${MenuProgramsShortcut} "Создать ярлык в меню Пуск"
    !insertmacro MUI_DESCRIPTION_TEXT ${SecDesctopShortcut} "Создать ярлык на рабочем столе"
    !insertmacro MUI_DESCRIPTION_TEXT ${SecQlaunchShortcut} "Создать ярлык в панели быстрого запуска"
    !insertmacro MUI_DESCRIPTION_TEXT ${SecArlaunchShortcut} "Добавить программу в автозапуск"
  !insertmacro MUI_FUNCTION_DESCRIPTION_END

;--------------------------------


Lesder2 16-02-2008 00:12 741183

Master of Magic
7zip\м расспаковывается =))))
Но скрипта нету =(

Master of Magic 16-02-2008 01:50 741235

7zip и плагином в тотал командаре, это я и сам знаю, скриптик нужен...
Кстати, что 7zip, что плагин в Total-е только частично поддерживают распаковку NSIS

simplix 17-02-2008 19:30 742516

Master of Magic, Следующий код:
Код:

File data\changelog-dc.txt
File data\changelog-en.txt
File data\changelog.txt
File data\dcppboot.xml
File data\License.txt
File data\russian.xml
File data\StrongDC.exe
File data\unicows.dll
File data\home.url

; Поскольку папок много приходится менять путь установки

SetOutPath $INSTDIR\EmoPacks

File data\EmoPacks\Kolobok.xml

SetOutPath $INSTDIR\EmoPacks\Kolobok

File /r data\EmoPacks\Kolobok\*.* ; Копируем все файлы в этой папке, /r - означает что копируем полностью все файлы в этой папке

SetOutPath $INSTDIR\Settings

File /r data\Settings\*.*

SetOutPath $INSTDIR\Settings\Certificates

File /r data\Settings\Certificates\*.*

SetOutPath $INSTDIR\Settings\HubLists

File /r data\Settings\HubLists\*.*

Можно заменить так:

Код:

File /r "data\*.*"

Master of Magic 17-02-2008 21:28 742596

В принципе монжо и так :)

hb860 21-02-2008 12:26 745368

HM NIS EDIT: A Free NSIS Editor/IDE
Неплохой инструмент в помощь "начинающему писателю" скриптов NSIS
На сайте программы есть также конвертер инносетапа в нсис(если оно надо кому-то, в чём лично я сомневаюсь)
Русский язык включен.
Сайт программы

simplix 21-02-2008 15:25 745500

hb860, Тогда уж лучше EclipseNSIS.

unikum111 21-02-2008 20:39 745716

Никто так и не ответил на вопрос: возможно ли вытащить скрипт из инсталлятора? Я склоняюсь к отрицательному ответу...

simplix 21-02-2008 22:08 745812

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

unikum111 22-02-2008 12:03 746077

simplix, я так и понял, восстановить можно только по снимкам системы (файловой системы + реестра).

hb860 22-02-2008 13:08 746116

unikum111, Именно, можно накатать собственно ручно скрипт, который будет делать тоже самое. Надо просто знать что делает оригинал(всего-то :-))

SamLab 22-02-2008 15:27 746232

Можно ли как в командой строке запретить запуск приложения и посещение сайта программы (например при установке последней врсии ReGet Personal)?

hb860 27-02-2008 17:40 749350

Если я правильно понял вопрос, то многоуважаемый (мной, по крайней мере) SamLab имеет ввиду, нет ли у NSIS какого-либо ключа, способного подавить указанные в посте действия. Изначально - нет, но в NSIS существует возможность расширять коммандные ключи исталятора,например, setup.exe /S /Bla /bla2=1.
Эти расширения задаются в процессе написания скрипта, и если создатель инсталлятора ReGet Personal заложил такую возможность, то теоретически она есть, но лично мне она не известна.

hb860 04-03-2008 09:31 752939

Цитата:

Цитата vampik
(для обновления значков после смены ассоциаций) »

А можно делать так:
Код:

${RefreshShellIcons}
Эффект будет тоже
Цитата:

Цитата E.1.21 RefreshShellIcons from NSIS Users Manual
After changing file associations, you can call this function to refresh the shell immediately.


ZaV 05-03-2008 16:45 754005

Цитата:

Цитата SamLab
Можно ли как в командой строке запретить запуск приложения и посещение сайта программы (например при установке последней врсии ReGet Personal)? »

Насчет ключей ничего найти не смог, а конкретно для ReGet Personal помогает следующее .
Перед собственно запуском инсталлятора копируем в

c:\Program Files\ReGet Software\ReGet Deluxe\

файл defaultlang.dll

после чего запускаем установки и окно IE не открывается.

Котяра 07-03-2008 17:13 755487

boss911, а как создавать .MSI файлы?

Вот несколько довольно простых инсталляторов:
- Inno Setup
Inno Setup (далее IS) обладает скриптовой логикой, но снабжен мастером создания скриптов. Обладает неограниченными возможностями.
- CreateInstall
CreateInstall (далее CI) - простой инсталлятор для начинающих. Free-версия бесплатна

В IS создавать Setup труднее. Но, они более сложные!
В CI все просто. Советую начать с CI!

МИШАНЧИК 04-05-2008 15:51 794567

Подскажите пожалуйста по поводу ключа для тихой установки программ созданных с помощью инсталятора NSIS!
Конкретно интересует Maxthon 2.09. Дело в том, что предыдущие версии Maxthon 2, упакованные NSIS, запускались тихо с ключом /S. А версия 2.09 не хочет. Хотя тоже упакована NSIS. В чём может быть проблема?
Заранее спасибо!

hb860 04-05-2008 16:29 794595

Цитата:

Цитата МИШАНЧИК
Хотя тоже упакована NSIS. »

Может на инносетап переделали ?
/Silent пробовал ?

МИШАНЧИК 05-05-2008 09:19 795010

hb860, нет, если открыть, то пишет ## NullSoft Installer ##
Как быть?

hb860 05-05-2008 14:37 795245

Дай-ка ссылку
Гляну на досуге

МИШАНЧИК 05-05-2008 14:41 795251

hb860, держи, это новый, но такая же ерунда получается.
http://maxthon.cachefly.net/mx_2.1.0.1595.exe

hb860 07-05-2008 09:28 796762

МИШАНЧИК, NSIS
Зачем то прижали тихую установку, непонятно, зачем. Наверно надо перепаковывать или использовать AutoIt
P.S. Помоему мы тут флудим.

Cramac 15-05-2008 11:16 803218

Всем привет. Подскажите, как можно с помощью данного установщика провести такое:
1. необходимо распаковать архив, запустить там ехе с параметром, потом установочные файлы удалить (настройка впн соединения)
дождаться когда завершиться и перейти дальше
2. распаковать программу и запустить настройщик (strongDC)
возможно еще 1 программу распаковать необходимо будет

hb860 15-05-2008 15:01 803416

Бррр
Как всё сложно

1.
Код:


Section "MainSection" SEC01
  SetOutPath "$TEMP"
  File "c:\твой_архив.ехе"
  ExecWait "$TEMP\твой_архив.ехе"
  Delete "$TEMP\твой_архив.ехе"
  ;Вот тут он уже распаковынный, предположим в C:\arcsrc
  ExecWait "C:\arcsrc\чё ты там хотел запустить.exe /параметры"
  RmDir /r "C:\arcsrc"

2. Поясни подробней. Непонятно ничё

Cramac 15-05-2008 16:57 803545

hb860, по второму пункту,
надо скопировать содержимое в папку (к примеру в c:/strongDC)
и запустить от туда софтинку (c:/strongDC/setting/editor.exe)
после этого создать пару ярлычков на раб столе и линков на вебсайты и закрыть инсталятор

hb860 15-05-2008 21:45 803784

Хорошо
Продолжение того что я там понаписал
Код:

SetOutPath "c:\strongDC\"
File /r "c:\Папка с файлами для копирования в c:/strongDC\*.*"
ExecWait "c:\strongDC\setting\editor.exe"
;Если не надо ждать когда едитор закроется - пиши так
;Exec "c:\strongDC\setting\editor.exe"
;плодим ярлыки
CreateShortCut "$Desktop\Я винамп.lnk" "c:\program files\winamp\winamp.exe" "" "c:\program files\winamp\winamp.exe" 0
CreateShortCut "$Desktop\А я не винамп.lnk" "http://www.ya.ru" "" "c:\Program Files\Internet Explorer\iexplore.exe" 0
SectionEnd


Master of Magic 22-05-2008 20:17 808680

Цитата:

Цитата Master of Magic
Собрал инсталлятор для Strong DC++ 2.11, прокомментировал и выложил скрипт сюда: »

Хочется к этому скрипту приделать деинсталлятор, что б при удаление программы удалялись сначала все установленные файлы, а потом предлагалась удалить файлы созданные программой: папка Logs с личкой и Downloads со всем накачанным. И что б папка StrongDC удалялась без перезагрузки.
Кто-нибудь знает как это сделать?

hb860 22-05-2008 23:29 808821

Я могу попробовать помочь
Так исторически сложилось что я никогда не пользовался Strong DC++, поэтому место расположения
Цитата:

Цитата Master of Magic
Logs с личкой и Downloads со всем накачанным »

мне неизвестно

Если они находятся в PROGRAM FILES\STRONGDC++, то меняешь
Код:

RmDir /rebootok "$INSTDIR"
на
Код:

RmDir /r "$INSTDIR"
Единственное, эта операция не удалит те файлы, которые на данный момент используются каким - либо приложением. Если таких файлов не будет, то команда снесет всю папку со всем содержимым. В противном случае остануться только "занятые" файлы. Просить перезагрузку деинсталятор не будет.
Попробуй

Master of Magic 23-05-2008 06:45 808913

Цитата:

Цитата hb860
Так исторически сложилось что я никогда не пользовался Strong DC++, поэтому место расположения »

Они действительно находятся в PROGRAM FILES\STRONGDC++, но у этого способа есть один большой минус, если деинсталлятор (uninstall.exe) поместить в любое другое место например в C:\Program Files, то из этой дериктории будет удалены все файлы. К тому же папка "$INSTDIR" все равно не будет удалена. И уж тем более не будет задан вопрос по удалению сначала установленных файлов, а уж потом удаление появившихся в результате работы. Реализовать сей момент можно с помошью uninstall.log я думаю(предложение в стиле йоды :) ). В играх же как-то реализванно, "Удалить все сохрарения игры"...

hb860 23-05-2008 15:26 809233

Цитата:

Цитата Master of Magic
деинсталлятор (uninstall.exe) поместить в любое другое место »

Ладно, пишем путь к папке установки в реестр в инсталяторе
Код:

WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\StrongDC" "SetupDir" "$INSTDIR"
, а в деинсталяторе читаем
Код:

ReadRegStr $0 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\StrongDC" "SetupDir"
и долбим :)
Долбим так(без перезагрузки):
Код:

RmDir "$0"
Потом вываливаем
Код:

MessageBox MB_YESNO "Удалять всё остальное?" IDYES true IDNO next
true:
  RmDir /r "$0"
  Goto next
next:
....Продолжение скрипта


МИШАНЧИК 25-05-2008 02:56 810217

Подскажите пожалуйста!
Можно ли как-то вскрывать инсталяторы NSIS? Примерно как с инсталяторами Inno, чтоб извлекался файл конфигурации и компоненты. Если да, то как?
Заранее спасибо.

hb860 25-05-2008 11:28 810306

Сто раз уже обсуждалось. Никак нельзя
Можно распаковать 7-zip'ом, вытащить все файлы
Дальше придется писать свой скрипт

ua.life 27-05-2008 18:39 812067

hb860, Почему это? Может стоит попробывать Universal Extractor? Или он не позволяет?

hb860 28-05-2008 09:10 812534

Цитата:

Цитата ua.life
стоит попробывать Universal Extractor »

Попробовал!
Локализация такая, что я лежал под столом
Получил .NSI файл. В нем написан бред, и он не копилится(декомпилировал им свою сборку Winrar). На оригинал НИКАКИМ местом не похоже. А то что он распаковал инсталятор, так
Цитата:

Цитата hb860
Можно распаковать 7-zip'ом, вытащить все файлы »


ua.life 28-05-2008 15:14 812865

Теперь понятно, спасибо. Я просто не имел пока дела с NSIS.

hb860 07-07-2008 10:55 844504

Утилитка, которая конвертит reg-файл в команды NSIS

Комсомолец 13-09-2008 09:07 897826

Скрипты с комментариями. Всё проверено. Раз для автоустановки форум-то без вопросов всё ставится с ключом /S.


FlyLinkDC++
Код:


;константы (название программы, версия, ключ для деинсталляции, брендинг)
!define PRODUCT_NAME "FlyLinkDC++"
!define PRODUCT_VERSION "3.52"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"
!define BRANDING "Created by Комсомолец 2008"

;вставляем графический фейс инсталлятора и функции
; MUI 1.67 compatible ------
!include "MUI.nsh"
!include "FileFunc.nsh"

;компрессия (это непрерывный архив, оптимальное сжатие)
SetCompressor /SOLID lzma

;стандартные страницы приветствия, выбора директории, иконки и т.д.
; MUI Settings
!define MUI_ABORTWARNING
;путь к иконкам инсталлятора и к иконке для унинсталла (тут мои)
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\flylihk.ico"
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall-blue-full.ico"
;а тут стандартные иконки из пакета NSIS
;!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install-colorfull.ico"
;!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall-blue-full.ico"
!define MUI_COMPONENTSPAGE_NODESC
; Welcome page
!insertmacro MUI_PAGE_WELCOME
; Directory page
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_COMPONENTS
; Instfiles page
!insertmacro MUI_PAGE_INSTFILES
; Finish page
!insertmacro MUI_PAGE_FINISH
; Uninstaller pages
!insertmacro MUI_UNPAGE_INSTFILES
; Language files
!insertmacro MUI_LANGUAGE "Russian"


;ребрендинг
BrandingText "${BRANDING}"

;название продукта и версия
Name "${PRODUCT_NAME}"
Caption "${PRODUCT_NAME} ${PRODUCT_VERSION}"

;имя выходного файла
OutFile "${PRODUCT_NAME}_${PRODUCT_VERSION}_PowerPack.exe"

;дефолтная директория установки
InstallDir "$PROGRAMFILES\FlyLinkDC"

;показывать все детали во время установки
ShowInstDetails show

;показывать все детали во время удаления
ShowUnInstDetails show

;варианты установки
InstType "Полная"
InstType "Сокращенная"

;основная секция
Section "!${PRODUCT_NAME}" idx0
;галка стоит в обоих вариантах установки и указываем, что устанавливаем в указанную директорию
  SectionIn 1 2 RO
  SetOutPath "$INSTDIR"

;путь откуда копируем все файлы и папки
 File /r "C:\FlyLinkDC\*.*"

;создаем файл unins000.exe и записи в реестре для удаления
        WriteUninstaller "$OUTDIR\unins000.exe"
        WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
        WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$OUTDIR\FlylinkDC.exe"
        WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$OUTDIR\unins000.exe"
        WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
SectionEnd

;тут думаю понятно
Section "Ярлыки в меню Пуск" idx1
        SectionIn 1 2
        SetShellVarContext all
        CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}"
        CreateShortCut  "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\FlylinkDC.exe"
        CreateShortCut  "$SMPROGRAMS\${PRODUCT_NAME}\ReadMe.lnk" "$INSTDIR\Readme.rtf"
        CreateShortCut  "$SMPROGRAMS\${PRODUCT_NAME}\Комтек.lnk" "$INSTDIR\Home.url"
        CreateShortCut  "$QUICKLAUNCH\${PRODUCT_NAME}.lnk" "$INSTDIR\FlylinkDC.exe"
        CreateShortCut  "$SMPROGRAMS\${PRODUCT_NAME}\Удалить ${PRODUCT_NAME}.lnk" "$INSTDIR\unins000.exe"
SectionEnd


;тут есть заморочка-  IfSilent +3  -не устанавливать при тихой установке
Section "Ярлыки в панели быстрого запуска" idx2
        SectionIn 1
            IfSilent +3
        SetShellVarContext all
        CreateShortCut  "$QUICKLAUNCH\${PRODUCT_NAME}.lnk" "$INSTDIR\FlylinkDC.exe"
SectionEnd

Section "Добавить ярлык в автозапуск" idx3
        SectionIn 1 2
            IfSilent +3
        SetShellVarContext all
                CreateShortCut "$SMSTARTUP\${PRODUCT_NAME}.lnk" "$INSTDIR\FlylinkDC.exe"
SectionEnd

Section "Ярлыки на рабочем столе" idx4
        SectionIn 1
            IfSilent +3
        SetShellVarContext all
        CreateShortCut "$DESKTOP\${PRODUCT_NAME}.lnk" "$INSTDIR\FlylinkDC.exe"
        CreateShortCut  "$SMPROGRAMS\${PRODUCT_NAME}\Комтек.lnk" "$INSTDIR\Home.url"
SectionEnd

;тут диалог о завершении удаления
Function un.onUninstSuccess
  HideWindow
  MessageBox MB_ICONINFORMATION|MB_OK "Удаление программы $(^Name) было успешно завершено."
FunctionEnd

;тут диалог подтверждения удаления
Function un.onInit
  MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "Вы уверены в том, что желаете удалить $(^Name) и все компоненты программы?" IDYES +2
  Abort
FunctionEnd

;тут прописываем что удалять и закрыть окно удаления
Section Uninstall
  RMDir /r "$INSTDIR\"
  SetShellVarContext all
  RMDir /r "$SMPROGRAMS\${PRODUCT_NAME}"
  Delete "$DESKTOP\${PRODUCT_NAME}.LNK"
  Delete "$QUICKLAUNCH\${PRODUCT_NAME}.LNK"
  Delete "$SMSTARTUP\${PRODUCT_NAME}.LNK"
  DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
  SetAutoClose true
SectionEnd



Total Commander
Код:

!define PRODUCT_NAME "Total Commander"
!define PRODUCT_VERSION "7.03"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"
!define BRANDING "Created by Комсомолец 2008"

; MUI 1.67 compatible ------
!include "MUI.nsh"
!include "FileFunc.nsh"

SetCompressor /SOLID lzma
; MUI Settings
!define MUI_ABORTWARNING
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\tcmd.ico"
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall-blue-full.ico"
!define MUI_COMPONENTSPAGE_NODESC
; Welcome page
!insertmacro MUI_PAGE_WELCOME
; Directory page
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_COMPONENTS
; Instfiles page
!insertmacro MUI_PAGE_INSTFILES
; Finish page
!insertmacro MUI_PAGE_FINISH
; Uninstaller pages
!insertmacro MUI_UNPAGE_INSTFILES
; Language files
!insertmacro MUI_LANGUAGE "Russian"

BrandingText "${BRANDING}"
Name "${PRODUCT_NAME}"
Caption "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "${PRODUCT_NAME}_${PRODUCT_VERSION}_PowerPack.exe"
InstallDir "$PROGRAMFILES\Total Commander"
ShowInstDetails show
ShowUnInstDetails show
InstType "Полная"
InstType "Сокращенная"

Section "!${PRODUCT_NAME}" idx0
  SectionIn 1 2 RO
  SetOutPath "$INSTDIR"
  File /r "C:\Total\*.*"

        WriteUninstaller "$OUTDIR\Uninstall.exe"
        WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
        WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$OUTDIR\totalcmd.exe"
        WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$OUTDIR\Uninstall.exe"
        WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
SectionEnd

Section "Ярлыки в меню Пуск" idx1
        SectionIn 1 2
        SetShellVarContext all
        CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}"
        CreateShortCut  "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\totalcmd.exe"
        CreateShortCut  "$SMPROGRAMS\${PRODUCT_NAME}\Удалить ${PRODUCT_NAME}.lnk" "$INSTDIR\Uninstall.exe"
SectionEnd

Section "Ярлыки в панели быстрого запуска" idx2
        SectionIn 1 2
        SetShellVarContext all
        CreateShortCut  "$QUICKLAUNCH\${PRODUCT_NAME}.lnk" "$INSTDIR\totalcmd.exe"
SectionEnd

Section "Ярлык на рабочем столе" idx3
        SectionIn 1
            IfSilent +3
        SetShellVarContext all
        CreateShortCut "$DESKTOP\${PRODUCT_NAME}.lnk" "$INSTDIR\totalcmd.exe"
SectionEnd


Function un.onUninstSuccess
  HideWindow
  MessageBox MB_ICONINFORMATION|MB_OK "Удаление программы $(^Name) было успешно завершено."
FunctionEnd

Function un.onInit
  MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "Вы уверены в том, что желаете удалить $(^Name) и все компоненты программы?" IDYES +2
  Abort
FunctionEnd

Section Uninstall
  RMDir /r "$INSTDIR\"
  SetShellVarContext all
  RMDir /r "$SMPROGRAMS\${PRODUCT_NAME}"
  Delete "$DESKTOP\${PRODUCT_NAME}.LNK"
  Delete "$QUICKLAUNCH\${PRODUCT_NAME}.LNK"
  DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
  SetAutoClose true
SectionEnd



QIP 2005
Код:

!define PRODUCT_NAME "QIP 2005"
!define PRODUCT_VERSION "v.8070"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"
!define BRANDING "Created by Комсомолец 2008"

; MUI 1.67 compatible ------
!include "MUI.nsh"
!include "FileFunc.nsh"

SetCompressor /SOLID lzma
; MUI Settings
!define MUI_ABORTWARNING
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\qip.ico"
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\unqip.ico"
!define MUI_COMPONENTSPAGE_NODESC
; Welcome page
!insertmacro MUI_PAGE_WELCOME
; Directory page
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_COMPONENTS
; Instfiles page
!insertmacro MUI_PAGE_INSTFILES
; Finish page
!insertmacro MUI_PAGE_FINISH
; Uninstaller pages
!insertmacro MUI_UNPAGE_INSTFILES
; Language files
!insertmacro MUI_LANGUAGE "Russian"

BrandingText "${BRANDING}"
Name "${PRODUCT_NAME}"
Caption "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "${PRODUCT_NAME}_${PRODUCT_VERSION}_PowerPack.exe"
InstallDir "$PROGRAMFILES\QIP"
ShowInstDetails show
ShowUnInstDetails show
InstType "Полная"
InstType "Сокращенная"

Section "!${PRODUCT_NAME}" idx0
  SectionIn 1 2 RO
  SetOutPath "$INSTDIR"
  File /r "C:\QIP\*.*"

        WriteUninstaller "$OUTDIR\UnQIP.exe"
        WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
        WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$OUTDIR\QIP.exe"
        WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$OUTDIR\UnQIP.exe"
        WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
SectionEnd

Section "Ярлыки в меню Пуск" idx1
        SectionIn 1 2
        SetShellVarContext all
        CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}"
        CreateShortCut  "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\QIP.exe"
        CreateShortCut  "$SMPROGRAMS\${PRODUCT_NAME}\Удалить ${PRODUCT_NAME}.lnk" "$INSTDIR\UnQIP.exe"
SectionEnd

Section "Ярлыки в панели быстрого запуска" idx2
        SectionIn 1 2
            IfSilent +3
        SetShellVarContext all
        CreateShortCut  "$QUICKLAUNCH\${PRODUCT_NAME}.lnk" "$INSTDIR\QIP.exe"
SectionEnd

Section "Ярлык на рабочем столе" idx3
        SectionIn 1
            IfSilent +3
        SetShellVarContext all
        CreateShortCut "$DESKTOP\${PRODUCT_NAME}.lnk" "$INSTDIR\QIP.exe"
SectionEnd


Function un.onUninstSuccess
  HideWindow
  MessageBox MB_ICONINFORMATION|MB_OK "Удаление программы $(^Name) было успешно завершено."
FunctionEnd

Function un.onInit
  MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "Вы уверены в том, что желаете удалить $(^Name) и все компоненты программы?" IDYES +2
  Abort
FunctionEnd

Section Uninstall
  RMDir /r "$INSTDIR\"
  RMDir /r "$INSTDIR\LI\"
  RMDir /r "$INSTDIR\Plugins\"
  RMDir /r "$INSTDIR\Skins\"
  RMDir /r "$INSTDIR\Sounds\"
  RMDir /r "$INSTDIR\Users\"
  SetShellVarContext all
  RMDir /r "$SMPROGRAMS\${PRODUCT_NAME}"
  Delete "$DESKTOP\${PRODUCT_NAME}.LNK"
  Delete "$QUICKLAUNCH\${PRODUCT_NAME}.LNK"
  DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
  SetAutoClose true
SectionEnd



Aimp2 v.2.50 (автор скрипта-hb860)
Код:

!define PRODUCT_NAME "AIMP2"
!define PRODUCT_VERSION "2.50.293"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"
!define BRANDING "Created by Комсомолец 2008"

; MUI 1.67 compatible ------
!include "MUI.nsh"
!include "FileFunc.nsh"

SetCompressor /SOLID lzma
; MUI Settings
!define MUI_ABORTWARNING
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\aimp.ico"
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall-blue-full.ico"
!define MUI_COMPONENTSPAGE_NODESC
; Welcome page
!insertmacro MUI_PAGE_WELCOME
; Directory page
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_COMPONENTS
; Instfiles page
!insertmacro MUI_PAGE_INSTFILES
; Finish page
!insertmacro MUI_PAGE_FINISH
; Uninstaller pages
!insertmacro MUI_UNPAGE_INSTFILES
; Language files
!insertmacro MUI_LANGUAGE "Russian"

!insertmacro GetOptions

BrandingText "${BRANDING}"
Name "${PRODUCT_NAME}"
Caption "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "${PRODUCT_NAME}_${PRODUCT_VERSION}_PowerPack.exe"
InstallDir "$PROGRAMFILES\AIMP2"
ShowInstDetails show
ShowUnInstDetails show
InstType "Полная"
InstType "Сокращенная"

Var SkinFile
Var IconFile
Var Flag
Section "!${PRODUCT_NAME}" idx0
  SectionIn 1 2 3 RO
  SetOutPath "$INSTDIR\"
  File /r "C:\AIMP25\*.*"
  IfFileExists "$OUTDIR\Data\AIMP.INI" skip_cfg
        StrCpy $Flag "1"
        CreateDirectory "$OUTDIR\Data\AllUsers"   
        WriteINIStr "$OUTDIR\Data\AIMP.INI" System UserMode 0
          WriteINIStr "$OUTDIR\Data\AllUsers\AIMP2.INI" System LangFile russian.lng ;язык по умолчанию для плеера
        WriteINIStr "$OUTDIR\Data\AllUsers\AIMP2r.INI" System LangFile russian.lng ;язык по умолчанию для рекордера
        WriteINIStr "$OUTDIR\Data\AllUsers\AIMP2c.INI" System LangFile russian.lng ;язык по умолчанию для конвертера
        WriteINIStr "$OUTDIR\Data\AllUsers\AIMP2t.INI" System LangFile russian.lng ;язык по умолчанию для таггера
       
        ${GetOptions} $CMDLINE "/SKIN=" $SkinFile
        StrCmp $SkinFile "" +2
          WriteINIStr "$OUTDIR\Data\AllUsers\AIMP2.INI" Skins DefaultSkin $SkinFile        ;скин
skip_cfg:
        WriteUninstaller "$OUTDIR\uninst.exe"
        WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
        WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$OUTDIR\aimp2.exe"
        WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$OUTDIR\uninst.exe"
        WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
SectionEnd

Section "Скины" idx1
        SectionIn 1 2 3
        SetOutPath "$INSTDIR\Skins"
        File "C:\AIMP25\Skins\*.*"
SectionEnd

Section "Иконки типов файлов" idx2
        SectionIn 1 2 3
        SetOutPath "$INSTDIR\Icons"
        File "C:\AIMP25\icons\*.*"
        StrCmp $Flag "1" +2
        IfFileExists "$INSTDIR\Data\AIMP.INI" skip_cfg
        ${GetOptions} $CMDLINE "/ICONS=" $IconFile
        StrCmp $IconFile "" skip_cfg
                IfFileExists "$INSTDIR\Icons\$IconFile" 0 skip_cfg
                Rename "$INSTDIR\Icons\aimp2.dll" "$INSTDIR\Icons\aimp2_original.dll"
                Rename "$INSTDIR\Icons\$IconFile" "$INSTDIR\Icons\aimp2.dll"
        skip_cfg:
SectionEnd

Section "Ярлыки в меню Пуск" idx3
        SectionIn 1 2 3
        SetShellVarContext all
        CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}"
        CreateShortCut  "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\aimp2.exe"
        CreateShortCut  "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME} Advanced Tag Editor.lnk" "$INSTDIR\AIMP2t.exe"
        CreateShortCut  "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME} Audio Converter.lnk" "$INSTDIR\AIMP2c.exe"
        CreateShortCut  "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME} Audio Recorder.lnk" "$INSTDIR\AIMP2r.exe"
        CreateShortCut  "$SMPROGRAMS\${PRODUCT_NAME}\Удалить ${PRODUCT_NAME}.lnk" "$INSTDIR\uninst.exe"
SectionEnd

Section "Ярлык на рабочем столе" idx4
        SectionIn 1
;              IfSilent +3
        SetShellVarContext all
        CreateShortCut "$DESKTOP\${PRODUCT_NAME}.lnk" "$INSTDIR\aimp2.exe"
SectionEnd

Section "Ярлык на панели быстрого запуска" idx5
        SectionIn 1
        SetShellVarContext all
        CreateShortCut "$QUICKLAUNCH\${PRODUCT_NAME}.lnk" "$INSTDIR\aimp2.exe"
SectionEnd

Section "Ассоциации файлов" idx6
        SectionIn 1 2 3
        ExecWait '$INSTDIR\aimp2.exe /REG=R'
        RegDLL  "$INSTDIR\System\aimp_shell.dll"
SectionEnd

Function un.onUninstSuccess
  HideWindow
  MessageBox MB_ICONINFORMATION|MB_OK "Удаление программы $(^Name) было успешно завершено."
FunctionEnd

Function un.onInit
  MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "Вы уверены в том, что желаете удалить $(^Name) и все компоненты программы?" IDYES +2
  Abort
FunctionEnd

Section Uninstall
  UnRegDLL "$INSTDIR\System\aimp_shell.dll"
  ExecWait '$INSTDIR\aimp2.exe /REG=U'
  RMDir /r "$INSTDIR\"
  SetShellVarContext all
  RMDir /r "$SMPROGRAMS\${PRODUCT_NAME}"
  Delete "$DESKTOP\${PRODUCT_NAME}.LNK"
  Delete "$QUICKLAUNCH\${PRODUCT_NAME}.LNK"
  DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
  SetAutoClose true
SectionEnd



Winamp 5.xx
Код:

!define PRODUCT_NAME "Winamp"
!define PRODUCT_VERSION "5.32"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"
!define BRANDING "Created by Комсомолец 2008"

; MUI 1.67 compatible ------
!include "MUI.nsh"
!include "FileFunc.nsh"

SetCompressor /SOLID lzma

; MUI Settings
!define MUI_ABORTWARNING
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install-colorful.ico"
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install-blue-full.ico"
!define MUI_COMPONENTSPAGE_NODESC
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_UNPAGE_FINISH
; Language files
!insertmacro MUI_LANGUAGE "Russian"

; MUI end ------
Name "${PRODUCT_NAME}"
Caption "${PRODUCT_NAME} ${PRODUCT_VERSION}"
UninstallCaption "Удаление ${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "${PRODUCT_NAME}-${PRODUCT_VERSION}_rus.exe"
InstallDir "$PROGRAMFILES\Winamp"
ShowInstDetails show
ShowUnInstDetails show
BrandingText "${BRANDING}"
InstType "Полная"
InstType "Сокращенная"

Section "!${PRODUCT_NAME}" idx0
;галка стоит в обоих вариантах установки и указываем, что устанавливаем в указанную директорию
  SectionIn 1 2 RO
  SetOutPath "$INSTDIR"
  File /r "C:\Winamp\*.*"
  SetShellVarContext all
  WriteUninstaller "$INSTDIR\uninst.exe"
  WriteRegStr HKLM "SOFTWARE\Nullsoft\Winamp" "regname" "Ваше имя"
  WriteRegStr HKLM "SOFTWARE\Nullsoft\Winamp" "regkey" "Ваш регистрационный номер"
  WriteRegStr HKCR "Directory\shell\Winamp.Enqueue" "" "Добавить в Winamp"
  WriteRegStr HKCR "Directory\shell\Winamp.Play" "" "Открыть в Winamp"
  WriteRegStr HKCR "Winamp.File\shell\Enqueue" "" "Добавить в Winamp"
  WriteRegStr HKCR "Winamp.File\shell\Play" "" "Открыть в Winamp"
  WriteRegStr HKCR "Winamp.Playlist\shell\Enqueue" "" "Добавить в Winamp"
  WriteRegStr HKCR "Winamp.Playlist\shell\Play" "" "Открыть в Winamp"
  WriteRegStr HKLM "SOFTWARE\Classes\Directory\shell\Winamp.Enqueue" "" "Добавить в Winamp"
  WriteRegStr HKLM "SOFTWARE\Classes\Directory\shell\Winamp.Play" "" "Открыть в Winamp"
  WriteRegStr HKLM "SOFTWARE\Classes\Winamp.File\shell\Enqueue" "" "Добавить в Winamp"
  WriteRegStr HKLM "SOFTWARE\Classes\Winamp.File\shell\Play" "" "Открыть в Winamp"
  WriteRegStr HKLM "SOFTWARE\Classes\Winamp.Playlist\shell\Enqueue" "" "Добавить в Winamp"
  WriteRegStr HKLM "SOFTWARE\Classes\Winamp.Playlist\shell\Play" "" "Открыть в Winamp"
  ExecWait '$INSTDIR\winamp.exe /REG=LCAD'
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$INSTDIR\winamp.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "${PRODUCT_VERSION}"
SectionEnd

Section "Ярлыки в меню Пуск" idx1
        SectionIn 1 2
        SetShellVarContext all
  CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}"
  CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\winamp.exe"
  CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Удалить ${PRODUCT_NAME}.lnk" "$INSTDIR\uninst.exe"
SectionEnd

Section "Ярлык в панели быстрого запуска" idx2
        SectionIn 1 2
        SetShellVarContext all
  CreateShortCut "$QUICKLAUNCH\${PRODUCT_NAME}.lnk" "$INSTDIR\winamp.exe"
SectionEnd

Section "Ярлык на рабочем столе" idx3
        SectionIn 1
                IfSilent +3
        SetShellVarContext all
  CreateShortCut "$Desktop\${PRODUCT_NAME}.lnk" "$INSTDIR\winamp.exe"       
SectionEnd

Section Uninstall
  ExecWait '$INSTDIR\winamp.exe /UNREG'
  RMDir /r "$INSTDIR"
  SetShellVarContext all
  RMDir /r "$SMPROGRAMS\${PRODUCT_NAME}"
  DeleteRegKey HKLM "SOFTWARE\Nullsoft\Winamp"
  DeleteRegKey HKCR "Directory\shell\Winamp.Enqueue"
  DeleteRegKey HKCR "Directory\shell\Winamp.Play"
  DeleteRegKey HKCR "Winamp.File\shell\Enqueue"
  DeleteRegKey HKCR "Winamp.File\shell\Play"
  DeleteRegKey HKCR "Winamp.Playlist\shell\Enqueue"
  DeleteRegKey HKCR "Winamp.Playlist\shell\Play"
  DeleteRegKey HKLM "SOFTWARE\Classes\Directory\shell\Winamp.Enqueue"
  DeleteRegKey HKLM "SOFTWARE\Classes\Directory\shell\Winamp.Play"
  DeleteRegKey HKLM "SOFTWARE\Classes\Winamp.File\shell\Enqueue"
  DeleteRegKey HKLM "SOFTWARE\Classes\Winamp.File\shell\Play"
  DeleteRegKey HKLM "SOFTWARE\Classes\Winamp.Playlist\shell\Enqueue"
  DeleteRegKey HKLM "SOFTWARE\Classes\Winamp.Playlist\shell\Play"
  Delete "$DESKTOP\${PRODUCT_NAME}.lnk"       
  Delete "$QUICKLAUNCH\${PRODUCT_NAME}.lnk"
  DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
  SetAutoClose true
SectionEnd


Скоро еще выложу...

Комсомолец 15-09-2008 06:06 899433

Цитата:

Цитата hb860
Утилитка, которая конвертит reg-файл в команды NSIS »

криво конвертирует. ключи неверно.

hb860 15-09-2008 10:41 899554

Цитата:

Цитата Комсомолец
криво конвертирует. ключи неверно. »

Верно. Одна иногда и она может полезной быть, когда кучу стринговых ключей надо оттранслировать, а лень руками писать.

Кстати, форум проповедует принцип одна тема- одна программа. Если вываливание скриптов допустимо в данном топике оптом, то я за обеими руками!

Комсомолец 15-09-2008 10:53 899562

Цитата:

Цитата hb860
форум проповедует принцип одна тема- одна программа. Если вываливание скриптов допустимо в данном топике оптом, то я за обеими руками! »

А тема-то называется
Цитата:

Цитата desperate
NSIS »

,
значит и все, с ним связаное. верно? В том числе и скрипты. И нет причин создавать новую тему. :yes:

Цитата:

Цитата hb860
Верно. Одна иногда и она может полезной быть, когда кучу стринговых ключей надо оттранслировать, а лень руками писать. »

Абсолютно согласен! А заменить не проблема.

hb860 24-09-2008 20:33 907888

Вложений: 1
Что-ж, раз на то пошло дело, выкладываю свою коллекцию скриптов
Код:

Artweaver.nsi - оно и есть
delphi.nsi - делфи 5
edialer.nsi - оно и есть
far.nsi - оно и есть
foxitpdf.nsi - foxit pdf reader
foxpro8.nsi - MS Visual FoxPro 8
Games.nsi - коллекция игрушек
icofx.nsi - Ico FX
opera.nsi - Опера на основе MSI
photoshop.nsi - 7ой фотошоп
ps.nsi - пунто свитчер
qip.nsi - оно и есть
radmin.nsi - радмин сервер версии 2.х
starter.nsi - codestuff starter
taskinfo.nsi - Iarsn Taskino 6.x+
tc.nsi - Total commander
thebat.nsi - The Bat!
themes.nsi - Сборник тем для XP
unlocker.nsi - непосредственно программа :)
uuds.nsi - Usefull Utilities Disk Studio
winamp.nsi - Винамп :)
windjvu.nsi - WinDJView 0.5
winrar.nsi - оно и есть
wirechanger.nsi - WiredPLane WireChanger - его бесплатная версия
xnview.nsi - скрипт с ассоциациями файлов

Сразу скажу: многие программы, обозначенные здесь и не требуют установки вовсе, я их исталю потому что мне так удобнее.
И ещё, некторые скрипты содержат ошибки, строго не пинать, нахожу - исправляю. Они не критичные.
Текст в инсталере фара содержит не мою функцию StrLoc, однако в коментах ничего нет, взято с вики нсиса, иметь ввиду первоисточник при копировании.
Другие мои скрипты, не представленные здесь, можно найти в соответсвующих программам топиках.

Если есть вопросы - пишите.

Комсомолец 24-10-2008 08:17 932168

hb860, скрипты продолжаем выкладывать? ;)

hb860 24-10-2008 10:35 932255

пока ничё стоящего :)

Котяра 24-10-2008 14:16 932442

hb860, спасибо за то, что указали на редактор скриптов "HM NIS Edit 2.0.3" (я имею ввиду текст комментария в коде скрипта :) )
Вот я выложу скрипт для установки XPTweaker-а:
читать дальше »

Код:

; Script generated by the HM NIS Edit Script Wizard.

; HM NIS Edit Wizard helper defines
!define PRODUCT_NAME "XPTweaker"
!define PRODUCT_VERSION "1.5.3 build 78"
!define PRODUCT_PUBLISHER "www.xptweaker.net"
!define PRODUCT_WEB_SITE "http://www.xptweaker.net"
!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\XPTweaker.exe"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"
!define PRODUCT_STARTMENU_REGVAL "NSIS:StartMenuDir"

; MUI 1.67 compatible ------
!include "MUI.nsh"

; MUI Settings
!define MUI_ABORTWARNING
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"

; Welcome page
!insertmacro MUI_PAGE_WELCOME
; License page
!insertmacro MUI_PAGE_LICENSE "C:\Program Files\XPTweaker\License.txt"
; Directory page
!insertmacro MUI_PAGE_DIRECTORY
; Start menu page
var ICONS_GROUP
!define MUI_STARTMENUPAGE_NODISABLE
!define MUI_STARTMENUPAGE_DEFAULTFOLDER "XPTweaker"
!define MUI_STARTMENUPAGE_REGISTRY_ROOT "${PRODUCT_UNINST_ROOT_KEY}"
!define MUI_STARTMENUPAGE_REGISTRY_KEY "${PRODUCT_UNINST_KEY}"
!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "${PRODUCT_STARTMENU_REGVAL}"
!insertmacro MUI_PAGE_STARTMENU Application $ICONS_GROUP
; Instfiles page
!insertmacro MUI_PAGE_INSTFILES
; Finish page
!define MUI_FINISHPAGE_RUN "$INSTDIR\XPTweaker.exe"
!define MUI_FINISHPAGE_SHOWREADME "$INSTDIR\Readme.txt"
!insertmacro MUI_PAGE_FINISH

; Uninstaller pages
!insertmacro MUI_UNPAGE_INSTFILES

; Language files
!insertmacro MUI_LANGUAGE "Russian"

; MUI end ------

Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "C:\Documents and Settings\All Users\Documents\XPTweakerSetup.exe"
InstallDir "$PROGRAMFILES\XPTweaker"
InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" ""
ShowInstDetails show
ShowUnInstDetails show

Section "MainSection" SEC01
  SetOutPath "$INSTDIR"
  SetOverwrite try
  File "C:\Program Files\XPTweaker\belarussian.lng"
  File "C:\Program Files\XPTweaker\english.lng"
  File "C:\Program Files\XPTweaker\History.txt"
  File "C:\Program Files\XPTweaker\License.txt"
  File "C:\Program Files\XPTweaker\Readme.txt"
  File "C:\Program Files\XPTweaker\ukrainian.lng"
  File "C:\Program Files\XPTweaker\XPTweaker.chm"
  File "C:\Program Files\XPTweaker\XPTweaker.dll"
  File "C:\Program Files\XPTweaker\XPTweaker.exe"
  File "C:\Program Files\XPTweaker\XPTweaker.log"

; Shortcuts
  !insertmacro MUI_STARTMENU_WRITE_BEGIN Application
  CreateDirectory "$SMPROGRAMS\$ICONS_GROUP"
  CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\Help.lnk" "$INSTDIR\XPTweaker.chm"
  CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\XPTweaker.lnk" "$INSTDIR\XPTweaker.exe"
  CreateShortCut "$DESKTOP\XPTweaker.lnk" "$INSTDIR\XPTweaker.exe"
  !insertmacro MUI_STARTMENU_WRITE_END
SectionEnd

Section -AdditionalIcons
  !insertmacro MUI_STARTMENU_WRITE_BEGIN Application
  WriteIniStr "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}"
  CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\Website.lnk" "$INSTDIR\${PRODUCT_NAME}.url"
  CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\Uninstall.lnk" "$INSTDIR\uninst.exe"
  !insertmacro MUI_STARTMENU_WRITE_END
SectionEnd

Section -Post
  WriteUninstaller "$INSTDIR\uninst.exe"
  WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\XPTweaker.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\XPTweaker.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"
SectionEnd


Function un.onUninstSuccess
  HideWindow
  MessageBox MB_ICONINFORMATION|MB_OK "Удаление программы $(^Name) было успешно завершено."
FunctionEnd

Function un.onInit
  MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "Вы уверены в том, что желаете удалить $(^Name) и все компоненты программы?" IDYES +2
  Abort
FunctionEnd

Section Uninstall
  !insertmacro MUI_STARTMENU_GETFOLDER "Application" $ICONS_GROUP
  Delete "$INSTDIR\${PRODUCT_NAME}.url"
  Delete "$INSTDIR\uninst.exe"
  Delete "$INSTDIR\XPTweaker.log"
  Delete "$INSTDIR\XPTweaker.exe"
  Delete "$INSTDIR\XPTweaker.dll"
  Delete "$INSTDIR\XPTweaker.chm"
  Delete "$INSTDIR\ukrainian.lng"
  Delete "$INSTDIR\Readme.txt"
  Delete "$INSTDIR\License.txt"
  Delete "$INSTDIR\History.txt"
  Delete "$INSTDIR\english.lng"
  Delete "$INSTDIR\belarussian.lng"

  Delete "$SMPROGRAMS\$ICONS_GROUP\Uninstall.lnk"
  Delete "$SMPROGRAMS\$ICONS_GROUP\Website.lnk"
  Delete "$DESKTOP\XPTweaker.lnk"
  Delete "$SMPROGRAMS\$ICONS_GROUP\XPTweaker.lnk"
  Delete "$SMPROGRAMS\$ICONS_GROUP\Help.lnk"

  RMDir "$SMPROGRAMS\$ICONS_GROUP"
  RMDir "$INSTDIR"

  DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
  DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"
  SetAutoClose true
SectionEnd


hb860 24-10-2008 15:31 932505

Котяра, я им только пару раз пользовался, если честно. Я щас пишу всё в Notepad++. Отличная штука. А константры из скрипта в скрипт копирую просто каждый раз и коментариии не убираю.

Котяра 24-10-2008 19:30 932730

Цитата:

Цитата hb860
я им только пару раз пользовался, если честно »

Ясно. Мне эта программа понравилась - удобная.

Комсомолец 25-10-2008 14:18 933253

Котяра, пригодится скрипт))
hb860, секции exclude как сделать? взаимоисключения.

hb860 25-10-2008 16:11 933312

эээ, всмысле ? поподробней ПЛЗ

Мой новый скрипт, кстати http://forum.oszone.net/thread-120962.html
Хороший пример работы с XML файлами

Комсомолец 25-10-2008 17:47 933384

вот еще скрипт DC++ (более продвинутый)
читать дальше »
Код:

;константы (название программы, версия, ключ для деинсталляции, брендинг)
!define PRODUCT_NAME "FlyLinkDC++"
!define PRODUCT_VERSION "3.64"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"
!define BRANDING "Created by Комсомолец 2008"

;вставляем графический фейс инсталлятора и функции
; MUI 1.67 compatible ------
!include "MUI.nsh"
!include "FileFunc.nsh"

;компрессия (это непрерывный архив, максимальное сжатие)
SetCompressor /SOLID lzma

;стандартные страницы приветствия, выбора директории, иконки и т.д.
; MUI Settings
!define MUI_ABORTWARNING
;путь к иконкам инсталлятора и к иконке для унинсталла (тут мои)
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\flylihk.ico"
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall-blue-full.ico"
;а тут стандартные иконки из пакета NSIS
;!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install-colorfull.ico"
;!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall-blue-full.ico"
!define MUI_COMPONENTSPAGE_NODESC
; Welcome page
!insertmacro MUI_PAGE_WELCOME

;если плагин URL не установлен-комментим ниже
;----------------------
; My URL
!define MUI_CUSTOMFUNCTION_GUIINIT onGUIInit
;---------------------
;заканчиваем комменты

; Directory page
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_COMPONENTS
; Instfiles page
!insertmacro MUI_PAGE_INSTFILES
; Finish page
!insertmacro MUI_PAGE_FINISH
; Uninstaller pages
!insertmacro MUI_UNPAGE_INSTFILES
; Language files
!insertmacro MUI_LANGUAGE "Russian"


;ребрендинг
BrandingText "${BRANDING}"

;название продукта и версия
Name "${PRODUCT_NAME}"
Caption "${PRODUCT_NAME} ${PRODUCT_VERSION}"

;имя выходного файла
OutFile "${PRODUCT_NAME}_${PRODUCT_VERSION}_PowerPack.exe"

;дефолтная директория установки
InstallDir "$PROGRAMFILES\FlyLinkDC"

;показывать все детали во время установки
ShowInstDetails show

;показывать все детали во время удаления
ShowUnInstDetails show

;если плагин URL не установлен-комментим ниже
;-----------------
## Dummy section.
Section
SectionEnd

## Set the hyperlink up.
Function onGUIInit
 BrandingURL::Set /NOUNLOAD "0" "200" "0" "http://www.site.ru"
FunctionEnd
;-----------------------
;заканчиваем комменты

;варианты установки
InstType "Полная"
InstType "Минимальная"
;=========================================================================================================================
;основная секция
Section "!${PRODUCT_NAME}" idx0
;галка стоит в обоих вариантах установки и указываем, что устанавливаем в указанную директорию
  SectionIn 1 2 RO
  SetOutPath "$INSTDIR"
;путь откуда копируем все файлы и папки
 File /r "C:\FlyLinkDC\fly\*.*"
;=========================================================================================================================
;создаем файл unins000.exe и записи в реестре для удаления
        WriteUninstaller "$OUTDIR\unins000.exe"
        WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
        WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$OUTDIR\FlylinkDC.exe"
        WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$OUTDIR\unins000.exe"
        WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
SectionEnd

;=========================================================================================================================
SectionGroup /e "Ярлыки"
;тут думаю понятно
Section "Ярлыки в меню Пуск"
        SectionIn 1 2
        SetShellVarContext all
        CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}"
        CreateShortCut  "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\FlylinkDC.exe"
        CreateShortCut  "$SMPROGRAMS\${PRODUCT_NAME}\ReadMe.lnk" "$INSTDIR\Readme.rtf"
        CreateShortCut  "$SMPROGRAMS\${PRODUCT_NAME}\home.lnk" "$INSTDIR\Home.url"
        CreateShortCut  "$SMPROGRAMS\${PRODUCT_NAME}\Удалить ${PRODUCT_NAME}.lnk" "$INSTDIR\unins000.exe"
SectionEnd

;=========================================================================================================================
;тут есть заморочка-  IfSilent +3  -не устанавливать при тихой установке

Section "Ярлыки в панели быстрого запуска"
        SectionIn 1
                IfSilent +3
        SetShellVarContext all
        CreateShortCut  "$QUICKLAUNCH\${PRODUCT_NAME}.lnk" "$INSTDIR\FlylinkDC.exe"
SectionEnd

Section "Добавить ярлык в автозапуск"
        SectionIn 1 2
                IfSilent +3
        SetShellVarContext all
                CreateShortCut "$SMSTARTUP\${PRODUCT_NAME}.lnk" "$INSTDIR\FlylinkDC.exe"
SectionEnd

Section "Ярлыки на рабочем столе"
        SectionIn 1
                IfSilent +3
        SetShellVarContext all
        CreateShortCut "$DESKTOP\${PRODUCT_NAME}.lnk" "$INSTDIR\FlylinkDC.exe"
        CreateShortCut  "$SMPROGRAMS\${PRODUCT_NAME}\home.lnk" "$INSTDIR\Home.url"
SectionEnd
SectionGroupEnd

;=========================================================================================================================

SectionGroup /e "Боты"
       
        Section "Cool Bot"
                SectionIn 1
                IfSilent +3
                SetOutPath "$INSTDIR\"
                File "C:\FlyLinkDC\Cool Bot\*.*"
        SectionEnd

        Section "Auto Slot"
                SectionIn 1
                IfSilent +3
                SetOutPath "$INSTDIR\"
                File "C:\FlyLinkDC\Auto Slot\*.*"
        SectionEnd

;        Section "Bot Repeater"
;                SectionIn 1
;                IfSilent +3
;                SetOutPath "$INSTDIR\"
;                File "C:\FlyLinkDC\Bot Repeater\*.*"
;        SectionEnd

;        Section "Test API"
;                SectionIn 1
;                IfSilent +3
;                SetOutPath "$INSTDIR\"
;                File "C:\FlyLinkDC\Test API\*.*"
;        SectionEnd

SectionGroupEnd       

;=========================================================================================================================
SectionGroup /e "Настройки"

    SectionGroup /e "settings provider"

        Section "Избранные хабы"
                SectionIn 1
                SetOutPath "$INSTDIR\Settings\"
                File "C:\FlyLinkDC\Settings\Favorites.xml"
        SectionEnd

        Section "Версия программы"
                SectionIn 1
                SetOutPath "$INSTDIR\Settings\"
                File "C:\FlyLinkDC\Settings\Queue.xml"
        SectionEnd

      SectionGroupEnd
SectionGroupEnd       

;=========================================================================================================================
;тут диалог о завершении удаления
Function un.onUninstSuccess
  HideWindow
  MessageBox MB_ICONINFORMATION|MB_OK "Удаление программы $(^Name) было успешно завершено."
FunctionEnd

;тут диалог подтверждения удаления
Function un.onInit
  MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "Вы уверены в том, что желаете удалить $(^Name) и все компоненты программы?" IDYES +2
  Abort
FunctionEnd

;если плагин URL не установлен-комментим ниже
;-----------------------------------------------------
## Unload the plugin.
Function .onGUIEnd
 BrandingURL::Unload
FunctionEnd
;-------------------------------------------------------
;заканчиваем комменты


;тут прописываем что удалять и закрыть окно удаления
Section Uninstall
  RMDir /r "$INSTDIR\"
  SetShellVarContext all
  RMDir /r "$SMPROGRAMS\${PRODUCT_NAME}"
  Delete "$DESKTOP\${PRODUCT_NAME}.LNK"
  Delete "$DESKTOP\home.lnk"
  Delete "$QUICKLAUNCH\${PRODUCT_NAME}.LNK"
  Delete "$SMSTARTUP\${PRODUCT_NAME}.LNK"
  DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
  SetAutoClose true
SectionEnd


два бота закомментированы-с ними еще не разобрался просто.

Котяра 25-10-2008 17:54 933387

Скрипт установки "Средства удаления вредоносных программ" (это такой антивирусный сканер от Microsoft):
читать дальше »

Код:

; Script generated by the HM NIS Edit Script Wizard.

; HM NIS Edit Wizard helper defines
!define PRODUCT_NAME "Средство удаления вредоносных программ"
!define PRODUCT_VERSION "1.0"
!define PRODUCT_PUBLISHER "Microsoft"
!define PRODUCT_WEB_SITE "http://www.microsoft.com/"
!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\MRT.exe"

; MUI 1.67 compatible ------
!include "MUI.nsh"

; MUI Settings
!define MUI_ABORTWARNING
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"

; Welcome page
!insertmacro MUI_PAGE_WELCOME
; Instfiles page
!insertmacro MUI_PAGE_INSTFILES
; Finish page
!define MUI_FINISHPAGE_RUN "$SYSDIR\MRT.exe"
!insertmacro MUI_PAGE_FINISH

; Language files
!insertmacro MUI_LANGUAGE "Russian"

; MUI end ------

Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "C:\Documents and Settings\All Users\Documents\MRTSetup.exe"
InstallDir "$SYSDIR"
InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" ""
ShowInstDetails show

Section "MainSection" SEC01
  SetOutPath "$SYSDIR"
  SetOverwrite ifnewer
  File "C:\windows\system32\MRT.exe"
  CreateDirectory "$SMPROGRAMS\Средство удаления вредоносных программ"
  CreateShortCut "$SMPROGRAMS\Средство удаления вредоносных программ\Средство удаления вредоносных программ.lnk" "$SYSDIR\MRT.exe"
  CreateShortCut "$DESKTOP\Средство удаления вредоносных программ.lnk" "$SYSDIR\MRT.exe"
SectionEnd

Section -Post
  WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$SYSDIR\MRT.exe"
SectionEnd


Деинсталлятор отключен, устанавливается файл "mrt.exe" в папку "system32".

hb860 25-10-2008 18:46 933426

Цитата:

Цитата Комсомолец
hb860, секции exclude как сделать? взаимоисключения. »

Чё имеется ввиду ? Таких секций не бывает! Тебе что нужно то ? Чтоб когда одну галку ставишь другая снималась ? Тогда смотри c:\Program Files\NSIS\Examples\one-section.nsi - там офигительный пример как это сделать!

P.S. Котяра, тебе говоришь тоже полезно это узнать ? Смотри там же :) c:\Program Files\NSIS\Examples\one-section.nsi

Комсомолец 25-10-2008 19:28 933465

Цитата:

Цитата hb860
Таких секций не бывает! »

это и есть радиобуттон. почитал. буду курить.

Комсомолец 31-10-2008 02:21 938647

Вложений: 1
Скрипт для упаковки KM Player. Не идеален, но работает. Проблемы: при открытии файла не начинает воспроизведение (необходимо нажать Play), на некоторых файлах спрашивает, с помощью какой программы открыть. Буду рад помощи в доработке. В аттаче, т.к. сообщение слишком большое.

hb860 01-11-2008 11:20 939748

Комсомолец, Зачем убрал
Код:


  ;StrCpy $OpenCommand "$INSTDIR\KMPlayer.exe $\"%1$\""

Это нужная строка была! Раскоментируй.

Вот это бред:
Код:


  DeleteRegKey HKCR "${extenstion}" 
  DeleteRegKey HKCR "${ClassName}"
  DeleteRegKey HKLM "${ClassName}"


Комсомолец 01-11-2008 12:32 939793

Цитата:

Цитата hb860
Зачем убрал »

иначе ошибка.
Цитата:

Цитата hb860
Вот это бред »

ну а как иначе ассоциации убить?

hb860 01-11-2008 12:36 939795

Цитата:

Цитата Комсомолец
иначе ошибка. »

Var Opencommand не надо было стирать. Добавь назад
Цитата:

Цитата Комсомолец
ну а как иначе ассоциации убить? »

Надо думать.

Комсомолец 01-11-2008 19:56 940155

Цитата:

Цитата hb860
Надо думать. »

будем думать.

hb860 07-11-2008 18:40 946164

Мой новый скрип для перепаковки GOM Player
http://forum.oszone.net/thread-122263.html

bobick 17-11-2008 18:07 955100

не могу удалить с помощью uninstall.exe c рабочего стола и с меню "Пуск" ярлыки
делаю так:
Delete "$DESKTOP\ХХХХХ.lnk"
Delete "$SMPROGRAMS\ХХХХ\ХХХХХ.lnk"
делаю все под админом, а оно не удаляется

hb860 17-11-2008 21:26 955318

bobick, попробуй так:
Код:

SetShellVarContext Current
Delete "$DESKTOP\ХХХХХ.lnk"
Delete "$SMPROGRAMS\ХХХХ\ХХХХХ.lnk"

или так:
Код:

SetShellVarContext all
Delete "$DESKTOP\ХХХХХ.lnk"
Delete "$SMPROGRAMS\ХХХХ\ХХХХХ.lnk"

А вообще было бы неплохо увидеть скрипт

bobick 18-11-2008 09:10 955631

hb860, большое спасибо - заработало

bobick 19-11-2008 17:38 957208

подскажите кто нибудь, как можно проверить наличие определенной ветки реестра с помощью ф-й NSIS

hb860 19-11-2008 21:18 957402

Вот так:
Код:

ReadRegStr $0 HKLM "Software\MyProgram" "SetupPath"
IfErrors 0 noerror
DetailPrint "Ключ не существует!"
Goto EndCheck
noerror:
DetailPrint "Ключ существует, значение SetupPath=$0"
EndCheck:
....продолжение кода скрипта

или
Код:

ReadRegStr $0 HKLM "Software\MyProgram" ""
IfErrors 0 noerror
DetailPrint "Ключ не существует!"
Goto EndCheck
noerror:
DetailPrint "Ключ существует!"
EndCheck:
....продолжение кода скрипта


hb860 10-12-2008 20:55 977786

Хоть бы раз "Полезное сообщение" ткнул...ммм.. ну да ладно.

Вот такой вот скрипт ставит оперу 10 альфа на русском тихо с ключом /S
Код:

; HM NIS Edit Wizard helper defines
!define PRODUCT_NAME "Opera"
!define PRODUCT_VERSION "10 alpha"
!define MSI_NAME "opera installer.msi"

!include "MUI.nsh"
SetCompressor /SOLID lzma

!define MUI_ABORTWARNING
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"

!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"


Name "${PRODUCT_NAME}"
Caption "Установка ${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "${PRODUCT_NAME}-${PRODUCT_VERSION}.exe"
;InstallDir "$TEMP"
ShowInstDetails show

Section "Core" SEC01
  SetOutPath "$TEMP"
  File  "d:\opera\${MSI_NAME}"
  ExecWait "msiexec.exe /i $\"$TEMP\${MSI_NAME}$\" /qb ALLUSERS=1 CREATE_DESKTOP_ICON=1 CREATE_QUICKLAUNCH_ICON=1 CREATE_STARTMENU_ICONS=1 MULTI_USER_SETTING=1$\""
  Delete "$TEMP\${MSI_NAME}"
  File  "d:\opera\install_flash_player.exe"
  ExecWait "$TEMP\install_flash_player.exe /S"
  Delete "$TEMP\install_flash_player.exe"
  SetOverwrite on
  SetOutPath "$PROGRAMFILES\Opera 10 preview"       
  Rename "$PROGRAMFILES\Opera 10 preview\english.lng" "$PROGRAMFILES\Opera 10 preview\english_enUS.lng"
  File /oname=english.lng "d:\opera\ru.lng"
  CreateDirectory "$PROGRAMFILES\Opera 10 preview\locale\ru"
  SetOutPath "$PROGRAMFILES\Opera 10 preview\locale\ru"
  File "d:\opera\ru.lng"
  SetAutoClose false
SectionEnd

Function .onInit
        ;SetSilent silent
FunctionEnd


Vetoshkin 16-12-2008 17:02 982084

А вот с такой проблемой при инсталляции кто - нибудь сталкивался?
Собственно сама проблема, но сначала постановка.
1. Мне надо что то инсталлировать, допустим один файл приложение и конфигурационный файлик;
2. Но этот конфигурационный файлик может быть различным, а в зависимости от него приложение будет выглядеть по разному или делать по разному, не суть важна, важно другое - при инсталляции можно выбирать. Как это делать примеров много.
3. Мне же надо во время инсталляции прочитать другой файлик (почему другой - вопрос требует обстоятельного ответа, если нужно - могу описать) и в зависимости от того что там есть - подкорректировать диалог для выбора компонент, во время инсталляции, что то скрыть, чек боксы по другому активировать, много чего можно придумать.

Так вот сама проблема, для самодеятельных диалогов вроде это можно сделать: при инициализации скрипта писать в ИНИ с описанием диалога - а как это сделать для МУИ приложения?
Кто нибудь знает?

Оказалось всё очень просто, надо было лишь более или менее внимательно мануал почитать. Обьясняю: Есть такие две функции - SectionSetFlags / SectionGetFlags . Они то как раз и позволяют делать то что требуется. Там правда какая - то мутота с номерами секций - хотел свои имена - ну и начались, то синтаксические ошибки, то логические. Но со стандартными именами SEC01, SEC02,... проходит всё на ура. Если будет нужно - могу полный пример смастерить.

Комсомолец 17-12-2008 17:00 983128

скрипт QIP Infium. .

читать дальше »
Код:

!define PRODUCT_NAME "QIP Infium"
!define PRODUCT_VERSION "v.9020"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"
!define BRANDING "Разработка hb860 и моя немножко, 2008"

; MUI 1.67 compatible ------
!include "MUI.nsh"
!include "FileFunc.nsh"

SetCompressor /SOLID lzma
; MUI Settings
!define MUI_ABORTWARNING
!define MUI_ICON "E:\Nsis\Icons\qipinfium.ico"
!define MUI_UNICON "E:\Nsis\Icons\unqipinfium.ico"
!define MUI_COMPONENTSPAGE_NODESC
; Welcome page
!insertmacro MUI_PAGE_WELCOME
; Directory page
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_COMPONENTS
; Instfiles page
!insertmacro MUI_PAGE_INSTFILES
; Finish page
!insertmacro MUI_PAGE_FINISH
; Uninstaller pages
!insertmacro MUI_UNPAGE_INSTFILES
; Language files
!insertmacro MUI_LANGUAGE "Russian"

BrandingText "${BRANDING}"
Name "${PRODUCT_NAME}"
Caption "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "${PRODUCT_NAME}_${PRODUCT_VERSION}_PowerPack.exe"
InstallDir "$PROGRAMFILES\QIP Infium"
ShowInstDetails show
ShowUnInstDetails show
InstType "Полная"
InstType "Сокращенная"

Section "!${PRODUCT_NAME}" idx0
  SectionIn 1 2 RO
  SetOutPath "$INSTDIR"
  File /r "C:\QIP Infium\*.*"

        WriteUninstaller "$OUTDIR\UnQIP.exe"
        WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
        WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$OUTDIR\infium.exe"
        WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$OUTDIR\UnQIP.exe"
        WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
              SetShellVarContext current
              WriteRegStr HKCU "Software\Infium\Main" "CurLangFile" "Russian"

SectionEnd

Section "Ярлыки в меню Пуск" idx1
        SectionIn 1 2
        SetShellVarContext all
        CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}"
        CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\infium.exe"
        CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Удалить ${PRODUCT_NAME}.lnk" "$INSTDIR\UnQIP.exe"
SectionEnd

Section "Ярлыки в панели быстрого запуска" idx2
        SectionIn 1 2
                IfSilent +3
        SetShellVarContext all
        CreateShortCut  "$QUICKLAUNCH\${PRODUCT_NAME}.lnk" "$INSTDIR\infium.exe"
SectionEnd

Section "Ярлык на рабочем столе" idx3
        SectionIn 1
                IfSilent +3
        SetShellVarContext all
        CreateShortCut "$DESKTOP\${PRODUCT_NAME}.lnk" "$INSTDIR\infium.exe"
SectionEnd


Function un.onUninstSuccess
  HideWindow
  MessageBox MB_ICONINFORMATION|MB_OK "Удаление программы $(^Name) было успешно завершено."
FunctionEnd

Function un.onInit
  MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "Вы уверены в том, что желаете удалить $(^Name) и все компоненты программы?" IDYES +2
  Abort
FunctionEnd

Section Uninstall
  RMDir /r "$INSTDIR\"
  RMDir /r "$INSTDIR\Langs\"
  RMDir /r "$INSTDIR\Plugins\"
  RMDir /r "$INSTDIR\Profiles\"
  RMDir /r "$INSTDIR\Protos\"
  RMDir /r "$INSTDIR\Skins\"
  RMDir /r "$INSTDIR\Smilies\"
  RMDir /r "$INSTDIR\Sounds\"
  RMDir /r "$INSTDIR\Users\"
  SetShellVarContext all
  RMDir /r "$SMPROGRAMS\${PRODUCT_NAME}"
  Delete "$DESKTOP\${PRODUCT_NAME}.LNK"
  Delete "$QUICKLAUNCH\${PRODUCT_NAME}.LNK"
  DeleteRegKey HKCU "SOFTWARE\Infium"
  DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
  SetAutoClose true
SectionEnd



Удачи всем!

vimay1 20-12-2008 21:47 985828

Здравсвуйте, господа.
Есть скринсэйвер Dream Aquarium 1.07, запакованный NSIS. Установка автоматом проходит с ключом /s, однако потом появляются 3 окошка:
1. Запустить Dream Aquarium 1.07?
2. Добавить иконку на рабочий стол?
3. Сделать скрином по умолчанию?
Мне нужно ответить:
1. Нет
2. Нет
3. Да
Вопрос: как это сделать в автомате, чтобы окна не появлялись? Спасибо.

hb860 21-12-2008 11:13 986054

Вам надо написать скрипт AutoIT
Подробнее тут: http://forum.oszone.net/thread-98914.html

katok888 21-12-2008 12:26 986119

Вот тут лежит перевод справки для NSIS ,немного кривой правда . Все же лучше чем ничего.

Комсомолец 23-12-2008 13:07 988004

katok888, переложи на ifolder, плиз. я с локалки.

samsobi 23-12-2008 14:48 988089

Комсомолец, возьми, я положил на Ifolder

sibbear 06-01-2009 20:39 999023

Цитата:

Цитата vimay1
Здравсвуйте, господа.
Есть скринсэйвер Dream Aquarium 1.07, запакованный NSIS. Установка автоматом проходит с ключом /s, однако потом появляются 3 окошка:
1. Запустить Dream Aquarium 1.07?
2. Добавить иконку на рабочий стол?
3. Сделать скрином по умолчанию?
Мне нужно ответить:
1. Нет
2. Нет
3. Да
Вопрос: как это сделать в автомате, чтобы окна не появлялись? Спасибо. »

Сделай проще:
daqua.cmd
1. daqua.exe /verysilent
2. DEL иконку с рабочего стола
жмешь все в 7zSFX с запуском daqua.cmd при распаковке.

Я так сделал инстал Daqua для автоматической установки, и запускаю в SVCPACK
(вроде так, но уже не помню)

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

http://depositfiles.com/files/5tte3ps7p

Про NSYS
Я бы поубивал тех кто его написал, у него ключи кроме /S и /D еще есть стандартные? Или только т которые добавляет создатель архива? Тогда как их узнать?
Мне нужна установка приложения VERYSILENT NORESTART, чтобы он вообще не показывался, а /S всеравно выдает пару окон и просит нажать ОК.

SamLab 06-01-2009 21:09 999048

Есть ли у кого скрипт для утановки кодеков (особенно интересует ffdshow) или может программа которая из готового установщика сможет выдрать хотя бы часть скрипта?

sibbear 06-01-2009 21:47 999084

А чем K-Lite не подходит? Создайте ini файл с необходимыми настройками, укажите что именно вы хотите установить и устанавливайте в тихую с уже заданными настройками.
Или это принципиально?

hb860 07-01-2009 01:09 999342

Цитата:

Цитата sibbear
Мне нужна установка приложения VERYSILENT NORESTART, чтобы он вообще не показывался, а /S всеравно выдает пару окон и просит нажать ОК. »

Это кривые руки автора скрипта, а не проблема NSIS. Можно в любом инсталяторе писать через задницу, потому воздержитесь от убийств, уважаемый.
SamLab,
Код:

Строка            : Output directory: C:\Program Files\ffdshow
Строка            : Extract: ffdshow.ax
Строка            : Extract: libavcodec.dll
Строка            : Unregistering: C:\Program Files\ffdshow\ffdshow.ax
Строка            : Registering: C:\Program Files\ffdshow\ffdshow.ax
Строка            : Created uninstaller: uninstall.exe
Строка            : Create directory: C:\Documents and Settings\Администратор\Главное меню\Программы\ffdshow
Строка            : Create shortcut: C:\Documents and Settings\Администратор\Главное меню\Программы\ffdshow\Uninstall.lnk
Строка            : Create shortcut: C:\Documents and Settings\Администратор\Главное меню\Программы\ffdshow\Configuration.lnk
Строка            : Extract: libpostproc.dll
Строка            : Extract: copying.txt
Строка            : Extract: readme.txt
Строка            : Output directory: C:\Program Files\ffdshow\help
Строка            : Extract: ff.css
Строка            : Extract: ffmpeg-button.gif
Строка            : Extract: index.html
Строка            : Extract: presets.html
Строка            : Extract: compilation.html
Строка            : Completed

Сам напишешь? Или помочь? Я думаю напишешь :)

SamLab 07-01-2009 10:42 999473

sibbear, В чем и дело - в K-Lite куча ненужного, а нужного нет!

hb860, НЕ думал что так все просто - я думал идет регистрация не одного ffdshow.ax и прописываются значения в реестр

hb860 07-01-2009 11:25 999486

SamLab, ну я регмон не стал гонять... при желании можно, конечно, и его натравить на инсталятор, но я думаю это лишнее

sibbear 07-01-2009 15:10 999634

SamLab, ну уж ffdshow там в полном комплекте:-)

vimay1 09-01-2009 00:02 1001016

Цитата:

Цитата sibbear
вобщем на готовый, если интересно разберешься, если нет, просто будешь использовать... »

Спасибо!

VoodooHaker 17-02-2009 13:31 1041173

Подскажите ключ для тихой инсталляции, запаковано Install System v2.28

hb860 17-02-2009 13:40 1041182

VoodooHaker, если имеется ввиду NULLSOFT SCRIPT Install System v2.28, то попробуйте
Приложение.ехе /S
/S - обязательно большая

VoodooHaker 17-02-2009 14:08 1041214

hb860 я пробовал не хочет с этим ключом

Файл


Ключей так и не нашел, решил свою задачу с помощью AutoIT

hb860 18-02-2009 09:29 1041978

дело в том, что в данном случае нсис выполняет роль простого архиватора(дикость какая-то). Он распаковывает программу установки софта для модема во временную папку и оттуда запускает setup.exe.
А его ключей я не могу лично найти. Надо обратититься к производителю софта на форум

ZaV 18-02-2009 10:03 1042000

для setup.exe, который получается после распаковки инсталлятора nsis есть такие ключи
Код:

-skip_copy  -targetdir  -msi_mode  -s  -quiet
проверил quiet работает .. остальные пробуйте

проверил и на оригинальном файле Starcom_UM150.exe ключ -quiet тоже работает и ключ -s работает (проверял c маленькой s :) )

VoodooHaker 19-02-2009 13:46 1043147

ZaV
Итак после запуска файла Starcom_UM150.exe он распаковывает свое содержимое в папку темп, создает свою папку DGPX600
в которой содержится исполняющий setup.exe и для 64 битной винды файл Setup64.exe
теперь пробую применить ключи, который вы выше привели. Файл вроде бы хавает этот ключ но никакой инсталляции не происходит,
пуск>выполнить> "x:\DGPX600\setup.exe" /quiet после нажатия "Ок" больше ничего не просходит
подскажите где я неправильно пишу)

hb860 19-02-2009 16:17 1043256

VoodooHaker, обсуждайте установку этой программе в специацьной теме, пожалуйста
http://forum.oszone.net/thread-131163.html
Текущая тема предназначена для решения общих вопросов по инсталятору NSIS, а не какой-либо конкретной программы.

ab10001 28-02-2009 18:56 1051392

Всем привет! тут такой вопрос: как сделать так что бы во время установки пользователю предоставлялся выбор создавать иконку на рабочем столе или нет, и чтобы по умолчанию она была отключена, т.е. чтобы вовремя тихой установки она не создавалась ??

что и где надо добавить или исправить??

; Shortcuts
SetShellVarContext all
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
CreateDirectory "$SMPROGRAMS\$ICONS_GROUP"
CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\MyApp.lnk" "$INSTDIR\MyApp.exe"
CreateShortCut "$DESKTOP\MyApp.lnk" "$INSTDIR\MyApp.exe"
!insertmacro MUI_STARTMENU_WRITE_END
SectionEnd


Заранее всем спасибо !!!

hb860 02-03-2009 15:34 1052903

Кажется, так:
Код:

Section /o "Ярлыки в меню пуск"
; Shortcuts
SetShellVarContext all
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
CreateDirectory "$SMPROGRAMS\$ICONS_GROUP"
CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\MyApp.lnk" "$INSTDIR\MyApp.exe"
CreateShortCut "$DESKTOP\MyApp.lnk" "$INSTDIR\MyApp.exe"
!insertmacro MUI_STARTMENU_WRITE_END
SectionEnd

Section /o сделает секцию опциональной, т.е. на ней не будет стоять галка, и при тихой установке она не сработает
Далее, есть ещё такой вариант:
Код:

Section "Ярлыки в меню пуск"
IfSilent SkipSection
; Shortcuts
SetShellVarContext all
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
CreateDirectory "$SMPROGRAMS\$ICONS_GROUP"
CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\MyApp.lnk" "$INSTDIR\MyApp.exe"
CreateShortCut "$DESKTOP\MyApp.lnk" "$INSTDIR\MyApp.exe"
!insertmacro MUI_STARTMENU_WRITE_END
SkipSection:
SectionEnd

Если установка тихая - код секции не будет выполнен

volk1234 29-03-2009 19:35 1078220

Полезные ссылки по установщику NSIS


Сайт разработчиков NSIS
Официальная документация NSIS
Частичный русский перевод документации NSIS (2 главы) от Hackrus и Козлова Олега (oleg-nt)
Портированный для использования Unicode NSIS Сайт разработчика| Скачать| Конвертер NSI- скриптов из ANSI в Unicode
Reg2Nsis конвертор reg файлов в скрипт NSIS
ISS2NSI - конвертор скриптов Inno Setup в скрипты NSIS.


HM NIS EDIT - лучший редактор сценариев для NSIS с открытым исходным кодом. Сайт разработчика| Скачать
NSIS plugin для Eclipse


Venis GUI для NSIS Сайт разработчика | Скачать
ExperienceUI GUI для NSIS Сайт разработчика | Скачать
Mihov NSIS Helper простенкий GUI для NSIS Сайт разработчика | Скачать
NSIS SkinCrafter Plugin - GUI для NSIS Сайт разработчика | Скачать v.2.6.1


Примеры:
Статья: создаем инсталлятор под Windows в NSIS
Статья: Инсталляция by NSIS
2 замечательных скрипта с разбором от участника нашей конференции hb860:
Скрипт NSIS для перепаковки AIMP2+Сборки
Установка тем для Notepad++ с применением(NSIS скрипт+тема-сборка прилагается)

Serega 02-04-2009 19:21 1082255

Здравствуйте, решил посмотреть, что такое NSIS. Попытался скачать HM NIS EDIT, а у меня не получается. Попробовал с сайта, результат такой же.
Просьба, может кто-нибудь перезальёт? Интересует: HM NIS EDIT, утилита iss2nsi и было бы вообще шоколадно, если у кого-то, чисто случайно завалялся исходник HM NIS EDIT...

katok888 02-04-2009 19:48 1082287

Serega_, HM NIS EDIT

katok888 02-04-2009 20:03 1082311

Тема на руборде http://forum.ru-board.com/topic.cgi?...0595&start=740

Serega 02-04-2009 20:11 1082325

katok888 спасибо, а утилы iss2nsi случайно нет?

Комсомолец 02-04-2009 20:21 1082343

Цитата:

Цитата Serega_
а утилы iss2nsi случайно нет? »

хреновенько она работает. я ни один скрипт не смог перегнать((

hb860 02-04-2009 22:51 1082541

Комсомолец, нормально она работает, просто кой-чё руками надо поправить после неё. Я помню Download master от Baw17 перегонял. Лишь некоторые строки поправил

Комсомолец 03-04-2009 11:15 1082881

hb860, может уточнишь что именно? я строк 20 скрипта правил по ее подсказкам-так и не добился ничего((

volk1234, спасибо за оформление темы и ссылки! Прикрепи, пожалуйста, и ISS2NSI в ссылки.

Комсомолец 03-04-2009 11:35 1082907

вложение удалено.

Serega 03-04-2009 11:41 1082918

Комсомолец, спасибо! скачал!

hb860 04-04-2009 17:27 1084059

Комсомолец, что именно мне уточнить ?

Комсомолец 04-04-2009 20:10 1084182

hb860, как перегнать iss в nsi.

hb860 05-04-2009 13:28 1084661

Цитата:

==================
ISS2NSI v1.0a2
==================
ISS2NSI is a tool for convert Inno Setup script files into NSIS script files.


Usage:
==================
Program:
At the command prompt write: iss2nsi issscript.iss [nsiscript.nsi]
if nsiscript.nsi is no specified then the converted script will be
saved with the same name of the issscript.iss but with extension .nsi.

NIS Edit Plugin:
1- Close HM NIS Edit.
2- Put hmne_iss2nsi.dll in the plugins directory
(Default $PROGRAMFILES\HMSoft\NIS Edit\Plugins)
3- Start HM NIS Edit.
4- You will found a new item in the tools menu called "Convert InnoSetup script".
Это из оффициального мануала

Serega 05-04-2009 14:03 1084676

hb860, извините, но решил повторить ваше сообщение, переведя его на русский, насколько я понял:
Цитата:

==================
ISS2NSI v1.0a2
==================
ISS2NSI - инструмент для преобразования скрипта Inno Setup в скрипт NSIS.

Использование:
==================
Программа:
В командной строке запишите: iss2nsi issscript.iss [nsiscript.nsi]
если nsiscript.nsi не будет указан, тогда преобразованный скрипт будет сохранен с тем же самым именем issscript.iss, но с расширением.nsi
Плагин NIS Edit:
1- Закройте HM NIS Edit.
2- Разместите файл hmne_iss2nsi.dll в каталоге с плагинами (по умолчанию $PROGRAMFILES\HMSoft\NIS Edit\Plugins)
3- Запустите HM NIS Edit.
4- Вы увидите новый элемент в меню инструментов "Преобразование скрипта InnoSetup".

Комсомолец 05-04-2009 14:13 1084685

hb860, Serega_, я это давно сделал. Но при попытке конвертировать скрипт всегда шибка. Причем даже устранение ошибки в ISS не помогает((

Serega 05-04-2009 14:40 1084702

Комсомолец, прежде всего, так тяжело понять о чём речь...
Вы можете привести конкретный пример, а именно пример скрипта ISS и пример уже преобразованного скрипта в формат NSIS. Я думаю, так будет наглядней.

Комсомолец 05-04-2009 15:40 1084742

Serega_, да забил я на это и удалил их уже. лучше дальше нсис буду юзать.

volk1234 06-04-2009 01:19 1085215

Комсомолец
Добавил, спасибо ! Даже такие есть конверторы...
Надеюсь ничего, что с задержкой.

Комсомолец 06-04-2009 01:33 1085237

volk1234, отлично то, что вообще за тему кто-то взялся! А остальное не так и важно)))

Комсомолец 06-04-2009 14:12 1085652

Всё не успокоюсь насчет The KMPlayer. Кто поможет с оптимизацией?

Скрипт
Код:


!define PRODUCT_NAME "The KMPlayer"
!define PRODUCT_VERSION "2.9.3.1428"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"
!define BRANDING "Created by My, 2009"
!define Publisher "http://www.Site.ru/"
!define Contact "Комсомолец"
!define HelpLink "http://www.kmplayer.com/forums/index.php/"
!define URLInfoAbout "http://www.kmplayer.com/forums/index.php/"
!define URLUpdateInfo "http://www.kmplayer.com/forums/index.php/"
!define Comments "Отличный корейский мультимедийный плеер!"

; MUI 1.67 compatible ------
!include "MUI.nsh"
!include "FileFunc.nsh"

SetCompressor /SOLID lzma
; MUI Settings
!define MUI_ABORTWARNING
!define MUI_ICON "E:\NSIS\KMP player\kmp.ico"
!define MUI_UNICON "E:\NSIS\KMP player\kmp.ico"
!define MUI_COMPONENTSPAGE_NODESC
; Welcome page
!insertmacro MUI_PAGE_WELCOME
; Directory page
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_COMPONENTS
; Instfiles page
!insertmacro MUI_PAGE_INSTFILES
; Finish page
!insertmacro MUI_PAGE_FINISH
; Uninstaller pages
!insertmacro MUI_UNPAGE_INSTFILES
; Language files
!insertmacro MUI_LANGUAGE "Russian"
!insertmacro RefreshShellIcons

BrandingText "${BRANDING}"
Name "${PRODUCT_NAME}"
Caption "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "${PRODUCT_NAME}_${PRODUCT_VERSION}.exe"
InstallDir "$PROGRAMFILES\${PRODUCT_NAME}"
ShowInstDetails show
ShowUnInstDetails show

InstType "Полная"
InstType "Сокращенная"

Section "!${PRODUCT_NAME}" idx0
  SectionIn 1 2 RO
  SetOutPath "$INSTDIR"
  File /r "E:\NSIS\KMP player\kmp-setup-silent\*.*"
;======================================================================================================
        WriteUninstaller "$OUTDIR\Удалить.exe"
        WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
        WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$OUTDIR\KMPlayer.exe"
        WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$OUTDIR\Удалить.exe"
        WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
        WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${Publisher}"
        WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Contact" "${Contact}"
        WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "HelpLink" "${HelpLink}"
        WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${URLInfoAbout}"
        WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLUpdateInfo" "${URLUpdateInfo}"
        WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Comments" "${Comments}"
                SetShellVarContext current
SectionEnd
;======================================================================================================
SectionGroup /e "Ярлыки"
Section "Ярлыки в меню Пуск" idx1
        SectionIn 1 2
        SetShellVarContext all
        CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}"
        CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\KMPlayer.exe"
        CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Удалить ${PRODUCT_NAME}.lnk" "$INSTDIR\Удалить.exe"
SectionEnd

Section "Ярлыки в панели быстрого запуска" idx2
        SectionIn 1 2
        SetShellVarContext all
        CreateShortCut  "$QUICKLAUNCH\${PRODUCT_NAME}.lnk" "$INSTDIR\KMPlayer.exe"
SectionEnd

Section "Ярлык на рабочем столе" idx3
        SectionIn 1
                IfSilent +3
        SetShellVarContext all
        CreateShortCut "$DESKTOP\${PRODUCT_NAME}.lnk" "$INSTDIR\KMPlayer.exe"
SectionEnd
SectionGroupEnd
;======================================================================================================
Section "Скины" idx4
        SectionIn 1
        SetOutPath "$INSTDIR\Skins"
                File /r "E:\NSIS\KMP player\Skins\*.*"
SectionEnd
;======================================================================================================
Section "Мастер настройки" idx5
        SectionIn 1
        SetOutPath "$INSTDIR\"
                File "E:\NSIS\KMP player\wizard\KMPSetup.exe"
        SetShellVarContext all
        CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Мастер настройки.lnk" "$INSTDIR\KMPSetup.exe"
SectionEnd
;======================================================================================================
Section "Ассоциировать" idx6
        SectionIn 1 2
        SetOutPath "$INSTDIR\"
                File "E:\NSIS\KMP player\Assoc.exe"
                ExecWait '$INSTDIR\Assoc.exe'
                Delete  '$INSTDIR\Assoc.exe'

; заготовка на будущее-доделаю файл ассоциаций
;!include "assoc.nsh"
                ${RefreshShellIcons}
SectionEnd
;======================================================================================================

Function un.onUninstSuccess
  HideWindow
  MessageBox MB_ICONINFORMATION|MB_OK "Удаление программы $(^Name) было успешно завершено."
FunctionEnd

Function un.onInit
  MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "Вы уверены в том, что желаете удалить $(^Name) и все компоненты программы?" IDYES +2
  Abort
FunctionEnd

Section Uninstall
!include "unregassoc.nsh"
  ${RefreshShellIcons}
  RMDir /r "$INSTDIR\"
  SetShellVarContext all
  RMDir /r "$SMPROGRAMS\${PRODUCT_NAME}"
  Delete "$DESKTOP\${PRODUCT_NAME}.LNK"
  Delete "$QUICKLAUNCH\${PRODUCT_NAME}.LNK"
  DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
  SetAutoClose true
SectionEnd



unregassoc.nsh во вложении

Для ассоциациий взял пример с темы плеера на inno. Там sfx-архив рапаковывается в темп и добавляет записи в реестр (которые unregassoc.nsh как раз и удаляет). Архив во вложении (.exe форум не разрешает, поэтому упаковал). Начал переводить его в формат nsis, но пока нет времени продолжать.

вот что успел перевести:

Код:


WriteRegStr HKCR "DVD\shell" "" "The KMPlayer"
WriteRegStr HKCR "DVD\shell\The KMPlayer\command" "" "\$\"$INSTDIR\KMPlayer.exe\$\" \$\"%1\$\"" /dvd"

WriteRegStr HKCR "AudioCD\shell" "" "The KMPlayer"
WriteRegStr HKCR "AudioCD\shell\The KMPlayer\command" "" "\$\"$INSTDIR\KMPlayer.exe\$\" \$\"%1\$\"" /cd"

WriteRegStr HKCU "Software\KMPlayer\KMP2.0\OptionArea" "InstallPath" "$INSTDIR\KMPlayer.exe"
WriteRegStr HKCU "Software\KMPlayer\KMP2.0\OptionArea" "SkinFolder" "Vista-Blue.ksf"
WriteRegStr HKCU "Software\KMPlayer\KMP2.0\OptionArea" "LanguageIniName" "Russian.ini"

WriteRegStr HKCR ".3gp" "" "KMPlayer.3gp"
WriteRegStr HKCR ".3gp\DefaultIcon" "" "$INSTDIR\KIconLib.dll,48"
WriteRegStr HKCR ".3gp" "KMPlayer.3gp" "KMP - Видеофайл 3GP"
WriteRegStr HKCR ".3gp\shell\open" "" "&Open"
WriteRegStr HKCR ".3gp\shell\open\command" "" "\$\"$INSTDIR\KMPlayer.exe\$\" \$\"%1\$\""
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.3GP" "Progid" "KMPlayer.3gp"

WriteRegStr HKCR ".asf" "" "KMPlayer.asf"
WriteRegStr HKCR ".asf\DefaultIcon" "" "$INSTDIR\KIconLib.dll,0"
WriteRegStr HKCR ".asf" "KMPlayer.asf" "KMP - Видеофайл asf"
WriteRegStr HKCR ".asf\shell\open" "" "&Open"
WriteRegStr HKCR ".asf\shell\open\command" "" "\$\"$INSTDIR\KMPlayer.exe\$\" \$\"%1\$\""
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.asf" "Progid" "KMPlayer.asf"



Мусору в скрипте достаточно. Буду рад помощи...

hb860 06-04-2009 20:47 1086021

Комсомолец, удали строку №65, она ни к чему
А ассоциации сдери из аимпа, там универсальная функция. Куда удобней чем файлики подключать
Примерно так:
Код:

;custom filetype registration function
!macro RegisterExtension extenstion
        ;create a class for extesion
  StrCpy $ClassName "KMPLAYER.${extenstion}"
  WriteRegStr HKCR ".${extenstion}" "" "$ClassName"
  WriteRegStr HKCR "$ClassName" "" "Файл KMPLAYER: ${extenstion}"
  WriteRegStr HKCR "$ClassName\shell\open" "" "Открыть в AIMP2"
  WriteRegStr HKCR "$ClassName\shell\open\command" "" "$OpenCommand"
        ;define  icon for class
        ${Switch} ${extenstion}       
                ${Case} "3GP"
                        StrCpy $IconIndex 0
                        ${Break}       
                ;mp3 group       
                ${Case} "AVI"
                        StrCpy $IconIndex 1
                        ${Break}
....................................................................................                       
                ${Default}
                        StrCpy $IconIndex 4
                        ${Break}
        ${EndSwitch}
  WriteRegStr HKCR "$ClassName\DefaultIcon" "" "$IconFile,$IconIndex"       
!macroend


Комсомолец 07-04-2009 02:01 1086351

hb860, ок. посмотрю.

▬ Господа! Избегайе такого затратного использования постов! Можно же отписатся по результатам. Неужто комуто интересно будет читать 50 страниц постов - Я сейчас чай пью и тд ....Давайте боротся за форум высокой культуры слога! - Ваш volk1234

volk1234, вот и результат :)

А вот и все в одном посте Комсомолец ! :)

Impeck 24-04-2009 23:13 1103442

Доброго времени суток.
Подскажите, как прописать ключ в реестр такого вида:

Код:

[HKEY_LOCAL_MACHINE\SOFTWARE\Компания\Прога]
"Manual"=dword:00000001

Так запись производится не верно
Код:

WriteRegStr HKLM "SOFTWARE\Компания\Прога" "Manual" "dword:00000001"
Такое работает для
[HKEY_LOCAL_MACHINE\SOFTWARE\Компания\Прога]
"Manual"="forum.oszone.net"

p.s на значения ключей не смотрите это просто для примера.

Комсомолец 25-04-2009 02:36 1103575

Impeck,
Код:

  WriteRegStr HKLM  "SOFTWARE\Nullsoft\Winamp" "regname" "Name"
  WriteRegStr HKLM  "SOFTWARE\Nullsoft\Winamp" "regkey" "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

WriteRegDWORD HKCU "Software\Smart Projects\IsoBuster" "SavedGotham" 0x5

это для примера.

Impeck 25-04-2009 13:16 1103783

Цитата:

Цитата Комсомолец
Код:
WriteRegStr HKLM "SOFTWARE\Nullsoft\Winamp" "regname" "Name"
WriteRegStr HKLM "SOFTWARE\Nullsoft\Winamp" "regkey" "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
WriteRegDWORD HKCU "Software\Smart Projects\IsoBuster" "SavedGotham" 0x5
это для примера. »

Т.е в моем случае это должно быть так:
Код:

WriteRegDWORD HKLM "SOFTWARE\Компания\Прога" "Manual" 00000001
или так:
Код:

WriteRegDWORD HKLM "SOFTWARE\Компания\Прога" "Manual" 1

Комсомолец 25-04-2009 14:04 1103810

Impeck, nullsoft=company. winamp=proga. manual=ключ. значение=как сам задашь. главное чтобы прога его поняла.

hb860 25-04-2009 17:04 1103962

Комсомолец, ты сам то понял что ты ему ответил ?
Impeck, вот так прокатит:
Код:

WriteRegDWORD HKLM "SOFTWARE\Компания\Прога" "Manual" 1
Я вообще, когда пишу дворды в реестр, я их перевожу в десятичную систему счисления, и в WriteRegDWORD указываю именно десятичное значение. Ещё ни разу не подвело

Комсомолец 25-04-2009 17:32 1103987

hb860, всё верно. разжевал предыдущее.
WriteRegStr HKLM "SOFTWARE\Nullsoft\Winamp" "regname" "Name"
WriteRegStr HKLM "SOFTWARE\Nullsoft\Winamp" "regkey" "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

а уже как он все напишет-тут никто не помешает.

Serega 25-04-2009 19:16 1104070

Комсомолец, я так понял нажать спасибо в запад.., т.е. тяжело... Извините, если, что не так, т.е. за мою откровенность...

volk1234 25-04-2009 20:49 1104130

Спокойно, не ругаемся. Спасибки, даже для других, выпрашивать нехорошо :)
Вы посчитали ценным сообщение - поставили, другой человек не считает сообщение стоящего отметки.
У всех разные критерии оценки....

Комсомолец 26-04-2009 14:22 1104641

Serega_,Полезного для себя ничего не увидел. Это раз. Нажатие полезного сообщения-дело добровольное. Это два.

Impeck 26-04-2009 14:29 1104645

Комсомолец и hb860 спасибо за ответ.
Возник другой вопрос...
Нужна дополнительная страница на которой запрашивается имя пользователя, пользователь пишет User.
После инсталляции всех файлов это имя пользователя (User) дописывается в опред. секцию [User_0] в ini файл.
Код:

[User_0]
Name=User

Такое возможно сделать на основе NSIS?

hb860 26-04-2009 16:58 1104745

Можно. Увы, я так ещё ни разу не делал. Но я работаю на этим вопросом! Я пишу новый скрипт для аимпа, там будет пара нестандартных страниц, которые будут делать примерно тоже самое.

Пока по теме могу написать вот что:
1. в ини файл писать так
Код:

WriteINIStr "с:\мой_ини_файл.ini" Секция параметр значение
2. По поводу своих страниц копать тут:
C:\Program Files\NSIS\Docs\Modern UI 2\Readme.html
А также, цитата оттуда(литературно переведено):
Код:

Если вы хотите использовать нестандартные страницы в скрипте, вы можете напихать
своих собственных комманд между макросов, формирующих обычные страницы,
как в этом примере
!insertmacro MUI_PAGE_WELCOME
Page custom FunctionName ;Вот она, нестандартная страница
!insertmacro MUI_PAGE_COMPONENTS
 
;Uninstaller
!insertmacro MUI_UNPAGE_CONFIRM
UninstPage custom un.FunctionName ;Вот она, нестандартная страница
!insertmacro MUI_UNPAGE_INSTFILES

Пользуйте макрос MUI_HEADER_TEXT для задания заголовков своих собственных страниц:

LangString PAGE_TITLE ${LANG_ENGLISH} "Title"
LangString PAGE_SUBTITLE ${LANG_ENGLISH} "Subtitle"

Function CustomPageFunction
  !insermacro MUI_HEADER_TEXT $(PAGE_TITLE) $(PAGE_SUBTITLE)
  ...
FuctionEnd


hastur 30-04-2009 03:56 1107647

Всем доброго времени суток. Вопрос к тем кто давно работает с NSIS. есть вообще какойнить ман по самому языку? чистому без плагинов к нему?

Вот например две строчки

!define MUI_FINISHPAGE_RUN "$INSTDIR\blabla.exe"
!insertmacro MUI_PAGE_FINISH

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

hb860 30-04-2009 16:37 1108080

hastur, справка по нему - лучший источник информации
Также советую полазить по его офф.сайту, там много полезных примеров
Ну и на край полазить в файле "MUI.nsh" :) MUI_FINISHPAGE_RUN берется именно оттуда :)

Otop Ris 03-05-2009 13:02 1109587

Всем привет!здесь прочёл всё, и есть вопросик-прога тихо ставится NSISом с ключом /S, но при обычной установке-предлагает установить ярлыки(надо отметить галочками) , а при тихой -ярлыков нет...есть ли добавка какая к тихому ключу в таких случаях?заранее благодарен...

Комсомолец 03-05-2009 13:46 1109607

Otop Ris, заранее можно указать ключи командной строки. если вы про это. Или ненужным ярлыкам приписываем if silent +3. Тогда они не ставятся при тихой установке.

Otop Ris 03-05-2009 13:57 1109612

Ясно, а если не сам собирал NSIS-установщик, а только знаю ключ тихого инсталла...по идее может быть добавка к ключу(пример?), если заложена изначально?

Или получается что корректировкой команд тихого инсталла для NSIS уже ничего не изменить для готового установщика?

Комсомолец 03-05-2009 20:01 1109847

Otop Ris, посмотри тут пример указания ключей в скрипте. А стандартные в собранном инсталляторе уже не изменить.

hb860 03-05-2009 22:47 1109975

Otop Ris, если автор скрипта заложил в скрипт обработку параметров командной строки - то такая возможность есть.
Если он этого не делал - то исталлер будет поддерживать только /S, /D, /NOCRC. И более того, даже эти ключи можно заставить работать не так как надо. Если сборка не ваша - надо спрашивать у автора, что умеет/не умеет его инсталятор.

Цитата:

Цитата Otop Ris
по идее может быть добавка к ключу(пример?), если заложена изначально? »

Вот тут посмотрите, я лично неплохую "добавку" к аимпу привернул(помоему, даже чересчур).

Otop Ris 05-05-2009 17:45 1111386

Огромное спасибо Всем, особенно за ссылки!!!

wcp 26-05-2009 23:13 1128302

NSIS умеет выставлять права на папки? Ситуация такая:
под вистой в Program Files создается каталог и туда разворачивается некая сборка. В конце инсталляции появляется запрос с предложением запустить установленную программу. Если сказать "да", всё отлично отрабатывает, прога запускается и работает. До закрытия.
Оказывается, виста распознает нсису и при отработке инсталлятора автоматом присваивает ему уровень привилегий admin (соответственно если прогу запустить из-под инсталлятора, то права унаследуются на одну сессию). Дальнейшие попытки запустить программу не из инсталлятора приводят к появлению дебильного для висты запроса "непонятная прога.. чо делать бум? запускать?" А всё потому, что у юзера нет прав на полноценную работу с этим каталогом.
Хотелось бы научить nsis выставить полные права на папку для user.

hb860 27-05-2009 08:58 1128494

wcp, запросы на запуск программы зависят от того, что эта программа собирается делать. Инсталятор тут ни при чем, и согласно новой модели безопасности операционной системы, права на програмфайлс давать программе не рекомендуется. Скорее всего, Ваша программа пытается читать/писать какие то файлы в своей папке установке %programfiles%\programdir
Если уж очень хочется, надо выполнить:
Код:

ExecWait "cmd.exe /c takeown /f $\"$INSTDIR$\" /r /d y && icacls $\"$INSTDIR$\" /grant %username%:F /t"
Эта команда даст полные права текущему пользователю на каталог установки программы, и запросов безопасности не будет.

wcp 27-05-2009 09:41 1128515

hb860, спасибо!

GenLaden 09-06-2009 23:23 1139569

Всем добрый вечер. Решил собрать себе диск необходимых программ, для работы, но вот проблема, попало в руки пару программ упакованых инсталлятором Nullsoft Install System. Новую тему решил не заводить, так как производитель вроде тот же, но ключи тихой установки не подходят. Перебрал все извесные мне ключи тихой установки, но увы...



Если кого интересует ссылка на программу упакованую этим инсталятором, могу бросить в личку.

Заранее благодарен.

hb860 15-06-2009 08:27 1143439

GenLaden, в этом исталяторе отключена тихая установка. Зачем - непонятно. Стандартный ключ /S в данном случае не работает. Надо либо перепаковывать, либо на AutoIT кнопки нажимать.

AlexThePeacemaker 27-06-2009 10:30 1152917

Товарищи, подскажите есть ли возможность запустить NSISовский uninstaller в тихом режиме? И какие ключи для этого использовать?

Комсомолец 27-06-2009 11:52 1152951

AlexThePeacemaker, так же с ключом /S.
Uninstall.exe /S

Serega 05-07-2009 18:50 1159538

Здравствуйте, надумал сделать конвертер рег-файлов в формат .nsi, если конечно это актуально...
В справке описано далеко не всё, поэтому решил задать вопрос в этой теме.
Как занести этот рег-файл в реестр:
Пример
Код:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\My Program]

[HKEY_LOCAL_MACHINE\SOFTWARE\My Program\System]
; REG_BINARY
"Component Information"=hex:00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
; REG_NONE
"WMVFile"=hex(0):
; REG_EXPAND_SZ
"Command"=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,\
  74,00,25,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,72,\
  00,75,00,6e,00,64,00,6c,00,6c,00,33,00,32,00,2e,00,65,00,78,00,65,00,20,00,\
  25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,00,5c,\
  00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,73,00,79,00,6e,00,\
  63,00,75,00,69,00,2e,00,64,00,6c,00,6c,00,2c,00,42,00,72,00,69,00,65,00,66,\
  00,63,00,61,00,73,00,65,00,5f,00,43,00,72,00,65,00,61,00,74,00,65,00,20,00,\
  25,00,32,00,21,00,64,00,21,00,20,00,25,00,31,00,00,00
; REG_MULTI_SZ
"SystemBiosVersion"=hex(7):47,00,42,00,54,00,20,00,20,00,20,00,20,00,2d,00,20,\
  00,34,00,32,00,33,00,30,00,32,00,65,00,33,00,31,00,00,00,41,00,77,00,61,00,\
  72,00,64,00,20,00,4d,00,6f,00,64,00,75,00,6c,00,61,00,72,00,20,00,42,00,49,\
  00,4f,00,53,00,20,00,76,00,36,00,2e,00,30,00,30,00,50,00,47,00,00,00,00,00
; REG_MULTI_SZ
"SmartoolX.BaseAddin,Version=\"8.0.2632.25087\",Culture=\"neutral\",FileVersion=\"8.0.2632.25087\",ProcessorArchitecture=\"MSIL\""=hex(7):74,\
  00,43,00,64,00,24,00,5e,00,4b,00,32,00,6a,00,64,00,3f,00,2c,00,50,00,47,00,\
  45,00,43,00,4d,00,43,00,59,00,7a,00,52,00,53,00,6d,00,61,00,72,00,74,00,6f,\
  00,6f,00,6c,00,58,00,3e,00,76,00,7a,00,6c,00,72,00,2d,00,40,00,6b,00,37,00,\
  29,00,3f,00,55,00,25,00,40,00,4f,00,2c,00,56,00,72,00,6a,00,34,00,48,00,00,\
  00,00,00
; REG_RESOURCE_LIST
"\\Device\\0000003f.Raw"=hex(8):01,00,00,00,0f,00,00,00,ff,ff,ff,ff,00,00,00,\
  00,01,00,00,00,02,03,00,00,09,00,00,00,09,00,00,00,ff,ff,ff,ff
; REG_FULL_RESOURCE_DESCRIPTOR
"Configuration Data"=hex(9):ff,ff,ff,ff,ff,ff,ff,ff,00,00,00,00,02,00,00,00,05,\
  00,00,00,0c,00,00,00,00,00,00,00,00,00,00,00,80,00,ff,03,00,00,3f,00,fe,00,\
  01,00,05,00,00,00,10,00,00,00,00,00,00,00,00,00,00,00,00,00,0c,00,00,ce,00,\
  00,00,00,0f,00,00,00,01,00
; REG_RESOURCE_REQUIREMENTS_LIST 
"Pci"=hex(a):48,02,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,01,00,00,00,01,00,01,00,11,00,00,00,00,01,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,01,00,00,00,00,00,ff,ff,ff,ff,00,00,00,00,\
  08,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,05,00,00,00,00,00,00,ff,\
  ff,00,00,00,00,00,00,08,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,40,01,\
  00,00,00,00,00,00,7f,01,00,00,00,00,00,00,08,01,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,02,00,00,00,00,00,00,ff,02,00,00,00,00,00,00,08,01,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,03,00,00,00,00,00,00,6f,03,00,00,00,\
  00,00,00,08,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,78,03,00,00,00,00,\
  00,00,7a,03,00,00,00,00,00,00,08,01,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,e8,02,00,00,00,00,00,00,ff,02,00,00,00,00,00,00,08,01,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,f0,01,00,00,00,00,00,00,f8,01,00,00,00,00,00,00,08,\
  01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,b0,03,00,00,00,00,00,00,cf,03,\
  00,00,00,00,00,00,08,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,e8,03,00,\
  00,00,00,00,00,ff,03,00,00,00,00,00,00,08,01,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,ce,01,00,00,00,00,00,00,cf,01,00,00,00,00,00,00,08,01,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,01,00,00,00,00,00,00,ff,03,00,00,00,00,\
  00,00,00,03,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,10,00,00,00,00,\
  00,ff,ff,ff,ff,00,00,00,00,08,03,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,0f,00,00,00,00,00,ff,ff,0f,00,00,00,00,00,08,03,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,08,00,00,00,00,00,ff,ff,0b,00,00,00,00,00,08,03,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,08,00,00,00,00,00,ff,ff,0f,\
  00,00,00,00,00,08,03,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,08,00,\
  00,00,00,00,ff,ff,bf,ff,00,00,00,00
; REG_QWORD
"LastInstallTime"=hex(b):d6,1a,3e,7a,f8,c4,c9,01
; REG_DWORD
"FeatureSet"=dword:a0033fff
; REG_SZ
"1"="\"C:\\Program Files\\Microsoft Office\\OFFICE11\\EXCEL.EXE\" /e"
"2"="\"C:\\Program Files\\Paint.NET\\PaintDotNet.exe\" \"%1\""
"3"="\"C:\\Program Files\\Paint.NET\\PaintDotNet.exe\" \"print:%1\""
"4"="C:\\Program Files\\Paint.NET\\PaintDotNet.exe"
"Path"="C:\\Program Files\\Paint.NET"

[HKEY_LOCAL_MACHINE\SOFTWARE\My Program\System]
; удаление данных
"Component Information"=-
; удаление секции My Program
[-HKEY_LOCAL_MACHINE\SOFTWARE\My Program]



Для Inno Setup, это бы выглядело так:
Пример
Код:

[Registry]
; Converter v.0.1.3
Root: HKLM; SubKey: SOFTWARE\My Program; Flags: uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\My Program\System; ValueType: binary; ValueName: Component Information; ValueData: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\My Program\System; ValueType: none; ValueName: WMVFile; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\My Program\System; ValueType: expandsz; ValueName: Command; ValueData: %SystemRoot%\system32\rundll32.exe %SystemRoot%\system32\syncui.dll,Briefcase_Create %2!d! %1; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\My Program\System; ValueType: multisz; ValueName: SystemBiosVersion; ValueData: GBT    - 42302e31{break}Award Modular BIOS v6.00PG{break}{break}; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\My Program\System; ValueType: multisz; ValueName: "SmartoolX.BaseAddin,Version=""8.0.2632.25087"",Culture=""neutral"",FileVersion=""8.0.2632.25087"",ProcessorArchitecture=""MSIL"""; ValueData: tCd$^K2jd?,PGECMCYzRSmartoolX>vzlr-@k7)?U%@O,Vrj4H{break}{break}; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\My Program\System; ValueType: dword; ValueName: FeatureSet; ValueData: $a0033fff; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\My Program\System; ValueType: string; ValueName: 1; ValueData: """C:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE"" /e"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\My Program\System; ValueType: string; ValueName: 2; ValueData: """C:\Program Files\Paint.NET\PaintDotNet.exe"" ""%1"""; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\My Program\System; ValueType: string; ValueName: 3; ValueData: """C:\Program Files\Paint.NET\PaintDotNet.exe"" ""print:%1"""; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\My Program\System; ValueType: string; ValueName: 4; ValueData: C:\Program Files\Paint.NET\PaintDotNet.exe; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\My Program\System; ValueType: string; ValueName: Path; ValueData: C:\Program Files\Paint.NET; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\My Program\System; ValueName: Component Information; Flags: deletevalue
Root: HKLM; SubKey: SOFTWARE\My Program; Flags: deletekey

[code]
var
  res: Integer;
  reg,str: string;
// к сожалению некоторые типы ключей не поддерживаются в IS, поэтому приходится вносить изменения в реестр таким образом... :)
procedure CreateReg;
begin
  reg:= ExpandConstant('{tmp}\regkey.reg');
  str:= 'Windows Registry Editor Version 5.00' + #13#13 +
        '[HKEY_LOCAL_MACHINE\SOFTWARE\My Program\System]' + #13 +
        // тип ключа - REG_RESOURCE_LIST
        '"\\Device\\0000003f.Raw"=hex(8):01,00,00,00,0f,00,00,00,ff,ff,ff,ff,00,00,00,00,01,00,00,00,02,03,00,00,09,00,00,00,09,00,00,00,ff,ff,ff,ff' + #13#13 +
        '[HKEY_LOCAL_MACHINE\SOFTWARE\My Program\System]' + #13 +
        // тип ключа - REG_FULL_RESOURCE_DESCRIPTOR
        '"Configuration Data"=hex(9):ff,ff,ff,ff,ff,ff,ff,ff,00,00,00,00,02,00,00,00,05,00,00,00,0c,00,00,00,00,00,00,00,00,00,00,00,80,00,ff,03,00,00,3f,00,fe,00,01,00,05,00,00,00,10,00,00,00,00,00,00,00,00,00,00,00,00,00,0c,00,00,ce,00,00,00,00,0f,00,00,00,01,00' + #13#13 +
        '[HKEY_LOCAL_MACHINE\SOFTWARE\My Program\System]' + #13 +
        // тип ключа - REG_RESOURCE_REQUIREMENTS_LIST
        '"Pci"=hex(a):48,02,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,01,00,00,00,01,00,01,00,11,00,00,00,00,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,01,00,00,00,00,00,ff,ff,ff,ff,00,00,00,00,08,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,05,00,00,00,00,00,00,ff,ff,00,00,00,00,00,00,08,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,40,01,00,00,00,00,00,00,7f,01,00,00,00,00,00,00,08,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,02,00,00,00,00,00,00,ff,02,00,00,00,00,00,00,08,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,03,00,00,00,00,00,00,6f,03,00,00,00,00,00,00,08,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,78,03,00,00,00,00,00,00,7a,03,00,00,00,00,00,00,08,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,e8,02,00,00,00,00,00,00,ff,02,00,00,00,00,00,00,08,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,f0,01,00,00,00,00,00,00,f8,01,00,00,00,00,00,00,08,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,b0,03,00,00,00,00,00,00,cf,03,00,00,00,00,00,00,08,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,e8,03,00,00,00,00,00,00,ff,03,00,00,00,00,00,00,08,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ce,01,00,00,00,00,00,00,cf,01,00,00,00,00,00,00,08,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,01,00,00,00,00,00,00,ff,03,00,00,00,00,00,00,00,03,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,10,00,00,00,00,00,ff,ff,ff,ff,00,00,00,00,08,03,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,0f,00,00,00,00,00,ff,ff,0f,00,00,00,00,00,08,03,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,08,00,00,00,00,00,ff,ff,0b,00,00,00,00,00,08,03,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,08,00,00,00,00,00,ff,ff,0f,00,00,00,00,00,08,03,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,08,00,00,00,00,00,ff,ff,bf,ff,00,00,00,00' + #13#13 +
        '[HKEY_LOCAL_MACHINE\SOFTWARE\My Program\System]' + #13 +
        // тип ключа - REG_QWORD, поддерживается в IS, начиная с версии 5.3
        '"LastInstallTime"=hex(b):d6,1a,3e,7a,f8,c4,c9,01' + #13#13 +
        '';
  SaveStringToFile(reg, str, False);
end;
// заносим ключ в реестр
procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssPostInstall then begin
    CreateReg;
    Exec('regedit.exe',' /s ' + AddQuotes(reg),ExpandConstant('{win}'),SW_HIDE,ewWaitUntilTerminated,res);
    DeleteFile(reg);
  end;
end;
// при деинсталляции удаляем значения
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  if CurUninstallStep = usUninstall then begin
    RegDeleteValue(HKEY_LOCAL_MACHINE,'SOFTWARE\My Program\System','\\Device\\0000003f.Raw');
    RegDeleteValue(HKEY_LOCAL_MACHINE,'SOFTWARE\My Program\System','Configuration Data');
    RegDeleteValue(HKEY_LOCAL_MACHINE,'SOFTWARE\My Program\System','Pci');
    RegDeleteValue(HKEY_LOCAL_MACHINE,'SOFTWARE\My Program\System','LastInstallTime');
  end;
end;
// -= Converter v.0.1.3 =-
// Затраченное время: 31 мсек.



Как это будет выглядеть для NSIS?

Habetdin 05-07-2009 19:54 1159591

Serega,
из справки:

Цитата:

4.9.2.14 WriteRegBin
Код:

root_key subkey key_name valuedata
This command writes a block of binary data to the registry. Valid values for root_key are listed under WriteRegStr. Valuedata is in hexadecimal (e.g. DEADBEEF01223211151). The error flag is set if the binary data could not be written to the registry. If the registry key doesn't exist it will be created.

Код:

WriteRegBin HKLM "Software\My Company\My Software" "Binary Value" DEADBEEF01223211151
4.9.2.15 WriteRegDWORD
Код:

root_key subkey key_name value
This command writes a dword (32 bit integer) to the registry (a user variable can be specified). Valid values for root_key are listed under WriteRegStr. The error flag is set if the dword could not be written to the registry. If the registry key doesn't exist it will be created.

Код:

WriteRegDWORD HKLM "Software\My Company\My Software" "DWORD Value" 0xDEADBEEF
4.9.2.16 WriteRegStr
Код:

root_key subkey key_name value
Write a string to the registry. See WriteRegExpandStr for more details.

Код:

WriteRegStr HKLM "Software\My Company\My Software" "String Value" "dead beef"
4.9.2.17 WriteRegExpandStr
Код:

root_key subkey key_name value
Write a string to the registry. root_key must be one of:

HKCR or HKEY_CLASSES_ROOT
HKLM or HKEY_LOCAL_MACHINE
HKCU or HKEY_CURRENT_USER
HKU or HKEY_USERS
HKCC or HKEY_CURRENT_CONFIG
HKDD or HKEY_DYN_DATA
HKPD or HKEY_PERFORMANCE_DATA
SHCTX or SHELL_CONTEXT
If root_key is SHCTX or SHELL_CONTEXT, it will be replaced with HKLM if SetShellVarContext is set to all and with HKCU if SetShellVarContext is set to current.

The error flag is set if the string could not be written to the registry. The type of the string will be REG_SZ for WriteRegStr, or REG_EXPAND_STR for WriteRegExpandStr. If the registry key doesn't exist it will be created.

Код:

WriteRegExpandStr HKLM "Software\My Company\My Software" "Expand String Value" "%WINDIR%\notepad.exe"


Serega 05-07-2009 20:17 1159609

Habetdin, справку я прочитал. С WriteRegBin и WriteRegDWORD, в принципе понятно, но вот остальные ключи?

Повторюсь:
Цитата:

Цитата Serega
Как это будет выглядеть для NSIS? »


hb860 05-07-2009 20:44 1159632

Serega,
читать дальше »

############################### reg2nsis begin #################################
# This NSIS-script was generated by the Reg2Nsis utility #
# Author : Artem Zankovich #
# URL : http://aarrtteemm.nm.ru #
# Usage : You can freely inserts this into your setup script as inline text #
# or include file with the help of !include directive. #
# Please don't remove this header. #
################################################################################

WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\My Program" "" ""
WriteRegBin HKEY_LOCAL_MACHINE "SOFTWARE\My Program\System" "Component Information" 00000000000000000000000000000000
WriteRegBin HKEY_LOCAL_MACHINE "SOFTWARE\My Program\System" "WMVFile"
WriteRegBin HKEY_LOCAL_MACHINE "SOFTWARE\My Program\System" "Command" 2500530079007300740065006d0052006f006f00740025005c00730079007300740065006d00330032005c00720075006e00 64006c006c00330032002e0065007800650020002500530079007300740065006d0052006f006f00740025005c0073007900 7300740065006d00330032005c00730079006e006300750069002e0064006c006c002c004200720069006500660063006100 730065005f004300720065006100740065002000250032002100640021002000250031000000
WriteRegBin HKEY_LOCAL_MACHINE "SOFTWARE\My Program\System" "SystemBiosVersion" 47004200540020002000200020002d0020003400320033003000320065003300310000004100770061007200640020004d00 6f00640075006c00610072002000420049004f0053002000760036002e00300030005000470000000000
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\My Program\System" "$\"SmartoolX.BaseAddin,Version" "\$\"8.0.2632.25087\$\",Culture=\$\"neutral\$\",FileVersion=\$\"8.0.2632.25087\$\",ProcessorArchitec ture=\$\"MSIL\$\"$\"=hex(7):74,
00,43,00,64,00,24,00,5e,00,4b,00,32,00,6a,00,64,00,3f,00,2c,00,50,00,47,00,
45,00,43,00,4d,00,43,00,59,00,7a,00,52,00,53,00,6d,00,61,00,72,00,74,00,6f,
00,6f,00,6c,00,58,00,3e,00,76,00,7a,00,6c,00,72,00,2d,00,40,00,6b,00,37,00,
29,00,3f,00,55,00,25,00,40,00,4f,00,2c,00,56,00,72,00,6a,00,34,00,48,00,00,
00,00,00"
WriteRegBin HKEY_LOCAL_MACHINE "SOFTWARE\My Program\System" "\Device\0000003f.Raw" 010000000f000000ffffffff0000000001000000020300000900000009000000ffffffff
WriteRegBin HKEY_LOCAL_MACHINE "SOFTWARE\My Program\System" "Configuration Data" ffffffffffffffff0000000002000000050000000c00000000000000000000008000ff0300003f00fe000100050000001000 0000000000000000000000000c0000ce000000000f0000000100
WriteRegBin HKEY_LOCAL_MACHINE "SOFTWARE\My Program\System" "Pci" 4802000000000000000000000000000000000000000000000000000001000000010001001100000000010000000000000000 0000000000000000010000000000ffffffff00000000080100000000000000000000000000000005000000000000ffff0000 000000000801000000000000000000000000000040010000000000007f010000000000000801000000000000000000000000 00000002000000000000ff020000000000000801000000000000000000000000000000030000000000006f03000000000000 0801000000000000000000000000000078030000000000007a0300000000000008010000000000000000000000000000e802 000000000000ff0200000000000008010000000000000000000000000000f001000000000000f80100000000000008010000 000000000000000000000000b003000000000000cf0300000000000008010000000000000000000000000000e80300000000 0000ff0300000000000008010000000000000000000000000000ce01000000000000cf010000000000000801000000000000 00000000000000000001000000000000ff03000000000000000300000000000000000000000000000000100000000000ffff ffff000000000803000000000000000000000000000000000f0000000000ffff0f0000000000080300000000000000000000 000000000000080000000000ffff0b0000000000080300000000000000000000000000000000080000000000ffff0f000000 0000080300000000000000000000000000000000080000000000ffffbfff00000000
WriteRegBin HKEY_LOCAL_MACHINE "SOFTWARE\My Program\System" "LastInstallTime" d61a3e7af8c4c901
WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\My Program\System" "FeatureSet" 0xa0033fff
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\My Program\System" "1" "\$\"C:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE\$\" /e"
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\My Program\System" "2" "\$\"C:\Program Files\Paint.NET\PaintDotNet.exe\$\" \$\"%1\$\""
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\My Program\System" "3" "\$\"C:\Program Files\Paint.NET\PaintDotNet.exe\$\" \$\"print:%1\$\""
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\My Program\System" "4" "C:\Program Files\Paint.NET\PaintDotNet.exe"
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\My Program\System" "Path" "C:\Program Files\Paint.NET"
WriteRegBin HKEY_LOCAL_MACHINE "SOFTWARE\My Program\System" "Component Information" 00000000000000000000000000000000
WriteRegBin HKEY_LOCAL_MACHINE "SOFTWARE\My Program\System" "WMVFile"
WriteRegBin HKEY_LOCAL_MACHINE "SOFTWARE\My Program\System" "Command" 2500530079007300740065006d0052006f006f00740025005c00730079007300740065006d00330032005c00720075006e00 64006c006c00330032002e0065007800650020002500530079007300740065006d0052006f006f00740025005c0073007900 7300740065006d00330032005c00730079006e006300750069002e0064006c006c002c004200720069006500660063006100 730065005f004300720065006100740065002000250032002100640021002000250031000000
WriteRegBin HKEY_LOCAL_MACHINE "SOFTWARE\My Program\System" "SystemBiosVersion" 47004200540020002000200020002d0020003400320033003000320065003300310000004100770061007200640020004d00 6f00640075006c00610072002000420049004f0053002000760036002e00300030005000470000000000
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\My Program\System" "$\"SmartoolX.BaseAddin,Version" "\$\"8.0.2632.25087\$\",Culture=\$\"neutral\$\",FileVersion=\$\"8.0.2632.25087\$\",ProcessorArchitec ture=\$\"MSIL\$\"$\"=hex(7):74,
00,43,00,64,00,24,00,5e,00,4b,00,32,00,6a,00,64,00,3f,00,2c,00,50,00,47,00,
45,00,43,00,4d,00,43,00,59,00,7a,00,52,00,53,00,6d,00,61,00,72,00,74,00,6f,
00,6f,00,6c,00,58,00,3e,00,76,00,7a,00,6c,00,72,00,2d,00,40,00,6b,00,37,00,
29,00,3f,00,55,00,25,00,40,00,4f,00,2c,00,56,00,72,00,6a,00,34,00,48,00,00,
00,00,00"
WriteRegBin HKEY_LOCAL_MACHINE "SOFTWARE\My Program\System" "\Device\0000003f.Raw" 010000000f000000ffffffff0000000001000000020300000900000009000000ffffffff
WriteRegBin HKEY_LOCAL_MACHINE "SOFTWARE\My Program\System" "Configuration Data" ffffffffffffffff0000000002000000050000000c00000000000000000000008000ff0300003f00fe000100050000001000 0000000000000000000000000c0000ce000000000f0000000100
WriteRegBin HKEY_LOCAL_MACHINE "SOFTWARE\My Program\System" "Pci" 4802000000000000000000000000000000000000000000000000000001000000010001001100000000010000000000000000 0000000000000000010000000000ffffffff00000000080100000000000000000000000000000005000000000000ffff0000 000000000801000000000000000000000000000040010000000000007f010000000000000801000000000000000000000000 00000002000000000000ff020000000000000801000000000000000000000000000000030000000000006f03000000000000 0801000000000000000000000000000078030000000000007a0300000000000008010000000000000000000000000000e802 000000000000ff0200000000000008010000000000000000000000000000f001000000000000f80100000000000008010000 000000000000000000000000b003000000000000cf0300000000000008010000000000000000000000000000e80300000000 0000ff0300000000000008010000000000000000000000000000ce01000000000000cf010000000000000801000000000000 00000000000000000001000000000000ff03000000000000000300000000000000000000000000000000100000000000ffff ffff000000000803000000000000000000000000000000000f0000000000ffff0f0000000000080300000000000000000000 000000000000080000000000ffff0b0000000000080300000000000000000000000000000000080000000000ffff0f000000 0000080300000000000000000000000000000000080000000000ffffbfff00000000
WriteRegBin HKEY_LOCAL_MACHINE "SOFTWARE\My Program\System" "LastInstallTime" d61a3e7af8c4c901
WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\My Program\System" "FeatureSet" 0xa0033fff
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\My Program\System" "1" "\$\"C:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE\$\" /e"
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\My Program\System" "2" "\$\"C:\Program Files\Paint.NET\PaintDotNet.exe\$\" \$\"%1\$\""
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\My Program\System" "3" "\$\"C:\Program Files\Paint.NET\PaintDotNet.exe\$\" \$\"print:%1\$\""
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\My Program\System" "4" "C:\Program Files\Paint.NET\PaintDotNet.exe"
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\My Program\System" "Path" "C:\Program Files\Paint.NET"
DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\My Program"

############################### reg2nsis end #################################

Мож и не стоит изобретать велосипед-то ? Reg2Nsis utility мои потребности, например, удовлетворяет.

Serega 05-07-2009 20:53 1159638

Цитата:

Цитата hb860
Мож и не стоит изобретать велосипед-то ? »

Спасибо, я про неё не знал :) , а в "Полезные ссылки", я и не заглядывал...
Извините, вопрос снят.

onis 21-07-2009 01:01 1173234

Здравствуйте форумчане. Я только начал разбираться с программой дайте ответ на 2 вопроса
1, как запустить установленное приложения после установки.
2, как интегрировать файл реестровый файл когда идет установка
Заранее спасибо

hb860 21-07-2009 18:44 1173853

onis, именно реестровый файл так:
Код:

ExecWait "regedit.exe /S $\"$OUTDIR\lines98.reg$\""
А ещё его можно сконвертить в код NSIS, и впихнуть прям в инсталятор. Но лично мне лень, и я часто делаю так, как написал выше, хотя это и "дурной тон"

Чтобы запустить установленное приложение в конце установки, читаем справку:
Цитата:

MUI_FINISHPAGE_RUN exe_file
Application which the user can select to run using a checkbox. You don't need to put quotes around the filename when it contains spaces.

MUI_FINISHPAGE_RUN_TEXT text
Texts to display next to the 'Run program' checkbox.

MUI_FINISHPAGE_RUN_PARAMETERS parameters
Parameters for the application to run. Don't forget to escape double quotes in the value (use $\").

MUI_FINISHPAGE_RUN_NOTCHECKED
Do not check the 'Run program' checkbox by default

MUI_FINISHPAGE_RUN_FUNCTION function
Call a function instead of executing an application (define MUI_FINISHPAGE_RUN without parameters). You can use the function to execute multiple applications or you can change the checkbox name and use it for other things.
Пример можно поглядеть тут: c:\Program Files\NSIS\Examples\makensis.nsi
Вот оттуда код:
Код:

!define MUI_FINISHPAGE_LINK "Visit the NSIS site for the latest news, FAQs and support"
!define MUI_FINISHPAGE_LINK_LOCATION "http://nsis.sf.net/"

!define MUI_FINISHPAGE_RUN "$INSTDIR\NSIS.exe"

Помоему, более чем достаточно. Заодно ссылочку воткнете на свой сайт или сайт производителя :)

onis 21-07-2009 19:13 1173883

hb860, Большое спасибо

MDinc 22-07-2009 19:27 1174901

Порадую вас кодом проги Roof Builder
ее сайт www.roof-builder.ru

Код:

/*
*/
!define PRODUCT_NAME "Roof Builder"
!define PRODUCT_VERSION "3.00.69.00"
!define PRODUCT_PUBLISHER "MDinc"
!define PRODUCT_WEB_SITE "http://www.roof-builder.ru"
!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\roof.exe"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"
!define PRODUCT_USERRB_ROOT_KEY "HKCU"
!define PRODUCT_RB_KEY "Software\VB and VBA Program Settings\${PRODUCT_NAME}"
!define PRODUCT_RB_DIR "..\..\Roof_Builder_2.85"

VIProductVersion "${PRODUCT_VERSION}"

!define PRODUCT_DAO_DIR_KEY "Microsoft Shared\DAO"
var PRODUCT_DAO_OK

;!define /date MyTIMESTAMP "%Y/%m/%d %H:%M:%S"

Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
;Name "roof"
OutFile "RBinstall.exe"
InstallDir "$PROGRAMFILES\${PRODUCT_NAME}"
InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" ""

;!ifdef NSIS_LZMA_COMPRESS_WHOLE
;SetCompressor zlib
;!else
;SetCompressor /SOLID lzma
;!endif

SetCompress Auto
SetCompressor /SOLID lzma
SetCompressorDictSize 32
SetDatablockOptimize on    ; - оптимизация блока данных

; MUI 1.67 compatible ------
!include "MUI.nsh"
!define MUI_UI "LA_ui.exe" #файл интерфейса

!define MUI_HEADERIMAGE
!define MUI_HEADERIMAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Header\orange-r-nsis.bmp"
!define MUI_HEADERIMAGE_RIGHT

; MUI Settings
!define MUI_ABORTWARNING
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"

; Language Selection Dialog Settings
!define MUI_LANGDLL_REGISTRY_ROOT "${PRODUCT_UNINST_ROOT_KEY}"
!define MUI_LANGDLL_REGISTRY_KEY "${PRODUCT_UNINST_KEY}"
!define MUI_LANGDLL_REGISTRY_VALUENAME "NSIS:Language"

; Welcome page
!define MUI_WELCOMEFINISHPAGE_BITMAP  "nsis\Roof-Builder-box_nsis_forma_cad.bmp"
!define MUI_WELCOMEPAGE_TITLE_3LINES
!insertmacro MUI_PAGE_WELCOME
; License page
;!insertmacro MUI_PAGE_LICENSE "${PRODUCT_RB_DIR}\doc\lic.txt"
!insertmacro MUI_PAGE_COMPONENTS
;!define MUI_COMPONENTSPAGE_SMALLDESC

; Directory page
var SHC_DESCTOP
var SHC_START
var SHC_ASS

!define MUI_PAGE_CUSTOMFUNCTION_LEAVE "CheckButtonsState1" #определяем статус кнопок
function CheckButtonsState1
FindWindow $R1 "#32770" "" $HWNDPARENT
GetDlgItem $R0 $R1 1052 #верхняя кнопка
SendMessage $R0 0x00F2 0 0 $R0 #$R0=0 - если не выбрано
StrCpy $SHC_DESCTOP "$R0" #переменная $SHC_DESCTOP используется в инсталляторе для ярлыка на Рабочий стол

FindWindow $R1 "#32770" "" $HWNDPARENT
GetDlgItem $R0 $R1 1053 #средняя кнопка
SendMessage $R0 0x00F2 0 0 $R0
StrCpy $SHC_START "$R0" #переменная $SHC_START используется в инсталляторе для ярлыка в меню Пуск

FindWindow $R1 "#32770" "" $HWNDPARENT
GetDlgItem $R0 $R1 1054 #нижняя кнопка
SendMessage $R0 0x00F2 0 0 $R0
StrCpy $SHC_ASS "$R0" #переменная $SHC_ASS используется в инсталляторе для ассоциаций с файлами
functionend

!define MUI_PAGE_CUSTOMFUNCTION_SHOW "ChangeButtonsCaption1"
function ChangeButtonsCaption1 #подписи к кнопкам
FindWindow $R1 "#32770" "" $HWNDPARENT
GetDlgItem $R0 $R1 1052
SendMessage $R0 0x00F1 1 0 #по умолчанию выбрано
SendMessage $R0 0xC 0 "STR:$(DeskSh)"

FindWindow $R1 "#32770" "" $HWNDPARENT
GetDlgItem $R0 $R1 1053
SendMessage $R0 0x00F1 1 0 #по умолчанию выбрано
SendMessage $R0 0xC 0 "STR:$(StMenuSh)"

FindWindow $R1 "#32770" "" $HWNDPARENT
GetDlgItem $R0 $R1 1054
StrCmp $9 "1" +2 #$9 берется из on.Init при установке поверх эта кнопка будет не выбрана
SendMessage $R0 0x00F1 1 0 #выбрано по умолчанию. Если поверх - то перескакивает - и не выбрано.
SendMessage $R0 0xC 0 "STR:$(AssocFiles)"
functionend

!insertmacro MUI_PAGE_DIRECTORY

; Instfiles page
!insertmacro MUI_PAGE_INSTFILES

; Finish page
!define MUI_FINISHPAGE_RUN "$INSTDIR\roof.exe"
!define MUI_FINISHPAGE_LINK $(Site)
!define MUI_FINISHPAGE_LINK_LOCATION "http://www.roof-builder.ru"
;!define MUI_CUSTOMFUNCTION_GUIINIT onGUIInit

!insertmacro MUI_PAGE_FINISH

; Uninstaller pages
!insertmacro MUI_UNPAGE_INSTFILES

; MUI end ------

; Language files
!insertmacro MUI_LANGUAGE "English"
!insertmacro MUI_LANGUAGE "Russian"
!insertmacro MUI_LANGUAGE "Lithuanian"

VIAddVersionKey /LANG=${LANG_ENGLISH} "ProductName" "Roof Builder"
VIAddVersionKey /LANG=${LANG_ENGLISH} "Comments" "Roof Builder is a complex decision for the calculation of roof sheets."
VIAddVersionKey /LANG=${LANG_ENGLISH} "CompanyName" "MDinc"
VIAddVersionKey /LANG=${LANG_ENGLISH} "LegalTrademarks" "MDinc"
VIAddVersionKey /LANG=${LANG_ENGLISH} "LegalCopyright" "© MDinc"
VIAddVersionKey /LANG=${LANG_ENGLISH} "FileDescription" "Roof Builder is a complex decision for the calculation of roof sheets."
VIAddVersionKey /LANG=${LANG_ENGLISH} "FileVersion" "${PRODUCT_VERSION}"

ShowInstDetails show
ShowUnInstDetails show

;кнопки на странице с выбором Пути
LangString DeskSh ${LANG_ENGLISH} "Desktop shortcut"
LangString DeskSh ${LANG_RUSSIAN} "Ярлык на Рабочий стол"
LangString DeskSh ${LANG_LITHUANIAN} "Nuoroda i darbalauki"

LangString StMenuSh ${LANG_ENGLISH} "Start Menu shortcut"
LangString StMenuSh ${LANG_RUSSIAN} "Ярлык в меню Пуск"
LangString StMenuSh ${LANG_LITHUANIAN} "Nuoroda i Start meniu"

LangString AssocFiles ${LANG_ENGLISH} "Associate with files"
LangString AssocFiles ${LANG_RUSSIAN} "Ассоциировать файлы .rfd и .rbp с программой"
LangString AssocFiles ${LANG_LITHUANIAN} "Asocijuoti su failais"

;на последней странице инсталлятора название ссылки
LangString Site ${LANG_ENGLISH} "Visit Roof Builder Website - www.roofbuilder.net"
LangString Site ${LANG_RUSSIAN} "Посетить сайт программы - www.roof-builder.ru"
LangString Site ${LANG_LITHUANIAN} "Aplankyti programos tinklapi - www.roofbuilder.net"

;LangString Previous ${LANG_ENGLISH} "Configuration file was found.$\nWarning! Configuration from previous version of ${PRODUCT_NAME} may not be be right for new version.$\nDo you want update file?"
;LangString Previous ${LANG_RUSSIAN} "Найдена предыдущая установка программы.$\nВнимание! Текущая версия программы может не корректно работать со старой конфигурацией.$\nОбновить или пропустить?"
;LangString Previous ${LANG_LITHUANIAN} "Si programos versija jau buvo idegta.$\nDemesio! Instaliuojama programos versija su senu konfiguravimu gali dirbti su klaidom.$\nAtnaujinti ar praleisti?"

LangString UninstSuccess ${LANG_ENGLISH} "$(^Name) was successfully removed from your computer."
LangString UninstSuccess ${LANG_RUSSIAN} "Деинсталяция программы $(^Name) успешна завершена."
LangString UninstSuccess ${LANG_LITHUANIAN} "Programos deinstaliacija $(^Name) sekmingai uzbaigta."

;Удаление
LangString Uninstall ${LANG_ENGLISH} "Remove Roof Builder."
LangString Uninstall ${LANG_RUSSIAN} "Удалить программу."
LangString Uninstall ${LANG_LITHUANIAN} "Pasalinti programa."

LangString UnInit ${LANG_ENGLISH} "Are you sure you want to completely remove $(^Name) and all of its components?"
LangString UnInit ${LANG_RUSSIAN} "Вы действительно хотите удалить $(^Name) и все ее компоненты?"
LangString UnInit ${LANG_LITHUANIAN} "Jus tikrai norite pasalinti $(^Name) visus programos komponentus?"

BrandingText /TRIMRIGHT "  ${PRODUCT_NAME} v${PRODUCT_VERSION}  "

var SELECT_LNG

Function .onInit
 
  !insertmacro MUI_LANGDLL_DISPLAY
  StrCpy $SELECT_LNG 9
 
  ;Call CloseRB
  ;Sleep 100
 
  ;Call SysLang
  ;Pop "$SELECT_LNG" ; Variable (for language name)
 
  ; Check to see if already installed
  ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" "UninstallString"
  IfFileExists $R0 +1 NotInstalled
  MessageBox MB_YESNO "${PRODUCT_NAME} is apparently already installed. Are you want to unistall it?" /SD IDYES IDNO dontinstall
  Exec $R0
  Quit
  dontinstall:
 
NotInstalled:

  ;Banner::show /NOUNLOAD "Checking for DAO..."
  ;Banner::destroy

  StrCpy $PRODUCT_DAO_OK 0

  IfFileExists "$COMMONFILES\${PRODUCT_DAO_DIR_KEY}\DAO360.DLL" 0 isdao

        StrCpy $R0 "$COMMONFILES\${PRODUCT_DAO_DIR_KEY}\DAO360.DLL"
        Push $R0
        Call CheckDllVersion
        Pop $R0

        ${If} $R0  >= 3.60
                ;MessageBox MB_ICONEXCLAMATION  "$0 < 3.60"
                ;Call ConnectInternet ;Make an internet connection (if no connection available)
                ;StrCpy $2 "$TEMP\MDAC.exe"
                ;NSISdl::download http://download.microsoft.com/download/c/f/2/cf2b5cd9-7ffd-4c19-971f-9ccaf0b57d48/MDAC_TYP.EXE $2
                ;Pop $0
                ;StrCmp $0 success success
                ;SetDetailsView show
                ;DetailPrint "download failed: $0"
                ;Abort
                ;success:
                ;SetDetailsView show
                ;ExecWait '"$2"'
                ;Delete $2
                ;Abort
                ;DetailPrint "DAO360.DLL"
                StrCpy "$PRODUCT_DAO_OK" 1
        ${EndIf}
  isdao:
FunctionEnd

;  StrCpy $R0 "$COMMONFILES\${PRODUCT_DAO_DIR_KEY}\DAO360.DLL"
;  Push $R0
;  Call CheckDllVersion
;  Pop $R0
;
Function CheckDllVersion
Exch $0
Push $1
GetDllVersion $0 $R1 $R2
IntOp $R3 $R1 / 0x00010000
IntOp $R4 $R1 & 0x0000FFFF
;IntOp $R5 $R2 / 0x00010000
;IntOp $R6 $R2 & 0x0000FFFF
StrCpy $0 $R3.$R4
Pop $1
Exch $0
FunctionEnd

;Function CheckRegKey
;Exch $0
;Push $1
;ReadRegStr $0 HKLM "Software\MyProgram" "SetupPath"
;IfErrors 0 noerror
;DetailPrint "Ключ не существует!"
;Goto EndCheck
;noerror:
;DetailPrint "Ключ существует, значение SetupPath=$0"
;EndCheck:
;FunctionEnd

## Set the hyperlink up.
;Function onGUIInit
; BrandingURL::Set /NOUNLOAD "0" "200" "0" "http://www.roof-builder.ru"
;FunctionEnd

;function RenameFile
;  Push $R0
;
;  IfFileExists $R0 0 +2
;
;  Rename $R0 $R0.
;
;  StrCpy $R0 1
;  Exch $R0
;functionend

;Function ConnectInternet
;
;  Push $R0
;
;    ClearErrors
;    Dialer::AttemptConnect
;    IfErrors noie3
;
;    Pop $R0
;    StrCmp $R0 "online" connected
;      MessageBox MB_OK|MB_ICONSTOP "Cannot connect to the internet."
;      Quit
;
;    noie3:
;
;    ; IE3 not installed
;    MessageBox MB_OK|MB_ICONINFORMATION "Please connect to the internet now."
;
;    connected:
;
;  Pop $R0
;
;FunctionEnd

;ExecWait '"$INSTDIR\myprog.exe"'
;!include Library.nsh

AutoCloseWindow false
ShowInstDetails show
InstProgressFlags smooth

InstType "Full Install"
InstType "Standart"


Section "!Main" SEC01
  SectionIn 1 2 3 RO

  SetDateSave on

  ;
  ; CHECK PREVIOUS INSTALLATION
  ;
  StrCpy $0 0
  loop:
  EnumRegKey $1 ${PRODUCT_USERRB_ROOT_KEY} "${PRODUCT_RB_KEY}" $0
  StrCmp $1 "" done
  IntOp $0 $0 + 1

        ;StrCmp $1 "REG" miss
        ;DetailPrint "Delete ${PRODUCT_RB_KEY}\$1"

        StrCpy $2 0
        loopv:
        ClearErrors
        EnumRegValue $3 ${PRODUCT_USERRB_ROOT_KEY} "${PRODUCT_RB_KEY}\$1" $2
        IfErrors donev
        IntOp $2 $2 + 1
        ;StrCmp $3 "" donev
        StrCmp $3 "firminfo" loopv
        StrCmp $3 "fimname" loopv
        DetailPrint "Delete ${PRODUCT_RB_KEY}\$1\$3"
        DeleteRegValue ${PRODUCT_USERRB_ROOT_KEY} "${PRODUCT_RB_KEY}\$1" "$3"
        goto loopv
        donev:

        DetailPrint "Delete ${PRODUCT_RB_KEY}\$1"
        DeleteRegKey ${PRODUCT_USERRB_ROOT_KEY} "${PRODUCT_RB_KEY}\$1"
        ;miss:

  goto loop
  done:

  DeleteRegKey ${PRODUCT_USERRB_ROOT_KEY} "${PRODUCT_RB_KEY}"

  ;StrCpy $0 0
  ;EnumRegKey $1 HKLM "Software\${PRODUCT_NAME}" $0
  ;StrCmp $1 "" done1
  ;IntOp $0 $0 + 1 
  ;WriteRegStr HKLM "Software\${PRODUCT_NAME}" "" ""
  ;done1:
 
  AccessControl::GrantOnRegKey HKLM "Software\${PRODUCT_NAME}" "(BU)" "FullAccess"

  ;
  ; Main
  ;
  SetOutPath "$INSTDIR"
  SetOverwrite ifnewer

  IfFileExists "$INSTDIR\roof.exe" 0 +1
  Delete "$INSTDIR\roof.exe"
  File "${PRODUCT_RB_DIR}\roof.exe"

  ;
  ; LNG
  ;
  CreateDirectory "$INSTDIR\lng"
  SetOutPath "$INSTDIR\lng"
  SetOverwrite on
  file "${PRODUCT_RB_DIR}\lng\Russian.lng"

  ;
  ; PLUGINS
  ;
  ;IfFileExists "$INSTDIR\plugins\CalcList.dll" "" +2
  ;Rename "$INSTDIR\plugins\CalcList.dll" "$INSTDIR\plugins\CalcList.dll.backup"

  ;CreateDirectory "$INSTDIR\plugins"
  ;SetOutPath "$INSTDIR\plugins"
  ;file "${PRODUCT_RB_DIR}\plugins\CalcList.dll"

  ;
  ; MDB
  ;
  ;IfFileExists "$INSTDIR\cfg\materials.mdb" IsConfigFile
  ;UpdateConfigFile:
  ; Обновление реестра
  WriteRegStr ${PRODUCT_USERRB_ROOT_KEY} "${PRODUCT_RB_KEY}\main" "mdbcofigfile" "$INSTDIR\cfg\materials.mdb"
  ; Удаление файла конфигурации
  IfFileExists "$INSTDIR\cfg\materials.mdb" +1
  Delete "$INSTDIR\cfg\materials.mdb"
  ;CreateDirectory "$INSTDIR\cfg"
  ;SetOutPath "$INSTDIR\cfg"
  ;file "${PRODUCT_RB_DIR}\cfg\materials.mdb"
  ;goto UpdateConfigFileSuccess
  ;IsConfigFile:
  ;MessageBox MB_YESNO|MB_ICONEXCLAMATION  $(Previous) IDYES UpdateConfigFile
  ;UpdateConfigFileSuccess:

  ;
  ; OCX
  ;
  SetOutPath "$INSTDIR"
  SetOverwrite on
  ;ifnewer
 
  file "${PRODUCT_RB_DIR}\ocx\SplitterModern\SplitterModern.ocx"
  RegDLL "$INSTDIR\SplitterModern.ocx"
  file "${PRODUCT_RB_DIR}\ocx\FrameMinus\FrameHide.ocx"
  RegDLL "$INSTDIR\FrameHide.ocx"
  file "${PRODUCT_RB_DIR}\ocx\SuperRuler 1.0\acSR.ocx"
  RegDLL "$INSTDIR\acSR.ocx"
 

  ;
  ; DAO
  ;
  ${If} $PRODUCT_DAO_OK == 0
        SetOutPath "$COMMONFILES\${PRODUCT_DAO_DIR_KEY}"
        SetOverwrite ifnewer
        file "C:\Program Files\Common Files\Microsoft Shared\DAO\dao360.dll"
        RegDLL "$COMMONFILES\${PRODUCT_DAO_DIR_KEY}\dao360.dll"
  ${EndIf}
 
  ;SetOutPath "$INSTDIR"
  ;SetOverwrite ifdiff
 
  ;
  ; DLL
  ;
 
 
  CreateDirectory "$INSTDIR\data"
  AccessControl::GrantOnFile "$INSTDIR\data" "(BU)" "FullAccess"
 
  CreateDirectory "$INSTDIR\tmp"
  AccessControl::GrantOnFile "$INSTDIR\tmp" "(BU)" "FullAccess"
 
  SetOverwrite on
 
  ;
  ; DLL
  ;
  file "${PRODUCT_RB_DIR}\rb_loc.dll"
 
  ;
  ; TLB
  ;
 
  file "${PRODUCT_RB_DIR}\gdi+.tlb"
  ;
  ; DLL VB6
  ;
  file "${PRODUCT_RB_DIR}\FileMan.dll"
  RegDLL "$INSTDIR\FileMan.dll"
  file "h:\PROJECTs\VB6\VB6\SUBCLALSSING\iSubclass dll SelfSub 2.1\SelfSub 2.1\Samples\cSubclass\iSubclass version\iSubclass.dll"
  RegDLL "$INSTDIR\iSubclass.dll"
 

  StrCmp $SHC_DESCTOP "0" nodesk
  CreateShortCut "$DESKTOP\${PRODUCT_NAME}.lnk" "$INSTDIR\roof.exe" "" "" "" "" "" "${PRODUCT_NAME} ${PRODUCT_VERSION}"
  nodesk:

  StrCmp $SHC_START "0" nostart
  CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}"
  CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\roof.exe"
  nostart:

SectionEnd

Section "Config Base" SEC06
  SectionIn 1
 
  CreateDirectory "$INSTDIR\cfg"
 
  AccessControl::GrantOnFile "$INSTDIR\cfg" "(BU)" "FullAccess"

  SetOutPath "$INSTDIR\cfg"
  SetOverwrite on
  file "${PRODUCT_RB_DIR}\cfg\materials.mdb"
 
SectionEnd

Section "VB6 Libraryes" SEC05
  SectionIn 1 2
  ;VB6
  SetOutPath "$SYSDIR"
 
  IfFileExists "$SYSDIR\STDOLE2.TLB" 0 skip_comdlg32
    File "C:\windows\SYSTEM32\comdlg32.ocx"
    RegDLL "$SYSDIR\comdlg32.ocx"
  skip_comdlg32:
 
  IfFileExists "$SYSDIR\STDOLE2.TLB" 0 skip_Msvbvm60
    File "C:\windows\SYSTEM32\Msvbvm60.dll"
    RegDLL "$SYSDIR\Msvbvm60.dll"
  skip_Msvbvm60:
 
  IfFileExists "$SYSDIR\STDOLE2.TLB" 0 skip_MSCOMCTL
    File "C:\windows\SYSTEM32\MSCOMCTL.OCX"
    RegDLL "$SYSDIR\MSCOMCTL.OCX"
  skip_MSCOMCTL:
 
  IfFileExists "$SYSDIR\STDOLE2.TLB" 0 skip_MSCOMCT2
    File "C:\windows\SYSTEM32\MSCOMCT2.OCX"
    RegDLL "$SYSDIR\MSCOMCT2.OCX"
  skip_MSCOMCT2:
 
  IfFileExists "$SYSDIR\STDOLE2.TLB" 0 skip_STDOLE2
    File "C:\windows\SYSTEM32\STDOLE2.TLB"
    RegDLL "$SYSDIR\STDOLE2.TLB"
  skip_STDOLE2:
 
  IfFileExists "$SYSDIR\STDOLE2.TLB" 0 skip_VB6
    File "C:\windows\SYSTEM32\VB6.OLB"
  skip_VB6:

SectionEnd

SubSection "Language pkg" SecLNG
Section /o "Lithuania pkg" SEC03
  SectionIn 1

  SetOutPath "$INSTDIR\lng"
  SetOverwrite on
  file "${PRODUCT_RB_DIR}\lng\Lithuania.lng"
 
SectionEnd

Section /o "English pkg" SEC04
  SectionIn 1

  SetOutPath "$INSTDIR\lng"
  SetOverwrite on
  file "${PRODUCT_RB_DIR}\lng\English.lng"
 
SectionEnd
SubSectionEnd

Section  "-Calculation libraryes" SEC02 # /o ! -
  ;SectionIn 1

  ;IfFileExists "$INSTDIR\plugins\CalcListAdvanced.dll" "" +2
  ;Rename "$INSTDIR\plugins\CalcListAdvanced.dll" "$INSTDIR\plugins\CalcListAdvanced.dll.backup"

  SetOutPath "$INSTDIR\plugins"
  SetOverwrite on
  ;file "${PRODUCT_RB_DIR}\plugins\CalcListCProject.dll"
  file "${PRODUCT_RB_DIR}\plugins\CalcList.dll"
  ;RegDLL "$INSTDIR\plugins\CalcList_cp_w.dll"
 
  ;SetOutPath "$SYSDIR" 
  ;SetOverwrite on
 
  Delete "$SYSDIR\advcalcdll.dll"
 
  SetOutPath "$INSTDIR"
  SetOverwrite on
  file "${PRODUCT_RB_DIR}\advcalcdll.dll"
 
  ; MS VC
  file "H:\PROJECTs\CP\cdll\msvcp71.dll"
  file "H:\PROJECTs\CP\cdll\msvcr71.dll"
  SectionEnd

;Section /o "Manual" SEC04
;  SectionIn 1
;  SetOutPath "$INSTDIR"
;  file /r "${PRODUCT_RB_DIR}\Doc"
;SectionEnd

LangString DESC_SEC01 ${LANG_RUSSIAN} "Основная програма со всеми настройками."
;LangString DESC_SEC02 ${LANG_RUSSIAN} "Добавочные библиотеки расчета."
LangString DESC_SEC03 ${LANG_RUSSIAN} "Локализационые файлы."
LangString DESC_SecLNG ${LANG_RUSSIAN} "Локализационые файлы."
;LangString DESC_SEC04 ${LANG_RUSSIAN} "Файлы документации."
LangString DESC_SEC05 ${LANG_RUSSIAN} "Основные библиотечные файлы."
LangString DESC_SEC06 ${LANG_RUSSIAN} "Конфигурационный файл."

LangString DESC_SEC01 ${LANG_ENGLISH} "Main program's files"
;LangString DESC_SEC02 ${LANG_ENGLISH} "Calculation`s library's."
LangString DESC_SEC03 ${LANG_ENGLISH} "Main localisation's files."
LangString DESC_SecLNG ${LANG_ENGLISH} "Main localisation's files."
;LangString DESC_SEC04 ${LANG_ENGLISH} "Manual."
LangString DESC_SEC05 ${LANG_ENGLISH} "Main library's files."
LangString DESC_SEC06 ${LANG_ENGLISH} "Main base config file."

LangString DESC_SEC01 ${LANG_LITHUANIAN} "Pagrindine programa su visais nustatymais."
;LangString DESC_SEC02 ${LANG_LITHUANIAN} "Papildomos skaciavimo bibliotekos."
LangString DESC_SEC03 ${LANG_LITHUANIAN} "Lokalizuoti failai."
LangString DESC_SecLNG ${LANG_LITHUANIAN} "Lokalizuoti failai."
;LangString DESC_SEC04 ${LANG_LITHUANIAN} "Dokumentacijos failai."
LangString DESC_SEC05 ${LANG_LITHUANIAN} "Pagrindiniai bibliotekos failai."
LangString DESC_SEC06 ${LANG_LITHUANIAN} "Main base config file."


!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
  !insertmacro MUI_DESCRIPTION_TEXT ${SEC01} $(DESC_SEC01)
  ;!insertmacro MUI_DESCRIPTION_TEXT ${SEC02} $(DESC_SEC02)
  !insertmacro MUI_DESCRIPTION_TEXT ${SEC03} $(DESC_SEC03)
  !insertmacro MUI_DESCRIPTION_TEXT ${SecLNG} $(DESC_SecLNG)
  ;!insertmacro MUI_DESCRIPTION_TEXT ${SEC04} $(DESC_SEC04)
  !insertmacro MUI_DESCRIPTION_TEXT ${SEC05} $(DESC_SEC05)
  !insertmacro MUI_DESCRIPTION_TEXT ${SEC06} $(DESC_SEC06)
!insertmacro MUI_FUNCTION_DESCRIPTION_END

Section -AdditionalIcons
  WriteIniStr "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}"

  StrCmp $SHC_START "0" nostart
  CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Website.lnk" "$INSTDIR\${PRODUCT_NAME}.url"
  CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Uninstall.lnk" "$INSTDIR\uninst.exe"
  nostart:
SectionEnd

Section -Post
  WriteUninstaller "$INSTDIR\uninst.exe"
  WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\roof.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\roof.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"

  WriteRegStr "${PRODUCT_USERRB_ROOT_KEY}" "${PRODUCT_RB_KEY}\Main" "CurrentLanguage" 25

  ;Call Build_md5
  ;Pop $0
  ;DetailPrint "md5: [$0]"
  ;Delete "${PRODUCT_RB_DIR}\md5dll.dll"

  StrCmp $SHC_ASS "0" noassociation
  ExecWait '$INSTDIR\roof.exe /a'
  noassociation:

  ;Поиск ватермарка ROOF BUILDER 2880000000000000000 <> 3ed0f8b8558388fef8e57b9d25eb2e00
  ;SetDetailsPrint none
  ;ExecWait '$INSTDIR\Update.exe -f "$INSTDIR\roof.exe" -s "620923383e86370de5db9c98622101c6" -r "$0"'
  ;SetDetailsPrint both

SectionEnd

;Function Build_md5
# generate MD5sum of file
  ;md5dll::GetMD5File "$INSTDIR\PM.dll"
  ;Pop $0
;FunctionEnd

Function un.InitializeUnistall
  Push $5
  loop:
    FindWindow $5 "Roof Builder"
    IntCmp $5 0 done
    SendMessage $5 16 0 0
    Sleep 100
    Goto loop
  done:
  Pop $5
FunctionEnd

Function un.onUninstSuccess
  HideWindow
  MessageBox MB_ICONINFORMATION|MB_OK $(UninstSuccess)
FunctionEnd

Function un.onInit
!insertmacro MUI_UNGETLANGUAGE
  Call un.InitializeUnistall
  Sleep 100
  MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 $(UnInit) IDYES +2
  Abort
FunctionEnd

Section Uninstall
 
  SetShellVarContext all

  ExecWait "$INSTDIR\roof.exe /una"

  ;
  ; OCX
  ;
  UnRegDLL "$INSTDIR\SplitterModern.ocx"
  Delete "$INSTDIR\SplitterModern.ocx"
  UnRegDLL "$INSTDIR\FrameHide.ocx"
  Delete "$INSTDIR\FrameHide.ocx"
  UnRegDLL "$INSTDIR\acSR.ocx"
  Delete "$INSTDIR\acSR.ocx"
 
  ;
  ; DLL
  ;
  UnRegDLL "$INSTDIR\FileMan.dll"
  UnRegDLL "$INSTDIR\iSubclass.dll"

  RMDir "$SMPROGRAMS\${PRODUCT_NAME}"
  RMDir /r "$INSTDIR\plugins\*.*"
  RMDir /r "$INSTDIR\lng\*.*"
  RMDir /r "$INSTDIR\tmp\*.*"
 
  Delete "$INSTDIR\roof.exe"
  Delete "$INSTDIR\advcalcdll.dll"
  Delete "$INSTDIR\msvcp71.dll"
  Delete "$INSTDIR\msvcr71.dll"
  Delete "$INSTDIR\FileMan.dll"
  Delete "$INSTDIR\iSubclass.dll"
  Delete "$INSTDIR\rb_loc.dll"
  Delete "$INSTDIR\uninst.exe"
 
  ;
  ; TLB
  ;
  Delete "$INSTDIR\gdi+.tlb"
  ;Delete "$INSTDIR\Roof Builder"
 
 
  ;DeleteRegKey HKLM "Software\${PRODUCT_NAME}"

  Delete "$SMPROGRAMS\${PRODUCT_NAME}\Uninstall.lnk"
  Delete "$SMPROGRAMS\${PRODUCT_NAME}\Website.lnk"
  Delete "$DESKTOP\${PRODUCT_NAME}.lnk"
  Delete "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk"

  DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
  DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"
  SetAutoClose true
SectionEnd


hb860 04-08-2009 20:28 1185592

Для Комсомольца, и всех остальных, кому интересно. Диск, на котором установлена винда, я определяю так:
Код:

Var SysDrive
Function .onInit
        StrCpy $SysDrive $WINDIR 2
        StrCpy $INSTDIR "$SysDrive\totalcmd"
FunctionEnd

Знаете способ лучше ? Напишите

nRoof 21-08-2009 02:35 1199009

Доброго времени суток всем! Сделал инсталлятор на NSIS. Ставит несколько программ и создает/меняет некоторые ключи реестра.

Под ХР работает, а под вистой и семеркой не хочет ни в какую писать ключи реестра в раздел HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\ (контекстное меню Мой компьютера). Туда удобно ставить ссылки на некоторые программы, чтоб не мешались и одновременно были под рукой в нужный момент.

Пробовал RequestExecutionLevel admin и highest, одновременно с указанием SetShellVarContext all в секциях установщика и анинсталла. Не помогает, независимо от способа запуска - ни просто так, ни от имени админа. Все файлы и остальные ключи записываются нормально, только в указанный раздел ничего не добавляется.

Зато, если создать reg-файл с этими ключами и запускать его вручную после установки, то все добавляется. Но такой способ мне совсем не нравится. С таким же успехом можно обойтись и без установщика, копируя файлы вручную :-\

Помогите советом, как заставить мой инсталлятор правильно работать?

hb860 21-08-2009 08:29 1199062

nRoof, давай код скрипта поглядим. Хотя бы ту часть которая пишет в реестр.

nRoof 21-08-2009 16:35 1199474

Разобрался сегодня сам. Проблема была совсем не в правах доступа.

Моя ошибка была в том, что я не учел разрядность висты и 7, они у меня 64-битные. А у Windows x64 систем реестр делится на 64 и 32-разрядные разделы. Мониторинг процесса установки моего инсталлера ProcessMonitor'ом показал, что ключи все-таки добавляются, но не в HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\, а в HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell. Стало очевидно, что инсталлер обращается к 32-разрядным разделам вместо 64-разрядных.

Поиск в справке NSIS привел к инструкции SetRegView 32|64|lastused, которая и определяет, к какой разрядности разделам обращаться установщику. Добавление в скрипт SetRegView 64 решило проблему.

Теперь под XP-32 и под Vista-64/7-64 собранный мной установщик работает правильно :) . Буду рад если этот пост кому-то поможет.

Impeck 24-08-2009 20:43 1202191

Подскажите, как nsis'ом определить расположение ранее установленной программы.
Занести пусть в переменную и использовать ее при конфигурировании.
Например:
Определяем куда установлен µTorrent
Определили что он установлен в C:\Program Files\uTorrent\ занесли это в переменную $instor
и потом
Код:

WriteINIStr $TEMP\something.ini section1 something $instor\utorrent.exe
возможно такое?

Habetdin 24-08-2009 23:18 1202295

Impeck, из справки NSIS:
Цитата:

4.9.3.11 SearchPath
Код:

user_var(output) filename
Assign to the user variable $x, the full path of the file named by the second parameter. The error flag will be set and $x will be empty if the file cannot be found. Uses SearchPath() to search the system paths for the file.

Impeck 25-08-2009 09:13 1202487

нашел пример использования

Код:

  SearchPath $1 notepad.exe
  MessageBox MB_OK "notepad.exe=$1"

путь определяет.

но если ставить например
Код:

SearchPath $1 firefox.exe
  MessageBox MB_OK "firefox.exe=$1"

путь пустой.

MDinc 25-08-2009 14:07 1202762

тогда уж так

The DeleteRegKey problem is probably a windows bug and not nsis, either way, using SetRegView 64 on 32 bit systems is not supported

To detect x64, include x64.nsh

${If} ${RunningX64}
MessageBox MB_OK "running on x64"
${EndIf}

edit: gah too slow, kichik beat me to it

hb860 25-08-2009 14:59 1202803

Ребят, вы чёт загнались тут конкретно!
Короче, умейте читать справку! Uses SearchPath() to search the system paths for the file.
СИСТЕМНЫЕ ПУТИ!!! системные пути это %windir%, %path% etc.
Я вообще не понял суть вопроса с поиском. Если функция нужна - используйте это:
http://nsis.sourceforge.net/Search_For_a_File
ИЛИ ЭТО
http://nsis.sourceforge.net/FindIt:_...le_/_directory
Если надо ПРОСТО УЗНАТЬ, установлен юторрент установлен или нет, то прочитайте ветку HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\uTorrent, ключ "UninstallString"="\"C:\\Program Files\\uTorrent\\uTorrent.exe\" /UNINSTALL"
или этот "InstallLocation"="C:\\Program Files\\uTorrent" (я рекомендую читать первый)
и проверьте наличия файла

P.S. А ещё можно в аппдата поглядеть, есть ли профиль юторрента. Если есть - значит он он есть(ну или был когда то 100%)

MDinc 25-08-2009 16:33 1202893

ну если это ко мне адресовано то я ответил на пост 173 nRoof

nRoof 25-08-2009 18:03 1202987

MDinc, да пришлось сталкиваться с таким. Ключи реестра добавлялись на обоих системах, но при деинсталле удалялись только на одной, в зависимости от значения SetRegView. Как проверять разрядность системы нашел поиском на англоязычном форуме винампа.
Добавил такой кусочек кода:
Код:

  !include "x64.nsh"
    ${If} ${RunningX64}
      SetRegView 64
    ${Endif}

и все заработало.

Bond01 09-09-2009 18:36 1215020

Подскажите - как задать директорию для программы в меню пуск? например - программа.ехе /S что дальше?

Habetdin 09-09-2009 18:40 1215026

Bond01, вроде бы никак :dont-know
В справке только такие ключи:
Цитата:

/NCRC disables the CRC check, unless CRCCheck force was used in the script.
/S runs the installer or uninstaller silently. See section 4.12 for more information.
/D sets the default installation directory ($INSTDIR), overriding InstallDir and InstallDirRegKey. It must be the last parameter used in the command line and must not contain any quotes, even if the path contains spaces. Only absolute paths are supported.

Bond01 09-09-2009 18:48 1215032

Жалко, я тоже ничего не нашел. Хочу прибраться в меню пуск, а то все программу кто-куда устанавливаются.
А есть русик на сам компилятор, что-то с ним немогу разобраться.

Habetdin 10-09-2009 17:48 1215910

Bond01, http://vadimsva.ucoz.org/NSIS_rus_2.xx.7z

Archius 25-09-2009 11:29 1227076

У NSIS есть поиск по реестру, только чтобы поиск подразделы тоже в себя включал?

K.A.V. 25-09-2009 20:18 1227461

Archius, воспользуйтесь плагином Registry для NSIS
http://nsis.sourceforge.net/Registry_plug-in

SlavikGol 04-10-2009 04:48 1234060

Подскажите пожлуйста как можно сделать инсталяшку на nsis чтоб она инсталировалась у пользователе без прав админа

K.A.V. 04-10-2009 07:59 1234072

SlavikGol, попробуйте добавить в начале кода:
Код:

RequestExecutionLevel user

SlavikGol 04-10-2009 12:31 1234166

K.A.V., Продовал при компиляции выдает ошибку
Код:

Invalid command: RequestExecutionLevel

K.A.V. 04-10-2009 18:43 1234399

эту строчку надо добавлять перед описанием всех функций, но после инклудинка библиотек, если всё равно ошибки- обновите свою версию NSIS, команда 100% валидная

SlavikGol 05-10-2009 03:14 1234708

K.A.V., Спасибо! Старая версия NSIS стояла

XCV 15-10-2009 10:25 1243497

Может глупые вопросы, но всё же нигде не нашел на них ответ:
1. Можно ли в NSIS сделать так чтобы при установке проги ставился или 1-й её компонент, или 2-й (тоесть при выборе 2-го галочка с 1-го автоматически снималась и наоборот)?
2. Может ли NSIS различать в какой ОС запущен инсталятор и в зависимости от этого выполнять те или иные действия?
3. При создании инстолятора делаю секцию "ярлыки" которая и создает при установке эти самые ярлыки... Создаётся папка с ярлыками в меню пуск в которой ярлычки на некоторые компоненты устанавливаемой проги, если при установке отменить выбор некоторых компонентов то ярлыки на них всё равно создаются, если создавать ярлыки в той же секции где устанавливается сам компонент то пропадает возможность выбора, создавать ярлыки или нет. Можно ли с этим както бороться?
Если у кого-то есть положительные ответы на эти вопросы, то, если можно, дайте пример....
Заранее благодарен всем.

K.A.V. 15-10-2009 12:47 1243620

Цитата:

Цитата XCV
1. Можно ли в NSIS сделать так чтобы при установке проги ставился или 1-й её компонент, или 2-й (тоесть при выборе 2-го галочка с 1-го автоматически снималась и наоборот)? »

Можно :)

Цитата:

Цитата XCV
2. Может ли NSIS различать в какой ОС запущен инсталятор и в зависимости от этого выполнять те или иные действия? »

Конечно

Цитата:

Цитата XCV
3. При создании инстолятора делаю секцию "ярлыки" которая и создает при установке эти самые ярлыки... Создаётся папка с ярлыками в меню пуск в которой ярлычки на некоторые компоненты устанавливаемой проги, если при установке отменить выбор некоторых компонентов то ярлыки на них всё равно создаются, если создавать ярлыки в той же секции где устанавливается сам компонент то пропадает возможность выбора, создавать ярлыки или нет. Можно ли с этим както бороться?
Если у кого-то есть положительные ответы на эти вопросы, то, если можно, дайте пример.... »

Можно, например я делал так: создавал глобальные переменные, если отмечена секция на установку компонента, то глобальной переменной назначается допустим "1", потом в секции "post" просто напросто делаем сравнение значений переменных, если значение переменной "1", то создаём ярлык, если нет, то нет... :)

XCV 15-10-2009 14:38 1243722

Цитата:

Цитата K.A.V.
Можно »

Цитата:

Цитата K.A.V.
Конечно »

Цитата:

Цитата K.A.V.
Можно, например я делал так: создавал глобальные переменные, если отмечена секция на установку компонента, то глобальной переменной назначается допустим "1", потом в секции "post" просто напросто делаем сравнение значений переменных, если значение переменной "1", то создаём ярлык, если нет, то нет... »

если не трудно можно какой либо скрипт для примера?

K.A.V. 15-10-2009 15:12 1243749

Определение операционной системы
читать дальше »
Код:

; Создаём переменную
var WinVer

; В любой функции вызываем функцию определения ОС
call GetWindowsVersion
; Результат в переменной $WinVer (95, 98, ME, NT, 2000, XP, 2003, Vista, 7)

; Сама функция определения ОС
Function GetWindowsVersion

  Push $R0
  Push $R1

  ClearErrors

  ReadRegStr $R0 HKLM \
  "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion

  IfErrors 0 lbl_winnt

  ; we are not NT
  ReadRegStr $R0 HKLM \
  "SOFTWARE\Microsoft\Windows\CurrentVersion" VersionNumber

  StrCpy $R1 $R0 1
  StrCmp $R1 '4' 0 lbl_error

  StrCpy $R1 $R0 3

  StrCmp $R1 '4.0' lbl_win32_95
  StrCmp $R1 '4.9' lbl_win32_ME lbl_win32_98

  lbl_win32_95:
    StrCpy $R0 '95'
  Goto lbl_done

  lbl_win32_98:
    StrCpy $R0 '98'
  Goto lbl_done

  lbl_win32_ME:
    StrCpy $R0 'ME'
  Goto lbl_done

  lbl_winnt:

  StrCpy $R1 $R0 1

  StrCmp $R1 '3' lbl_winnt_x
  StrCmp $R1 '4' lbl_winnt_x

  StrCpy $R1 $R0 3

  StrCmp $R1 '5.0' lbl_winnt_2000
  StrCmp $R1 '5.1' lbl_winnt_XP
  StrCmp $R1 '5.2' lbl_winnt_2003
  StrCmp $R1 '6.0' lbl_winnt_vista
  StrCmp $R1 '6.1' lbl_winnt_7 lbl_error

  lbl_winnt_x:
    StrCpy $R0 "NT $R0" 6
  Goto lbl_done

  lbl_winnt_2000:
    Strcpy $R0 '2000'
  Goto lbl_done

  lbl_winnt_XP:
    Strcpy $R0 'XP'
  Goto lbl_done

  lbl_winnt_2003:
    Strcpy $R0 '2003'
  Goto lbl_done

  lbl_winnt_vista:
    Strcpy $R0 'Vista'
  Goto lbl_done

  lbl_winnt_7:
    Strcpy $R0 '7'
  Goto lbl_done

  lbl_error:
    Strcpy $R0 ''
  lbl_done:

strcpy $WinVer $R0

  Pop $R1
  Exch $R0

FunctionEnd



Один компонент для установки
читать дальше »
Код:

; Секции с компонентами
Section /o "Компонент №1" ID_1
SectionEnd

Section /o "Компонент №2" ID_2
SectionEnd

Section /o "Компонент №3" ID_3
SectionEnd

Section /o "Компонент №4" ID_4
SectionEnd

Section /o "Компонент №5" ID_5
SectionEnd

Section /o "Компонент №6" ID_6
SectionEnd


; Функция проверки отметки, обязательна
Function .onSelChange

; Выбор между компонентам 1, 2, 3
  !insertmacro StartRadioButtons $1
    !insertmacro RadioButton ${ID_1}
    !insertmacro RadioButton ${ID_2}
    !insertmacro RadioButton ${ID_3}
  !insertmacro EndRadioButtons

; Выбор между компонентам 5 и 6
  !insertmacro StartRadioButtons $2
    !insertmacro RadioButton ${ID_5}
    !insertmacro RadioButton ${ID_6}
  !insertmacro EndRadioButtons

FunctionEnd



Создаём ярлыки в зависимости отметки компонета
читать дальше »
Код:

; Создаём глобальные переменные
var Component_1_is_checked
var Component_2_is_checked
var Component_3_is_checked

; Пошли компоненты
Section /o "Компонент №1" ID_1
strcpy $Component_1_is_checked "1"
SectionEnd

Section /o "Компонент №2" ID_2
strcpy $Component_2_is_checked "1"
SectionEnd

Section /o "Компонент №3" ID_3
strcpy $Component_3_is_checked "1"
SectionEnd


; Пост секция создания ярлыков
Section -Post
StrCmp $Component_1_is_checked "1" 0 no_shortCuts_1
;
; Ярлыки для 1 компонента
;
no_shortCuts_1:
StrCmp $Component_2_is_checked "1" 0 no_shortCuts_2
;
; Ярлыки для 2 компонента
;
no_shortCuts_2:
StrCmp $Component_3_is_checked "1" 0 no_shortCuts_3
;
; Ярлыки для 3 компонента
;
no_shortCuts_3:
SectionEnd


Impeck 16-10-2009 21:01 1244903

Подскажите, как подобную страничку создать?

K.A.V. 16-10-2009 21:17 1244911

Impeck, сам показ диалога, картинки и всего текста отображенного на изображении реализовать не составляет никакого труда...для меня :)...но вот какие действия происходят если отмечена галочка "Установить яндекс бар", т.е. что именно выполняется для установки бара, здесь я вам подсказать не смогу (впринципе уже не по теме установка яндекс бара :))...могу лишь помочь вам в создании диалога

Impeck 17-10-2009 10:00 1245149

K.A.V., да это и интересует, с установкой тулбара сам разберусь.

K.A.V. 17-10-2009 12:00 1245234

Вложений: 1
Судя по скриншоту, мне кажется что использовался инсталлер не от NSIS по некоторым особенностям...
Но всё же, качайте прикреплённый архив, если чего не поймёте - спрашивайте не стесняйтесь ;)

XCV 20-10-2009 12:05 1247737

Цитата:

Цитата K.A.V.
Один компонент для установки »

Создал скрипт, вот его часть:
Section "!${PRODUCT_NAME}"
SectionIn 1 2 3 RO
SetOutPath "$INSTDIR"
File /r "prog\*.*"
WriteUninstaller "$OUTDIR\uninst.exe"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$OUTDIR\prog.exe"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$OUTDIR\uninst.exe"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
SectionEnd
;=================================================================================================== ======================
SectionGroup "Цветовая тема оформления"
Section /o "Белая" ID_1
SetOutPath "$INSTDIR"
File /r "White\*.*"
SectionEnd
Section "Чёрная" ID_2
SetOutPath "$INSTDIR"
File /r "Black\*.*"
SectionEnd
SectionGroupEnd
Function .onSelChange
!insertmacro StartRadioButtons $1
!insertmacro RadioButton ${ID_1}
!insertmacro RadioButton ${ID_2}
!insertmacro EndRadioButtons
FunctionEnd

По идее всё нормально, при инстоляции по умолчанию "Чёрная" "Цветовая тема оформления", но если попытаться переставить галочку на "Белая" то галочка вместо того чтобы пропасть с "Чёрная" пропадает с "!${PRODUCT_NAME}", и вернуть её туда не удаётся :(, хотя при повторном нажатиии на "Белая" галочка с "Чёрная" пропадает, но на "!${PRODUCT_NAME}" не появляется. Подскажите в чем моя ошибка плиз...

K.A.V. 20-10-2009 13:07 1247793

XCV, добавьте в конец .onInit функции строку
Код:

StrCpy $1 ${ID_2}
Пример
читать дальше »

Код:

Function .onInit
  StrCpy $1 ${ID_2}
 FunctionEnd


Oput 29-10-2009 14:15 1255596

Помогите плиз решить задачу:
1. Надо устанавливать кучу компонентов но 2 из них для своей работы требуют стороний продукт. создаю вот такую группу:
Код:

SectionGroup /e group1
Section "component 1" id1
SectionEnd
SectionGroupEnd

SectionGroup /e group2
Section "component 2" id2
SectionEnd
SectionGroupEnd

Section "service"
SectionEnd

Мне надо если пользователь чекнит группу "component 1" или "compenent 2" или 2 группы сразу, то что бы секция "service" тоже чекалась а если анчекнит две сразу то тоже что бы анчекалась.
знаю что надо подписаться на .onSelChange а вот что написать внутри - без понятия.

2. установку service можно проверить через реестр и допустим если он уже стоит надо пропускать его установку. это можно на этапе самой установки, т.е галочка чекнута а по реестру видим что всё стоит то просто пропустить.

K.A.V. 29-10-2009 14:28 1255608

Цитата:

Цитата Oput
Мне надо если пользователь чекнит группу "component 1" или "compenent 2" или 2 группы сразу, то что бы секция "service" тоже чекалась а если анчекнит две сразу то тоже что бы анчекалась.
знаю что надо подписаться на .onSelChange а вот что написать внутри - без понятия. »

немного попозже думаю напишу ;) (просто сейчас занят немного исправлением ошибок своего твикера)

Цитата:

Цитата Oput
2. установку service можно проверить через реестр и допустим если он уже стоит надо пропускать его установку. это можно на этапе самой установки, т.е галочка чекнута а по реестру видим что всё стоит то просто пропустить. »

Ну ведь это легко...просто сделаем метку в конце секции, на которую переходить если служба уже существует...например

Код:

Section "MyService"
Предположу, что системное имя нашей службы MyService, а отображаемое - "Моя служба"
; Определяю, установлена ли служба, читая значение ключа, которое отображает полное имя нашей службы
ReadRegStr $0 HKLM "SYSTEM\CurrentControlSet\Services\MyService" "DisplayName"
StrCmp $0 "Моя служба" NoServiceInstall 0
##########
# Код установки службы
##########
NoServiceInstall:
SectionEnd


Oput 29-10-2009 16:05 1255711

первое вроде как реализовал, вернее нашёл пример на nsis. За второе ОГРОМНОЕ спасибо. Может кому пригодиться:
Код:

Section "Section 2" Sec2
SectionEnd
 
SectionGroup "s1" Sec3
Section "Section 3"
ExecWait "cmd"
SectionEnd
SectionGroupEnd

SectionGroup "s2" Sec4
Section "Section 4"
SectionEnd
SectionGroupEnd

Function .onInit

  # This is necessary otherwise Sec3 won't be selectable for the first time you click it.
  SectionGetFlags ${Sec2} $R0
  IntOp $R0 $R0 & ${SF_SELECTED}
  StrCpy $IndependentSectionState $R0

FunctionEnd

Function .onSelChange
Push $R0
Push $R1

  # Check if Sec2 was just selected then select Sec3 and Sec4.
  SectionGetFlags ${Sec2} $R0
  IntOp $R0 $R0 & ${SF_SELECTED}
  StrCmp $R0 $IndependentSectionState +3
    StrCpy $IndependentSectionState $R0
  Goto UnselectDependentSections
    StrCpy $IndependentSectionState $R0

  Goto CheckDependentSections

  # Select Sec2 if Sec3 or Sec4 was selected.
  SelectIndependentSection:

    SectionGetFlags ${Sec2} $R0
    IntOp $R1 $R0 & ${SF_SELECTED}
    StrCmp $R1 ${SF_SELECTED} +3

    IntOp $R0 $R0 | ${SF_SELECTED}
    SectionSetFlags ${Sec2} $R0

    StrCpy $IndependentSectionState ${SF_SELECTED}

  Goto End

  # Were Sec3 or Sec4 just unselected?
  CheckDependentSections:

  SectionGetFlags ${Sec3} $R0
  IntOp $R0 $R0 & ${SF_SELECTED}
  StrCmp $R0 ${SF_SELECTED} SelectIndependentSection

  SectionGetFlags ${Sec4} $R0
  IntOp $R0 $R0 & ${SF_SELECTED}
  StrCmp $R0 ${SF_SELECTED} SelectIndependentSection

  Goto End

  # Unselect Sec3 and Sec4 if Sec2 was unselected.
  UnselectDependentSections:

    SectionGetFlags ${Sec3} $R0
    IntOp $R1 $R0 & ${SF_SELECTED}
    StrCmp $R1 ${SF_SELECTED} 0 +3

    IntOp $R0 $R0 ^ ${SF_SELECTED}
    SectionSetFlags ${Sec3} $R0

    SectionGetFlags ${Sec4} $R0
    IntOp $R1 $R0 & ${SF_SELECTED}
    StrCmp $R1 ${SF_SELECTED} 0 +3

    IntOp $R0 $R0 ^ ${SF_SELECTED}
    SectionSetFlags ${Sec4} $R0

  End:

Pop $R1
Pop $R0
FunctionEnd


XCV 25-11-2009 18:30 1279696

надо чтобы инстолятор nsis перед началом установки проверил установлен ли в системе к примеру netframework или другой нужный компонент (его наличие можно проверить по определённому файлу или ключу в реестре), и затем выдал окошко в котором предложил бы: если компонет установлен то переустановить его или продолжить установку, а если нет то установить его...
возможно ли это реализовать?

hb860 25-11-2009 21:04 1279817

Код:

ReadRegStr $R0 HKLM "Software\МойСофт" "МойАдскийКлюч"
StrCmp $R0 "Значение ключа" lblKeyExists 0

MessageBox MB_ICONQUESTION|MB_YESNO  "АХТУНГ!. Нету ключа реестра. Будем ставить компонент?" IDYES 0 IDNO lblSkipSetup
ExecWait 'команда установки'
goto lblSkipSetup

lblKeyExists:
MessageBox MB_ICONQUESTION|MB_YESNO  "АХТУНГ!. Есть ключ рееста. Переставим компонент?" IDYES 0 IDNO lblSkipSetup
ExecWait 'Команда перестановки'

lblSkipSetup:
......

Вот как то так

Vsirf 25-11-2009 22:11 1279858

Какая проблема в етом файле:
читать дальше »

Код:

GetDlgItem 32 74 78
CreateFont 33 -37 -38 83 0
SendMessage -1 91 95 87 85 0
GetDlgItem 34 74 102
SerCtlColors 91 0 0
SerCtlColors 107 0 0
Call 120
SetFlag 13 0
File $PLUGINSDIR\modern-header.bmp
SetBrandingImage 111
GetDlgItem 35 74 133
SerCtlColors 138 0 0
GetDlgItem 36 74 142
SerCtlColors 147 0 0
GetDlgItem 38 74 151
SerCtlColors 156 24 0
GetDlgItem 37 74 160
SerCtlColors 165 24 0
SendMessage -1 165 174 85 169 2
GetDlgItem 39 74 181
GetDlgItem 40 74 186
GetDlgItem 41 74 191
GetDlgItem 42 74 193
GetDlgItem 43 74 195
Return
Return
Return
WriteINIStr 197 206 -40 221
WriteINIStr 240 216 -41 221
WriteINIStr 248 216 -42 221
WriteINIStr 256 216 -43 221
WriteINIStr 264 216 -44 221
WriteINIStr 272 216 -45 221
WriteINIStr 280 216 -46 221
WriteINIStr 288 216 -47 221
WriteINIStr 296 216 -48 221
WriteINIStr 304 216 -49 221
WriteINIStr 272 312 318 221
WriteINIStr 280 312 345 221
WriteINIStr 288 312 390 221
WriteINIStr 296 312 446 221
WriteINIStr 483 216 492 221
WriteINIStr 511 216 520 221
WriteINIStr 533 216 542 221
WriteINIStr 553 216 562 221
GetDlgItem 12 74 193
ShowWindow 573 85
GetDlgItem 12 74 195
ShowWindow 573 85
Push $0
Call 120
File $PLUGINSDIR\InstallOptions.dll
SetFlag 13 0
Push $PLUGINSDIR\NS Welcome.ini
RegisterDLL $PLUGINSDIR\InstallOptions.dll dialog 0
Pop $0
Pop $0
Return
Call 120
SetFlag 13 0
IfFileExists $WINDIR\NiwradSoft Shell Pack\Tools 65 0
MessageBox 16 643 0 0 0
ShellExecute 719 318 0 1
Quit
ReadRegStr 0 2147483650 756 787 0
StrCmp  "$0" "1" 0 69 0
ShellExecute 719 318 0 1
WriteReg 2147483650 756 787 85 1
File $PLUGINSDIR\NS Welcome.ini
File $PLUGINSDIR\niwradsoft.bmp
File $PLUGINSDIR\un.bmp
File $PLUGINSDIR\up.bmp
File $PLUGINSDIR\user.bmp
IfFileExists $WINDIR\NiwradSoft Shell Pack\Tools\NS Welcome.exe 77 0
WriteINIStr 304 852 858 221
Goto 80
ReadRegStr 0 2147483650 867 913 0
StrCmp  "$0" "$WINDIR\NiwradSoft Shell Pack\Tools\NS Welcome.exe" 0 80 0
WriteINIStr 304 312 191 221
Call 120
File $PLUGINSDIR\System.dll
SetFlag 13 0
Push kernel32::CreateMutexA(i 0, i 0, t 'NS Welcome') i .r0 ?e
RegisterDLL $PLUGINSDIR\System.dll Call 0
Pop $0
StrCmp  "$0" "0" 103 0 0
Assign 0 -3
IntOp 0 577 191 0
FindWindow 1 1010 0 85 1017
IntCmp 1017 85 102 0 0 0
Call 120
File $PLUGINSDIR\System.dll
SetFlag 13 0
Push user32::GetWindowText(i r1, t .r2, i r0) i.
RegisterDLL $PLUGINSDIR\System.dll Call 0
StrCmp  "$2" "" 0 89 0
Call 120
File $PLUGINSDIR\System.dll
SetFlag 13 0
Push user32::SetForegroundWindow(i r1) i.
RegisterDLL $PLUGINSDIR\System.dll Call 0
Abort
Return
ReadINIStr 0 304 852 221
StrCmp  "$0" "DISABLED" 113 0 0
ReadINIStr 0 304 312 221
StrCmp  "$0" "1" 0 110 0
WriteReg 2147483650 867 913 805 1
Goto 113
ReadRegStr 0 2147483650 867 913 0
StrCmp  "$0" "$WINDIR\NiwradSoft Shell Pack\Tools\NS Welcome.exe" 0 113 0
DelReg 0 2147483650 867 913
SetOutPath $TEMP
Call 120
File $PLUGINSDIR\System.dll
SetFlag 13 0
Push 0
RegisterDLL $PLUGINSDIR\System.dll Free 0
Return
SetFlag 13 163
StrCmp  "$PLUGINSDIR" "" 0 130 0
Push $0
SetFlag 2 0
GetTempFileName  $TEMP
Delete 8 $0
SetOutPath $0
IfFlag 131 0 2 0
StrCpy $PLUGINSDIR "$0"
Pop $0
Return
MessageBox 2097168 1119 0 0 0
Quit
Return


hb860 25-11-2009 22:51 1279874

Файлы дистрибутивов NSIS декомпиляции не подлежат. Уже неоднократно обсуждалось, что получить исходный NSI-файл не получится, максимум - извлечь файлы дистрибутива. Пишите свой скрипт, если нужна помощь, обращайтесь, поможем. Или выпросите скрипт у автора продукта, как вариант.

volk1234 25-11-2009 22:56 1279883

Извиняюсь забыл сделать обьявление -
Посоветовавшись с предыдущим автором темы desperate сделал куратором темы (и новым автором темы) hb860
Предыдущий автор не мог уделять много времени поддержке этой темы.
Куратор может редактировать только шапку и свои сообщения -
в остальном все как обычно...

Vsirf 25-11-2009 23:01 1279890

Цитата:

Цитата hb860
Файлы дистрибутивов NSIS декомпиляции не подлежат. Уже неоднократно обсуждалось, что получить исходный NSI-файл не получится, максимум - извлечь файлы дистрибутива. Пишите свой скрипт, если нужна помощь, обращайтесь, поможем »

А где можно почитать про написание своих скриптов?Желательно на Руском языке , потому что у меня с англиским неочень :)

hb860 25-11-2009 23:23 1279911

Vsirf,
Начните отсюда, например:
http://www.winreview.ru/news.php?extend.33.11
http://www.markelov.net/articles.php?lng=ru&pg=39
http://www.compdoc.ru/bd/other/nsis/


Есть ещё http://nsis.narod.ru/nsis_help, но он неполный и мне не нравится.

DRUG123 05-12-2009 23:11 1287705

Вложений: 1
помогите пожалуйста! создал инсталлятор для StrongDC++ запускаю его а он мне вон че пишет (смотрим аттачмент)...

как этого издателя сделать? что прописать нуно??? сразу пишу не нужно мне напоминать о том, что в панели управления винды7 можно это отключить, чтоб издатель не проверялся... не все пользователи это будут делать - а эта штука так и будет вылетать! после нажатия ОК все работает и устанавливается, но не приятен сам факт существования этого нелепого окна =(
и вот ещё что, эта же программа StrongDC++ когда установится, при запуске не чего такого не пишет, а в свойствах файла во вкладке Подробнее тоже самое прописано - наверное там с этим всё в порядке, а тут... =(((((

огромное спасибо заранее!

hb860 06-12-2009 01:34 1287779

Во-первых, сам запрос с "издателем" ничего общего не имеет. Операционная система понимает, что вы запускаете инсталлятор, и требует от вас потверждения установки программы. Проверяется не издатель, а потенциальная опасность действий приложения.
Во-вторых, раз оригинальный инсталлятор Стронга не требует повышенных привелегий на установку, а ваш - требует, значит, их действия различны. Вы в своем что-то меняете - пишете в реестр, копируете файлы или что-то такое, чего в оригинальном не делается. Проанализируйте разницу в действиях вашего и оригинального инсталляторов.
В третьих, чтобы прописать издателя, необходимо подключить этот плагин:http://nsis.sourceforge.net/Version_...heets_for_NSIS. Там же пример использования, а вот вам ещё один, если певрого мало,где указывается "издатель". Если остались вопросы - пишите, разберемся.

DRUG123 06-12-2009 11:52 1287915

hb860, ок спасибо, посмотрел уже. вот тока не понятно зачем это, зачем лесть через ResHacker в .exe и сохранять .res файл? (как написано в readme.txt что лежал в архиве VIT.zip) что это даёт? и зачем это? если можно в скрипте прописать следующее:

Код:

VIProductVersion "0.7.0.8"
VIAddVersionKey /LANG=${LANG_RUSSIAN} ProductName "StrongDC++"
VIAddVersionKey /LANG=${LANG_RUSSIAN} ProductVersion "2.30"
VIAddVersionKey /LANG=${LANG_RUSSIAN} CompanyName "BigMuscle"
VIAddVersionKey /LANG=${LANG_RUSSIAN} CompanyWebsite "http://strongdc.sourceforge.net"
VIAddVersionKey /LANG=${LANG_RUSSIAN} FileVersion "2.30"
VIAddVersionKey /LANG=${LANG_RUSSIAN} FileDescription "StrongDC++ - клиент для p2p файлообменных сетей."
VIAddVersionKey /LANG=${LANG_RUSSIAN} LegalCopyright "Copyright © 2009, BigMuscle"
VIAddVersionKey /LANG=${LANG_RUSSIAN} Comments "Windows XP, Vista, 7"
VIAddVersionKey /LANG=${LANG_RUSSIAN} OriginalFilename "StrongDC.exe"

извините, не понятно =(

и да скорее всего эта фишка с издателем вызвана иза "потенциальная опасности" приложения... но опять же это не у всех инсталляторов - не у всех у которых есть цифровая подпись и нет её (так же как у меня просто "Свойства => Подробно") - но видать чего то все таки не хватает, и этого просто не достаточно для подтверждения издателя.

hb860 06-12-2009 17:50 1287941

В ресхакер лезть не надо, он вызывается из скрипта и сгененрирует нужный бинарный блок для вашего инсталлятора
Вот тут:
Код:

!packhdr tmp.dat '"c:\program files\reshack\reshacker.exe" -addoverwrite tmp.dat, tmp.dat, vit.res, versioninfo,1,'
В данном примере просто используется методика из VIT.

Habetdin 07-12-2009 00:58 1288256

December 06, 2009 - NSIS 2.46 Released! :)
Скачать | Русификатор

XCV 10-12-2009 12:00 1291399

Цитата:

Цитата hb860
Код:
ReadRegStr $R0 HKLM "Software\МойСофт" "МойАдскийКлюч"
StrCmp $R0 "Значение ключа" lblKeyExists 0
MessageBox MB_ICONQUESTION|MB_YESNO "АХТУНГ!. Нету ключа реестра. Будем ставить компонент?" IDYES 0 IDNO lblSkipSetup
ExecWait 'команда установки'
goto lblSkipSetup
lblKeyExists:
MessageBox MB_ICONQUESTION|MB_YESNO "АХТУНГ!. Есть ключ рееста. Переставим компонент?" IDYES 0 IDNO lblSkipSetup
ExecWait 'Команда перестановки'
lblSkipSetup:
......Вот как то так »

вставил в свой скрипт, выдаёт ошибку, пишет что нехватает функции или макроса.. что ещё надо добавить?
и ещё такой вопрос, при установке инсталятора созданного в nsis (если нажать кнопочку детали) показывается что делает инсталятор, но в конце установки выскакивает окошко финиш которое всё закрывает, можно ли как нибудь выдрать этот лог установки?

K.A.V. 10-12-2009 12:52 1291427

Цитата:

Цитата XCV
вставил в свой скрипт, выдаёт ошибку, пишет что нехватает функции или макроса.. что ещё надо добавить? »

Вроде всё правильно...может у вас ошибка в другом месте кода?

Цитата:

Цитата XCV
и ещё такой вопрос, при установке инсталятора созданного в nsis (если нажать кнопочку детали) показывается что делает инсталятор, но в конце установки выскакивает окошко финиш которое всё закрывает, можно ли как нибудь выдрать этот лог установки? »

Сначала пропишем глобальные переменные
читать дальше »

Код:

!define LVM_GETITEMCOUNT 0x1004
!define LVM_GETITEMTEXT 0x102D


В самую последнюю секцию (-POST) прописываем
читать дальше »

Код:

push "$DESKTOP\LOG.log"
Call DumpLog

Где "$DESKTOP\LOG.log" - путь файла, в который будет происходить запись данных

+Нам необходимо добавить функцию
читать дальше »

Код:

Function DumpLog
  Exch $5
  Push $0
  Push $1
  Push $2
  Push $3
  Push $4
  Push $6

  FindWindow $0 "#32770" "" $HWNDPARENT
  GetDlgItem $0 $0 1016
  StrCmp $0 0 error
  FileOpen $5 $5 "w"
  StrCmp $5 0 error
    SendMessage $0 ${LVM_GETITEMCOUNT} 0 0 $6
    System::Alloc ${NSIS_MAX_STRLEN}
    Pop $3
    StrCpy $2 0
    System::Call "*(i, i, i, i, i, i, i, i, i) i \
      (0, 0, 0, 0, 0, r3, ${NSIS_MAX_STRLEN}) .r1"
    loop: StrCmp $2 $6 done
      System::Call "User32::SendMessageA(i, i, i, i) i \
        ($0, ${LVM_GETITEMTEXT}, $2, r1)"
      System::Call "*$3(&t${NSIS_MAX_STRLEN} .r4)"
      FileWrite $5 "$4$\r$\n"
      IntOp $2 $2 + 1
      Goto loop
    done:
      FileClose $5
      System::Free $1
      System::Free $3
      Goto exit
  error:
    MessageBox MB_OK error
  exit:
    Pop $6
    Pop $4
    Pop $3
    Pop $2
    Pop $1
    Pop $0
    Exch $5
FunctionEnd


XCV 10-12-2009 17:36 1291671

Цитата:

Цитата K.A.V.
Сначала пропишем глобальные переменные
читать дальше »
Код:
!define LVM_GETITEMCOUNT 0x1004
!define LVM_GETITEMTEXT 0x102D
В самую последнюю секцию (-POST) прописываем
читать дальше »
Код:
push "$DESKTOP\LOG.log"
Call DumpLogГде "$DESKTOP\LOG.log" - путь файла, в который будет происходить запись данных
+Нам необходимо добавить функцию
читать дальше » »

Инстолятор не мой поэтому внести в него изменения не могу, просто хочу увидеть что делает инсталятор во время установки, точнее я даже записал на видео поцесс установки и сумел просмотреть почти всё, какие папки создаёт, что туда копирует, что запускает, но некоторые файлы запускает с ключем который не влез в окошко установки, как его увидеть?
Цитата:

Цитата K.A.V.
Вроде всё правильно...может у вас ошибка в другом месте кода? »

да нет, если выбрасываю эту часть скрипт без проблем компилится... попробую поискать в чем загвоздка

K.A.V. 10-12-2009 17:55 1291690

Цитата:

Цитата XCV
Инстолятор не мой поэтому внести в него изменения не могу, просто хочу увидеть что делает инсталятор во время установки »

так...это что получается, имеем инсталлятор на NSIS, и после его запуска хотим перехватить этот текст и записать в файл?
Так что сложного? :)
В строчке
Код:

FindWindow $0 "#32770" "" $HWNDPARENT
вставляем что-то типа этого
Код:

FindWindow $0 "#32770" "Это заголовок окна инсталлятора" ""
p.s.
Не тестил, но работать должно :)

hb860 10-12-2009 19:13 1291749

Цитата:

Цитата K.A.V.
Цитата XCV:Инстолятор не мой поэтому внести в него изменения не могу, просто хочу увидеть что делает инсталятор во время установки » »

Это не совсем в тему, но тут не NSIS нужен, a Sysinternals ProcMon. Вот им всё можно увидеть

XCV 11-12-2009 10:19 1292304

Цитата:

Цитата hb860
Это не совсем в тему, но тут не NSIS нужен, a Sysinternals ProcMon. »

ProcMon если я правильно понимаю может отследить изменения в реестре и файловой системе, а мне надо лог который пишет nsis при установке, в том числе какие файлы запускались и с какими ключами

XCV 11-12-2009 10:45 1292330

вот к примеру скрин (первый попавшийся) как увидеть окончание последней строчки?

K.A.V. 11-12-2009 13:08 1292447

XCV, в посте 219 я объяснил как это сделать в собственном инсталляторе
Как перехватить информацию, когда инсталлятор не ваш, описал я в посте 221, просто это будет отдельный ваш EXEшник, который будет копировать информацию из диалога...что не понятно?
Или вам написать готовый EXE файл может?

hb860 11-12-2009 13:33 1292462

Цитата:

Цитата XCV
в том числе какие файлы запускались и с какими ключами »

Так в процмоне же есть коммандная строка процесса. Чем плох вариант ?

XCV 11-12-2009 14:57 1292559

Цитата:

Цитата K.A.V.
описал я в посте 221 »

сори пропустил

KSE 19-12-2009 19:22 1299435

Всем добрый день!
Подскажите пожалуйста.

Есть две custom pages
При запуске первой выводиться 3 Radio Buttons

Выбиретие вариант
1. Мастер
2. По умолчанию
3 Без изменений

При выборе одного из вариантов активируется кнопка "далее"
Мне нужно сделать, чтобы в случае выбора 1-го варианта запускалась вторая custom page, ну и при выборе 2 или 3 варианта, вторая страница пропускалась. Никак не получается сделать.

KSE 20-12-2009 00:11 1299659

Еще вопрос касательно поста выше

4.9.14.5 FindWindow
user_var(hwnd output) windowclass [windowtitle] [windowparent] [childafter]

Searches for a window. Behaves like the win32 FindWindowEx(). Searches by windowclass (and/or windowtitle if specified). If windowparent or childafter are specified, the search will be restricted as such. If windowclass or windowtitle is specified as "", they will not be used for the search. If the window is not found, the user variable returned is 0. To accomplish old-style FindWindow behavior, use FindWindow with SendMessage.
FindWindow $0 "#32770" "" $HWNDPARENT
FindWindow $0 "my window class" "my window title"

GetDlgItem
user_var(output) dialog item_id

Retrieves the handle of a control identified by item_id in the specified dialog box dialog. If you want to get the handle of a control on the inner dialog, first use FindWindow user_var(output) "#32770" "" $HWNDPARENT to get the handle of the inner dialog.
GetDlgItem $0 $HWNDPARENT 1 # next/install button

Я так понял можно как то воспользоваться этой инструкцией. Только тут не совсем все понятно!

FindWindow $0 "#32770" "название окна"
GetDlgItem $0 $0 "тут цифра"
IntCmp $0 1 Goto 0 0
Abort
Goto:

Вопрос. Как узнать название моего окна или как присвоить моему окну (конкретно первому custom page) название? И как узнать под какой какой цыфрой будет допустим первая Radio Button?

K.A.V. 20-12-2009 12:09 1299840

KSE, сейчас занят, попозже напишу скрипт и отвечу на все ваши вопросы ;)

K.A.V. 20-12-2009 13:52 1299898

Вложений: 1
KSE, в прикрелпённом архиве скрипт для вас ;)

Цитата:

Цитата KSE
или как присвоить моему окну (конкретно первому custom page) название? »

В файле конфигурации диалога (в INI файле), пропишите в секцию Settings имя параметра Title и присвойте данному параметру имя желаемого окна, например:
читать дальше »

[Settings]
Title=Это мой заголовок окна


Цитата:

Цитата KSE
И как узнать под какой какой цыфрой будет допустим первая Radio Button?

В файле конфигурации диалога, Field X, где X - ваша цифра

Мне не понятно, для чего вам использование:
Код:

FindWindow $0 "#32770" "название окна"
GetDlgItem $0 $0 "тут цифра"

В InstallOptions это врядли вам пригодится

ALaN_1 20-12-2009 20:20 1300146

Люди, может быть создать что типа программы для создания скриптов с настройками чтоб написал и все. Не поймите меня не правильно просто я не разбираюсь в этом скриптовом языке. А сама программка классная. Сам не чем помочь не могу, т.к. не очень хорошо понимаю в программировании,только начинаю его изучать.

Habetdin 20-12-2009 20:23 1300150

ALaN_1, Запускаете, жмете Ctrl+W - запускается мастер создания сценария, заполняете поля.. Profit! :)

ALaN_1 22-12-2009 14:13 1301622

Цитата:

ALaN_1,



Цитата hb860:




HM NIS EDIT - лучший редактор сценариев для NSIS с открытым исходным кодом »

Запускаете, жмете Ctrl+W - запускается мастер создания сценария, заполняете поля.. Profit!
Хорошо так говорить когда понимаешь скриптовый язык программы. А я хочу создать "гибкий" инсталятор. И вообще освоить его. Но не учебников и ничего подобного по нему нет, а зря-ведь программа заслуживает этого.

K.A.V. 22-12-2009 14:58 1301660

Цитата:

Цитата ALaN_1
А я хочу создать "гибкий" инсталятор »

Гибкий можно создать только вручную редактируя скрипт, ИМХО

Цитата:

Цитата ALaN_1
Но не учебников и ничего подобного по нему нет »

Знаете, когда я начал изучать NSIS (это было где-то года 3 назад), я начинал именно с HM NIS EDIT, и его функция мастера сценариев мне очень помогла, к тому же, я не знал английского языка (да и сейчас не знаю :lol:), и к тому же, у меня тогда не было интернета, открывал пару раз файл справки, было очень страшно :laugh: там же всё по английскому написано...НО там есть примеры всех команд, и разобраться не так уж и сложно окозалось...главное необходимо желание, и...усиленные тесты! ;)

К тому же, в данное время, много кто уже знаком с NSIS довольно хорошо (например даже я, весь мой софт написан чисто на NSIS :) ), и данная тема созданна именно для решения проблем, пишем сюда все ваши вопросы, и не сомневайтесь, мы постараемся вам помочь, насколько хватит знанинй ;)
Чем больше вы будете задавать вопросов, стараться разобраться, тем быстрей вы освоите данный язык :)

KSE 23-12-2009 18:03 1302702

Вопрос по созданию ярлыка.

Var freq
StrCpy $freq "60"

...

CreateShortCut "$DESKTOP\blablabla.lnk" "$INSTDIR\blablabla.exe" \
"-freq $freq" "$INSTDIR\blablabla\blablabla.ico" 0 SW_SHOWNORMAL \
ALT|CONTROL|SHIFT|F5 "запустить blablabla"

Пишет, invalid command "-freq $freq"
Как втулить в параметры запуска значение из переменной?

Из документации мало что можно взять

CreateDirectory "$SMPROGRAMS\My Company"
CreateShortCut "$SMPROGRAMS\My Company\My Program.lnk" "$INSTDIR\My Program.exe" \
"some command line parameters" "$INSTDIR\My Program.exe" 2 SW_SHOWNORMAL \
ALT|CONTROL|SHIFT|F5 "a description"

KSE 23-12-2009 18:28 1302740

Все, я разобрался, синтаксис был у меня правильный. Оно матюкалось на комментарий. Его там ставить нельзя было.
Неправильно:
CreateShortCut "$DESKTOP\blablabla.lnk" "$INSTDIR\blablabla.exe" \ ;Мой коммент
"-freq $freq" "$INSTDIR\blablabla\blablabla.ico" 0 SW_SHOWNORMAL \
ALT|CONTROL|SHIFT|F5 "запустить blablabla"

Правильно:
;Мой коммент
CreateShortCut "$DESKTOP\blablabla.lnk" "$INSTDIR\blablabla.exe" \
"-freq $freq" "$INSTDIR\blablabla\blablabla.ico" 0 SW_SHOWNORMAL \
ALT|CONTROL|SHIFT|F5 "запустить blablabla"

Все получилось :)

KSE 24-12-2009 05:41 1303071

Подкскажите пожалуйста! Как можно максимально упросить данный код?

Пример:

${If} $mon == 1
${AndIf} $2 == 1
${AndIf} $R1 == 1
StrCpy $freq "60"
${EndIf}

${If} $mon == 1
${AndIf} $2 == 1
${AndIf} $R2 == 1
StrCpy $freq "75"
${EndIf}

${If} $mon == 1
${AndIf} $1 == 1
${AndIf} $R1 == 1
StrCpy $freq "100"
${EndIf}

...

И так 90 вариантов! :)

Буду очень признателен!

ЗЫ:
Видел, что так можно делать, но у меня почему то не получается.

Код:

${If} $mon == 1
      ${If} $2 == 1
              ${If} $R1 == 1
              StrCpy $freq "60"
              ${EndIf}
              ${If} $R2 == 1
              StrCpy $freq "75"
              ${EndIf}
      ${EndIf}
      {If} $3 == 1
              ${If} $R1 == 1
              StrCpy $freq "65"
              ${EndIf}
              ${If} $R2 == 1
              StrCpy $freq "85"
              ${EndIf}
      ${EndIf}
${ElseIf} $mon == 2
      ${If} $2 == 1
              ${If} $R1 == 1
              StrCpy $freq "55"
              ${EndIf}
              ${If} $R2 == 1
              StrCpy $freq "45"
              ${EndIf}
      ${EndIf}
      ${If} $3 == 1
              ${If} $R1 == 1
              StrCpy $freq "35"
              ${EndIf}
              ${If} $R2 == 1
              StrCpy $freq "25"
              ${EndIf}
      ${EndIf}
${EndIf}


K.A.V. 24-12-2009 10:37 1303202

Цитата:

Цитата KSE
Подкскажите пожалуйста! Как можно максимально упросить данный код?
Пример:
${If} $mon == 1
${AndIf} $2 == 1
${AndIf} $R1 == 1
StrCpy $freq "60"
${EndIf} »

Код:

StrCmp $mon "1" 0 +4
StrCmp $2 "1" 0 +3
StrCmp $R1 "1" 0 +2
StrCpy $freq "60"

p.s.
KSE, почему не отписываемся о проделанной мною работы, по вашей проблемы с поста #220, или я зря тратил своё время?

KSE 24-12-2009 16:53 1303431

Отписываю.

Я хотел сделать так, чтобы до выбора одного из вариантов кнопка "далее" была неактивна.
После выбора варианта - активировать кнопку "далее". При нажатии кнопки далее осуществлялся переход на ту или иную страницу в зависимости от выбора.
Проблему решил след. образом

Код:

...
; Мои две custom страницы
Page custom configurring
Page custom configmaster
...
переменные и т.д.
...

Function configurring
StrCpy $Reservefiles "0" ; По умолчанию файлы не резервируются

!insertmacro MUI_HEADER_TEXT "Мастер кофигурирования параметров" ""
nsDialogs::Create 1018
        Pop $Dialog1
        ${If} $Dialog1 == error
        Abort
        ${EndIf}
       
            ; Деактивация кнопки далее, и тот и тот вариант работает.
        ;GetDlgItem $0 $HWNDPARENT 1
        ;EnableWindow $0 0
        EnableWindow $mui.Button.Next 0
       
          ${NSD_CreateRadioButton} 0 0 100% 10u "&Запустить мастер кофигурирования параметров (рекомендуется)"
        Pop $Confmaster
        ${NSD_OnClick} $Confmaster confway
        ${NSD_CreateLabel} 17 10u 100% 20u "&С помощью ....."
        Pop $Description

        ${NSD_CreateRadioButton} 0 36u 100% 10u "&Сконфигурировать по умолчанию"
        Pop $Confdefault
        ${NSD_OnClick} $Confdefault confway
        ${NSD_CreateLabel} 17 46u 100% 10u "&Все настройки будут установлены по умолчанию."
        Pop $Description

        ${NSD_CreateRadioButton} 0 65u 100% 10u "&Не изменять конфигурацию"
        Pop $Confstay
        ${NSD_OnClick} $Confstay confway
        ${NSD_CreateLabel} 17 75u 100% 10u "&Все параметры и файлы конфигурации будут оставлены без изменений."
        Pop $Description
       
        ${NSD_CreateCheckBox} 0 98u 100% 10u "&Сделать резервную копию игры."
        Pop $Reserve
        ${NSD_OnClick} $Reserve Reserve
        ${NSD_CreateLabel} 17 108u 100% 100% "&Предыдущая версия игры будет скопирована в папку backup. В случае деинсталяции данного пачта все файлы и ключи будут востановлены."
        Pop $Description
       
        nsDialogs::Show

FunctionEnd

Function confway
        Pop $Confmaster
        ${NSD_GetState} $Confmaster $0
        Pop $Confdefault
        ${NSD_GetState} $Confdefault $1
        Pop $Confstay
        ${NSD_GetState} $Confstay $2
        ${If} $0 == 1
        EnableWindow $mui.Button.Next 1
        StrCpy $master "1"
        ${EndIf}
        ${If} $1 == 1
        EnableWindow $mui.Button.Next 1
        StrCpy $master "2"
        ${EndIf}
        ${If} $2 == 1
        EnableWindow $mui.Button.Next 1
        StrCpy $master "3"
        ${EndIf}
FunctionEnd

Function Reserve
Pop $Reserve
${NSD_GetState} $Reserve $3
        ${If} $3 == 1
        StrCpy $Reservefiles "1"
        EnableWindow $mui.Button.Next 0
        ${Else}
        StrCpy $Reservefiles "0"
        EnableWindow $mui.Button.Next 0
        ${EndIf}
FunctionEnd

Function configmaster
IntCmp $master 1 Goto 0 0 ; Если переменная $master равно 1, то перейти к .. и т.д.
Abort
Goto:
!insertmacro MUI_HEADER_TEXT "&Мастер кофигурирования параметров" ""
nsDialogs::Create 1018
Pop $Dialog2
${If} $Dialog2 == error
Abort
${EndIf}

        EnableWindow $mui.Button.Next 0
       
        ; Выбор монитора (заголовок)
        ${NSD_CreateLabel} 0 0 220u 10u "....."
.....

Конечно я выбрал немного инной способ
я использовал logiclib и nsDialogs


K.A.V.
Насчет моего предыдущего поста я не сильно понял, как

StrCmp $mon "1" 0 +4
StrCmp $2 "1" 0 +3
StrCmp $R1 "1" 0 +2
StrCpy $freq "60"
такой код может быть проще? Как я уже говорил, таких вот столбиков

${If} $mon == 1
${AndIf} $2 == 1
${AndIf} $R1 == 1
StrCpy $freq "60"
${EndIf}

У меня будет очень много! Где то 90!

Какая может быть замена такому варианту. Так как он выглядит убедительней, но работать не хочет.
Код:

${If} $mon == 1
      ${If} $2 == 1
              ${If} $R1 == 1
              StrCpy $freq "60"
              ${EndIf}
              ${If} $R2 == 1
              StrCpy $freq "75"
              ${EndIf}
      ${EndIf}
      {If} $3 == 1
              ${If} $R1 == 1
              StrCpy $freq "65"
              ${EndIf}
              ${If} $R2 == 1
              StrCpy $freq "85"
              ${EndIf}
      ${EndIf}
${ElseIf} $mon == 2
      ${If} $2 == 1
              ${If} $R1 == 1
              StrCpy $freq "55"
              ${EndIf}
              ${If} $R2 == 1
              StrCpy $freq "45"
              ${EndIf}
      ${EndIf}
      ${If} $3 == 1
              ${If} $R1 == 1
              StrCpy $freq "35"
              ${EndIf}
              ${If} $R2 == 1
              StrCpy $freq "25"
              ${EndIf}
      ${EndIf}
${EndIf}


K.A.V. 25-12-2009 02:12 1303754

Цитата:

Цитата KSE
Отписываю.
Я хотел сделать так, чтобы до выбора одного из вариантов кнопка "далее" была неактивна.
После выбора варианта - активировать кнопку "далее". При нажатии кнопки далее осуществлялся переход на ту или иную страницу в зависимости от выбора.
Проблему решил след. образом »

:drug:
я про это и говорил...
Цитата:

Цитата K.A.V.
или я зря тратил своё время? »

В посте №231 я выложил файл (вложение) "CustomDialog.rar" в котором лежит скрипт, написанный мною с использованием метода InstallOptions показа диалогов, вот я просто и понял, что тратил своё время зря

Цитата:

Цитата KSE
такой код может быть проще? »

Если честно, я ещё нигде не использовал конструкции с if, мне StrCmp всегда хватало...

Цитата:

Цитата KSE
У меня будет очень много! Где то 90! »

:o
Ну если бы вы могли объяснить, какая задача перед вами стоит, я возможно бы понял о чем идёт речь...

KSE 25-12-2009 03:53 1303771

Нет не зря. Я очень благодарен. Но в Вашем примере, ув. K.A.V., при нажатии на один из радибуттонов сразу происходит переход на след. страницу

О чем идет речь я объяснить могу, но не хочу вылаживать полностью весь код сюда.
Если можно связаться со мной по асе 3853535, был бы очень признателен так как Ваша не отвечает :)

K.A.V. 25-12-2009 12:39 1303930

Цитата:

Цитата KSE
Если можно связаться со мной по асе 3853535 »

:o
1. А форум для чего?
2. Вы думаете, что у меня столько свободного времени, что я могу каждому персонально выделять время и общаться он-лайн?

Цитата:

Цитата KSE
но не хочу вылаживать полностью весь код сюда. »

Мне зачем весь ваш код, вы скажите, что именно хотите сделать вашими "столбиками", которых будет 90

KSE 25-12-2009 22:17 1304358

Ув. K.A.V., я с Вами полностью согласен.

И так, предыдущая проблема была решена. Как оказалось все оч. просто

Это правильный код:
Код:

${If} $mon == 1
      ${If} $2 == 1
              ${If} $R1 == 1
              StrCpy $freq "60"
              ${EndIf}
              ${If} $R2 == 1
              StrCpy $freq "75"
              ${EndIf}
      ${EndIf}
      {If} $3 == 1
              ${If} $R1 == 1
              StrCpy $freq "65"
              ${EndIf}
              ${If} $R2 == 1
              StrCpy $freq "85"
              ${EndIf}
      ${EndIf}
${ElseIf} $mon == 2
      ${If} $2 == 1
              ${If} $R1 == 1
              StrCpy $freq "55"
              ${EndIf}
              ${If} $R2 == 1
              StrCpy $freq "45"
              ${EndIf}
      ${EndIf}
      ${If} $3 == 1
              ${If} $R1 == 1
              StrCpy $freq "35"
              ${EndIf}
              ${If} $R2 == 1
              StrCpy $freq "25"
              ${EndIf}
      ${EndIf}
${EndIf}

Это неправильный код (моя ошибка была след.):
Код:

${If} $mon == 1
      ${If} $2 == 1
              ${If} $R1 == 1
              StrCpy $freq "60"
              ${EndIf}
              ${If} $R2 == 1
              StrCpy $freq "75"
              ${EndIf}
      {ElseIf} $3 == 1 ; Это делать нельзя!
              ${If} $R1 == 1
              StrCpy $freq "65"
              ${EndIf}
              ${If} $R2 == 1
              StrCpy $freq "85"
              ${EndIf}
      ${EndIf}
${ElseIf} $mon == 2
      ${If} $2 == 1
              ${If} $R1 == 1
              StrCpy $freq "55"
              ${EndIf}
              ${If} $R2 == 1
              StrCpy $freq "45"
              ${EndIf}
      ${EsleIf} $3 == 1  Это делать нельзя!
              ${If} $R1 == 1
              StrCpy $freq "35"
              ${EndIf}
              ${If} $R2 == 1
              StrCpy $freq "25"
              ${EndIf}
      ${EndIf}
${EndIf}

Этого делать нельзя!
${If} $0 == 1
...
${ElseIf} $1 == 1
...
${EndIf}
Можно так
${If} $0 == 1
...
${EndIf}
${If} $1 == 1
...
${EndIf}

${ElseIf} работает только с одной переменной

XCV 28-12-2009 12:34 1306071

помогите пожалуйста решить следующую задачу, надо при установке проверить есть ли рядом с инстолятором reg файл, если есть то импортировать его.
и второе проверить есть ли рядом с инстолятором ini файл, если есть скопировать его в папку с установленной программой (по идее это одна и таже задача)

K.A.V. 28-12-2009 15:26 1306219

Цитата:

Цитата XCV
надо при установке проверить есть ли рядом с инстолятором reg файл, если есть то импортировать его. »

Код:

IfFileExists "$EXEPATH\MyFile.reg" 0 +2
execwait `$WINDIR\regedit.exe /s "$EXEPATH\MyFile.reg"`

Цитата:

Цитата XCV
и второе проверить есть ли рядом с инстолятором ini файл, если есть скопировать его в папку с установленной программой »

Код:

IfFileExists "$EXEPATH\MyFile.ini" 0 +2
copyfiles /silent "$EXEPATH\MyFile.ini" "$INSTDIR"


FuckToAll 07-01-2010 07:26 1313023

как удалить ключь автозагрузки при деинсталяции? например:

Код:

HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Run" "имя проги" "$INSTDIR\прога.exe"
я делал так, но не робит:

Код:

DeleteRegKey HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Run" "имя проги" "$INSTDIR\прога.exe"
в скриптах, которые я ковырял удаляется ветка целеком, например:

Код:

DeleteRegKey HKLM "${PRODUCT_UNINST_KEY}"
но в маём случае полностью сносить Run не надо =) знающие люди хэлпните

K.A.V. 07-01-2010 10:14 1313067

Код:

DeleteRegValue HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Run" "имя проги"

Hector 07-01-2010 20:50 1313520

Есть дистрибутив контры и патч отдельным файлом, решил объединить их при помощи NSIS, но вот проблема: установка не работает, отрабатывает только NSIS, а установочник и патч не запускаются. В чем проблема?
Код:

;имя приложения
!define PRODUCT_NAME "Counter-Strike"

;версия приложения
!define PRODUCT_VERSION "1.6"

; название в панели задач
Name "${PRODUCT_NAME}"
; заголовок окна
Caption "Установка ${PRODUCT_NAME} ${PRODUCT_VERSION}"
; выходной файл
OutFile "cs16full_v35.exe"

;настройка интерфейса
!include "MUI.nsh"
!define MUI_ABORTWARNING
!define MUI_ICON "E:\Program Files\Counter-Strike\cstrike-16.ico"
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "Russian"

VIProductVersion "1.9.9.1"
VIAddVersionKey /LANG=${LANG_RUSSIAN} "ProductName" "Counter-Strike 1.6"
VIAddVersionKey /LANG=${LANG_RUSSIAN} "CompanyName" "GGMC"
VIAddVersionKey /LANG=${LANG_RUSSIAN} "FileDescription" "Установщик Counter-Strike 1.6"

; установка
Section
    SetOutPath "$TEMP\CS"
    file "D:\Home\Нужный  хлам\CS\cs16full_v4+zbot.exe"
    file "D:\Home\Нужный  хлам\CS\cs16patch_full_v35.exe"
    ExecWait "cs16full_v4+zbot.exe /sms"
    SetShellVarContext all
    Delete "$Desktop\Counter Strike 1.6.lnk"
    ExecWait "cs16patch_full_v35.exe"
    RmDir /r "$TEMP\CS"
SectionEnd


hb860 08-01-2010 00:38 1313766

Попробуйте
Код:

ExecWait "$TEMP\CS\cs16full_v4+zbot.exe /sms"
 ExecWait "$TEMP\CS\cs16patch_full_v35.exe"


Hector 08-01-2010 13:38 1314086

Результат тотже

hb860 08-01-2010 13:54 1314103

для cs16full_v4+zbot.exe должно быть
Код:

ExecWait "$TEMP\CS\cs16full_v4+zbot.exe /s /sms"
/s /sms - это ключи инсталлшилда. Прочитайте это: http://www.oszone.net/display.php?id=2766
Для патча не знаю что и предположить. Расскажите про него - чем он упакован?

Hector 08-01-2010 14:11 1314125

/s /sms пойдет тихая установка, но мне нужно указать директорию. Патч по идее NSIS, вывод из скриншота:

hb860 08-01-2010 15:12 1314179

Измените страницы скрипта на такие:
Код:

!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_INSTFILES

и ещё
Код:

...
SetAutoClose false
SectionEnd

И посмотрите, что у вас запускается или не запускается.
NSIS в логе напишет, запускается ли установка вообще.

Hector 08-01-2010 16:30 1314277

Отлично, все заработало

Painkiller 09-01-2010 13:46 1315125

hb860, Здравствуйте! Нужна ваша помощь в NSIS. Делаю инсталяшку для плеера. Хочу наладить ассоциацию файлов с ним. Как мне это сделать ? И плизз не могу допереть с выбором компонентов. То есть при выборе чтобы они копировались в папку программы. Если можно на примерчиках . Заранее спасибо!

hb860 09-01-2010 14:10 1315161

ммм, вот этот примерчик подойдет ? - http://forum.oszone.net/thread-101182.html

Painkiller 09-01-2010 14:24 1315185

Цитата:

Цитата hb860
ммм, вот этот примерчик подойдет ? - http://forum.oszone.net/thread-101182.html »

Я собрал с помощью этого вашего скрипта новую версию AIMP. Но для меня сложноватый скрипт если учесть что я только сегодня начал его изучать. Есть в нем много мелочей , которые я не понимаю с чем они связаны. Мне бы скриптик с выбором компонентов и ассоциацией файлов для начало . Очень хочется научиться !!!

hb860 09-01-2010 16:24 1315306

С выбором компонентов почитайте это.
Регистрация ассоциаций:
Код:

!macro RegisterExtension extenstion
  WriteRegStr HKCR ".${extenstion}" "" "Winamp.File"
   
  WriteRegStr HKCR "Winamp.File" "" "Winamp Media File"
  WriteRegStr HKCR "Winamp.File\DefaultIcon" "" "$INSTDIR\winamp.exe,1"
  WriteRegStr HKLM "Winamp.File\shell" "" "Play"
  WriteRegStr HKLM "Winamp.File\shell\Play" "" "&Play in Winamp"
  WriteRegStr HKCR "Winamp.File\shell\Play\command" "" "$\"$INSTDIR\winamp.exe$\" $\"%1$\""
  WriteRegStr HKCR "Winamp.File\shell\open\command" "" "$\"$INSTDIR\winamp.exe$\" $\"%1$\"" 
  WriteRegStr HKLM "Winamp.File\shell\ListBookmark" "" "Add to Winamp's &Bookmark list"
  WriteRegStr HKLM "Winamp.File\shell\ListBookmark\command" "" "$\"$INSTDIR\winamp.exe$\"/BOOKMARK $\"%1$\""
  WriteRegStr HKLM "Winamp.File\shell\Enqueue" "" "&Enqueue in Winamp"
  WriteRegStr HKLM "Winamp.File\shell\Enqueue\command" "" "$\"$INSTDIR\winamp.exe$\"/ADD $\"%1$\""
!macroend


Section "Программа" SEC01
...
                !insertmacro RegisterExtension MP3
                !insertmacro RegisterExtension MP2
                !insertmacro RegisterExtension MP1
                !insertmacro RegisterExtension OGG
                !insertmacro RegisterExtension WAV
...
SectionEnd


Painkiller 10-01-2010 16:46 1316359

hb860, Ваши уроки очень помогли. Надеюсь они не последние. У меня ещё один вопросик , как шкуру надеть ?

hb860 10-01-2010 20:59 1316586

Цитата:

Цитата Painkiller
Надеюсь они не последние. »

Не последние, обещаю.
Шкуру надеть на инсталлятор ?

Painkiller 11-01-2010 01:40 1316835

Цитата:

Цитата hb860
Шкуру надеть на инсталлятор ? »

Ага. Желательно подробнее. А также буду ждать новых уроков.

hb860 11-01-2010 08:32 1316941

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

K.A.V. 11-01-2010 12:58 1317110

Скачиваем SkinCrafter Plugin, устанавливаем, в функции .onInit прописываем
Код:

NSIS_SkinCrafter::skin /NOUNLOAD "<Полный путь к файлу скина>"
Насчет имени dll могу ошибаться, уже не помню её имя :)
И не забудьте скачать сам скин :) :) :)

Painkiller 11-01-2010 20:25 1317543

K.A.V. ,hb860, почему то у меня не получается.
Если так :
Function .onInit
SetOutPath $TEMP
NSIS_SkinCrafter::skin /NOUNLOAD $TEMP\V-touch.skf
FunctionEnd.

Компилируется но никаких внешних изменений нету.
Если так :

Function .onInit
SetOutPath $TEMP
File /oname=V-touch.skf "V-touch.skf"
NSIS_SkinCrafter_Plugin::skin /NOUNLOAD $TEMP\V-touch.skf
Delete $TEMP\V-touch.skf
FunctionEnd


Выбивает ошибку при компиляции . Что делать? Помогите?

Vsirf 11-01-2010 20:51 1317557

hb860, я никогда не пользовался программой NSIS , но возник такой вопрос: можно ли с помощью NSIS создать Welcom Center ( запуск программ из него , или запуск компонентов панели управления ) для Windows XP , если да , то где можно почитать про команды и компиляцию , у меня есть уже готовый ( разковыряный ) , но что то подобное мне создать никак не удается ? заранее благодарен

K.A.V. 11-01-2010 21:59 1317606

Инструкция по использованию скинов :)

1. Качаем с этой странички "Unicode/ANSI NSIS SkinCrafter Plugin" (если скин не подгружается, попробуйте эту библиотеку), открываем загруженный архив, распаковываем библиотеку "NSIS_SkinCrafter_Plugin.dll" в каталог с плагинами NSIS (\Program Files\NSIS\Plugins)

2. Загружаем какой-либо файл скина из библиотеки

3. Добавляем данный кусок кода в NSIS
Код:

Function .onInit
 SetOutPath $TEMP
 File /oname=TEST.skf "TEST.skf"
 NSIS_SkinCrafter_Plugin::skin /NOUNLOAD "$TEMP\TEST.skf"
FunctionEnd

И не забудьте выгрузить SkinCrafter
Код:

Function .onGUIEnd
            NSIS_SkinCrafter_Plugin::destroy
FunctionEnd

В данном коде предположено, что файл скина "TEST.skf" находится в одной папке с NSIS скриптом
Для того, чтобы скин подгружался и в деинсталляторе, добавьте следующие функции
Код:

Function un.onInit
    SetOutPath $TEMP
    File /oname=TEST.skf "TEST.skf"
    NSIS_SkinCrafter_Plugin::skin /NOUNLOAD "$TEMP\TEST.skf"
FunctionEnd

Function un.onGUIEnd
    NSIS_SkinCrafter_Plugin::destroy
FunctionEnd


P.S.
На некоторых сборках ОС скин может не примениться, т.к. удалены некоторые библиотеки
На момент редактирования поста мной выявлена 1 DLL, без которой скины не подгружаются - mfc71.dll, она должна находиться в директории System32
Если вы не уверены, что данная библиотека присутствует в системе, то добавьте данную библиотеку в пакет инсталлятора и пропишите команду распаковки данной библиотеки в System32 каталог перед тем, как вызовите функцию загрузки скина
Можно конечно обойтись без распаковки библиотеки в системный каталог, для этого поместите mfc71.dll в одну директорию с пакетом инсталлятора



Painkiller, ваши ошибки
читать дальше »

NSIS_SkinCrafter_Plugin::skin /NOUNLOAD $TEMP\V-touch.skf
и ещё 1 ошибка, вы же не распаковали файл скина, после команда "SetOutPath $TEMP" должна быть команда распаковки

hb860 11-01-2010 22:12 1317619

K.A.V., добавил в шапку

Painkiller 12-01-2010 19:12 1318447

hb860, у меня вызывает ошибку при компиляции именно вот эта строчка :
File /oname=V-touch.skf "V-touch.skf"
Вот что пишет об ошибке :
Function: ".onInit"
SetOutPath: "$TEMP"
File: "V-touch.skf" -> no files found.
Usage: File [/nonfatal] [/a] ([/r] [/x filespec [...]] filespec [...] |
/oname=outfile one_file_only)
Error in script "C:\2.nsi" on line 94 -- aborting creation process

А вот мой код :
Function .onInit
SetOutPath $TEMP
File /oname=V-touch.skf "V-touch.skf"
NSIS_SkinCrafter_Plugin::skin /NOUNLOAD "$TEMP\V-touch.skf"
FunctionEnd
Function .onGUIEnd
NSIS_SkinCrafter_Plugin::destroy
FunctionEnd

Habetdin 12-01-2010 19:28 1318465

Painkiller,
Цитата:

Цитата Painkiller
File: "V-touch.skf" -> no files found. »

"Файл не найден." У вас рядом со скриптом нет файла V-touch.skf.. :)

Painkiller 12-01-2010 19:35 1318474

Habetdin , большое спасибо! Вот в чём собака зарыта. Его нужно возле скрипта держать. Вот моя ошибка была сс самого начало. Я же его держал в папке которую я назначил за $TEMP. Но жалко то что скин на семёрке не пашит :(

Painkiller 14-01-2010 00:50 1319630

K.A.V. , странно почему то скин и на чистой xp sp2 не пашит :(

K.A.V. 14-01-2010 13:36 1319938

Попробуйте использовать эту библиотеку
И ещё, в системе должна присутствовать (в System32 каталоге) библиотека mfc71.dll, если её нет, то скин подгружаться не будет

Painkiller 14-01-2010 18:20 1320194

K.A.V. , скин заработал как я подменил на вашу предложенную библиотеку на семёрке, но только один. А остальные видно что просто не поддерживаются. У них классический вид . В System32 библиотека mfc71.dll в семёрке присутствует .
Возможно установщик защитить паролем от распаковки ?

K.A.V. 14-01-2010 19:38 1320273

Цитата:

Цитата Painkiller
Возможно установщик защитить паролем от распаковки ? »

Распаковать NSIS инсталлятор можно с помощью 7-zip, здесь пароль никак не поставить, на сколько мне известно...однако можно поставить запрос пароля, если производится запуск вашего пакета инсталлятора

Painkiller 14-01-2010 21:12 1320376

Цитата:

Цитата K.A.V.
однако можно поставить запрос пароля, если производится запуск вашего пакета инсталлятора »

А можете показать на примере как прикрутить такую финчу ?

K.A.V. 14-01-2010 22:06 1320432

Самый простой пример, это с использованием плагина DialogsEx

Код:

${InputPwdBox} "Заголовок" "Введите пароль" "" "10" "" "" 0
StrCmp $0 "Это пароль" okPass 0
MessageBox MB_ICONSTOP|MB_YESNO "Пароль неверный!!$\r$\nПовторить ввод пароля?" IDYES -2
quit
okPass:

В представленном коде, число 10 соответствует максимально возможному количеству вводимых символов
Число 0, в самом конце первой строчки означает, что введёное пользователем значение следует поместить в переменную $0

Painkiller 15-01-2010 00:00 1320547

Эxх. Побольше бы такой информации и уроков !!!

K.A.V. 15-01-2010 00:34 1320573

Цитата:

Цитата Painkiller
Эxх. Побольше бы такой информации и уроков !!! »

Так кто вам не даёт задавать вопросы :)
Спрашивайте, а мы ответим/поможем на сколько знаний хватит ;)

Painkiller 15-01-2010 01:00 1320595

K.A.V. , я просто не знаю возможностей языка NSIS. Можете хоть описать хоть в вкратце что ещё можно прикрутить к установщику ? Хотя знаю что всё описать не возможно, но из самое интересного?

K.A.V. 15-01-2010 03:42 1320649

У каждого своё понимание "интересного" :)
Много возможностей добавляют плагины для NSIS, например...
Мне проще отвечать на вопросы, чем начинать перечисление :)
Так что, с вас вопрос - с меня ответ, возможно это или нет ;) (здесь ещё необходимо учитывать, что я всего про NSIS не знаю :) )

It4a 15-01-2010 20:45 1321235

Добрый вечер. Совсем недавно наткнулся на Nsis выбирая из программ подобного рода, т.к. стояла задача сделать одним файлом инсталлятор. Есть база размер около 4Gb, много файлов, папок, подпапок и т.д.(так же присутствуют програмы без которых она работать не будет или будет, но некорректно). Ограничение в Nsis не более 2 Gb. Как и что будет ставиться и куда распаковываться я уже понял, т.е. осталось решить совсем чуть-чуть.
а. Как сделать что-бы обойти размер в 2 Gb. если нельзя, то как реализовать по другому
b. Защитить от распаковки и просмотра , вроде как это делает DcryptDll Plugin (на данный момент пытаюсь разобраться)
Мелочи:
с. Как изменить цвет текста в BrandingText /TRIMLEFT "Здесь текст"
d. Как изменить цвет галочек(он всегда зелёный) в SectionGroup
f. Как сделать uninstall с таким же скином как и установщик?
Буду благодарен всем ответившим.

K.A.V. 15-01-2010 21:38 1321271

Цитата:

Цитата It4a
а. Как сделать что-бы обойти размер в 2 Gb »

В голову приходит только 1 мысль, использовать архивы, например 7-ZIP и ZIP
Для распаковки можно использовать плагины. Для 7-ZIP архивов, для ZIP архивов

Цитата:

Цитата It4a
b. Защитить от распаковки и просмотра , вроде как это делает DcryptDll Plugin (на данный момент пытаюсь разобраться) »

Таким вопросом не задавался и с DcryptDll не знакомился, поэтому сказать по данному вопросу ничего не могу :)

Цитата:

Цитата It4a
с. Как изменить цвет текста в BrandingText /TRIMLEFT "Здесь текст" »

Для выполнения данной операции, сначала необходимо подправить файл диалога, обычно это modern.exe (\Program Files\NSIS\Contrib\UIs), необходимо убрать флаг WS_DISABLED с элемента 1028 (сделать это можно с помощьюю программы ResHacker, ресурс 105)
Затем, перед строкой
Код:

!insertmacro MUI_PAGE_WELCOME
добавить
Код:

!define MUI_CUSTOMFUNCTION_GUIINIT myGuiInit
а затем, добавить следующий кусок кода в удобное место в скрипте
Код:

Function myGuiInit
GetDlgItem $0 $HWNDPARENT 1028
SetCtlColors $0 0xFF0000 transparent
FunctionEnd

в указанном коде указать цвет по HEX значению (заменить FF0000, указанный в коде цвет - красный)

Цитата:

Цитата It4a
d. Как изменить цвет галочек(он всегда зелёный) в SectionGroup »

Добавить в код
Код:

!define MUI_COMPONENTSPAGE_CHECKBITMAP "<путь к файлу с галочками>"
а готовые (и есть парочка на выбор) файлы галочек можно взять из каталога "\Program Files\NSIS\Contrib\Graphics\Checks"

Цитата:

Цитата It4a
f. Как сделать uninstall с таким же скином как и установщик? »

мм, простите, забыл про деинсталлятор, необходимо добавить следующие функции
Код:

Function un.onInit
    SetOutPath $TEMP
    File /oname=TEST.skf "TEST.skf"
    NSIS_SkinCrafter_Plugin::skin /NOUNLOAD "$TEMP\TEST.skf"
FunctionEnd

Function un.onGUIEnd
    NSIS_SkinCrafter_Plugin::destroy
FunctionEnd


It4a 16-01-2010 01:19 1321457

Всё получилось, огромное спасибо. Но почему-то деинсталлятор не хочет быть таким как инсталятор, пример который с плагином работает нормуль, а вот у меня не хочет.

Так что бы выбирал пользователь, т.е. буху одно, одному отделу другое и т.д. Соль в том что каждый раз(т.е. 1-2 раз в неделю) устанавливать им это пипец(КАЖДОМУ), а так как все постоянно сносят чего то, то места не хватает, то вирусы, то ещё чего-то. А так будет висеть на сервере общедоступен, клац выбрал, что нужно сиди кури пока ставиться.

K.A.V. 16-01-2010 01:58 1321486

Цитата:

Цитата It4a
работает нормуль, а вот у меня не хочет. »

:lamer: что-то я не понял...
Цитата:

Цитата It4a
Но почему-то деинсталлятор не хочет быть таким как инсталятор »

если это про поддержку скина, то возможно, что у вас ошибка в коде, у меня всё нормально, скин подгружается и в инстале и в деинстале

дальше что вы написали, мне не совсем понятно, суть вопроса...даёте четкий вопрос, получаете четкий ответ ;)

It4a 16-01-2010 02:17 1321497

Цитата:

Цитата K.A.V.
если это про поддержку скина, то возможно, что у вас ошибка в коде, »

ога, было Function .onInit , а правильно Function un.onInit
Так как пишу сам, бывает и ошибаюсь :gulp:
Так ну уже почти всё понятно, вот только осталось немного...как сразу распаковывать, на лету, т.е. из exe файла скомпелированного nsis'ом нужно , что бы сразу распаковывался в С:\Папка, а не переписывался туда архив.7z, распавовывался там , а потом удалялся. Делается это скорее всего каким то ключом, вот тока не могу понять каким.

K.A.V. 16-01-2010 02:49 1321508

да, не читал я документацию на плагин распаковки архивов 7-Zip, неудобный какой-то написали :(
Тогда взамен плагина используйте для распаковки консольную версию архиватора 7-zip, передадите в параметры программы какой архив и в какую папку извлечь ;)

hb860 16-01-2010 23:52 1322173

или 7z sfx, как вариант. Модифицированный модуль вроде переменные окружения поддерживает даже. Его наличие позволило мне отказаться от коммерческого Winrar

eugeny-nn 17-01-2010 15:36 1322642

Добрый день! Ребят, как создать установщик для Adobe Photoshop Elements 8.0 или Adobe Photoshop CS4?? интересует как можно интегрировать серийный ключ продукта.. Может у кого-то есть уже созданные скрипты на основе программ Adobe Photoshop Elements 8.0 или Adobe Photoshop CS4??

It4a 17-01-2010 21:31 1322980

Цитата:

Цитата K.A.V.
да, не читал я документацию на плагин распаковки архивов 7-Zip, неудобный какой-то написали »

Цитата:

File "ArchiveName.7z"
Nsis7z::Extract "ArchiveName.7z"
Delete "$OUTDIR/ArchiveName.7z"
Засунуть архив.7z в инсталятор(в *.exe), который в свою очередь распакует *.7z в указанное место оттуда извлечёт файлы из архива и *.7z удалит. Не толковый плагин какой-то.
Цитата:

Цитата hb860
или 7z sfx, как вариант. »

Спасибо прочёл, на будущее буду иметь ввиду.
Подскажите в чём может быть причина RMDir /r $INSTDIR не удаляет папку в которую ставится программа, т.е.
С:\Папка, так и остаётся на диске С:\ после деинсталяции.

Спасибо огромное! Только что всё закончил, правда сыровато, не красиво так как хотелось бы, но главное получилось, осталось за малым.

Habetdin 17-01-2010 21:34 1322981

It4a,
Цитата:

Цитата It4a
Подскажите в чём может быть причина »

Файлы в папке используются системой или какой-либо программой

eugeny-nn, Автоматическая установка Adobe Photoshop CS4

It4a 20-01-2010 03:10 1324787

Подскажите в чём может быть причина RMDir /r $INSTDIR не удаляет папку в которую ставится программа, т.е.
С:\Папка, так и остаётся на диске С:\ после деинсталяции.
Цитата:

Цитата Habetdin
Файлы в папке используются системой или какой-либо программой »

Там только uninstall.exe , ну да ладно пёс с этим, есть более насущая проблемма при
CreateDirectory "$SMPROGRAMS\Dir" создаёт в C:\Documents and Settings\Имя пользователя\ папку ├ыртэюх ьхэ■ в ней ╧ЁюуЁрьь√ и только там Dir, а там где нужно(т.е. C:\Documents and Settings\Имя пользователя\Главное меню\Программы - нет.) . Я так понимаю - это проблема с кодировкой, но появилась она после использования 7z плагина, если отключить секцию отвечающую за распаковку, тогда всё норм, но уже поздно, т.к. всё везде настроенно и переделывать я уже чего то просто не в состоянии. Есть у кого какие идеи.

K.A.V. 20-01-2010 14:58 1325137

Цитата:

Цитата It4a
но появилась она после использования 7z плагина »

Что за плагин? Это который здесь?

It4a 21-01-2010 02:15 1325635

Цитата:

Цитата K.A.V.
Что за плагин? Это который здесь? »

Да именно он. Очень хочется довести до ума, но чего то я не понимаю.
Цитата:

Вопрос снят, т.к. создание, ярлыков, директорий в меню пуск, должно быть вынесено в отдельную секцию, стоящей перед секцией с распаковкой.
Да и ещё хочу обратить ваше внимание на то что 95% возникающих ошибок из-за невнимательности.

K.A.V. 21-01-2010 03:06 1325658

Плагин вдвойне неудачный...
Как выход из ситуации, прописывайте распаковку после создания директорий :)

Painkiller 21-01-2010 03:56 1325671

K.A.V. , подскажите как заменить картинку в установщике сбоку и сверху ?

K.A.V. 21-01-2010 04:39 1325679

Сверху
Код:

!define MUI_HEADERIMAGE
!define MUI_HEADERIMAGE_BITMAP "C:\Program Files\NSIS\Contrib\Graphics\Header\orange-uninstall-nsis.bmp"

Слева
Код:

!define MUI_WELCOMEFINISHPAGE_BITMAP "C:\Program Files\NSIS\Contrib\Graphics\Wizard\orange-uninstall.bmp"

dracosha 21-01-2010 10:31 1325822

Цитата:

Цитата K.A.V.
Один компонент для установки
читать дальше » »

У меня тоже возник этот вопрос... В первом случае у меня стоит птичка на одном из компонентов без возможности ее снятия, а во втором случае хочу что бы можно было птичку снять или хотя бы что бы изначально птичка не стояла...
читать дальше »
Код:

!include "MUI.nsh"
!include "Sections.nsh"

Name "One Section"
OutFile "one-section_test.exe"
RequestExecutionLevel user

!insertmacro MUI_PAGE_COMPONENTS

SectionGroup "Group 1"

        Section "Option 1" g1o1
        SectionEnd

        Section /o "Option 2" g1o2
        SectionEnd

        Section /o "Option 3" g1o3
        SectionEnd

SectionGroupEnd

SectionGroup "Group 2"

        Section /o "Option 1" g2o1
        SectionEnd

        Section /o "Option 2" g2o2
        SectionEnd

        Section /o "Option 3" g2o3
        SectionEnd

SectionGroupEnd

Function .onInit

  StrCpy $1 ${g1o1}
  StrCpy $2 ${g2o1}

FunctionEnd


Function .onSelChange

  !insertmacro StartRadioButtons $1
    !insertmacro RadioButton ${g1o1}
    !insertmacro RadioButton ${g1o2}
    !insertmacro RadioButton ${g1o3}
  !insertmacro EndRadioButtons
       
  !insertmacro StartRadioButtons $2
    !insertmacro RadioButton ${g2o1}
    !insertmacro RadioButton ${g2o2}
    !insertmacro RadioButton ${g2o3}
  !insertmacro EndRadioButtons
       
FunctionEnd



Если закоментировать StrCpy $2 ${g2o1} то происходит какой-то безпредел с 1-й группой компонентов... Я так понимаю что вот это: StrCpy $2 ${g2o1} заставляет ставить галку при первом действии мышкой в любой секции, даже если установлен параметр /o на всех компонентах.
Что делать? Ума не приложу.
Должно же быть что-то подобное этому StrCpy $2 ${g2o1} но только что бы не включало, а наоборот отключало

K.A.V., Помогите плиз

K.A.V. 21-01-2010 11:55 1325899

Цитата:

Цитата dracosha
В первом случае у меня стоит птичка на одном из компонентов без возможности ее снятия »

Это вопрос? Если да, то для того, чтобы сделать секцию не активной для изменения, необходимо в секцию добавить команду
Код:

SectionIn RO
честно говоря, я не совсем понял что именно вы хотите...про первый случай я написал, а про второй не совсем понятно, ведь по умолчанию так и есть
Цитата:

Цитата dracosha
птичку снять или хотя бы что бы изначально птичка не стояла »


dracosha 21-01-2010 12:11 1325909

В первом случае меня все полностью устраивает.

А во втором случае мне нужно что бы по умолчанию ни на одном компоненте не стояла галка...
Да. На первый взгляд все вроде в порядке, но все остается в порядке пока не начинаешь выбирать компоненты мышкой... Даже если не трогать компоненты во второй группе, а выбирать компоненты только в первой, то автоматом во второй группе ставится галка.
А я хочу что бы вторая группа оставалась без изменений.
K.A.V., Вы сможете меня понять когда скомпилите этот скрипт который я выложил... Этот скрипт - простой пример и ничего не потребует при компиляции.

И вот еще одну не совсем понятную вещицу нашел.
Если мышкой нажать на квадратик группы (именно на квадратик группы а не копонента) то выбирается 2 компонента из трех, хотя должен выбираться только один.

K.A.V. 21-01-2010 13:06 1325946

Попробуйте удалить:
Код:

StrCpy $1 ${g1o1}
StrCpy $2 ${g2o1}

а вообще, в каждой группе просто должен быть по умолчанию отмечен хотя бы 1 компонент для установки

Цитата:

Цитата dracosha
Если мышкой нажать на квадратик группы (именно на квадратик группы а не копонента) то выбирается 2 компонента из трех, хотя должен выбираться только один. »

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

dracosha 21-01-2010 13:41 1325979

Цитата:

Цитата K.A.V.
Попробуйте удалить: »

Это я уже несколько раз пробовал :(
Цитата:

Цитата K.A.V.
а вообще, в каждой группе просто должен быть по умолчанию отмечен хотя бы 1 компонент для установки »

Почему должен? Это по правилам так должно быть? Или это глюк nsis?
Цитата:

Цитата K.A.V.
Так и должно быть, при отметки группы, помечаются все компоненты, которые находятся в данной группе »

Но эти компоненты выбираются один из трех. Даже если так и должно быть, то по-моему это не правильно.
Народ! Пожалуйста! Помогите решить эти проблемки:
1. тут
2. тут

NoName01.cpp 21-01-2010 15:04 1326060

Здраствуйте, я только начал изнучать NSIS. У меня два вопроса:

1. Как сделать выбор языка перед установкой?
2. Как сделать разное описание секций для разных языков?

Заранее спасибо!

dracosha 21-01-2010 16:25 1326146

Цитата:

Цитата NoName01.cpp
Здраствуйте, я только начал изнучать NSIS. У меня два вопроса: »

У меня такая же ситуация.
NoName01.cpp, если вдруг узнаешь ответ на свой вопрос, отпишись тут пожалуйста.

K.A.V. 21-01-2010 18:02 1326238

dracosha, не знаю, может это и глюк NSIS...
Если секций не много, то думаю, что можно организовать ручную проверку, т.е. самому прописать команды на снятие/отметку галочек с секций, с использованием команд SectionGetFlags и SectionSetFlags :)

Цитата:

Цитата NoName01.cpp
1. Как сделать выбор языка перед установкой? »

В начале кода добавить
читать дальше »

Код:

  !insertmacro MUI_LANGUAGE "Russian" ;первый язык - язык по умолчанию
  !insertmacro MUI_LANGUAGE "English"
 !insertmacro MUI_RESERVEFILE_LANGDLL



Добавить в функцию OnInit (данный макрос вызовет диалог выбора языка)
читать дальше »

Код:

  !insertmacro MUI_LANGDLL_DISPLAY


Цитата:

Цитата NoName01.cpp
2. Как сделать разное описание секций для разных языков? »

читать дальше »

Код:

LangString NameSec1 ${LANG_Russian} "Имя 1 секции на русском"
 LangString NameSec2 ${LANG_Russian} "Имя 2 секции на русском"
 LangString NameSec3 ${LANG_Russian} "Имя 3 секции на русском"
 
 LangString NameSec1 ${LANG_ENGLISH} "Имя 1 секции на английском"
 LangString NameSec2 ${LANG_ENGLISH} "Имя 2 секции на английском"
 LangString NameSec3 ${LANG_ENGLISH} "Имя 3 секции на английском"


Секции
Код:

Section /o $(NameSec1) section1
SectionEnd

Section /o $(NameSec2) section2
SectionEnd

Section /o $(NameSec3) section3
SectionEnd



P.S.
Новичкам очень рекомендую заглянуть в каталог "\Program Files\NSIS\Examples", там много разных примеров ;)

dracosha 21-01-2010 21:32 1326376

Цитата:

Цитата K.A.V.
dracosha, не знаю, может это и глюк NSIS...
Если секций не много, то думаю, что можно организовать ручную проверку, т.е. самому прописать команды на снятие/отметку галочек с секций, с использованием команд SectionGetFlags и SectionSetFlags »

А можно какой нить пример что бы было понятно как и где эти команды применить?

Секций на самом деле много... Примерно около 100-120. И это еще не предел...
Но компонентов которые подлежат выбору один из 2 или более будет примерно около пяти-семи точно не помню.
Я Вас еще буду мучать что бы Вы мне помогли разобраться с добавлением окон :blush2: и при этом буду просить что бы Вы мне помогли нарисовать или изменить положение деталей в этих окнах :blush2:
Цитата:

Цитата K.A.V.
В начале кода добавить »

Что нужно сделать что бы язык по умалчанию был как в ОС... А если ОС на каком-то другом языке, который не поддерживается скриптом nsis то автоматом выбирался английский?

K.A.V. 21-01-2010 22:52 1326443

Цитата:

Цитата dracosha
А можно какой нить пример что бы было понятно как и где эти команды применить? »

В файле справки всё написано, в "указатель" введите слово "SectionGetFlags" и примерчики там будут.
читать дальше »
Код:

Section /o "test1" section1
SectionEnd

Section /o "test2" section2
SectionEnd

Section /o "test3" section3
SectionEnd

 Function .onSelChange
  SectionGetFlags ${section1} $1
  SectionGetFlags ${section2} $2
  SectionGetFlags ${section3} $3
StrCmp $1 "1" 0 N1
  SectionGetFlags ${section2} $0
  IntOp $0 $0 & ${SECTION_OFF}
  SectionSetFlags ${section2} $0
  SectionGetFlags ${section3} $0
  IntOp $0 $0 & ${SECTION_OFF}
  SectionSetFlags ${section3} $0
N1:
 
StrCmp $2 "1" 0 N2
  SectionGetFlags ${section1} $0
  IntOp $0 $0 & ${SECTION_OFF}
  SectionSetFlags ${section1} $0
  SectionGetFlags ${section3} $0
  IntOp $0 $0 & ${SECTION_OFF}
  SectionSetFlags ${section3} $0
N2:

StrCmp $3 "1" 0 N3
  SectionGetFlags ${section1} $0
  IntOp $0 $0 & ${SECTION_OFF}
  SectionSetFlags ${section1} $0
  SectionGetFlags ${section2} $0
  IntOp $0 $0 & ${SECTION_OFF}
  SectionSetFlags ${section2} $0
N3:
 FunctionEnd




Цитата:

Цитата dracosha
Что нужно сделать что бы язык по умалчанию был как в ОС... »

NSIS так и поступает, если вы добавили в установщик язык, который используется в ОС основным, то данный язык и устанавливается на выбор :)

Цитата:

Цитата dracosha
А если ОС на каком-то другом языке, который не поддерживается скриптом nsis то автоматом выбирался английский? »

В OnInit функции, перед
Код:

!insertmacro MUI_LANGDLL_DISPLAY
добавить
Код:

strcpy $LANGUAGE "1033"
Цитата:

Цитата dracosha
Я Вас еще буду мучать что бы Вы мне помогли разобраться с добавлением окон и при этом буду просить что бы Вы мне помогли нарисовать или изменить положение деталей в этих окнах »

Ну я сейчас занят своим проектом, так что врядли я смогу тратить на вас много своего времени, тем более что нужно писать практически готовый код...

dracosha 21-01-2010 23:16 1326459

Цитата:

Цитата K.A.V.
Ну я сейчас занят своим проектом, так что врядли я смогу тратить на вас много своего времени, тем более что нужно писать практически готовый код... »

Ну тогда буду надеятся на помощь других форумчан, а там глядишь и hb860 поможет :)

hb860 21-01-2010 23:34 1326477

Цитата:

Цитата NoName01.cpp
1. Как сделать выбор языка перед установкой? »

Уважаемый мной KAV на это ответил
Цитата:

Цитата dracosha
Я Вас еще буду мучать что бы Вы мне помогли разобраться с добавлением окон »

Я четвертый день не успеваю дописать статью, я про это пишу как раз сейчас. С Английским у вас как ? Если хоть чуть-чуть знаете - читайте file:///C:/Program%20Files/NSIS/Docs/nsDialogs/Readme.html Там по шагам.
Цитата:

Цитата K.A.V.
NSIS так и поступает, если вы добавили в установщик язык, который используется в ОС основным, то данный язык и устанавливается на выбор »

У меня почему то по умолчанию английский выбирается на русской системе. Я перепроверю.

Цитата:

Цитата dracosha
Почему должен? Это по правилам так должно быть? Или это глюк nsis? »

Такие ограничения. Галка должна стоять

K.A.V. 21-01-2010 23:45 1326484

Цитата:

Цитата hb860
У меня почему то по умолчанию английский выбирается на русской системе. Я перепроверю. »

В функции onInit, перед
Код:

!insertmacro MUI_LANGDLL_DISPLAY
пропиши
Код:

strcpy $LANGUAGE "1049"
Если не хочешь так кардинально, то сначала прочитай значение параметра sCountry в ветке
Код:

HKEY_USERS\.DEFAULT\Control Panel\International
и если значение не "Россия", то просто пропускай назначение переменной $LANGUAGE ;)

Готовый код:
Код:

Function .onInit
ReadRegStr $0 HKU ".DEFAULT\Control Panel\International" "sCountry"
StrCmp $0 "Россия" 0 +2
strcpy $LANGUAGE "1049"
!insertmacro MUI_LANGDLL_DISPLAY
functionEnd

:)

hb860 21-01-2010 23:59 1326498

Цитата:

Цитата K.A.V.
HKEY_USERS\.DEFAULT\Control Panel\International »

я полагаю, лучше HKEY_CURRENT_USER\Control Panel\International\locale
Я не ставлю задачу выбрать язык. Я просто отписался, что автоматом не выбирается. Вот на это:
Цитата:

Цитата hb860
NSIS так и поступает, »

Не поступает он так

K.A.V. 22-01-2010 00:13 1326514

Цитата:

Цитата hb860
Я не ставлю задачу выбрать язык. »

И я :)

Цитата:

Цитата hb860
Не поступает он так »

Я не спорю, если наверняка не уверен, я так написал, потому что у меня при любом расположении строки
Код:

  !insertmacro MUI_LANGUAGE "Russian"
всегда по умолчанию выбирается русский язык, хоть и строчка эта находится и в середине/в конце/где угодно списка языков
;)

Painkiller 22-01-2010 17:27 1327106

K.A.V. ,hb860 , у меня такой вопрос. Можно ли сделать чтобы в названии секции было ещё и количество компонентов входящих в эту секцию ???

K.A.V. 22-01-2010 17:35 1327119

Цитата:

Цитата Painkiller
K.A.V. ,hb860 , у меня такой вопрос. Можно ли сделать чтобы в названии секции было ещё и количество компонентов входящих в эту секцию ??? »

Что-то не понятно...а прописать самому никак?

Может пригодится:
читать дальше »
Код:

Section /o "test1" section1
SectionEnd

Читаем имя секции, затем к имени секции добавляем путь к каталогу Windows

       
Код:

       
  SectionGetText ${section1} $0
  StrCpy $0 "$0 - $WINDIR"
  SectionSetText ${section1} $0




NoName01.cpp 22-01-2010 18:19 1327160

Здраствуйте, мой инсталлятор ставит 3 программы, то есть у меня 3 секции, которые ставят 3 разных деинсталлятора для каждой программы. Что-то типа такого:

Section "Sec1" Sec1
...
WriteUninstaller "$INSTDIR\Sec1\uninstall.exe"
SectionEnd

Section "Sec2" Sec2
...
WriteUninstaller "$INSTDIR\Sec2\uninstall.exe"
SectionEnd

Section "Sec2" Sec2
...
WriteUninstaller "$INSTDIR\Sec2\uninstall.exe"
SectionEnd

Как мне прописать что должен делать каждый из 3 деинсталляторов?
И куда поместить код, который будет выполнятся в любом случае, независимо от того какую программу выбрал юзер?
Заранее благодарю)

K.A.V. 22-01-2010 18:27 1327168

Цитата:

Цитата NoName01.cpp
Как мне прописать что должен делать каждый из 3 деинсталляторов? »

:o прикольно
Вообще, когда вы создаёте инсталляционный пакет, то принято считать, что вы делаете инсталлятор для 1-ой программы, и деинсталлятор расчитан на 1 программу :)

Цитата:

Цитата NoName01.cpp
И куда поместить код, который будет выполнятся в любом случае, независимо от того какую программу выбрал юзер? »

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

NoName01.cpp 22-01-2010 18:46 1327181

Цитата:

Цитата K.A.V.
Вообще, когда вы создаёте инсталляционный пакет, то принято считать, что вы делаете инсталлятор для 1-ой программы, и деинсталлятор расчитан на 1 программу »

Может тогда можна сделать деинсталлятор с 3 секциями?

Цитата:

Цитата K.A.V.
Вот здесь не понятно, вы хотите, чтобы вне зависимости от того, какой из деинсталляторов запущен, выполнялись одни и те же действия? »

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

K.A.V. 22-01-2010 19:04 1327194

Посмотрите, может это то, что вам нужно :)
читать дальше »

Код:

Section "Sec1" Sec1
...
WriteUninstaller "$INSTDIR\Sec1\uninstall.exe"
SectionEnd

Section "Sec2" Sec2
...
WriteUninstaller "$INSTDIR\Sec2\uninstall.exe"
SectionEnd

Section "Sec3" Sec3
...
WriteUninstaller "$INSTDIR\Sec3\uninstall.exe"
SectionEnd



!include "FileFunc.nsh"
Section Uninstall
${GetParent} "$EXEPATH" $R0
StrCmp $R0 "$INSTDIR\Sec1" 0 +2
call UnInstall_SEC1

StrCmp $R0 "$INSTDIR\Sec2" 0 +2
call UnInstall_SEC2

StrCmp $R0 "$INSTDIR\Sec3" 0 +2
call UnInstall_SEC3

  SetAutoClose true
SectionEnd


Function UnInstall_SEC1
...
FunctionEnd

Function UnInstall_SEC2
...
FunctionEnd

Function UnInstall_SEC3
...
FunctionEnd

*Команда ${GetParent} помещает в переменную $R0 путь к запущенному деинсталлятору

hb860 22-01-2010 19:19 1327201

Цитата:

Цитата NoName01.cpp
Может тогда можна сделать деинсталлятор с 3 секциями? »

Легко.
Код:

Section Uninstall secidx01
  SectionIn 1 RO
  DeleteRegKey HKLM "Software\Mail.Ru\Agent"

  RMDir /r "$INSTDIR"

  SetShellVarContext all
  RMDir /r "$SMPROGRAMS\Mail.ru"
  Delete "$Desktop\${PRODUCT_NAME}.lnk"       
  DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
  SetAutoClose true
SectionEnd


Section "Un.Удалить папку данных"
    SectionIn 1
        SetShellVarContext current
        RMDir /r "$APPDATA\Mra\"
SectionEnd

Section "Un.Удалить настройки реестра"
  SectionIn 1
  SetShellVarContext current
  DeleteRegKey HKCU "Software\Mail.Ru\Agent"
SectionEnd


Function un.onInit
        SectionSetText ${secidx01} "Удалить приложение"
FunctionEnd

Можете ещё вот это почитать

hb860 22-01-2010 22:45 1327310

Цитата:

Цитата NoName01.cpp
Я имел ввиду куда поместить код инсталлятора, который будет выполнятся в любом случае, независимо от того какую секцию выбрал юзер. »

Поместите эту секцию после ВСЕХ ОСТАЛЬНЫХ, перед секцией Uninstall
HTML код:

Section "-post"
...поместите сюда нужный вам код, он будет выполняться ВСЕГДА
SectionEnd


hb860 22-01-2010 23:38 1327355

Цитата:

Цитата dracosha
Я Вас еще буду мучать что бы Вы мне помогли разобраться с добавлением окон и при этом буду просить что бы Вы мне помогли нарисовать или изменить положение деталей в этих окнах »

Я закончил статью, NSIS. NSIS. Создаем собственные страницы инсталлятора. Я надеюсь, этот материал поможет кому-то.
dracosha, задавайте вопросы. Слушаем.

Уважаемые модераторы, попрошу не рассматривать мои публикации как рекламу ресурса. В случае необходимости, я готов перепостить информацию на сайт Oszone или даже прямо в этот форум. Просто сообщите мне об этом, я и учту все рекомендации

Painkiller 23-01-2010 02:59 1327464

K.A.V. ,hb860 , изменю свой вопрос. Как сделать чтобы в названии секции с компонентами было указано ещё и количество выбранных компонентов?

K.A.V. 23-01-2010 03:30 1327478

Цитата:

Цитата Painkiller
K.A.V. ,hb860 , изменю свой вопрос. Как сделать чтобы в названии секции с компонентами было указано ещё и количество выбранных компонентов? »

В функции onSelChange прописать команды на перечисление статусов секций командами SectionGetFlags, в самом конце прописываем команду SectionSetText, где указываем количество подсчитанных отмеченных секций :)
Если не понятно, объянснил, то могу код сделать :)
Сейчас сделаю ;)

:)
читать дальше »
Код:

SubSection /e "Компоненты для установки" subSec
Section /o "test1" section1
SectionEnd

Section /o "test2" section2
SectionEnd

Section /o "test3" section3
SectionEnd

Section /o "test4" section4
SectionEnd

Section /o "test5" section5

SectionEnd
Section /o "test6" section6

SectionEnd
SubSectionEnd


 Function .onSelChange
 Strcpy $0 0
  SectionGetFlags ${section1} $1
StrCmp $1 "1" 0 +2
IntOp $0 $0 + 1

  SectionGetFlags ${section2} $1
StrCmp $1 "1" 0 +2
IntOp $0 $0 + 1

  SectionGetFlags ${section3} $1
StrCmp $1 "1" 0 +2
IntOp $0 $0 + 1

  SectionGetFlags ${section4} $1
StrCmp $1 "1" 0 +2
IntOp $0 $0 + 1

  SectionGetFlags ${section5} $1
StrCmp $1 "1" 0 +2
IntOp $0 $0 + 1

  SectionGetFlags ${section6} $1
StrCmp $1 "1" 0 +2
IntOp $0 $0 + 1

  SectionSetText ${subSec} "Компоненты для установки (Выбрано $0)"
 FunctionEnd


dracosha 23-01-2010 15:11 1327723

Вот еще возникло 3 вопроса...

Вопрос 1
Вобщем есть страничка лицензии
!insertmacro MUI_PAGE_LICENSE "files\LicenseRU.rtf"
а у меня еще есть файл лицензии LicenseEN.rtf
И если пользователь выбрал аннглийский язык, то мне очень хотелось бы чтоб ему отобразился текст из LicenseEN.rtf

Вопрос 2
Получается что какой бы язык пользователь не выбрал при инсталяции, в любом случае будет копировться файлик с русским языком... И если этот файлик копируется то при запуске прога будет запускаться на русском языке. Как бы сделать так что бы при выборе русского языка копировался файл с русским языком, а при выборе английского языка чтоб ничего не копировалось?

Вопрос 3
В скрипт добавил вот такую функцию: (зы взял код отсюда )
Код:

Function .onInit
SetOutPath $TEMP
File /oname=spl.bmp "files\splash.bmp"
advsplash::show 1500 2500 250 -1 $TEMP\spl
Pop $0
Delete $TEMP\spl.bmp
FunctionEnd

Вобщем можно ли сделать заставку что бы отображались картинки с прозрачностью? Например png-шки

Дайте плиз примерчики на это дело.

Цитата:

Цитата hb860
dracosha, задавайте вопросы. Слушаем. »

Уважаемый hb860, мне очень помогли Ваши практические примеры... Особенно 3 первых примера...
К сожалению в 4-м примере для меня все оказалось очень сложно. Наверное потаму что я не знаю ниодного языка програмирования...
Я очень хочу изменить страничку !insertmacro MUI_PAGE_COMPONENTS
И хочу что бы она выглядела вот так:

Если Вас не затруднит помогите мне пожалуйста с этим.
И ко всему этому я хочу добавить еще одну точно такую же страничку но на ней уже будут не компоненты а настройки. Правда там точно так же будут копироваться файлы как и в компонентах. Т.е. пользователь поставил птичку значит копироваться, нет значит не копироваться.

Если у Вас возникло сомнение или вопрос зачем еще одно такое же окно если там тоже будут копироваться файлы...
Дело в том что настройки - это инифайлы, которые при запуске проги автоматически будут удаляться... А точнее прога при первом запуске подхватит все настройки которые прописаны в ини и сразу же их удалит.

NoName01.cpp 23-01-2010 19:37 1327965

Здраствуйте, K.A.V. Я задавал вопрос о трех деинсталляторах. Вы мне предложили следущий код:
читать дальше »
Section "Sec1" Sec1
...
WriteUninstaller "$INSTDIR\Sec1\uninstall.exe"
SectionEnd

Section "Sec2" Sec2
...
WriteUninstaller "$INSTDIR\Sec2\uninstall.exe"
SectionEnd

Section "Sec3" Sec3
...
WriteUninstaller "$INSTDIR\Sec3\uninstall.exe"
SectionEnd



!include "FileFunc.nsh"
Section Uninstall
${GetParent} "$EXEPATH" $R0
StrCmp $R0 "$INSTDIR\Sec1" 0 +2
call UnInstall_SEC1

StrCmp $R0 "$INSTDIR\Sec2" 0 +2
call UnInstall_SEC2

StrCmp $R0 "$INSTDIR\Sec3" 0 +2
call UnInstall_SEC3

SetAutoClose true
SectionEnd


Function UnInstall_SEC1
...
FunctionEnd

Function UnInstall_SEC2
...
FunctionEnd

Function UnInstall_SEC3
...
FunctionEnd

Но 3 последних функции не вызываются.
Проверил значение $EXEPATH. Там совсем не тот путь: C:\Users\836D~1\AppData\Local\Temp\~nsu.tmp
То есть условие не срабатывает((((

K.A.V. 23-01-2010 23:14 1328136

Цитата:

Цитата dracosha
Вопрос 1
Вобщем есть страничка лицензии
!insertmacro MUI_PAGE_LICENSE "files\LicenseRU.rtf"
а у меня еще есть файл лицензии LicenseEN.rtf
И если пользователь выбрал аннглийский язык, то мне очень хотелось бы чтоб ему отобразился текст из LicenseEN.rtf

читать дальше »
Код:

!insertmacro MUI_PAGE_WELCOME
Page license
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH

  !insertmacro MUI_LANGUAGE "Russian"
  !insertmacro MUI_LANGUAGE "English"

LicenseLangString myLicenseData ${LANG_ENGLISH} "English_license_file.txt"
LicenseLangString myLicenseData ${LANG_RUSSIAN} "Russian_license_file.txt"
LicenseData $(myLicenseData)




Цитата:

Цитата dracosha
Вопрос 2
Получается что какой бы язык пользователь не выбрал при инсталяции, в любом случае будет копировться файлик с русским языком... И если этот файлик копируется то при запуске прога будет запускаться на русском языке. Как бы сделать так что бы при выборе русского языка копировался файл с русским языком, а при выборе английского языка чтоб ничего не копировалось?

читать дальше »

Про какой файл идёт речь? Про любой?
Вот пример команды копирования файла, копирование происходит, если пользователь выбрал русский язык
Код:

StrCmp $Language "1049" 0 +2
CopyFiles "$Windir\test.exe" "$Temp"




Цитата:

Цитата dracosha
Вобщем можно ли сделать заставку что бы отображались картинки с прозрачностью? Например png-шки

Не получится, тип файла это дело плагина, возможны только BMP файлы, да и прозрачность там такая что...
В коде вашего примера, за прозрачный цвет отвечает 4-ый параметр, т.е. -1, необходимо заменить "-1" на HEX значение прозрачного цвета, например, при указании 0xFFFFFF, за прозрачный цвет будет белый


Цитата:

Цитата dracosha
Я очень хочу изменить страничку !insertmacro MUI_PAGE_COMPONENTS

Необходимо с помощью редактора ресурсов (напр. ResHacker) изменить ресурс 104 в файле MUI диалогов (обычно это \Program Files\NSIS\Contrib\UIs\modern.exe)


Цитата:

Цитата dracosha
И ко всему этому я хочу добавить еще одну точно такую же страничку но на ней уже будут не компоненты а настройки

Таким вопросом не задавался, да и нужды не было, в двух страничках с компонентами :)
А сам скрипт вам не позволит две разные COMPONENTS странички, если вы пропишите дважды данную команду, у вас просто продублируется данный диалог...
С группами и галочками (но без описания) можно сделать такой диалог при помощи плагина EmbeddedLists


Цитата:

Цитата NoName01.cpp
Здраствуйте, K.A.V. Я задавал вопрос о трех деинсталляторах. Вы мне предложили следущий код:
...
Но 3 последних функции не вызываются.
Проверил значение $EXEPATH. Там совсем не тот путь: C:\Users\836D~1\AppData\Local\Temp\~nsu.tmp
То есть условие не срабатывает((((

Простите, ошибся, не тестировал и написал "на скорую руку"
Правильно будет так:
читать дальше »

Код:

Section "Sec1" Sec1
#...
Strcpy $R9 $INSTDIR
strcpy $INSTDIR "$INSTDIR\Sec1"
WriteUninstaller "$INSTDIR\uninstall.exe"
strcpy $INSTDIR "$R9"
SectionEnd

Section "Sec3" Sec2
#...
Strcpy $R9 $INSTDIR
strcpy $INSTDIR "$INSTDIR\Sec2"
WriteUninstaller "$INSTDIR\uninstall.exe"
strcpy $INSTDIR "$R9"
SectionEnd

Section "Sec3" Sec3
#...
Strcpy $R9 $INSTDIR
strcpy $INSTDIR "$INSTDIR\Sec3"
WriteUninstaller "$INSTDIR\uninstall.exe"
strcpy $INSTDIR "$R9"
SectionEnd


Section Uninstall
${GetParent} "$INSTDIR\uninstall.exe" $R0
${GetParent} "$R0" $R0

StrCmp $INSTDIR "$R0\Sec1" 0 +2
call un.UnInstall_SEC1

StrCmp $INSTDIR "$R0\Sec2" 0 +2
call un.UnInstall_SEC2

StrCmp $INSTDIR "$R0\Sec3" 0 +2
call un.UnInstall_SEC3

  SetAutoClose true
SectionEnd


Function un.UnInstall_SEC1
#...
FunctionEnd

Function un.UnInstall_SEC2
#...
FunctionEnd

Function un.UnInstall_SEC3
#...
FunctionEnd

Я хотел бы объяснить код, т.к. первый раз сталкиваюсь с созданием 3-х Деинсталляторов :)
После тестов, было выяснено, что невозможно вычислить директорию, где расположен файл деинсталлятора, только с помощью переменной $INSTDIR, поэтому, в секциях установки, мы сначала сохраняем значение переменной в переменную $R9, назначаем переменной $INSTDIR путь расположения компонента, создаём деинсталлятор с изменённой переменной (это очень важно), после создания деинсталлятора восстанавливаем значение переменной $INSTDIR

dracosha 24-01-2010 01:39 1328230

Цитата:

Цитата K.A.V.
Про какой файл идёт речь? Про любой?
Вот пример команды копирования файла, копирование происходит, если пользователь выбрал русский язык
Код:
StrCmp $Language "1049" 0 +2
CopyFiles "$Windir\test.exe" "$Temp" »

Я так понимаю этот код я должен был засунуть в функции?
Если так то меня все таки это немного не устраивает... Дело в том что файл копируется еще до выбора папки куда устанавливать прогу (копируется конешно же в указанную папку по умолчанию).
Может есть какое-то другое решение?
Цитата:

Цитата K.A.V.
Необходимо с помощью редактора ресурсов (напр. ResHacker) изменить ресурс 104 в файле MUI диалогов (обычно это \Program Files\NSIS\Contrib\UIs\modern.exe) »

Спасибо большое... Даже и не представлял что эти окна лежат где-то в ресурсах.

K.A.V. 24-01-2010 01:50 1328234

Цитата:

Цитата dracosha
Если так то меня все таки это немного не устраивает... Дело в том что файл копируется еще до выбора папки куда устанавливать прогу (копируется конешно же в указанную папку по умолчанию).
Может есть какое-то другое решение? »

Я честно сказать, не могу понять вашу цель, вашу задачу, объясните грамотно, что нужно сделать? :dont-know

Какие вопросы задаёте, такие ответы и получаете :drug:

dracosha 24-01-2010 14:15 1328460

Цитата:

Цитата K.A.V.
Я честно сказать, не могу понять вашу цель, вашу задачу, объясните грамотно, что нужно сделать? »

Сори! Попробую еще разок :)
Вобщем вот тестовый скрипт:
читать дальше »
Код:

SetCompressor /SOLID lzma
RequestExecutionLevel admin
SetOverwrite on

!define PRODUCT_NAME "Super Proga"
InstallDir "$PROGRAMFILES\Super Proga"

!include "MUI2.nsh"

!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE "files\LicenseRU.rtf"
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH

!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES

!insertmacro MUI_LANGUAGE "English"
!insertmacro MUI_LANGUAGE "Russian"
!insertmacro MUI_RESERVEFILE_LANGDLL

Section  $(NameSec0) Section0
SectionIn RO
  SetOutPath "$INSTDIR\"
  File "file1.dll"
  File "file2.dll"
SectionEnd

Section $(NameSec1) Section1
  SetOutPath "$INSTDIR\folder"
  File "file3.dll"
SectionEnd

Section $(NameSec2) Section2
  SetOutPath "$INSTDIR\folder"
  File "file4.dll"
SectionEnd

и т.д.

Function .onInit
!insertmacro MUI_LANGDLL_DISPLAY

StrCmp $Language "1049" 0 +2
CopyFiles "files\russian.lng" "$INSTDIR\"


SetOutPath $TEMP
File /oname=spl.bmp "files\splash.bmp"
advsplash::show 1500 2500 250 0xFFFFFF $TEMP\spl
Pop $0
Delete $TEMP\spl.bmp
FunctionEnd



Вобщем когда запускается инсталятор, то сразу после заставки (вобщем в самом начале) файл russian.lng копируется в папку по умолчанию... Тут же возникает вопрос... А если пользователь выберет другой путь для установки программы (MUI_PAGE_DIRECTORY)? При тестировании я собственно так и сделал... И в той папке которую я выбрал, файла russian.lng естественно не оказалось. Вобщем мне нужно что бы файл копировался туда куда пользователь решит.

Цитата:

Цитата K.A.V.
Не получится, тип файла это дело плагина, возможны только BMP файлы, да и прозрачность там такая что...
В коде вашего примера, за прозрачный цвет отвечает 4-ый параметр, т.е. -1, необходимо заменить "-1" на HEX значение прозрачного цвета, например, при указании 0xFFFFFF, за прозрачный цвет будет белый »

сделал свой файлик splash.bmp с прозрачностью
-1 изменил 0xFFFFFF
получилось вот так:
advsplash::show 1500 2500 250 0xFFFFFF $TEMP\spl
скомпилил
но вместо прозрачного выводится черный цвет
0xFFFFFF изменил на 0
получилось вот так:
advsplash::show 1500 2500 250 0 $TEMP\spl
теперь прозрачность есть, но фрагменты изображения на которых изпользуется прозрачность цвета не выводятся с прозрачностью... И в итоге картинка получается не совсем мягкая по бокам :(
Я думаю что есть таки плагины которые позволяют вставлять прозрачные картинки типа png?
K.A.V., может подскажете какой-нить русский ресурс с кучей плагинов для nsis?

K.A.V. 24-01-2010 15:32 1328543

Вам нужно поместить данную команду в секцию, а не в функцию, которая выполняется при запуске инсталлятора, пример кода:
Код:

Section -post
StrCmp $Language "1049" 0 +2
CopyFiles "files\russian.lng" "$INSTDIR\"
SectionEnd

Данная секция скрыта, она будет выполняться :)

Цитата:

Цитата dracosha
Я думаю что есть таки плагины которые позволяют вставлять прозрачные картинки?
K.A.V., может подскажете какой-нить русский ресурс с кучей плагинов для nsis? »

Есть ещё плагин NewAdvSplash, но он мало чем отличается...
Русскоязычный только nsis.narod.ru, только он не обновляется уже давно и там нет ничего полезного (по крайней мере для меня)...

NoName01.cpp 24-01-2010 16:28 1328585

K.A.V., спасибо за 3 деинсталлятора! Но еще одна проблемка нарисовалась: не могу удалить папку в которую установлена программа. (Ярлыки удаляются, из реестра тоже)

Код:
читать дальше »
Section $(Name_Seс1) Sec1
...
Strcpy $R9 $INSTDIR
strcpy $INSTDIR "$INSTDIR\Sec2"
WriteUninstaller "$INSTDIR\uninstall.exe"
strcpy $INSTDIR "$R9"
SectionEnd

Section $(Name_Sec2) Sec2
...
Strcpy $R9 $INSTDIR
strcpy $INSTDIR "$INSTDIR\Sec2"
WriteUninstaller "$INSTDIR\uninstall.exe"
strcpy $INSTDIR "$R9"
SectionEnd

Section $(Name_Sec3) Sec3
...
Strcpy $R9 $INSTDIR
strcpy $INSTDIR "$INSTDIR\Sec3"
WriteUninstaller "$INSTDIR\uninstall.exe"
strcpy $INSTDIR "$R9"
SectionEnd

Function un.UnInstall_Sec1
RMDir /r "$INSTDIR\Sec1" ;вот это не работает
...
FunctionEnd

Function un.UnInstall_Sec2
RMDir /r "$INSTDIR\Sec2" ;вот это не работает
...
FunctionEnd

Function un.UnInstall_Sec3
RMDir /r "$INSTDIR\Sec1" ;вот это не работает
...
FunctionEnd


Может папка не удаляется, потому-что в ней деинсталлятор, или потому-что в ней еще есть папки?
Хотя в примерах скриптов вроде все точное так же.

K.A.V. 24-01-2010 16:38 1328596

Цитата:

Цитата NoName01.cpp
Может папка не удаляется, потому-что в ней деинсталлятор »

При запуске деинсталлятор копирует сам себя во временную папку со случайным именем, чтобы возможно было удалить деинсталлятор в каталоге $INSTDIR ;)
Скорее всего, в данной папке есть файлы, которые используются системой/программами

К тому же, у вас ошибка в скрипте :)
Должно быть так:
Код:

RMDir /r "$INSTDIR"
или
Код:

RMDir /r "$R0\Sec1"
Т.к. переменная $INSTDIR уже содержит в своём пути "Sec1", мы же изменяли значение переменной в момент создания деинсталлятора, помните? ;)

dracosha 24-01-2010 16:49 1328605

K.A.V., Спасибо Вам большое.
Цитата:

Цитата K.A.V.
StrCmp $Language "1049" 0 +2 »

Я так понял "1049" - это код русского языка.
А какой код у английского?

K.A.V. 24-01-2010 16:54 1328613

Цитата:

Цитата dracosha
K.A.V., Спасибо Вам большое. »

Лучше помогите материально :laugh:
Шучу конечно, да пожалуйста! ;)


Цитата:

Цитата dracosha
А какой код у английского? »

1033

NoName01.cpp 24-01-2010 17:20 1328636

Цитата:

Цитата K.A.V.
Т.к. переменная $INSTDIR уже содержит в своём пути "Sec1", мы же изменяли значение переменной в момент создания деинсталлятора, помните? »

Спасибо большое! Теперь работает!

dracosha 24-01-2010 17:26 1328639

Цитата:

Цитата K.A.V.
Вам нужно поместить данную команду в секцию, а не в функцию, которая выполняется при запуске инсталлятора, пример кода:
Код:
Section -post
StrCmp $Language "1049" 0 +2
CopyFiles "files\russian.lng" "$INSTDIR\"
SectionEnd »

:( не работает! K.A.V., помоги разобраться плиз. Может я что-то не так делаю.
Но из функций я этот код убрал... Дабавил секцию полностью скопировав твой пример... А оно работать не хочет :cry:
Неработает - всмысле не копируется файл russian.lng.

K.A.V. 24-01-2010 17:37 1328650

dracosha, ну ей богу... :)
Команда "CopyFiles" копирует файл, который есть на жестком диске, а у нас файл упакованный в инсталлятор, значит прописывать надо так:
Код:

SetOutpath $INSTDIR
File "files\russian.lng"

---
Добавил позже
Цитата:

Цитата It4a
а. Как сделать что-бы обойти размер в 2 Gb. если нельзя, то как реализовать по другому »

У меня тут мысль в голову пришла :)
Использовать несколько инсталляторов NSIS, главный файл будет инсталлятором (маленький размер, чисто для запуска других), остальные будут как архивы (можно изменить на любое расширение отличное от EXE), каждый из инсталлеров будет принимать от главного инсталлера путь, куда следует распаковать файлы и будет их распаковывать :)

dracosha 24-01-2010 22:24 1328876

K.A.V., я думал если Вы мне поможете с копированием файла russian.lng при выборе русского языка, то я смогу догадаться как мне остальные файлы распределить по языкам...
Но к сожалению я разобраться не смог. Извините что сразу не ввел Вас вкурс того что мне еще надо.

Вобщем при выборе русского языка мне нужно что бы копировался russian.lng в корневую папку (с этим Вы мне уже помогли т.е. вопрос закрыт) и set.dll в папку $INSTDIR\settings

а при выборе английского языка что бы копировался тоже set.dll в папку $INSTDIR\settings
но это уже другой файл т.е. внутренности етого файла для русской версии проги отличаются хотя названия файлов одинаковые...
Файлы эти при компиляции естественно лежат в разных местах...
И вот собственно то что я сделал:
читать дальше »
Код:

SetCompressor /SOLID lzma
RequestExecutionLevel admin
SetOverwrite on

!define PRODUCT_NAME "Super Proga"
InstallDir "$PROGRAMFILES\Super Proga"
OutFile "SuperProga.exe"

!include "MUI2.nsh"

!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE "LicenseRU.rtf"
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH

!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES

!insertmacro MUI_LANGUAGE "English"
!insertmacro MUI_LANGUAGE "Russian"
!insertmacro MUI_RESERVEFILE_LANGDLL

Section "Group 1 - Option 1" g1o1
SectionEnd

Section "Group 2 - Option 2" g2o2
SectionEnd

Section "Group 2 - Option 3" g2o3
SectionEnd

Section -post
StrCmp $Language "1049" 0 +2
SetOutPath "$INSTDIR\"
File "files\russian.lng"
SectionEnd

Section -setru
StrCmp $Language "1049" 0 +2
SetOutPath "$INSTDIR\settings"
File "settings\set.dll"
SectionEnd

Section -seten
StrCmp $Language "1033" 0 +2
SetOutPath "$INSTDIR\settings"
File "files\set.dll"
SectionEnd


Section Uninstall
RMDir /r "$INSTDIR\"
SectionEnd

Function .onInit
!insertmacro MUI_LANGDLL_DISPLAY
SetOutPath $TEMP
File /oname=spl.bmp "splash.bmp"
advsplash::show 1500 2500 250 0 $TEMP\spl
Pop $0
Delete $TEMP\spl.bmp
FunctionEnd



Но в итоге при выборе русского языка файл для английского все равно копируется
а при выборе английского файл russian.lng копируется в папку $INSTDIR\settings
что за глюки такие... понятия не имею. :(
Помогите плиз

K.A.V. 24-01-2010 22:31 1328883

В выделенном тексте, везде где написано 0 +2 замените на 0 +3

Кстати не обязательно для каждого файла создавать новую секцию, всё можно прописать в одну
читать дальше »
Код:

Section -post
StrCmp $Language "1049" 0 +3
SetOutPath "$INSTDIR\"
File "files\russian.lng"

StrCmp $Language "1049" 0 +3
SetOutPath "$INSTDIR\settings"
File "settings\set.dll"

StrCmp $Language "1033" 0 +3
SetOutPath "$INSTDIR\settings"
File "files\set.dll"
SectionEnd


dracosha 25-01-2010 00:11 1328950

Цитата:

Цитата K.A.V.
!insertmacro MUI_PAGE_WELCOME
Page license
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "Russian"
!insertmacro MUI_LANGUAGE "English"
LicenseLangString myLicenseData ${LANG_ENGLISH} "English_license_file.txt"
LicenseLangString myLicenseData ${LANG_RUSSIAN} "Russian_license_file.txt"
LicenseData $(myLicenseData) »

Очень хотелось использовать именно MUI :)
Когда разбирался с языками для названия секций я просек тему что в nsis можно присваивать переменные а потом объявлять для них перевод...
После чего решил попробовать на MUI_PAGE_LICENSE
И к моему большому удивлению у меня все получилось...
читать дальше »
Код:

!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE "$(myLicenseData)"
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH

!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES

!insertmacro MUI_LANGUAGE "English"
!insertmacro MUI_LANGUAGE "Russian"
!insertmacro MUI_RESERVEFILE_LANGDLL

LicenseLangString myLicenseData ${LANG_ENGLISH} "files\Licenseen.rtf"
LicenseLangString myLicenseData ${LANG_RUSSIAN} "files\Licenseru.rtf"



может кому пригодится

dracosha 25-01-2010 01:01 1328980

Народ!
Нужно добавить еще 2 странички на которых хочу разместить следующее:
страничка 1
"возможность изменять название папки в меню пуск" и "кнопка - создавать папку в меню пуск или нет"
страничка 2
тут я хочу разместить кнопки для создания ярлыков на рабочем столе и в панели быстрого запуска

Если возможно то я бы и на одной страничке все это дело разместил
Господа ГУРУ помогите плиз.

NoName01.cpp 25-01-2010 01:17 1328989

Цитата:

Цитата dracosha
Народ!
Нужно добавить еще 2 странички на которых хочу разместить следующее: »

С созданием страниц у меня проблем нету. Примеры я взял отсюда:
http://nsis.sourceforge.net/Docs/nsDialogs/Readme.html
http://www.winreview.ru/comment.php?comment.news.241.11

Но есть у меня вопрос. В моем инсталляторе 3 секции. Как мне сделать так, чтобы страница появлялась только при условии, что выбрана например первая секция.

Какое условие мне сюда добавить:
Function nsDialogsPage
nsDialogs::Create 1018
nsDialogs::Show
FunctionEnd

Заранее спасибо!

K.A.V. 25-01-2010 03:15 1329051

Вложений: 1
Цитата:

Цитата dracosha
страничка 1
"название папки в меню пуск" и "создавать папку в меню пуск или нет"

читать дальше »

В начале кода (вставляем в зависимости от того, на каком этапе хотим видеть):
Код:

var ICONS_GROUP
!define MUI_STARTMENUPAGE_DEFAULTFOLDER "Моя программа"
!insertmacro MUI_PAGE_STARTMENU Application $ICONS_GROUP

В "-post" секцию добавить
Код:


  !insertmacro MUI_STARTMENU_WRITE_BEGIN Application
Прописываем создание ярлыков в старт меню
  !insertmacro MUI_STARTMENU_WRITE_END




Цитата:

Цитата dracosha
страничка 2
тут я хочу разместить кнопки для создания ярлыков на рабочем столе и в панели быстрого запуска

читать дальше »

Код:

!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
Page custom MyDialog_Shortcuts ""
!insertmacro MUI_PAGE_FINISH

Код:

Function MyDialog_Shortcuts
setoutpath $PLUGINSDIR
file "shortcuts.ini"
InstallOptions::initDialog /NOUNLOAD "$PLUGINSDIR\shortcuts.ini"
InstallOptions::show /NOUNLOAD
  ReadINIStr $0 "$PLUGINSDIR\shortcuts.ini" "Field 1" "State"
StrCmp $0 "1" 0 NoDesktopShortcuts
# Отмечена галка на создание на рабочем столе, здесь прописываем команды
NoDesktopShortcuts:
  ReadINIStr $0 "$PLUGINSDIR\shortcuts.ini" "Field 2" "State"
StrCmp $0 "1" 0 NoQuicklaunchShortcuts
# Отмечена галка на создание в панели быстрого запуска, здесь прописываем команды
NoQuicklaunchShortcuts:
FunctionEnd

Скачайте прикреплённый файл, распакуйте файл "Shortcuts.ini" в папку с вашим скриптом




Цитата:

Цитата NoName01.cpp
Но есть у меня вопрос. В моем инсталляторе 3 секции. Как мне сделать так, чтобы страница появлялась только при условии, что выбрана например первая секция.

Какое условие мне сюда добавить:
Function nsDialogsPage
nsDialogs::Create 1018
nsDialogs::Show
FunctionEnd

читать дальше »

Вам необходимо создать глобальную переменную и назначить ей "1" в секции, далее проверяете в функции...вообщем давайте я сразу к коду :)

Код:

var Sec1_Is_Checked
Section /o "Моя секция №1"
Strcpy $Sec1_Is_Checked "1"
SectionEnd

Function nsDialogsPage
StrCmp $Sec1_Is_Checked "1" 0 Sec1_NOT_Checked
nsDialogs::Create 1018
nsDialogs::Show
Sec1_NOT_Checked:
FunctionEnd

Можно конечно обойтись без создания переменной, командами "SectionGetFlags", если хотите сделать так, то посмотрите мои ранние посты, там я давал примеры, как определить, отмечена секция или нет ;)
А если смотреть лень :) говорите - напишу ;)

hb860 25-01-2010 08:16 1329114

K.A.V., а почему InstallOptions, а не nsDialogs ?
Цитата:

Цитата K.A.V.
InstallOptions::initDialog /NOUNLOAD "$PLUGINSDIR\shortcuts.ini" »

Имхо, nsDialogs попроще

kuchkan 25-01-2010 14:02 1329359

hb860, спасибо большое за статью NSIS. Создаем собственные страницы инсталлятора , теперь знаю с чего хоть начинать надо... Но как это обычно бывает осталась масса вопросов.
Все было понятно до выставления координат у элементов, дальше пошли сплошные термины, расчитанные, имхо, на продвинутых нсисников. Страница в инсталяторе появилась, но как сделать, чтобы всё это заработало? Не хватает живого примера на конкретной программе, как вы делали это в предыдущих статьях.
Что непонятно:
- почему в статье доп. страница названа Page custom fnCustomInit fnCustomDestroy, а в том же скрипте к AIMP2 вы использовали более традиционное Page custom nsDialogsPage nsDialogsPageLeave.
- как добавить надписи в шапку, сейчас у меня отображается надпись предыдущей страницы, а это "Выбор папки установки".
- зачем, вообще, в инсталяторе нужен MessageBox MB_OK $R1 (в статье это такое маленькое диалоговое окно).
- главное, как связать (в моем случае) чекбоксы с ярлыками и файлами инсталируемой программы. В переменных, пока еще, как свинья в апельсинах.

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

Код:

  !include "MUI.nsh" #выбранный интерфейс
  !include "nsDialogs.nsh" #плагин для дополнительных элементов
...........
...........
# Окна инсталятора
  !insertmacro MUI_PAGE_WELCOME #приветствие
  !insertmacro MUI_PAGE_DIRECTORY #выбор директории
  Page custom nsDialogsPage nsDialogsPageLeave #дополнительное окно с выбором ярлыков
  !insertmacro MUI_PAGE_INSTFILES #прогресс-бар и копирование файлов
  !insertmacro MUI_PAGE_FINISH #готово

# Опции дополнительного окна. НЕЗАКОНЧЕНО! и скорее всего неправильно!
Var Dialog
Var Label
Var CheckBox1
Var CheckBox2

Function nsDialogsPage
  nsDialogs::Create 1018
  Pop $Dialog

  ${NSD_CreateLabel} 0 0 100% 24u "Выберете желаемые ярлыки программы $(^Name) для установки. Нажмите кнопку «Далее» для продолжения."
  Pop $Label

  ${NSD_CreateCheckBox} 0 45u 100% 10u "  Ярлык на Рабочий стол"
  Pop $CheckBox1

  ${NSD_CreateCheckBox} 0 65u 100% 10u "  Ярлык на Панель быстрого запуска"
  Pop $CheckBox2

  nsDialogs::Show
FunctionEnd

Function nsDialogsPageLeave
  ${NSD_GetState} $CheckBox1 $R0
  CreateShortCut "$DESKTOP\${PR_NAME}.lnk" "$INSTDIR\${PR_EXE}" #впихнул сюда, т.к. не знаю куда, ярлык устанавливается в независимости от статуса чекбоксов
  ${NSD_GetState} $CheckBox2 $R0
  CreateShortCut "$QUICKLAUNCH\${PR_NAME}.lnk" "$INSTDIR\${PR_EXE}" #впихнул сюда, т.к. не знаю куда, ярлык устанавливается в независимости от статуса чекбоксов
FunctionEnd


K.A.V. спасибо за shortcuts.ini, но хотелось бы разобраться с nsDialogs.

NoName01.cpp 25-01-2010 14:07 1329361

Цитата:

Цитата kuchkan
как связать (в моем случае) чекбоксы с ярлыками и файлами инсталируемой программы. В переменных, пока еще, как свинья в апельсинах »

Я делал так:
читать дальше »
Var CheckLink
Var CheckDLink

Var Link
Var DLink

Function LinkPage
nsDialogs::Create 1018
${NSD_CreateCheckbox} 0 50u 100% 10u $(Name_DLink)
Pop $CheckDLink
${NSD_CreateCheckbox} 0 65u 100% 10u $(Name_Link)
Pop $CheckLink
${NSD_SetState} $CheckDLink ${BST_CHECKED}
${NSD_SetState} $CheckLink ${BST_CHECKED}
nsDialogs::Show
FunctionEnd

Function LinkPageLeave
${NSD_GetState} $CheckDLink $DLink
${NSD_GetState} $CheckLink $Link
FunctionEnd

а потом в секции проверка:
${If} $Link = ${BST_CHECKED}
;тут создаем ярлыки в пуск
${EndIf}
${If} $DLink = ${BST_CHECKED}
;тут создаем ярлыки на рабочий стол
${EndIf}


Может кто-то знает, что нада сделать, чтобы инсталлятор был вот такого вида (я имею ввиду окно на заднем плане):



Уже решил этот вопрос: BGGradient

dracosha 25-01-2010 15:26 1329438

K.A.V., спасибо большое!
В ini текст только на русском языке.
Но меня стало смущать вот это:
Цитата:

Цитата hb860
Имхо, nsDialogs попроще »

Получается что там все просто, а я понять немогу как мне сделать то что я хочу.
K.A.V., помню что у Вас куча работы и Вы пишете новый проект с нуля, но в основном Вы мне и помогаете :)
Пожалуйста! Помогите решить мои 2 вопроса при помощи nsDialogs и с возможностью вывода всего текста на окошках на разных языках.
ps Можно ли осуществить то что я хочу на одной страничке? Если можно то лучше конешно же все на одной.

ChVL 25-01-2010 18:56 1329624

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

hb860 25-01-2010 19:30 1329662

ChVL,
Нет ключа
Код:

дистрибутив.exe /s
ping -t 5 127.0.0.1
taskkill /IM чтозапустилось.ехе /F

Вот так сделайте

dracosha 25-01-2010 19:37 1329671

hb860, может Вы мне с этим поможете используя nsDialogs? Совсем не понимаю как мне это сделать.

ChVL 25-01-2010 19:54 1329696

hb860
Спасибо.
Действительно, дистрибутив и исполняемый файл имеют разные названия. Для чего тогда вводить задержку?

hb860 25-01-2010 20:10 1329708

Цитата:

Цитата kuchkan
fnCustomInit fnCustomDestroy »

Цитата:

Цитата kuchkan
nsDialogsPage nsDialogsPageLeave »

Это всего лишь названия функций, назовите хоть Vasaya1 и Vasaya2, будет работать одинаково
Цитата:

Цитата kuchkan
как добавить надписи в шапку, »

Код:

Function nsDialogsPage
  nsDialogs::Create 1018
  Pop $Dialog
 !insertmacro MUI_HEADER_TEXT "Опа-опа" "Вот оно чё, Михалыч(с)"

Цитата:

Цитата kuchkan
зачем, вообще, в инсталяторе нужен MessageBox MB_OK $R1 »

Для примера
Цитата:

Цитата kuchkan
- главное, как связать (в моем случае) чекбоксы с ярлыками и файлами инсталируемой программы. »

Код:

Function nsDialogsPageLeave
 ${NSD_GetState} $CheckBox1 $R0
StrCmp $R0 0 +2
 CreateShortCut "$DESKTOP\${PR_NAME}.lnk" "$INSTDIR\${PR_EXE}"
 ${NSD_GetState} $CheckBox2 $R0
StrCmp $R0 0 +2
 CreateShortCut "$QUICKLAUNCH\${PR_NAME}.lnk" "$INSTDIR\${PR_EXE}"
FunctionEnd

Цитата:

Цитата dracosha
hb860, может Вы мне с этим поможете используя nsDialogs? Совсем не понимаю как мне это сделать. »

Я напишу вам это, если уважаемый K.A.V. не сделает раньше.
Цитата:

Цитата ChVL
Спасибо.
Действительно, дистрибутив и исполняемый файл имеют разные названия. Для чего тогда вводить задержку? »

На всякий пожарный. Лишней она не будет, честное слово.

It4a 26-01-2010 02:10 1329976

Цитата:

Цитата K.A.V.
У меня тут мысль в голову пришла
Использовать несколько инсталляторов NSIS, главный файл будет инсталлятором (маленький размер, чисто для запуска других), остальные будут как архивы (можно изменить на любое расширение отличное от EXE), каждый из инсталлеров будет принимать от главного инсталлера путь, куда следует распаковать файлы и будет их распаковывать »

Над этим тоже думал с самого начала, NSIS вызывающий NSIS. Пробывал 7z SFX, слишком рамки ограничены, т.е. той гибкости котарая мне нужна нет. На данный момент я сделал ровно наполовину, т.е. весь процесс автоматизировать не получилось(но уже хорошо).

kuchkan 26-01-2010 11:14 1330148

NoName01.cpp, hb860, спасибо огроменное! :up
Когда разжуют, кажется всё таким простым... Взял на вооружение метод hb860: минимум символов и буковок - работоспособность 100%.
Шапка с "Опа-опа" "Вот оно чё, Михалыч(с)" смотрится классно :lol: .

dracosha 26-01-2010 21:23 1330709

hb860, совершенно случайно узнал что в nsis есть стандартная страничка MUI_PAGE_STARTMENU. Вобщем эту страничку я добавил... Но еще нужна страничка с возможностью добавления ярлыков на рабочий стол и панель быстрого запуска.

K.A.V. 27-01-2010 08:44 1331061

Цитата:

Цитата hb860
K.A.V., а почему InstallOptions, а не nsDialogs ?

Цитата:

Цитата dracosha
Пожалуйста! Помогите решить мои 2 вопроса при помощи nsDialogs

Я с nsDialogs не знаком и никогда им не пользовался, меня устраивает функционал и удобство InstallOptions и я не вижу причин в данный момент изучать что-то новое

kuchkan 27-01-2010 10:58 1331167

Цитата:

Цитата dracosha
Но еще нужна страничка с возможностью добавления ярлыков на рабочий стол и панель быстрого запуска. »

На этой и предыдущей странице топика есть 3 варианта решения проблемы:
#343, #346, #352.

hb860 27-01-2010 12:23 1331255

Цитата:

Цитата dracosha
Но еще нужна страничка с возможностью добавления ярлыков на рабочий стол и панель быстрого запуска. »

Я подобные вопросы решаю секциями
Код:

SectionGroup "Ярлыки"
        Section "В меню Пуск"
                SectionIn 1 2 3       
                SetShellVarContext all
                CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}"
                CreateShortCut  "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\aimp2.exe"
                CreateShortCut  "$SMPROGRAMS\${PRODUCT_NAME}\Удалить ${PRODUCT_NAME}.lnk" "$INSTDIR\uninst.exe"
        SectionEnd
        Section "На рабочем столе"
                SectionIn 1       
                SetShellVarContext all
                CreateShortCut "$DESKTOP\${PRODUCT_NAME}.lnk" "$INSTDIR\aimp2.exe"
        SectionEnd
        Section "В панели быстрого запуска"
                SectionIn 1       
                SetShellVarContext all
                CreateShortCut "$QUICKLAUNCH\${PRODUCT_NAME}.lnk" "$INSTDIR\aimp2.exe"
        SectionEnd       
SectionGroupEnd

Может и вам есть смысл так сделать ?

Цитата:

Цитата dracosha
hb860, совершенно случайно узнал что в nsis есть стандартная страничка MUI_PAGE_STARTMENU. »

Я а предполагал что она вас чем-то не устраивает

K.A.V. 27-01-2010 18:59 1331603

Цитата:

Цитата It4a
Над этим тоже думал с самого начала, NSIS вызывающий NSIS. Пробывал 7z SFX, слишком рамки ограничены, т.е. той гибкости котарая мне нужна нет. На данный момент я сделал ровно наполовину, т.е. весь процесс автоматизировать не получилось(но уже хорошо). »

Интересно даже стало... :) А что там не получилось на автомате всё сделать? :)

ChVL 27-01-2010 20:26 1331654

hb860,

Цитата:

Код:

дистрибутив.exe /s
ping -t 5 127.0.0.1
taskkill /IM чтозапустилось.ехе /F

Вот так сделайте
Работает, но кривовато. Дело в том, taskkill убивает уже имеющийся в памяти процесс, а потому установку дистрибутива приходится проводить до конца, и только после этого появившийся процесс убивать. При такой процедуре в конце мелькают окна, что не есть good.
В идеале надо бы предотвратить запуск исполняемого файла. Но, похоже, слишком многого хочу…

hb860 27-01-2010 20:46 1331678

Без перепаковки не получится. Окно можно скрыть при помощи утилит cmdow.exe и hidecon.exe. Предотвратить не получится

dracosha 28-01-2010 01:19 1331868

Цитата:

Цитата hb860
Может и вам есть смысл так сделать ? »

Неа. Такой вариант для моих уже более 100 имеющихся компонентов думаю будет не актуальным.
Цитата:

Цитата hb860
Я напишу вам это, если уважаемый K.A.V. не сделает раньше. »

Спасибо большое. С этим уже разобрался... Примел выложил NoName01.cpp вот здесь
hb860, может поможете мне вот с этим:

Мне нужно что бы при выборе компонента 1, стали активными для выбора компонент 2 компонент 3 и компонент 4, и в тоже время компоненты 2, 3 и 4 не должны выбираться 1 из 3, (т.е. что бы можно было поставить галочки на все компоненты 2 ,3 и 4). Если компонент 1 не выбран значит компоненты 2, 3 и 4 должны быть неактивными
Цитата:

Цитата K.A.V.
Код:

Section /o "test1" section1
SectionEnd
Section /o "test2" section2
SectionEnd
Section /o "test3" section3
SectionEnd
Function .onSelChange
 SectionGetFlags ${section1} $1
 SectionGetFlags ${section2} $2
 SectionGetFlags ${section3} $3
StrCmp $1 "1" 0 N1
 SectionGetFlags ${section2} $0
 IntOp $0 $0 & ${SECTION_OFF}
 SectionSetFlags ${section2} $0
 SectionGetFlags ${section3} $0
 IntOp $0 $0 & ${SECTION_OFF}
 SectionSetFlags ${section3} $0
N1:
StrCmp $2 "1" 0 N2
 SectionGetFlags ${section1} $0
 IntOp $0 $0 & ${SECTION_OFF}
 SectionSetFlags ${section1} $0
 SectionGetFlags ${section3} $0
 IntOp $0 $0 & ${SECTION_OFF}
 SectionSetFlags ${section3} $0
N2:
StrCmp $3 "1" 0 N3
 SectionGetFlags ${section1} $0
 IntOp $0 $0 & ${SECTION_OFF}
 SectionSetFlags ${section1} $0
 SectionGetFlags ${section2} $0
 IntOp $0 $0 & ${SECTION_OFF}
 SectionSetFlags ${section2} $0
N3:
 FunctionEnd

»

Товарищ K.A.V. очень помог мне этим примером, но я этот пример использовал для других компонентов как самый настоящий скрипт. Смог догадаться только в переименовании секций на свои имена
Народ! Пожалуйста! Растолкуйте для новичка весь этот скрипт... Чтоб было понятно что тут за что отвечает.
Может тогда мне станет понятно как решить мою задачку.

It4a 28-01-2010 01:32 1331876

Вложений: 1
Цитата:

Цитата K.A.V.
Интересно даже стало... А что там не получилось на автомате всё сделать? »

К NSIS претензий нет - это проблема с правами пользователей, но это решаемо в процессе.
Нужно что бы было одним файлом, но оказалось что несколькими удобней(даже помоему лучше так, как приложения некоторые не всем нужны), но это не суть.
1. Хотел бы поинтересоваться как в BrandingText сделать тест ссылкой на ресурс кликабельной.
2. При выборе компонент(где галки ставим/снимаем) появляется текст, в пределах окна, компоненту описывающий, а вот возможно сделать рамку с другой стороны которая показывала бы изображения по такому же принципу.

K.A.V. 28-01-2010 03:45 1331929

Цитата:

Цитата It4a
Нужно что бы было одним файлом, но оказалось что несколькими удобней »

Фишка то в чем, про что я говорил, про то, что у NSIS ограничение в 2 Гб и использование нескольких упакованных с помощью NSIS "инсталляторов" дают возможность создавать:
1. Так сказать "многотомные" архивы :)
2. Обойти ограничение в 2 Гб, сохранив всю гибкость в установке ;)
3. Можно удалять эти отдельные архивы, как вы и сказали, когда разные архивы содержат разные компоненты (как например дополнения в Photoshop CS3)

Цитата:

Цитата It4a
1. Хотел бы поинтересоваться как в BrandingText сделать тест ссылкой на ресурс кликабельной. »

читать дальше »

Сначала необходимо убрать флаг "WS_DISABLED" с элемента 1028 (диалог 105), обычно редактировать необходимо файл (если не прописывали свою оболочку) по пути \Program Files\NSIS\Contrib\UIs\modern.exe

Затем, в начале кода вставить
Код:

!define MUI_CUSTOMFUNCTION_GUIINIT myGuiInit
И ещё потом
Код:

Function myGuiInit
GetDlgItem $0 $HWNDPARENT 1028
Linker::link /NOUNLOAD $0 "http://www.google.com/"
FunctionEnd

Function .onGUIEnd
Linker::unload
FunctionEnd

Кстати не забудьте сам плагин Linker скачать ;)


Цитата:

Цитата It4a
2. При выборе компонент(где галки ставим/снимаем) появляется текст, в пределах окна, компоненту описывающий, а вот возможно сделать рамку с другой стороны которая показывала бы изображения по такому же принципу. »

Я помню задавался таким же вопросом, когда писал твикер, в итоге - получилось, но только при условии, что изображения будут одинаковыми размерами, доделать я не доделал данную возможность, т.к. многовато скринов нужно было делать... :)
Как делать я сейчас с ходу не вспомню, т.к. того кода вроде нет...а может и есть, не знаю :)
Помню, что я правил файл MUI.nsh а конкретно функцию "onMouseOverSection" :)

drynpavel 28-01-2010 10:29 1332113

может не в тему, но все же про nsis. Подскажите, а есть ли какие нибудь ключи для при запуске деинсталятора nsis для "тихого " удаления программы?
Пробовал /S - не пошло.

hb860 28-01-2010 11:42 1332187

drynpavel, как раз должно было пойти.
Если в деинсталляторе не отключена тихая установка, то пойдет
Код:

uninstall.exe /S
S - обязательно большая

hb860 28-01-2010 19:51 1332721

Цитата:

Цитата K.A.V.
как в BrandingText сделать тест ссылкой на ресурс кликабельной »

В шапке. Включу в статью очередную

dracosha 28-01-2010 21:15 1332799

Господа ГУРУ! Неужели для Вас это сложный вопрос?
K.A.V., hb860, помогите пожалуйста :help:

NoName01.cpp 29-01-2010 22:13 1333881

Здраствуйте!
Имеется 3 секции. Одна секция RO. В функции .onSelChange я в зависимости от состояния активных секций меняю состояние неактивной(RO).
У меня такая проблемка: после запуска инсталлятора неактивная секция "бледного" цвета. Но когда я меняю ее состояния на SF_SELECTED или наоборот, то она выделяется, продолжает оставаться RO, но становится зеленой. Можно ли сделать чтобы RO секция всегда оставалась бледной???

И еще: как сделать неактивной кнопку Далее на странице компонентов? (Мне нада это впихнуть в функцию .onSelChange)
Решил этот вопрос:
GetDlgItem $0 $HWNDPARENT 1
EnableWindow $0 0

Заранее спасибо!

dracosha 30-01-2010 00:18 1333957

Ладно... Оставлю этот вопрос на потом.
Но сразу же хочу попросить помощи о создании странички выбора скина.
Нужно что бы слева шли названия скинов, а справа чтоб при наведении на имя или хотя бы при выборе скина показывалась картинка скина. Чекбоксов для выбора скинов будет 10 штук (т.к. скинов всего 10 штук :) ) ну и надо что бы выбор работал 1 из 10.
Помогите пожалуйста.

K.A.V. 30-01-2010 06:28 1334031

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

Цитата:

Цитата dracosha
Господа ГУРУ! Неужели для Вас это сложный вопрос? »

Цитата:

Цитата dracosha
Ладно... Оставлю этот вопрос на потом. »

Я пробовал, но там проблема, что как и написал NoName01.cpp:
Цитата:

Цитата NoName01.cpp
SF_SELECTED или наоборот, то она выделяется, продолжает оставаться RO, но становится зеленой. »

я не знаю, скорее всего есть какой-либо флаг или особый синтаксис (а может это и глюк NSIS), то что я вам писал ранее с отметкой и разными манипуляциями с секциями/создание 3х деинсталляторов - я делал в первый раз, не было таких необходимостей

А теперь, вы задаёте следующий вопрос #370
Цитирую отдельно:
Цитата:

Цитата dracosha
хочу попросить помощи »

Разве речь идёт о помощи? Мне кажется, здесь смысл другой - напишите за меня, чтобы мне нужно было только скопировать ваш код и вставить в свой скрипт
Цитата:

Цитата dracosha
Нужно что бы слева шли названия скинов, а справа чтоб при наведении на имя или хотя бы при выборе скина показывалась картинка скина. »

А разве я не ответил на вопрос №2 поста It4a - #363
А теперь вы задаёте такой же "вопрос", но так сказать о "просьбе" всё-таки написать этот код
Цитата:

Цитата dracosha
ну и надо что бы выбор работал 1 из 10 »

А разве вы это сами не можети реализовать? Даже выбор 1-го компонента из 10? Вам не кажется это "подозрительным"? В работе с секциями я думаю, мы разжевали всё уже очень подробно, например, мой пост #196
dracosha, лично вы, что сделали для реализации нужной вам возможности? Ничего...я ведь прав?


А зачем вообще нужна справка по NSIS? И не нужно говорить, что там всё написано на английском языке, я начал изучать NSIS в лет 16-17 не зная английского языка (и сейчас не знаю) и никакого языка программирования, с использованием справки и примеров в папки NSIS\Examples
Это так сложно? Ввести в "указатель" в файле справки нужную вам команду и прочитать её описание? Там на все команды написаны подробнейшие примеры

Этими словами я не обращаюсь к кому-то конкретно и не хочу сказать, что лично я не собираюсь отвечать/помогать в разрешении вопросов, но посмотрите, как называется наша тема? NSIS - все вопросы, а не NSIS - скажите, что вам нужно, а мы напишем за вас готовый код

На написание данного поста меня натолкнуло:
1. У меня сейчас, в данный момент, просто катастрофически не хватает времени
2.
Цитата:

Цитата dracosha
Неужели для Вас это сложный вопрос? »

Мы всё видим, мы тоже люди и не сидим каждую секунду в этой теме с включенным HM NIS Edit, чтобы как только появится вопрос, сразу бросаться писать код, и всего о NSIS мы не знаем

Вроде всё.

dracosha 30-01-2010 16:56 1334354

K.A.V., Вы конешно имеете полное право на такие высказывания, но Вас же никто не заставляет помогать! Вас просят о помощи, но помогать или нет это решать Вам.
И по-поводу английского языка хочу сказать что я имею полное право говорить о том что я не знаю английского... Да! Вы можете сказать в ответ что есть куча переводчиков и можно воспользоваться ими... Но переводчики не умеют переводить такие специфические тексты как положено. Так что новичку без знания английского с этим разобраться нереально... Если бы переводчики могли переводить все как положено на русский то уже давным давно был бы готовый для скачивания русский хелп по nsis. Я бы сам лично его сделал. Однако его до сих пор нет.
И таких примеров как давали Вы лично мне в справке нет. Там конешно же есть похожие примеры в 3 строки, но в этих трех строчках я разобраться не могу, т.к. не понимаю за что отвечает каждый элемент. Примеров с прогой идет конешно же тоже много, но того что мне надо я не нашел, хотя скомпилил полностью все примеры которые были с nsis. Да что тут далеко ходить... Вы сами говорите что еще не все знаете, а что тогда говорить о новичках?
Тот скрипт который у меня уже есть на сегодняшний день написан только благодаря Вам и hb860. hb860 сделал отличные примеры на практике. Очень жаль что примеров там еще мало.
Форум же для того и существует что бы помогать друг другу.
И помощи от Вас я конешно же очень жду, :blush2: а поможете Вы мне или нет это безусловно Ваше право.

hb860 30-01-2010 20:40 1334514

Под постом K.A.V. я подписался
Цитата:

Цитата dracosha
Очень жаль что примеров там еще мало. »

Вы и любой желающий может начать писать статьи со мной вместе. Я опубликую их здесь и на своем сайте. Я только "за", это поможет людям быстро освоить NSIS, и , кажется, немного решит проблему:
Цитата:

Цитата dracosha
я имею полное право говорить о том что я не знаю английского »

Я в общем-то, лично далеко не гуру английского, и те посты, которые я делаю на соотв. форумах, вызывают улыбку англоязычных пользователей.
Цитата:

Цитата dracosha
Если бы переводчики могли переводить все как положено »

Зачем переводить то? Вопрос тут не в том чтобы перевести. Надо сесть, подумать и написать.
От вас лично требуется взять блокнот, попихать в него примеры из справки и скомпилить. Увидя, как они работают на практике, необходимо реализовать некий алгоритм, последовательность действий, где вы сможете применить этот функционал команд. Вот что требуется.
Цитата:

Неужели для Вас это сложный вопрос? »
Вовсе нет. Но нам надо сесть, разработать алгоритм и реализовать код- все то, что лично вы не желаете делать, ибо ни я, ни K.A.V., по всей видимости, такую задачу не решали и нам она "в новинку" (и её практическая ценность, я полагаю, весьма сомнительна). Нам несложно, но это требует времени, и немалого. Мы не отказываем вам в помощи и не ставим целью оскорбить вас или ваши навыки, но, действительно, у нас и другие дела. Впрочем, два поста выше это уже было сказано.
dracosha, попробую завтра пописать для вас.

dracosha 31-01-2010 00:44 1334655

Цитата:

Цитата hb860
что лично вы не желаете делать »

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

K.A.V. 31-01-2010 20:18 1335270

Цитата:

Цитата dracosha
Вы можете сказать в ответ что есть куча переводчиков и можно воспользоваться ими... »

Цитата:

Цитата dracosha
Так что новичку без знания английского с этим разобраться нереально... »

Вы наверное не внимательно прочитали мой пост ;)
Цитата:

Цитата K.A.V.
я начал изучать NSIS в лет 16-17 не зная английского языка (и сейчас не знаю) »

Просто было большое желание и очень много тестов :)
Не скажу, что всё получалось сразу, даже сейчас не всё получается с первого раза, но усилия, которые прилагаются для реализации нужной возможности не оказываются напрасными, просто нужно запастись побольше терпением и желанием :)

Цитата:

Цитата dracosha
И таких примеров как давали Вы лично мне в справке нет. »

Сначала команды изучаются по отдельности методом тестов естественно, затем включаем устройство под названием мозг и посылаем ему команду на выявление возможных связок команд в функции, т.е. что можно сделать с использованием нескольких команд, вот тогда и рождаются функции... ;)

Всё, на этом предлагаю прекратить оффтоп :)

NoName01.cpp 31-01-2010 20:31 1335283

Здраствуйте! У меня вопрос по поводу плагина MSSQL OLEDB plug-in.
Я подключаюсь к sql серверу, делаю запрос и получаю результат с помощью MSSQL_OLEDB::SQL_GetRow.
После этого возвращается строка. И если запрос возвращает не одно значение а несколько(можна сказать структуру), то строка будет примерно вот такого типа:
Value1|Value2|...
Тоесть разделитель это символ |
Проблема в том, что мне нужно получить только одно конкретное значение(например первое), а не всю строку.

Как мне разбить эту строку?
Видел в интернете !insertmacro GET_STRING_TOKEN. Но у меня компилятор его не нашел, и оно я так понял разделяет строку с пробелами.

K.A.V. 01-02-2010 07:54 1335629

Цитата:

Цитата NoName01.cpp
Видел в интернете !insertmacro GET_STRING_TOKEN »

Читали здесь?
Там нужно добавить целую страницу кода :) И как покзано в том коде, ещё нужно создать пару переменных с помощью !define:
Код:

!define PART ""
!define INPUT ""

Я сам не тестировал, поэтому сказать наверняка не могу :)


Но могу представить на обозрение собственный механизм ;)
читать дальше »
В начале кода:
Код:

!include "StrFunc.nsh"
${StrStrAdv}
${StrRep}

Предположу, что наша строка хранится в переменной $1
Код:


strcpy $1 "C|Program Files|NSIS|test1|test2"

# Предварительно, необходимо добавить символ "|" в конец строки, чтобы прочитать последнее значение
StrCpy $1 "$1|"

now:
  ${StrStrAdv} $0 "$1" "|" ">" "<" "0" "0" "1"
  StrCmp $0 "" end 0
# Выполняем код, который нужен [ начало ]
MessageBox MB_OK|MB_ICONINFORMATION "$0$\n$1"
# Выполняем код, который нужен [ конец ]

# Продолжаем фильтр строки
  ${StrRep} $1 "$1" "$0|" ""
goto now
end:




dracosha, с секциями можно вот так реализовать:
читать дальше »
Код:

Function .onSelChange
SectionGetFlags ${section1} $1
StrCmp $1 "0" 0 noUnCheck
SectionSetFlags ${section2} 0
SectionSetFlags ${section3} 0
SectionSetFlags ${section4} 0
noUnCheck:
FunctionEnd




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

NoName01.cpp 02-02-2010 17:39 1337092

Люди, как сделать чтобы при запуске денисталлятора автоматом выбирался язык который юзер выбрал при запуске инсталлятора?
Записывать выбранный язык в реестр?

K.A.V. 02-02-2010 17:45 1337095

Цитата:

Цитата NoName01.cpp
Люди, как сделать чтобы при запуске денисталлятора автоматом выбирался язык который юзер выбрал при запуске инсталлятора?
Записывать выбранный язык в реестр? »

А почему бы и нет, вы всё равно создаёте ветку программы в Uninstall в реестре, от добавления 1 параметра я думаю ничего плохого не случится ;)

orthodox 02-02-2010 20:06 1337215

Подскажите, пожалуйста!
Нашел в примерах такое
System::Call '${sysSetupCopyOEMInf}?e (R1, R2, ${SPOST_PATH}, 0, 0, 0, 0, 0) .r0'
Я так понимаю, что таким образом формируется список параметров. Ткните носом, где можно найти описание такого синтаксиса передачи параметров. Ни в документации на nsis.sourceforge.net, ни поиском не могу по этому поводу ничего найти. Наверное не везет :search:

K.A.V. 02-02-2010 20:10 1337219

\Program Files\NSIS\Docs\System\System.html
+
Calling an external DLL using the System.dll plugin

NoName01.cpp 02-02-2010 21:50 1337311

У меня такая проблемка.
Можно ли прочитать имена (не значения) всех параметров одного из разделов реестра?

hb860 03-02-2010 08:29 1337591

NoName01.cpp,
Код:

StrCpy $0 0
loop:
  ClearErrors
  EnumRegValue $1 HKLM Software\Microsoft\Windows\CurrentVersion $0
  IfErrors done
  IntOp $0 $0 + 1
  ReadRegStr $2 HKLM Software\Microsoft\Windows\CurrentVersion $1
  MessageBox MB_YESNO|MB_ICONQUESTION "$1 = $2$\n$\nMore?" IDYES loop
done:

2all
Новая статейка: Создание своего инсталлятора на NSIS. Ассоциации файлов. Макросы. Если есть что дополнить - пишите.

andreyl 03-02-2010 13:03 1337784

Доброго дня.

Подскажите кто нибудь сумел прикрутить библиотеку 7z.dll к nsis?
Меня интересует как использовать функции которые она содержит:
- 7z::CreateObject
- 7z::GetHandlerProperty
- 7z::GetHandlerProperty2
- 7z::GetMethodProperty
- 7z::GetNumberOfFormats
- 7z::GetNumberOfMethods
- 7z::SetLargePageMode

kuchkan 04-02-2010 11:21 1338663

Полезный советик.
Не пинайте, если уже обсуждалось.
Думаю, некоторые сталкивались с проблемой отображения приветствия в первом окне инсталятора, если имя и версия устанавливаемого приложения слишком длинные. Чтобы не извращатся над именем программы, дописывать дополнительные строки в стандартный скрипт, менять шрифт инсталятора и т.д., нашел, имхо, самый легкий выход из этого положения.
Если используете NSIS 2.46, интерфейс "MUI.nsh", то в файле ...\NSIS\Contrib\Modern UI\ioSpecial.ini, в 13 и 14 строках, вместо Left=120 и Right=315 прописываете соответственно Left=116 и Right=326. Всё! Получится, примерно, так:

Интерфейс от этого практически не пострадал, зато, под имя/версию теперь выделена целая строка, большенство длинных названий влезет...

K.A.V. 04-02-2010 16:12 1338927

Цитата:

Цитата NoName01.cpp
У меня такая проблемка.
Можно ли прочитать имена (не значения) всех параметров одного из разделов реестра? »

Обращаюсь ещё раз ко всем, особенно к новичкам, не ленитесь посидеть недельку и потестить функции, которые описаны в файле справки к NSIS, там всё доходчиво расписано, при применении какой функции какой будет результат.
Задавать вопросы, которые описаны в файле справки, это совсем не дело...

Цитата:

Цитата andreyl
Подскажите кто нибудь сумел прикрутить библиотеку 7z.dll к nsis?
Меня интересует как использовать функции которые она содержит: »

А оно кому-нибудь нужно? O_o
1. Чтобы DLL взаимодействовала с вашим инсталлятором (имею ввиду чтобы функции библиотеки принимали и отдавали значения) необходимо, чтобы сама DLL была написана специальным образом (там добавляются специальные функции)
2. Если DLL не написана специально для языка NSIS (т.е. это не плагин к NSIS), как в нашем случае, то для того, чтобы передать и получить данные в/из функции, необходимо вызывать функции библиотек через System.dll

Цитата:

Цитата kuchkan
Полезный советик. »

Да, для кого-то он полезен, данный файл предназначен для настройки отображения страницы приветствия.
Не хотите более подробно описать, за что отвечает каждый элемент в данном файле конфигурации?
hb860 знает, почему я это говорю ;) :) :) :)

Да, кстати, hb860 единственное пожелание к статьям, это то, как ты выделяешь двойные кавычки... #23

hb860 04-02-2010 16:48 1338959

Цитата:

Цитата K.A.V.
единственное пожелание к статьям »

Я так делаю, потому что:
1. их так лучше видно в Notepad++
2. это способ экранирования в NSIS спецсимоволов. Люблю единую системы экранирования. Да, я знаю про одинарные и двойные, но предпочитаю использовать $\"это$\".

kuchkan 04-02-2010 21:02 1339178

Цитата:

Цитата K.A.V.
Не хотите более подробно описать, за что отвечает каждый элемент в данном файле конфигурации? »

Я не настолько подкован, чтобы писать мануалы :). Действовал методом тыка...
Понял, что:
[Field 1] - это координаты для картинки
[Field 2] - координаты для приветствия, то что жирным шрифтом
[Field 3] - координаты для остального текста
NumFields=3 - по видимому, количество элементов
Количество элементов на странице, с помощью ioSpecial.ini, можно увеличивать, как на странице приветствия, так и на финишной странице. Например, линк на сайт. Примеры здесь и здесь.
Вот и все мои познания :)

andreyl 07-02-2010 20:46 1341547

Цитата:

Цитата K.A.V.
Цитата andreyl:
Подскажите кто нибудь сумел прикрутить библиотеку 7z.dll к nsis?
Меня интересует как использовать функции которые она содержит: »
А оно кому-нибудь нужно? O_o
1. Чтобы DLL взаимодействовала с вашим инсталлятором (имею ввиду чтобы функции библиотеки принимали и отдавали значения) необходимо, чтобы сама DLL была написана специальным образом (там добавляются специальные функции)
2. Если DLL не написана специально для языка NSIS (т.е. это не плагин к NSIS), как в нашем случае, то для того, чтобы передать и получить данные в/из функции, необходимо вызывать функции библиотек через System.dll »

Спасибо за совет, теперь хотя-бы ошибки при старте нет.
Но вызов через
Код:

System::Call "7z::CreateObject()"
ни чего не дал.
Параметров я все-же не знаю.

K.A.V. 07-02-2010 22:12 1341604

Когда вызываются функции библиотек с помощью System.dll, предполагается, что вызываемая библиотека должна находиться в системном каталоге (System32), в нашем случае, в System32 должна находиться библиотека 7z.dll

Цитата:

Цитата andreyl
Параметров я все-же не знаю. »

Здесь я вам тоже ничего посоветовать не могу, т.к. не вникал в синтаксис System.dll

Painkiller 08-02-2010 18:16 1342258

K.A.V. , как там на счёт кода когда при выборе компонента отображалась картинка? Очень надо

K.A.V. 08-02-2010 19:35 1342330

Painkiller, я сейчас занят...просто нет свободного времени, как будет так посмотрю (возможно даже завтра)

NoName01.cpp 08-02-2010 22:20 1342501

Люди, а можно на nsis написать обработчик нажатий клавиш?

hb860 09-02-2010 00:50 1342620

нажатий где ? в окне или глобально в системе ?
и самое главное - зачем ??

K.A.V. 09-02-2010 16:23 1343128

Цитата:

Цитата NoName01.cpp
Люди, а можно на nsis написать обработчик нажатий клавиш? »

:o
NSIS пора наверно С/С++ вытеснять? :lol:
Не пробовал, но в самом NSIS вы такого не напишите, можно написать библиотеку на С/С++ и вызывать её, но мне кажется маловероятным использование данной библиотеки, например, на странице выбора компонентов....


Показываем картинки на странице выбора компонентов при наведении курсора мыши на компоненты

Необходимо внести изменения в файл интерфейса (\Program Files\NSIS\Contrib\UIs\modern.exe)
Открываем данный файл с помощью ResHacker, переходим в диалог 105
Создаём элемент "BITMAP", устанавливаем ему идентификатор (поле ID), например 9999

*Вот только в этом неудобство, приходится подгонять, если добавлять элемент в диалог 104 (где и есть выбор компонентов), то при компиляции вы получите сообщение об ошибке

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

Открываем файл \Program Files\NSIS\Contrib\Modern UI\System.nsh (можно скопировать данный файл в каталог с вашим скриптом и редактировать его, чтобы не распростарнять изменения на ваши последующие скрипты, НО при этом, необходимо заменить строку !include "MUI.nsh" в вашем скрипте на !include "System.nsh"), ищем в данном файле строку
Код:

!insertmacro MUI_DESCRIPTION_BEGIN
После неё, вставляем код

Код:

StrCmp $0 ${section1} 0 +2
SetBrandingImage /IMGID=9999 "$exedir\MODERNUI\Addons\Images\SEC57.bmp"
StrCmp $0 ${section2} 0 +2
SetBrandingImage /IMGID=9999 "$exedir\MODERNUI\Addons\Images\SEC66.bmp"
StrCmp $0 ${section3} 0 +2
SetBrandingImage /IMGID=9999 "$exedir\MODERNUI\Addons\Images\SEC69.bmp"
StrCmp $0 ${section4} 0 +2
SetBrandingImage /IMGID=9999 "$exedir\MODERNUI\Addons\Images\SEC75.bmp"

Думаю здесь всё понятно?
9999 - идентификатор добавленного нами элемента
sectionX - идентификаторы секций
Ну а пути к файлам прописываем полные... :)
Да кстати, только BMP файлы, и как я писал раньше, все изображения должны быть одного разрешения, иначе получите глюки ;)

Ещё не устали? Это ещё не всё! :tongue:
Находим строчки, где прописаны какие странички инсталлера показывать (в вашем скрипте)

Код:

!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_COMPONENTS
page custom MyCustom
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH

Строчка, выделенная красным цветом обязательна! Если вы её не добавите, то ваши же изображения потом отобразятся на следующих страничках :) Короче говоря избавляемся от глюков ;)
Ну и последнее, добавляем функцию, которая и скрывает этот элемент (в вашем скрипте)
Код:

Function MyCustom
!include WinMessages.nsh
GetDlgItem $0 $HWNDPARENT 9999
ShowWindow $0 ${SW_HIDE}
FunctionEnd

Ну вообщем тестируйте сами, всю инфу которая нужна была - я выложил :)
И не смейте потом где-нибудь писать, что вы сами реализовали данную возможность! :aggressiv ;)

NoName01.cpp 09-02-2010 17:08 1343196

Цитата:

Цитата hb860
нажатий где ? в окне или глобально в системе ?
и самое главное - зачем ?? »

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

It4a 10-02-2010 22:07 1344209

Цитата:

Цитата K.A.V.
Показываем картинки на странице выбора компонентов при наведении курсора мыши на компоненты »

Ты просто мегачеловечище...... Обязательно в шапку. Т.к. после пары неудачных идей, я забил на всё это дело :sorry: , не справился, сделал просто вызов файла с описанием(скриншоты, текст, указатели), но данный пример одназначно применим, за что ещё раз спасибо.

hb860 10-02-2010 22:22 1344219

Цитата:

Цитата It4a
Обязательно в шапку. »

Конечно

XCV 15-02-2010 11:38 1347473

Уважаемый K.A.V., пару страниц назад задавал вам вопрос по поводу создания лога установки инсталятора нсис изменить скрипт которого нет возможности (есть ток скомпилированный вариант) вы вроде дали довольно понятное разъяснение на основе которого я сделал скрипт, но лог так и не получил :(, может я что не так сделал?
Вот скрипт:
Код:

!define PRODUCT_NAME "Nsis лог"
!define PRODUCT_VERSION "1.0"
;includes
!include "MUI.nsh"
!include "FileFunc.nsh"
!include "LogicLib.nsh"
SetCompressor /SOLID lzma
; MUI Settings
!define MUI_ABORTWARNING
;!define MUI_ICON "ico.ico"
; Welcome page
!insertmacro MUI_PAGE_WELCOME
; Finish page
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
; Language files
!insertmacro MUI_LANGUAGE "Russian"
!define LVM_GETITEMCOUNT 0x1004
!define LVM_GETITEMTEXT 0x102D
Name "${PRODUCT_NAME}"
OutFile "${PRODUCT_NAME}.exe"
Function DumpLog
  Exch $5
  Push $0
  Push $1
  Push $2
  Push $3
  Push $4
  Push $6
FindWindow $0 "#32770" "Заголовок окна files" ""
  GetDlgItem $0 $0 1016
  StrCmp $0 0 error
  FileOpen $5 $5 "w"
  StrCmp $5 0 error
    SendMessage $0 ${LVM_GETITEMCOUNT} 0 0 $6
    System::Alloc ${NSIS_MAX_STRLEN}
    Pop $3
    StrCpy $2 0
    System::Call "*(i, i, i, i, i, i, i, i, i) i \
      (0, 0, 0, 0, 0, r3, ${NSIS_MAX_STRLEN}) .r1"
    loop: StrCmp $2 $6 done
      System::Call "User32::SendMessageA(i, i, i, i) i \
        ($0, ${LVM_GETITEMTEXT}, $2, r1)"
      System::Call "*$3(&t${NSIS_MAX_STRLEN} .r4)"
      FileWrite $5 "$4$\r$\n"
      IntOp $2 $2 + 1
      Goto loop
    done:
      FileClose $5
      System::Free $1
      System::Free $3
      Goto exit
  error:
    MessageBox MB_OK error
  exit:
    Pop $6
    Pop $4
    Pop $3
    Pop $2
    Pop $1
    Pop $0
    Exch $5
FunctionEnd
Section "Inst"
 SetOutPath "$TEMP\files\"
 File /r "Files.exe"
Exec "$TEMP\files\files.exe"
SectionEnd
Section "-Post"
push "$DESKTOP\LOG.log"
Call DumpLog
SectionEnd

Заранее благодарен...
да забыл сказать что после выполнения полученной программы получаю красивое окошко с заголовком "error" и одной кнопочкой "ОК" (которое предусмотрено в скрипте)

Archius 18-02-2010 18:26 1350467

как сделать чтобы при создании ярлыка он запускался от имени админа

K.A.V. 19-02-2010 00:38 1350738

XCV, я привёл вам код, но его не тестировал, нет, он конечно работает, когда "вытаскивает" лог из текущей установки, а когда данный код используется для "вытаскивания" из другого окна инсталлера - почему-то не работает... :(
Хотя я проверял, дескрипторы окон одинаковые (когда вызывается вытаскивающий EXE и тот, в котором хранится лог), в чем проблема я не разбирался...да ведь и не особо нужно... ;)

XCV 19-02-2010 01:41 1350772

Цитата:

Цитата K.A.V.
да ведь и не особо нужно »

ну мне эт очень нужно, я перепаковываю инсталяторы (к примеру для добавления возможности тихой установки, или выбрасывания лишнего, или наоборот добавления компонентов.....), и многие собраны в нсис, и вместо того чтобы долго сидеть разбираться что куда надо кинуть, что зарегить, что дополнительно установить и т.д., намного проще было бы взять лог и исходя из него писать свой скрипт... Но видать не судьба, прийдется самому разбираться с каждой прогой в отдельности... хорошо в этом плане с инновскими инсталяторами, с них можно вырвать часть основную скрипта, жаль в нсис этого не сделать...

XCV 19-02-2010 17:36 1351269

ещё один вопрос господа профессионалы, в нсис скрипте команда
Код:

Exec "files.exe"
запускает какой либо процесс, как сделать чтобы инсталятор дождался конца выполнения этого процесса и только после этого продолжил свою работу?
ЗЫ:
Код:

ExecWait "files.exe"
тоже не ждет окончания работы запущенного процесса :(

K.A.V. 19-02-2010 17:53 1351285

Вообще ExecWait должен ждать...Посмотрите, PID процесса не меняется? Может запускаемый файл сам себя перезапускает :dont-know

XCV 19-02-2010 22:08 1351510

Цитата:

Цитата K.A.V.
Вообще ExecWait должен ждать...Посмотрите, PID процесса не меняется? »

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

XCV 20-02-2010 00:01 1351595

проблемму эту обошел, но все равно интересно на будущее

K.A.V. 20-02-2010 01:31 1351646

Цитата:

Цитата XCV
с этим можно бороться? »

Средствами только NSIS маловероятно...
Я бы сделал примерно следующее: написал бы DLL, которая получает список процессов, запущенных в данный момент, и, если полный путь процесса совпадает с файлом, который мы запускали, снова определяем запущенные процессы...когда процесс завершит свою работу, продолжаем... :)

XCV 20-02-2010 13:22 1351852

Цитата:

Цитата K.A.V.
написал бы DLL »

не, для меня это слишком....

K.A.V. 20-02-2010 14:02 1351878

Цитата:

Цитата XCV
не, для меня это слишком.... »

Ну тогда, например, можно искать запущенный процесс только по образу (если вы уверены в уникальности имени процесса :) ), а не по полному пути (например notepad.exe), наличие процесса может определить плагин Processes plug-in

XCV 20-02-2010 23:11 1352250

Цитата:

Цитата K.A.V.
наличие процесса может определить плагин Processes plug-in »

во, эт самое то...

andreyl 22-02-2010 15:30 1353323

Есть исходник библиотеки, нужно dll пересобрать как плагин для nsis.
Кто сталкивался, знает как и что нужно делать?

K.A.V. 22-02-2010 17:57 1353414

Вложений: 1
andreyl, там добавляется буквально 1 "h" файл, и вызывается функция (для инициализации с NSIS), ну ещё и заголовок функции меняется, ну и ещё 2 функции для передачи параметров из NSIS скрипта и получение данных из DLL :)

Пример пустой функции в прикреплённом архиве
В dllmain.c

#include "exdll.h"
Нужный файл :)

EXDLL_INIT();
Инициализация, без этой функции вы не сможете принимать/отдавать параметры

popstring(tmp);
Получаем данные из NSIS скрипта

pushstring(tmp);
Отправляем данные в NSIS скрипт

Переменная tmp должна быть типа Char

tiylar 22-02-2010 23:21 1353633

Всем привет раскажите про NSIS можно ли спомощью него перепокавать любую прогу и как? У меня есть пару програм которые просто не хотят устанавливатся с помошью обычных ключей. И плиз скажите как правельно покавать в SFX архивы. Заранеее спасибо.

Habetdin 23-02-2010 00:17 1353657

tiylar,
Цитата:

Цитата tiylar
NSIS [...] как? »

Создание своего инсталлятора на NSIS. Первые шаги
Ссылки на остальные уроки - в шапке ;)

Цитата:

Цитата tiylar
SFX »

Создание SFX-архива, SFX Creator - для создания SFX архивов

It4a 24-02-2010 22:39 1355191

Добрый вечер/день. Подскажите почему после компиляции иконка у скомпилированного файла не меняется(размер больше 1Gb) на указанную.

K.A.V. 25-02-2010 01:46 1355314

Цитата:

Цитата gora
Проблема известна и это проблема Windows. На больших SFX архивах или любых .exe файлах иконка "из файла" не отображается. Решения проблемы нет. »

Может из-за этого? А вообще, я не в курсе...ибо инсталляторы вообще не пишу :)

It4a 25-02-2010 22:56 1356034

Да именно так и есть из-за ограничения размера выполняемого файла иконка не отображается. Да я тоже не писАл инсталляторы, но вот пришлось, после, приблизительно, месяца я избавил себя от кучи проблем и беготни.

CyberMaster 02-03-2010 14:18 1359495

Подскажите пожалуйста, можно ли добавить в инсталлятор сразу все файлы и подпапки из директории pkgdir? (я имею ввиду одной командой, а не прописывать в скрипте каждый файл, который нужно включить в инсталлятор) и чтоб при распаковке инсталлятора, была сохранена структура папок, как в папке pkgdir?

K.A.V. 02-03-2010 14:51 1359520

CyberMaster
Код:

SetOutPath "Куда распаковать файлы"
File "Папка для упаковки\*.*"


CyberMaster 02-03-2010 22:42 1359879

K.A.V., да эт понятно :) вот только если папок штук 150 очень надоест прописывать пускай не каждый файл, но каждую папку. Поэтому я спрашивал можно ли добавить в инсталлятор сразу все файлы и подпапки из директории pkgdir?

hb860 02-03-2010 23:20 1359901

CyberMaster,
Код:

File /r "Папка для упаковки\*.*"
Всё что вам нужно - это дописать /r после слова File.

CyberMaster 03-03-2010 07:02 1360056

K.A.V., hb860, большое спасибо!
И еще один глупый вопрос :) Как изменить иконку деинсталлятора?

hb860 03-03-2010 10:28 1360143

Код:

!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"

MUI_ICON - это иконка инсталлятора,
MUI_UNICON - иконка деинсталлятора

Вы, например, можете использовать такой вариант:
Код:

!define MUI_ICON "d:\Мои иконки\windows.ico"

McG 05-03-2010 15:11 1361791

Подскажите кто нибудь как сделать картинку фона при инсталляции? (Смотрел пример в папке Examples но нифига не понял)
И еще такой вопрос, можно ли сделать музыку при инсталляции и если можно то как?

K.A.V. 05-03-2010 17:03 1361863

McG

В начале кода
Код:

!define MUI_CUSTOMFUNCTION_GUIINIT myGuiInit
В любом месте кода
Код:

Function myGuiInit
  BgImage::SetBg "D:\...\...\bground.bmp"
  BgImage::Redraw
  BgImage::Sound "D:\...\...\song.wav"
FunctionEnd


hb860 06-03-2010 00:13 1362126

K.A.V., включи в учебник

CyberMaster 06-03-2010 03:34 1362178

Перепробовал штук 20 скинов SkinCrafter Plugin и не один не работает, кроме Skinastic.skf. С чем это связано и можно ли решить данную проблему?

K.A.V. 06-03-2010 04:23 1362186

CyberMaster, шапка данной темы обязательна для прочтения

Расширение функциональности -> Интерфейс SkinCrafter Plugin -> Инструкция по использованию от K.A.V.

McG 06-03-2010 06:12 1362191

K.A.V., я так понимаю сначала звук и картинку нужна распаковать в папку TEMP а потом читать их оттуда функцией BgImage. А как так сделать чтоб при запуске инсталлятора сразу само распаковывались звук и картинка в папку TEMP а по окончанию действий инсталлятора удалялись оттуда?

CyberMaster 06-03-2010 06:16 1362192

K.A.V., да я читал это естественно. И библиотеку которую вы давали тоже юзал (собственно на другой библиотеке вообще не один скин не грузится).

K.A.V. 06-03-2010 06:32 1362193

McG
Файлы bground.bmp и song.wav должны находиться в одной папке с вашим скриптом
Код:

Function myGuiInit
File /oname=$TEMP\bground.bmp bground.bmp
File /oname=$TEMP\song.wav song.wav
  BgImage::SetBg "$TEMP\bground.bmp"
  BgImage::Redraw
  BgImage::Sound "$TEMP\song.wav"
FunctionEnd

Код:

Function .onGUIEnd
  Delete "$TEMP\bground.bmp"
  Delete "$TEMP\song.wav"
FunctionEnd


CyberMaster, вот вам моя библиотека, качал не помню когда, удалил парочку ресурсов, тем самым размер сократился с 5 Мб до 300 Кб, функционал не поврежден :)
Подгружаются все скины (по крайней мере какие я тестировал, а их примерно штук 20 было :) )
Забыл, обращаться с вызовом функции нужно к System.dll

ant20 15-03-2010 13:45 1369126

Это реально сделать, если да то подскажите плз как.

Производим вызов файла инсталятора с различными параметрами. Внутри инсталера в зависимости от значений параметров производится дальнейшая установка.

K.A.V. 15-03-2010 18:22 1369309

ant20

В начале кода
Код:

!include "FileFunc.nsh"
Затем
Код:

Function .onInit
${GetParameters} $R0

${GetOptions} "$R0" "/Test" $R1
IfErrors +2 0
call MyFunc1
FunctionEnd

Вся командная строка помещается в переменную $R0
Функция GetOptions определяет 1 параметр и его значение (если есть), например, командная строка инсталлятора:
Код:

C:\Install.exe /Silent /Test 12345 /OtherPar
при вызове функции с параметром /Test в переменную $R1 поместится текст 12345, т.к. после параметра ему указанно значение, если данный параметр будет указан (вне зависимости от значения), то будет выполнена функция MyFunc1

hb860 15-03-2010 18:51 1369331

ant20, посмотрите пример в топике про оперу. Я там как раз разбираю командную строку, http://forum.oszone.net/thread-49157.html

А вообще, принцип тот же, что описал выше уважаемый (как минимум мной) K.A.V..

GAleM 18-03-2010 17:35 1371672

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

Конкретнее, есть русская программа, она была переведена на английский, все сопутствующие с ней файлы остались прежними - изменился только exe'файл программы. Цель добавить в дистрибутив файлы "Программа_rus.exe" и "Программа_eng.exe", и в зависимости от выбранного языка инстяллятора один из этих файлов будет установлен с именем "Программа.exe".

hb860 19-03-2010 08:35 1372086

Можно
Код:

Section "!${PRODUCT_NAME}" secOPERA
  SetOutPath "$INSTALLDIR"
  File  "$(File_Ru)"
  File  "Все остальные файлы"
.....
......
......
SectionEnd
............
LangString File_Ru ${LANG_RUSSIAN} "d:\мой русский.ехе"
LangString File_En ${LANG_RUSSIAN} "d:\мой английский.ехе"

Или
Код:

Section "!${PRODUCT_NAME}" secOPERA
  SetOutPath "$INSTALLDIR"
  File /r /x "программа.exe"  "d:\файлы программы\*.*"
  File /oname "программа.exe" $(File_Ru)
.....
......
......
SectionEnd
............
LangString File_Ru ${LANG_RUSSIAN} "d:\мой русский.ехе"
LangString File_En ${LANG_RUSSIAN} "d:\мой английский.ехе"

Вот по такому принципу

kotkovets 19-03-2010 13:25 1372328

Подскажите пожалуйста,как реализовать выбор одного компонента исключающий выбор других компонентов в пределах одной секционной группы компонентов? т.е:
Код:

SectionGroup "A"

Section 1
SectionEnd

Section 2
SectionEnd

Section 3
SectionEnd

SectionGroupEnd


K.A.V. 19-03-2010 13:39 1372338

Цитата:

Цитата GAleM
Можно ли сделать, чтобы в зависимости от выбранного пользователем языка, при запуске инсталлятора, был установлен тот или иной файл? »

hb860, можно сделать проще :)
В переменной $LANGUAGE хранится ID выбранного языка (1033 - выбрали английский, 1049 - выбрали русский), поэтому распаковку файла можно реализовать гораздо проще:

Код:

Section "Моя программа"
SetOutPath $INSTDIR
StrCmp $LANGUAGE "1049" 0 +3
File /oname="$INSTDIR\Program.exe" "Rus.exe"
goto +2
File /oname="$INSTDIR\Program.exe" "Eng.exe"
SectionEnd

kotkovets, видите ссылку в моей подписи? Справочник по NSIS
Там описано, и в этой теме в доль и поперёк уже разжевали до немогу работу с секциями

Имейте совесть, ну пожалуйста, мы уже даже не направляем никого в файл помощи NSIS, мы просим вас хотя бы прочитать наш справочник на русском языке, это не совсем дико звучит?

hb860, оформи ссылку на справочник в шапку темы, выделив его жирным красным цветом :)
И шрифт примерно на 72 сделать, чтобы все увидили :biggrin:

совсем все обленились, даже лень русский help почитать...

kotkovets 19-03-2010 14:24 1372373

За справочник спасибо! но, когда отметишь группу А, отмечаются два компонента или все, а нужно только один компонент или снять все компонеты.
Код:

SectionGroup /e A
;file
Section "Компонент №1" ID_1
SectionEnd

Section /o "Компонент №2" ID_2
SectionEnd

Section /o "Компонент №3" ID_3
SectionEnd

SectionGroupend

Function .onSelChange

; Выбор между компонентам 1, 2, 3
  !insertmacro StartRadioButtons $1
    !insertmacro RadioButton ${ID_1}
    !insertmacro RadioButton ${ID_2}
    !insertmacro RadioButton ${ID_3}
  !insertmacro EndRadioButtons

FunctionEnd

Function .onInit

  StrCpy $1 ${ID_1}

FunctionEnd


K.A.V. 20-03-2010 07:48 1372955

kotkovets, я из принципа вам сейчас не дам готовый ответ, ведь я не зря вам написал:
Цитата:

Цитата K.A.V.
и в этой теме в доль и поперёк уже разжевали до немогу работу с секциями »

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

kotkovets 20-03-2010 22:57 1373487

K.A.V просматривал я всю ветку темы, однако сам не смог разобраться, по этому просил помочь.

K.A.V. 21-03-2010 04:40 1373594

Разобраться в чем? Не у меете читать по-русски? Или просто лень читать все посты?
Пост #307

kotkovets 21-03-2010 13:47 1373718

Как реализовать выбор одного компонента одним нажатием исключающие выбор двух других компонентов в одной группе? на примере поста #307 выбор получается двойным нажатием...

hb860 28-03-2010 20:54 1379313

В рамках учебника:
Создание своего инсталлятора на NSIS. Определяем системный диск

hb860 29-03-2010 08:22 1379565

Цитата:

Цитата Lisabon
Имеется две папки, например, папка х86 и папка х64. В каждой папке будет по одному MSI файлу, например, в папке х86, будет файл Run_х86.msi и в папке х64, будет файл Run_х64.msi. Так вот сама задача, необходимо, чтоб, на 32-х битной системе, устанавливался и распаковывался, только файл Run_х86.msi, а на 64-х битной системе, устанавливались и распаковывались, как файл Run_х86.msi, так и файл Run_х64.msi.
Распаковка обеих папки будет производиться в $TEMP.

Если вам не сложно, то можно написать пример скрипта.

Прочитайте, пожалуйста, это:
Создание своего инсталлятора на NSIS. Один инсталлятор для x86 и х64 систем сразу

Там есть пример скрипта. Вам надо его доработать во так
Код:

Section
SetOutPath "$TEMP"
File "d:\исходные файлы\Run_х86.msi"
ExecWait "команда установки MSI пакета Run_х86.msi"
${If} ${RunningX64}
      File "d:\исходные файлы\Run_х64.msi"
      ExecWait "команда установки MSI пакета Run_х64.msi"
${EndIf}
......
продолжение скрипта

На будущее, давайте писать-таки вопросы не мне в приват, а в эту ветку. Ваши вопросы и ответы могут оказаться полезными для других участников!

Krinkels 09-04-2010 10:47 1388582

Доброго времени суток, друзья. Не подскажете как сделать чтоб отображались проценты распакованных файлов. Вот скрин

Krinkels 09-04-2010 20:08 1389002

Вопрос снимается, разобрался сам. Все дело было в строчке SetCompressor /FINAL /SOLID lzma

K.A.V. 10-04-2010 13:36 1389425

Цитата:

Цитата kotkovets
Как реализовать выбор одного компонента одним нажатием исключающие выбор двух других компонентов в одной группе? на примере поста #307 выбор получается двойным нажатием... »

Я предлагаю - вы отказываетесь, если вам лень нажать пару раз - дело ваше, пишите собственный механизм и оглашайте его здесь
Для меня данная возможность не очень уж такая нужная, чтобы тратить время на разработку более лучшего механизма

kotkovets 14-04-2010 14:13 1392334

Цитата:

Цитата K.A.V.
Я предлагаю - вы отказываетесь, если вам лень нажать пару раз - дело ваше, пишите собственный механизм »

Решил сам вопрос вызовом модуля nsDialogs , с помощью вашего
Справочника NSIS .

Krinkels 15-04-2010 11:06 1393135

Друзья, помогите решить таков вопрос. Проверить версию установленной программы, и если ее версия больше устанавливаемой то выдать сообщение "Установка на более новую версию запрещена".

K.A.V. 15-04-2010 13:37 1393244

Вложений: 1
В начале кода:
Код:

!include "VersionCheck.nsh"
Сама проверка версии:
Код:

ReadRegStr $0 HKLM "SOFTWARE\MySoft\MyProgram" "Version"
${VersionCheck} "2.0.0.0" "$0" "$1"
StrCmp $1 "2" 0 okVer
MessageBox MB_OK|MB_ICONSTOP "Установка на более новую версию запрещена"
quit
okVer:

2.0.0.0 замените на версию, которую в данный момент устанавливаете (можно например заменить переменной ${PRODUCT_VERSION})
Ну и измените путь к параметру в реестре, который содержит версию установленной программы

P.S.
Перед компиляцией прикреплённый файл необходимо распаковать в директорию "Include" (\Program Files\NSIS\Include)

Krinkels 15-04-2010 14:24 1393285

K.A.V.
Вот спасибо, выручил.

SamLab 15-04-2010 17:38 1393466

Кто подскажет как зарегистрировать библиотеки под Win7 x64 - RegDLL только в x86 работает?

K.A.V. 15-04-2010 18:59 1393495

Цитата:

Цитата SamLab
RegDLL только в x86 работает? »

Это вопрос или утверждение? :)
Пробовали RegDLL?
Пробовали простым обращением к $SYSDIR\regsvr32.exe? (как в Win 7 не в курсе)
Пробовали RequestExecutionLevel admin? (ну мало ли, этот UAC ;))

И вот ещё (взял отсюда) попробуйте:
Код:

  !define LIBRARY_X64
  ${If} ${RunningX64}
    !insertmacro InstallLib REGDLL NOTSHARED REBOOT_PROTECTED "dll_64.dll" $INSTDIR\dll_64.dll "$INSTDIR"
  ${Else}
    !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED "dll_64.dll" $INSTDIR\dll_64.dll "$INSTDIR"
  ${Endif}
  !undef LIBRARY_X64


Krinkels 15-04-2010 21:20 1393578

Друзья, помогите добавить в этот скрипт выбор установки ярлыков (Для всех пользователей; Для текущего)
читать дальше »
!define PRODUCT_NAME "My Prog"

!include "MUI2.nsh"

!insertmacro MUI_PAGE_WELCOME

!insertmacro MUI_PAGE_DIRECTORY
Page custom Select Selected
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

Name "My Prog"
OutFile "setup.exe"
InstallDir "$PROGRAMFILES\My Prog"

Function .onInit
InitPluginsDir
File /oname=$PLUGINSDIR\Setting.ini "Setting.ini"
FunctionEnd

Function Select
InstallOptions::dialog "$PLUGINSDIR\Setting.ini"
Pop $0
InstallOptions::show
Pop $0
FunctionEnd

Var Chk1
Var Chk2
Var Chk3

Function Selected
ReadINIStr $0 "$PLUGINSDIR\Setting.ini" "Settings" "State"
StrCmp $0 0 done
StrCmp $0 2 Desctop
StrCmp $0 3 Shortcut
StrCmp $0 4 Pusk
Abort

Desctop:
ReadINIStr $Chk1 "$PLUGINSDIR\Setting.ini" "Field 2" "State"
Abort

Shortcut:
ReadINIStr $Chk2 "$PLUGINSDIR\Setting.ini" "Field 3" "State"
Abort

Pusk:
ReadINIStr $Chk3 "$PLUGINSDIR\Setting.ini" "Field 4" "State"
Abort

done:
FunctionEnd

Section -Post
StrCmp $Chk1 "1" 0 No_Check_1
CreateShortCut "$DESKTOP\My Prog.lnk" "$INSTDIR\prog.exe"

No_Check_1:
StrCmp $Chk2 "1" 0 No_Check_2
CreateShortCut "$QUICKLAUNCH\My Prog.lnk" "$INSTDIR\prog.exe"

No_Check_2:
StrCmp $Chk3 "1" 0 No_Check_3
CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}\"
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\My Prog.lnk" "$INSTDIR\prog.exe"
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
No_Check_3:
SectionEnd
читать дальше »
[Settings]
NumFields=4

[Field 1]
Type=GroupBox
Left=0
Top=0
Right=300
Bottom=140
Text=Иконки

[Field 2]
Type=CheckBox
Flags=NOTIFY
Left=16
Top=16
Right=159
Bottom=28
Text=Иконка на рабочий стол

[Field 3]
Type=CheckBox
Flags=NOTIFY
Left=16
Top=32
Right=223
Bottom=45
Text=Иконка на панель быстрого запуска

[Field 4]
Type=CheckBox
Flags=NOTIFY
Left=16
Top=48
Right=191
Bottom=61
Text=Создать группу в меню "Пуск"

hb860 15-04-2010 23:42 1393686

Цитата:

Цитата K.A.V.
Пробовали простым обращением к $SYSDIR\regsvr32.exe? (как в Win 7 не в курсе) »

Есть там такое, никуда не делось
Цитата:

Цитата SamLab
RegDLL только в x86 работает »

А в х64 разве не работает? Работает оно.
Цитата:

Цитата K.A.V.
RequestExecutionLevel admin »

Не надо, UAC сам вылезет на сетапер
Цитата:

Цитата K.A.V.
И вот ещё (взял отсюда) попробуйте: »

"Полезное сообщение"

K.A.V., было круто видеть ваши статьи у себя на сайте ;)

Krinkels, к чему ТАКОЙ изврат?
Почему бы секциями не сделать?

Компилить я этот код не буду, я вам напишу, что добавить.
Вверх:
Код:

Var Chk4
....
Function Selected
...
ReadINIStr $Chk4 "$PLUGINSDIR\Setting.ini" "Field 5" "State"
.....

Section -Post
StrCmp $Chk4 0 +2
SetShellVarContext all

....

Вниз:
Код:

[Field 5]
Type=CheckBox
Flags=NOTIFY
Left=16
Top=55
Right=191
Bottom=61
Text=Ярлыки для всех пользователей

Если это писали вы - я вам рекомендую подумать над стилем реализации ваших скриптов

Krinkels 16-04-2010 08:28 1393843

hb860
Цитата:

Цитата hb860
к чему ТАКОЙ изврат?
Почему бы секциями не сделать? »

Да вид мне не нравиться. А через свою страничку можешь сделать что угодно и придать этому любой вид

Цитата:

Цитата hb860
Если это писали вы - я вам рекомендую подумать над стилем реализации ваших скриптов »

Да, это писал я. А чем тебе стиль не нравится? Вроде нормально написано.

K.A.V. 16-04-2010 08:47 1393852

Krinkels
Заключайте пожалуйста команды/скрипты в тег CODE, неудобно читать пост

Вторая функция в InstallOptions используется только тогда (в вашем случае Selected), когда мы хотим выполнить какие-либо действия в режиме реального времени (например при отметки галочкой какого-либо пункта сделать другой элемент неактивным), в вашем же случае, вы просто читаете значения параметров, поэтому функция Selected вам не нужна, ну по крайней мере, зачем писать лишнее? ;)

Вот как будет выглядеть "правильнее"


Код:

!define PRODUCT_NAME "My Prog"

!include "MUI2.nsh"

!insertmacro MUI_PAGE_WELCOME

!insertmacro MUI_PAGE_DIRECTORY
Page custom Select
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

Name "My Prog"
OutFile "setup.exe"
InstallDir "$PROGRAMFILES\My Prog"

Function .onInit
InitPluginsDir
File /oname=$PLUGINSDIR\Setting.ini "Setting.ini"
FunctionEnd

Var Chk1
Var Chk2
Var Chk3

Function Select
InstallOptions::dialog "$PLUGINSDIR\Setting.ini"
Pop $0
InstallOptions::show

ReadINIStr $Chk1 "$PLUGINSDIR\Setting.ini" "Field 2" "State"
ReadINIStr $Chk2 "$PLUGINSDIR\Setting.ini" "Field 3" "State"
ReadINIStr $Chk3 "$PLUGINSDIR\Setting.ini" "Field 4" "State"

StrCmp $Chk1 "1" 0 No_Check_1
CreateShortCut "$DESKTOP\My Prog.lnk" "$INSTDIR\prog.exe"

No_Check_1:
StrCmp $Chk2 "1" 0 No_Check_2
CreateShortCut "$QUICKLAUNCH\My Prog.lnk" "$INSTDIR\prog.exe"

No_Check_2:
StrCmp $Chk3 "1" 0 No_Check_3
CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}\"
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\My Prog.lnk" "$INSTDIR\prog.exe"
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
No_Check_3:
FunctionEnd


Krinkels 16-04-2010 09:13 1393868

K.A.V.,
Цитата:

Цитата K.A.V.
Заключайте пожалуйста команды/скрипты в тег CODE, неудобно читать пост »

Без проблем.

Цитата:

Цитата K.A.V.
Вторая функция в InstallOptions используется только тогда (в вашем случае Selected), когда мы хотим выполнить какие-либо действия в режиме реального времени (например при отметки галочкой какого-либо пункта сделать другой элемент неактивным), в вашем же случае, вы просто читаете значения параметров, поэтому функция Selected вам не нужна, ну по крайней мере, зачем писать лишнее?
Вот как будет выглядеть "правильнее" »

У меня ярлыки создаются во время установки, а в приведенном тобой исправленном скрипте они создаются в реальном времени. А это жутко не удобно. Изначально мой скрипт создание ярлыков выглядел примерно так же, но я от него отказался :)

K.A.V. 16-04-2010 12:01 1393965

Цитата:

Цитата Krinkels
У меня ярлыки создаются во время установки, а в приведенном тобой исправленном скрипте они создаются в реальном времени »

Ну так а в чем проблема перекинуть
Код:

StrCmp $Chk1 "1" 0 No_Check_1
CreateShortCut "$DESKTOP\My Prog.lnk" "$INSTDIR\prog.exe"

No_Check_1:
StrCmp $Chk2 "1" 0 No_Check_2
CreateShortCut "$QUICKLAUNCH\My Prog.lnk" "$INSTDIR\prog.exe"

No_Check_2:
StrCmp $Chk3 "1" 0 No_Check_3
CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}\"
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\My Prog.lnk" "$INSTDIR\prog.exe"
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
No_Check_3:

в секцию "-Post"? (как у вас было)
Значения то мы прочитали...я просто дал вам пример того, что вторая функция "Selected" вовсе не нужна...Ну вообщем делайте как считаете нужным ;)

Krinkels 16-04-2010 12:16 1393979

K.A.V.
Спасибо за совет, вечером обязательно попробую :)

SamLab 20-04-2010 14:04 1396850

hb860, У меня на Windows 7 HP x64 не работает RegDLL

hb860 20-04-2010 23:01 1397291

Похоже, у меня либа просто реганая оставалась. На чистой системе и у меня не работает.
Говорят, regDLL вызывается из 32битного инсталлятора и работать вовсе не должна.
В форумах нсис говорят юзать то, что предложил K.A.V.:
Цитата:

Цитата K.A.V.
И вот ещё (взял отсюда) попробуйте:
Код:
!define LIBRARY_X64
${If} ${RunningX64}
!insertmacro InstallLib REGDLL NOTSHARED REBOOT_PROTECTED "dll_64.dll" $INSTDIR\dll_64.dll "$INSTDIR"
${Else}
!insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED "dll_64.dll" $INSTDIR\dll_64.dll "$INSTDIR"
${Endif}
!undef LIBRARY_X64 »


kotkovets 21-04-2010 01:06 1397353

А как поменять картинку чекбоксов в модуле nsDialogs ?

Sudno 21-04-2010 20:25 1397961

Полный ноль в NSIS, но надо создать инсталлятор. Подскажите пожалуйста:
1) как сделать так чтобы место установки бралось из реестра? т.е. проверялся ключ уже на компьютере где идет установка и в качестве пути по умолчанию предлагался бы найденный в реестре ключ
2) нужно будет создавать патчи, возможно ли такое в NSIS?
3) где можно поменять стандартный текст (типа "Вас приветствует мастер...")?
4) как добавить свою картинку в поле слева (видел такое в разных NSIS'овских инсталлерах)?

NoName01.cpp 22-04-2010 18:19 1398665

Здраствуйте! Инсталлятор должен зарегистрировать службу. Кто-то знает как такое делается на NSIS?

hb860 22-04-2010 20:20 1398739

Цитата:

Цитата Sudno
1) как сделать так чтобы место установки бралось из реестра? т.е. проверялся ключ уже на компьютере где идет установка и в качестве пути по умолчанию предлагался бы найденный в реестре ключ »

в функции .onInit прочитать значение ключа
Код:

Function .onInit
ReadRegStr $0 HKCU Software\mysoft "setuppath"
StrCpy $INSTDIR $0
FunctionEnd

Цитата:

Цитата Sudno
2) нужно будет создавать патчи, возможно ли такое в NSIS? »

скажу честно - не знаю насчёт NSIS, обычно такие вещи делаются чем-то другим. Например, патчи ресурсов компилируются Restorator'ом
Цитата:

Цитата Sudno
3) где можно поменять стандартный текст (типа "Вас приветствует мастер...")? »

Из справки:
Цитата:

MUI_WELCOMEPAGE_TITLE title Title to display on the top of the page.
MUI_WELCOMEPAGE_TITLE_3LINES Extra space for the title area.
MUI_WELCOMEPAGE_TEXT text Text to display on the page.
Код:

Таким обзразом,
!define MUI_WELCOMEPAGE_TITLE "Заголовок"
!define MUI_WELCOMEPAGE_TEXT "Вас привествует мастер Онотоле. Щас будем мастерить глиняный горшок"

Цитата:

Цитата Sudno
как добавить свою картинку в поле слева (видел такое в разных NSIS'овских инсталлерах)? »

Вот тут гляньте c:\Program Files\NSIS\Docs\Modern UI 2\Readme.html
и вот тут http://forums.shoutcast.com/showthread.php?t=208627
Там всё есть.
-------------------------------------------------------
Цитата:

Цитата NoName01.cpp
Здраствуйте! Инсталлятор должен зарегистрировать службу. Кто-то знает как такое делается на NSIS? »

Есть офигительный плагин для управления службами

Habetdin 22-04-2010 20:58 1398775

Цитата:

Цитата Sudno
как сделать так чтобы место установки бралось из реестра? т.е. проверялся ключ уже на компьютере где идет установка и в качестве пути по умолчанию предлагался бы найденный в реестре ключ »

Код:

!define PRODUCT_DIR_REGKEY "Software\Bla-Bla Soft\The Program"

InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" "InstallPath"

Section -Post
  ...
  WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "InstallDir" "$INSTDIR"
  ...
SectionEnd

Section Uninstall
  ...
  DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"
  ...
SectionEnd


hb860 23-04-2010 10:49 1399102

Habetdin, сообщение полезное ;)

Цитирую справку:
Цитата:

For more advanced install directory configuration, set $INSTDIR in .onInit.
Я сразу это и предложил.

SamLab 26-04-2010 11:48 1400902

Еще одну проблему обнаружил - на 64-битной семерке не удаляются ярлыки и группа прогаммы из меню Пуск - хотя из папки в каталоге Users линки удаляются, но в самом Пуске они видны - как это победить?

ilias_div 27-04-2010 11:03 1401605

Попробую повторить вопрос от Archius - ибо тема для меня важная, а ответов так и не было...
В Windows 7, Server 2008 и т.п. в ярлыках приложений во вкладке "совместимость" появилась галочка "Выполнять эту программу от имени администратора". Некоторые мои приложения (например, настройка служб моей системы) без этой галочки работают некорректно - в случае этой утилиты, система отрубает приложению доступ к SCM.
Может ли NSIS создавать ярлыки (в меню пуск, на рабочем столе) - у которых галочка "Выполнять эту программу от имени администратора" будет установлена по умолчанию? Может, есть какие расширения для этого?

hb860 27-04-2010 15:55 1401854

Цитата:

Цитата SamLab
как это победить? »

поставлю х64 - посмотрю
Юр, вот тут глянь http://nsis.sourceforge.net/Shortcut..._Windows_Vista
Цитата:

Цитата ilias_div
Может ли NSIS создавать ярлыки (в меню пуск, на рабочем столе) - у которых галочка "Выполнять эту программу от имени администратора" будет установлена по умолчанию? Может, есть какие расширения для этого? »

Насколько мне известно, нет

SamLab 28-04-2010 17:40 1402737

hb860, Спасибо - до нынешнего времени интернет был с трафиком и лазять по сетке накладно было и не мог сам найти все это безобразие

Lisabon 01-05-2010 20:08 1404804

hb860, собственно у меня вопрос:

Можно ли в NSIS сделать так, к примеру, у меня есть основная секция, например, PROGRAM_BASE и один дополнительный компонент, напрмер, COMPONENT, который помещён в SectionGroup, сам COMPONENT, будет находится в $EXEDIR\Addition\COMPONENT.exe или в $EXEDIR\COMPONENT.exe, так вот сам вопрос: можно ли в самом начале установки сделать проверку на наличие COMPONENT.exe в $EXEDIR\Addition\ и в $EXEDIR\ , и если этого COMPONENT.exe нет, то скрыть всю SectionGroup, а если этот COMPONENT.exe, есть, то отобразить SectionGroup. Почитав справку, увидел что в SectionGroup нет скрытия как на Section (Section "-Any_Name" или Section # Any_Name), есть какой-то способ, чтоб реализовать мою затею? Если можно напишите небольшой пример...

И ещё, вопрос: можно ли через скрипт изменять размер, например, прогресс бара?

SamLab 03-05-2010 23:25 1406043

hb860, RequestExecutionLevel и SetShellVarContext не помогают и ярлыки из Пуска не удаляются :(

hb860 03-05-2010 23:54 1406056

Завтра у меня будет VAIL x64, я посмотрю на конкретном примере

hb860 04-05-2010 00:23 1406068

Цитата:

Цитата Lisabon
И ещё, вопрос: можно ли через скрипт изменять размер, например, прогресс бара? »

посмотрю
На все ваши другие вопросы давно есть ответы тут: http://forums.winamp.com/showthread.php?postid=1765792
Цитата:

Цитата Lisabon
Почитав справку, увидел что в SectionGroup нет скрытия как на Section »

Там зато написано что можно рулить флагами, что вам и требуется

Вот вам пример лично от меня:
Код:

!include "MUI.nsh"
!include "Sections.nsh"
SetCompressor /SOLID lzma

!define MUI_ABORTWARNING
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "Russian"

Name "Lisabon"
InstallDir "$TEMP\Lisabon"
OutFile "Lisabon.exe"

Section "CORE" CORE
        SetOutPath "$INSTDIR"
        File "d:\Test.theme"
SectionEnd

SectionGroup "Some text" sg1
        Section "message box" mb
                MessageBox MB_OK "simple message box"
        SectionEnd
SectionGroupEnd

Function .onInit
        IfFileExists "$EXEDIR\Addition\COMPONENT.exe" leavefunc
        IfFileExists "$EXEDIR\COMPONENT.exe" leavefunc
        IntOp $0 ${sg1} + 1
        !insertmacro ClearSectionFlag ${sg1} ${SF_SELECTED}               
        !insertmacro ClearSectionFlag ${mb} ${SF_SELECTED}
        !insertmacro ClearSectionFlag ${sg1} ${SF_SECGRP}
        !insertmacro ClearSectionFlag $0 ${SF_SECGRPEND}       
        SectionSetText ${mb} ""
        SectionSetText ${sg1} ""
        SectionSetText $0 ""
leavefunc:
FunctionEnd


lmiol 05-05-2010 11:11 1407041

Вложений: 1
доброго времени суток
я решил скомпилить FirefoxPortable.nsi
но с кое-какими изменениями:
запуск приложения с параметрами и рабочей папкой

параметры в коде указать получилось:
Код:

StrCpy $EXECSTRING `"$PROGRAMDIRECTORY\$PROGRAMEXECUTABLE"  -app application.ini -override "%APPDATA%\WebApps\quake.live@prism.app\override.ini" -webapp quake.live@prism.app -profile "$PROFILEDIRECTORY"`
Goto CheckMultipleInstances

LaunchProgramParameters:
StrCpy $EXECSTRING `"$PROGRAMDIRECTORY\$PROGRAMEXECUTABLE"  -app application.ini -override "%APPDATA%\WebApps\quake.live@prism.app\override.ini" -webapp quake.live@prism.app -profile "$PROFILEDIRECTORY" $0`

Подскажите с рабочей папкой (мб еще плагин какой нада я вот нашел линк но сам разобраться не оч выходит)
мая рабочая папка :
Код:

"C:\Program Files\FirefoxPrismQuakeLive\Firefox\Data\profile\extensions\refractor@developer.mozilla.org\prism"

ilias_div 05-05-2010 11:26 1407052

Цитата:

Цитата hb860
Цитата ilias_div:
Может ли NSIS создавать ярлыки (в меню пуск, на рабочем столе) - у которых галочка "Выполнять эту программу от имени администратора" будет установлена по умолчанию? Может, есть какие расширения для этого? »
Насколько мне известно, нет »

Понятно
Впрочем, если кому интересно, проблему запуска программы под семеркой с админскими правами решил с помощью манифеста, как описано здесь или здесь

hb860 05-05-2010 13:06 1407122

Цитата:

Цитата lmiol
я решил скомпилить FirefoxPortable.nsi »

Зачем?
Простите за оффтом, но вот вам мануал, как сделать это приложение портативным

lmiol 05-05-2010 14:05 1407175

Цитата:

Зачем?
Простите за оффтом, но вот вам мануал , как сделать это приложение портативным
хочу сделать портативным quake livе с запуском PRISM
как компилить обычный знаю, в посте вроде я все ясно написал, но все равно спс за мануал

mshak 06-05-2010 13:50 1407945

Добрый день. Подскажите пожалуйста, как в NSIS узнать длину введенной строки (используется собственная страница с текстовым полем)

hb860 06-05-2010 14:11 1407958

Код:

StrLen $0 "лопата"
в $0 Будет длина слова "лопата", т.е. 6
Справку смотрели? Там есть это.

mshak 06-05-2010 14:26 1407976

мм.. спасибо. да смотрел, только не правильно понял справку.

Lisabon 07-05-2010 19:26 1408878

hb860, извиняюсь за столь необычный вопрос, но хотелось уточнить, вдруг подскажите:

Код:

4.9.3.13 RegDLL
dllfile [entrypoint_name]
Loads the specified DLL and calls DllRegisterServer (or entrypoint_name if specified). The error flag is set if an error occurs (i.e. it can't load the DLL, initialize OLE, find the entry point, or the function returned anything other than ERROR_SUCCESS (=0)).

Use SetOutPath to set the current directory for DLLs that depend on other DLLs that are now in the path or in the Windows directory. For example, if foo.dll depends on bar.dll which is located in $INSTDIR use:

 SetOutPath $INSTDIR
 RegDLL $INSTDIR\foo.dll

Собственно интересует [entrypoint_name] , я правильно понял, что можно на DLL, прописать определённое имя раздела в HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AppID , например, {A7A63E5C-3877-4840-8727-C1EA9D7A4D50} или [entrypoint_name] для чего другого? Если я прав, то как правильно указать [entrypoint_name] , в каком формате?

hb860 07-05-2010 21:35 1408965

Это оффтоп, но:
RegDLL file.dll ищет и вызывает в file.dll функцию DLLRegisterServer
Если функция регистрации называется по другому, используется entrypoint_name. Это всего лишь имя функции регистрации библиотеки в системе, и никак не свзянно с именем раздела или чем то таким.

Код:

RegDLL $INSTDIR\foo.dll MyRegFunc
я полагаю так надо это вызывать

SamLab 08-05-2010 00:13 1409057

hb860, На 64-битной системе не тестировал удаление ярлыков из Пуска еще?

Lisabon 08-05-2010 00:30 1409070

SamLab, я себе делал сборку и на Win 7 64-bit , без проблем удалялось.. как из Пуск так из Пуск/Программы...
Может ты в скрипте ошибся малёха...

SamLab 08-05-2010 21:18 1409569

Ставлю (пример одного элемента)
RequestExecutionLevel admin
...
SetShellVarContext all
CreateDirectory "$SMPROGRAMS\SAM CoDeC Pack\Плееры"
CreateShortCut "$SMPROGRAMS\SAM CoDeC Pack\Плееры\Media Player Classic - HomeCinema.lnk" "$PROGRAMFILES64\SAM CoDeC Pack\Players\MPCHC\mpc-hc64.exe" '' "$PROGRAMFILES64\SAM CoDeC Pack\Players\MPCHC\mpc-hc64.exe" 0
CreateShortCut "$DESKTOP\MPC HomeCinema.lnk" "$PROGRAMFILES64\SAM CoDeC Pack\Players\MPCHC\mpc-hc64.exe"

Удаляю
SetShellVarContext all
RMDir /r "$SMPROGRAMS\SAM CoDeC Pack"

Lisabon 08-05-2010 22:07 1409614

SamLab, внешне вроде нормально, должно удалять...

Я лично немного по другому делал
Код:


Var ICONS_GROUP
!define MUI_STARTMENUPAGE_NODISABLE
!define MUI_STARTMENUPAGE_DEFAULTFOLDER "${PRODUCT_NAME} 10"
!define MUI_STARTMENUPAGE_REGISTRY_ROOT "${PRODUCT_UNINST_ROOT_KEY}"
!define MUI_STARTMENUPAGE_REGISTRY_KEY "${PRODUCT_UNINST_KEY}"
!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "${PRODUCT_STARTMENU_REGVAL}"
!insertmacro MUI_PAGE_STARTMENU Application $ICONS_GROUP

..............

Section -Post
;
; Create Shortcuts
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
SetShellVarContext all
CreateDirectory "$SMPROGRAMS\$ICONS_GROUP"
CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\${PRODUCT_NAME} 10.lnk" "$INSTDIR\PDVDLaunchPolicy.exe"
CreateShortCut "$DESKTOP\${PRODUCT_NAME} 10.lnk" "$INSTDIR\PDVDLaunchPolicy.exe"
!insertmacro MUI_STARTMENU_WRITE_END
SectionEnd

..............

; UnInstalling
;

..............

!insertmacro MUI_STARTMENU_GETFOLDER "Application" $ICONS_GROUP
SetShellVarContext all
Delete "$DESKTOP\${PRODUCT_NAME} 10.lnk"
RMDir /r "$SMPROGRAMS\$ICONS_GROUP"


Lisabon 12-05-2010 19:20 1411828

hb860, может подскажете как реализовать вот такое:
- необходимо сделать так, при установке инсталлятора, на странице инсталллятора выбора компонентов (секций), если не выбран ни один компонент (секции), то становится не активной (блокируется) кнопка "Далее" ("Next"), а если выбран хотябы один компонент (секция), то кнопка "Далее" ("Next"), активна, для продолжения настройки и установки инсталлятора.

hb860 12-05-2010 23:08 1411960

Цитата:

Цитата Lisabon
hb860, может подскажете как реализовать вот такое: »

Я не знаю как это сделать со стандратной страницей компонентов, но для собственной страницы есть вот такое решение

Samlab, Lisabon прав. Я установил х64 - у меня нет проблемы с ярлыками, они удаляются корректно. Код такой же как у тебя, только группа называется XnView

hb860 13-05-2010 00:04 1411988

После недавнего общения с Lisabon,я созрел на написание нового материала по NSIS.
Встречайте: Создание своего инсталлятора на NSIS. Подробней о скрытых секциях. Скрытые группы секций.

mshak 13-05-2010 10:34 1412184

Добрый день. Подскажите пожалуйста, как в NSIS определить версию ОС под которой запущен инсталлятор?
требуется, т.к. на win2k, xp, vista немного отличаются сборки ПО, под который создается инсталлер.

==========
Сам отвечу. нашел.
!include WinVer.nsh
...
${If} ${IsWin2000}
...
${Else}
...
${EndIf}

Lisabon 13-05-2010 12:17 1412277

hb860, есть ещё вопрос:

- есть SectionGroup 1 и SectionGroup 2, также в инсталляторе предусмотрено InstType Max и InstType Min . Я хочу чтобы при выборе InstType Max и InstType Min, все чекбоксы применялись только к SectionGroup 1, а SectionGroup 2 - была независима от SectionGroup 1 и от выбора InstType Max и InstType Min, и также по-умолчанию SectionGroup 2 - была выбрана. В SectionGroup 2, я убрал SectionIn, но при выборе InstType Max и InstType Min, изменяются чекбоксы в SectionGroup 2.
Если можно пример, для наглядности.

mshak 13-05-2010 15:44 1412415

и все таки есть вопрос:
подскажите пожалуйста, как преобразовать к верхнему регистру:
делаю так:
!include StrFunc.nsh
... далее в функции
StrCpy $0 "$txtCSPSN1$txtCSPSN2$txtCSPSN3$txtCSPSN4$txtCSPSN5" ; собираем куски серийника в одну переменную
${StrCase} $SerialCSP $0 "U" ; преобразуем к верхнему регистру

на последней строке при компиляции получаю ошибку:
!insertmacro: FUNCTION_STRING_StrCase
!insertmacro: macro "FUNCTION_STRING_StrCase" requires 0 parameter(s), passed 3!

основывался на данной статье http://nsis.sourceforge.net/StrCase

====
сам отвечу: разобрался...
перед вызовом надо было описать функцию след образом:
# Описание используемых функций
${StrCase}
а потом ее только вызывать

SamLab 13-05-2010 16:34 1412457

Владельцы 64-битной Windows 7 попробуйте пожалуйста поставить и потом удалить SAM CoDeC Pack и посмотреть останется ли у вас в Пуск/Программы ветка SAM CoDeC Pack - http://samlab.ws/soft/samcp - не могу победить никак - не удаляется и все тут - может у меня в винде глюк...

Lisabon 13-05-2010 20:54 1412679

SamLab,
Цитата:

Цитата SamLab
Владельцы 64-битной Windows 7 попробуйте пожалуйста поставить и потом удалить SAM CoDeC Pack и посмотреть останется ли у вас в Пуск/Программы ветка SAM CoDeC Pack - http://samlab.ws/soft/samcp - не могу победить никак - не удаляется и все тут - может у меня в винде глюк... »

Попробовал как SAM CoDeC Pack 32-битный, так и SAM CoDeC Pack 64-битный, также попробовал на 32 и 64-битной Windows 7, и в Пуск/Программы ветка SAM CoDeC Pack, удаляется полностью, тобищь отработало без проблем.

hb860 13-05-2010 21:09 1412688

Lisabon,
Код:

SectionGroup 1
  section "Section 1"
  SectionIn 1 2
...
  section "Section 2"
  SectionIn 1 2

А для SectionGroup 2 не пишите вообще SectionIn, она и не будет зависеть от типа инсталляции.

Вообще, дайте-ка пример вашего кода. Я гляну чё вы там написали

mshak 14-05-2010 00:28 1412800

Добрый день/ночь еще раз.
имеется следующее:
несколько установочных MSI файлов, которые инсталлятор должен устанавливать в определенном порядке, причем каждый MSI пакет должен ставиться c определенным серийником.
делаю так: собственная страница с запросом серийников (3 шт), далее где секция установки файлов вызываю установку MSI файлов.
подскажите пожалуйста, можно ли сделать так, что бы при некорректной установки MSI файла возвращало на страницу с серийником.
...
как это выглядит у меня в скрипте
Код:

!include "nsDialogs.nsh"
....
Page Custom GetSN
...
Var HWNDGetSN
Function GetSN
        nsDialogs::Create 1018
        Pop $HWNDGetSN
 ... ; тут создаются поля ввода серийников
        nsDialogs::Show
FunctionEnd
...
Section ... ; секция установки
 ExecWait 'MsiExec /i "1.msi" PIDKEY=$SN1' $0
 ... ; анализ кода возврата (как отсюда вернуться на кастомную страницу с вводом серийников?)
 ExecWait 'MsiExec /i "2.msi" PIDKEY=$SN2' $0
 ... ; анализ кода возврата (как отсюда вернуться на кастомную страницу с вводом серийников?)
 ExecWait 'MsiExec /i "3.msi" PIDKEY=$SN3' $0
 ... ; анализ кода возврата (как отсюда вернуться на кастомную страницу с вводом серийников?)
SectionEnd

===============
я правильно понимаю что копать надо в сторону ShowWindow $HWNDGetSN ${Команда} ?
только вот какую команду надо отправить? уже пробовал WM_ACTIVATE, WM_SETFOCUS, SW_SHOW , SW_SHOWNORMAL ... но не получается.
===============
Еще нашел функцию RelGotoPage (http://nsis.sourceforge.net/Go_to_a_NSIS_page), но инглиш мой немного хромает, подскажите плз, как ей пользоваться
===============
а почему если просто в месте перехода вызвать
Call GetSN
то инсталлер закрывается без каких либо вопросов?

mshak 17-05-2010 12:17 1415046

с предыдущим вопросом разобрался:
Код:


; в месте перехода
        StrCpy $R9 -1
        Call RelGotoPage

; за секцией установки
Function RelGotoPage ; Функция для произвольного перехода по страницам
; Вызывать след образом:
; StrCpy $R9 X ; где Х - относительный номер страницы (например: -1 переход на одну назад, 1 - на одну вперед)
; Call RelGotoPage
  IntCmp $R9 0 0 Move Move
    StrCmp $R9 "X" 0 Move
      StrCpy $R9 "120"
  Move:
  SendMessage $HWNDPARENT "0x408" "$R9" ""
FunctionEnd

... но возник новый вопрос:
когда возвращаюсь снова в секцию установки (например когда во втором файле 2.msi была ошибка, и он не установился) то сначала запускается установка 3го файла 3.msi и одновременно начинается установка 1-го. Собственно вопрос? как сделать так, что бы не продолжалась "старая" установка, т.е. обнулить состояние данной секции?

hb860 18-05-2010 10:32 1415842

Потому что скрипт выполняет процесс установки уже. Вам надо писать свою страницу и функцию установки. MUI_PAGE_INSTALLFILES (или как там её) вам уже не подходит в вашем случае

mshak 18-05-2010 23:47 1416370

спасибо, но данное сделал след образом: после установки есть страница которая проверяет как прошла установка... если неверна, то возвращает на страницу с серийниками, если все ок. то к странице финиша

hb860 24-05-2010 11:41 1419820

Создание своих собственных ключей для инсталлятора NSIS
Это для тех, кому мало /S, /D и /NCRC

SamLab 11-06-2010 00:54 1431861

Как прописать System32 чтобы NSIS сам определял битность куда распаковаться в system32 или в syswow64
стоит $SYSDIR он лепит в system32 всегда без руздумий даже на 64-битной системе
прописать $WINDIR\SysWOW64\ нельзя т.к. на 32-битной системе такой папки нет
нужно чтобы NSIS на 32-битах в System32 распаковывал, а эта же установка на 64-битах в SysWOW64

kotkovets 11-06-2010 01:44 1431882

Цитата:

Цитата SamLab
Как прописать System32 чтобы NSIS сам определял битность куда распаковаться в system32 или в syswow64 »

Попробуйте так :

Код:

Name "GetVersion Example"
OutFile "GetVersion.exe"
ShowInstDetails show
Page InstFiles

Section
GetVersion::WindowsPlatformArchitecture
Pop $R9
StrCmp $R9 32 Not
MessageBox MB_OK "WindowsPlatformArchitecture: $R9"
SetOutPath "$WINDIR\SysWOW64"
Not:
StrCmp $R9 64 Note
MessageBox MB_OK "WindowsPlatformArchitecture: $R9"
SetOutPath "$SYSDIR"
Note:
SectionEnd

Плагин

SamLab 11-06-2010 21:18 1432462

kotkovets, Систему определяет правильно, но распаковывает сразу в обе папки все равно - взял руками закинул файл в system32 и он автоматом скопировался в wow - значит сама винда копирует

kotkovets 11-06-2010 23:02 1432520

И удаляются одинаковые файлы с двух папок одновременно?

SamLab 12-06-2010 01:07 1432568

kotkovets, Да! Как зеркала друг друга папки System32 и WOW64!

kotkovets 12-06-2010 02:26 1432589

По скрипту в 32-битной системе папка C:\Windows\SysWOW64 не создаётся.
В 64-битной системе ,предполагаю, это системные переменные , которые не рекомендуется изменять - глюки возможны.
Возможно Винда копирует файлы для совместимости 32-разрядных и 64-разрядных приложений.

SamLab 12-06-2010 09:42 1432633

kotkovets, Странная совместимость - когда я указываю 64-битным файлам в System32 а в WOW 32-битные, то получается какие в последнюю очередь копируются - те и помещаются в обе папки

wander 17-06-2010 00:06 1435684

Доброй ночи, друзья :)

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

Я сделал пока через FindWindow/SendMessage в цикле. Мне бы хотело более человеческий способ. Есть такой?

И вот еще вопрос, как сделать, чтобы установщик в конце замочил сам себя? Деинсталлятор же умеет так.

hb860 17-06-2010 00:31 1435707

wander, рулите процессами через http://nsis.sourceforge.net/Processes_plug-in
Как понять, "закончил себя"? У вас он не закрывается? Может, конкретный код глянем?
Только не в приват :)

wander 17-06-2010 10:13 1435874

Цитата:

Только не в приват
И в мыслях не было!
Цитата:

Как понять, "закончил себя"? У вас он не закрывается? Может, конкретный код глянем?
Не закончил, а замочил. То есть удалился с диска.
Спасибо :)

veln 17-06-2010 13:25 1435990

Возник вопрос
Помогите с решением

ОS - win7

необходимо скопировать файл по адресу:
c:\Users\Default\AppData\Roaming\

если использовать $APPDATA копится в c:\Users\user\AppData\Roaming\

SetShellVarContext all
$APPDATA копится в c:\Users\All Users\AppData\Roaming\


есть ли возможность закинуть файл в дефолтовый профиль используя предопределенные переменные

Lisabon 17-06-2010 13:50 1436005

Здравствуйте! У меня небольшая просьба помочь мне со скриптами на NSIS, если есть возможность и время, то можно ли мне помочь разобраться с ними, я был бы весьма признателен...

Есть весьма интересный пример RememberComponents.rar (прикрепил к сообщению), я хотел бы этот скрипт адаптировать в мой скрипт Nero_v10.0.rar (прикрепил к сообщению)... Собственно мне не понятно как адаптировать часть скрипта RememberComponents, Function .onInit и Function un.onInit , применение этих функций нарушает мои SectionGroup, тобишь все компоненты на странице MUI_PAGE_COMPONENTS идут в один ряд, без использования SectionGroup.

Вот скрины:

до


после


Если вам не сложно объясните как и что подправить или добавить в мой скрипт Nero_v10.0.rar... можно примером.... или правкой моего скрипта Nero_v10.0.rar. Сам скрипт писался только для собственных нужд, так как другие сборки в сети меня не устраивают...

Заранее благодарен...

hb860 17-06-2010 16:42 1436089

wander,
Цитата:

Цитата wander
Не закончил, а замочил. То есть удалился с диска. »

http://nsis.sourceforge.net/SelfDel_plug-in

veln, вам поможет чтение реестра, ветка HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList, значение Default.
Вот вам небольшой примерчик. Работает только в Windows Vista и Windows 7, для ХР путь на винте, как вы понимаете, другой.
Код:

outfile "hello world.exe"
section
        ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" "Default"
        ExpandEnvStrings $0  $0
        StrCpy $0 "$0\AppData\Roaming\"
        MessageBox MB_OK $0
sectionEnd


Cyber-pilot 22-06-2010 19:35 1439613

У меня проблема с установкой программы в операционной системе win7.
Запускаю установку, указывают путь для установки по умолчанию в "Program Files\Название программы". Для работы программы требуется ключ, копирую его в каталог с программой. Все отлично работает.
Проблема возникает когда захожу под другим пользователем. Установленная программа говорит, что не зарегистрированна. Странно! Проверяю есть ли ключ в каталоге с программой. Его там нет.
И так для остальных пользователей. Например меняешь какой-нибудь файл под одним пользователем, под другим пользователем он остается прежним.
С чем это связано? Как это можно исправить? Может быть в инсталяторе как-то указать, что каталог с программой общий для всех пользователей?

Cyber-pilot 24-06-2010 10:42 1440705

Разобрался. Надо было дать полный доступ для всех пользователей на каталог, куда устанавливается программа.
Для этого надо было установить AccessControl plug-in http://nsis.sourceforge.net/AccessControl_plug-in
и написать:
AccessControl::GrantOnFile \
"$INSTDIR" "(S-1-1-0)" "FullAccess"

WolfSoul 30-06-2010 00:13 1444143

Привет всем, доброго Вам времени суток.
Пожалуйста помогите с кодом...
Создал отдельную страницу

;--------------------------------

Цитата:

Var Dialog
Var CheckBox
Var GroupBox

Function fnCustomInit
nsDialogs::Create 1018
Pop $Dialog

${NSD_CreateGroupBox} 0 5% 100% 50% "Ярлыки программы:"
Pop $GroupBox

${NSD_CreateCheckBox} 10 18u 70% 10% "В меню Пуск"
Pop $CheckBox

${NSD_CreateCheckBox} 10 30u 70% 10% "На рабочем столе"
Pop $CheckBox

${NSD_CreateCheckBox} 10 42u 70% 10% "В панели быстрого запуска"
Pop $CheckBox

${NSD_CreateGroupBox} 0 -25% 100% 25% "Запуск программы вместе с системой:"
Pop $GroupBox

${NSD_CreateCheckBox} 10 -22u 70% 10% "Добавить программу в автозапуск"
Pop $CheckBox

nsDialogs::Show
FunctionEnd

Function fnCustomDestroy
${NSD_GetState} $CheckBox $R0
FunctionEnd
;--------------------------------
А как сделать что-бы она работала не как не разберусь.
;--------------------------------
Пока могу сделать только так...
;--------------------------------
; Пользователь сам выбирает, какие ярлыки ему нужны, по умолчанию все включено
Цитата:

SectionGroup /e "Ярлыки программы" SecShortcut
Section "Ярлык в меню Пуск" MenuProgramsShortcut
SectionIn 1 ; означает, что секция включена, а если не вставлять эту строку, тогда секция отключена
CreateDirectory "$SMPROGRAMS\AudioGrabber"
CreateShortCut "$SMPROGRAMS\AudioGrabber\Help.lnk" "$INSTDIR\AudioGrabber.hlp" "" "" "" "" "" "Помощь!!!"
CreateShortCut "$SMPROGRAMS\AudioGrabber\AudioGrabber.lnk" "$INSTDIR\AudioGrabber.exe" "" "" "" "" "" "AudioGrabber 1.83.0.1"
CreateShortCut "$SMPROGRAMS\AudioGrabber\Website.lnk" "$INSTDIR\${PRODUCT_NAME}.url" "" "" "" "" "" "Посетить сайт автора -> AudioGrabber"
CreateShortCut "$SMPROGRAMS\AudioGrabber\Uninstall.lnk" "$INSTDIR\Uninstall.exe" "" "" "" "" "" "Удалить -> AudioGrabber с Вашей системы"
SectionEnd
;--------------------------------
Section "Ярлык на рабочем столе" SecDesctopShortcut
SectionIn 1 ; означает, что секция включена, а если не вставлять эту строку, тогда секция отключена
CreateShortCut "$DESKTOP\AudioGrabber.lnk" "$INSTDIR\AudioGrabber.exe" "" "" "" "" "" "AudioGrabber 1.83.0.1"
SectionEnd
;--------------------------------
;
Section "Ярлык в панели быстрого запуска" SecQlaunchShortcut
SectionIn 1 ; означает, что секция включена, а если не вставлять эту строку, тогда секция отключена
CreateShortCut "$QUICKLAUNCH\AudioGrabber.lnk" "$INSTDIR\AudioGrabber.exe" "" "" "" "" "" "AudioGrabber 1.83.0.1"
SectionEnd
SectionGroupEnd
;--------------------------------
;
SectionGroup "Автозапуск" SecArlaunch
Section "Добавить программу в автозапуск" SecArlaunchShortcut
SectionIn 1 ; означает, что секция включена, а если не вставлять эту строку, тогда секция отключена
WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Run" "AudioGrabber" "$INSTDIR\AudioGrabber.exe"
SectionEnd
SectionGroupEnd
;--------------------------------
Так вот как сделать что-бы моя страница заработала(реагировала на действия пользователя)

hb860 30-06-2010 01:59 1444212

Часть скрипта, где страницы вставляете , покажите
Это:
Код:

!insertmacro MUI_PAGE_WELCOME
...
и так далее


Ничего не надо, простите. Ночью спать надо, а лазию в инете :)

У вас в функции fnCustomDestroy напрочь отсуствует анализ контроллов. Каждый контрол должен иметь свою переменную для обращения к нему. Я вам написал пример для ярлыков рабочего стола и меню Пуск, посмотрите и сделайте остальное по аналогии. Я надеюсь, у вас есть строчка в скрипте вида
Цитата:

!insertmacro MUI_PAGE_WELCOME
Page custom fnCustomInit fnCustomDestroy
!insertmacro MUI_PAGE_INSTFILES
Если остались вопросы, задавайте

Пример анализа
Код:

Var Dialog
Var CheckBoxSM
Var CheckBoxD
Var CheckBoxQL
Var CheckBoxA
Var GroupBox1
Var GroupBox2

Function fnCustomInit
nsDialogs::Create 1018
Pop $Dialog

${NSD_CreateGroupBox} 0 5% 100% 50% "Ярлыки программы:"
Pop $GroupBox1

${NSD_CreateCheckBox} 10 18u 70% 10% "В меню Пуск"
Pop $CheckBoxSM

${NSD_CreateCheckBox} 10 30u 70% 10% "На рабочем столе"
Pop $CheckBoxD

${NSD_CreateCheckBox} 10 42u 70% 10% "В панели быстрого запуска"
Pop $CheckBoxQL

${NSD_CreateGroupBox} 0 -25% 100% 25% "Запуск программы вместе с системой:"
Pop $GroupBox2

${NSD_CreateCheckBox} 10 -22u 70% 10% "Добавить программу в автозапуск"
Pop $CheckBoxA

nsDialogs::Show
FunctionEnd

Function fnCustomDestroy
${NSD_GetState} $CheckBoxSM $R0
StrCmp $R0 1 0 SkipSM
        CreateDirectory "$SMPROGRAMS\AudioGrabber"
        CreateShortCut "$SMPROGRAMS\AudioGrabber\Help.lnk" "$INSTDIR\AudioGrabber.hlp" "" "" "" "" "" "Помощь!!!"
        CreateShortCut "$SMPROGRAMS\AudioGrabber\AudioGrabber.lnk" "$INSTDIR\AudioGrabber.exe" "" "" "" "" "" "AudioGrabber 1.83.0.1"
        CreateShortCut "$SMPROGRAMS\AudioGrabber\Website.lnk" "$INSTDIR\${PRODUCT_NAME}.url" "" "" "" "" "" "Посетить сайт автора -> AudioGrabber"
        CreateShortCut "$SMPROGRAMS\AudioGrabber\Uninstall.lnk" "$INSTDIR\Uninstall.exe" "" "" "" "" "" "Удалить -> AudioGrabber с Вашей системы"
SkipSM:

${NSD_GetState} $CheckBoxD $R0
StrCmp $R0 1 0 SkipD
        CreateShortCut "$DESKTOP\AudioGrabber.lnk" "$INSTDIR\AudioGrabber.exe" "" "" "" "" "" "AudioGrabber 1.83.0.1"
SkipD:
....
И так ДАЛЕЕ
...       
FunctionEnd


WolfSoul 30-06-2010 12:53 1444421

Большое спасибо за ответ.
Да эти строки в моём скрипте присутствуют...
Цитата:

!insertmacro MUI_PAGE_WELCOME
Page custom fnCustomInit fnCustomDestroy
!insertmacro MUI_PAGE_INSTFILES
Попробую и после отпишусь.

WolfSoul 02-07-2010 17:27 1446108

Отлично всё получилось и работает.
Спасибо!!!
Подскажите пожалуйста как изменить выделенное красным, сделать другую надпись.
Цитата:


И ещё.
Можно ли добавить ещё одну собственную страницу, если можно то как это сделать?

hb860 02-07-2010 17:30 1446111

Я уже писал в этой теме ответ
Впрочем, мне самому его в справке быстрей найти
Код:

function fnCustomInit
!insermacro MUI_HEADER_TEXT "Оппа" "Виндовс рулит"
дальше ваш текст

Почитайте это file://localhost/C:/Program%20Files/NSIS/Docs/Modern%20UI%202/Readme.html
Путные вещи пишут :)

WolfSoul 02-07-2010 23:39 1446303

Спасибо познавательная информация.
А на второй вопрос, можете ответить?
Цитата:

Можно ли добавить ещё одну собственную страницу, если можно то как это сделать?

hb860 02-07-2010 23:56 1446315

Ну а что мешает написать два раза то:
Код:

Page custom fnCustomInit1 fnCustomDestroy1
Page custom fnCustomInit2 fnCustomDestroy2

Ну и сами функции напишите

Hector 06-07-2010 16:46 1448386

Как изменить указанную надпись?

Комсомолец 06-07-2010 16:53 1448394

Hector, при сборке ставится плагин BrandingURL и в скрипте записываются данные строки.

Hector 06-07-2010 16:57 1448398

Чтобы изменить одну строку текста нужен плагин?

Habetdin 06-07-2010 21:39 1448606

Hector, в скрипте стерите строку BrandingText
ЗЫ: убирать копирайты плохо. Чем вам эта строка мешает? :)

Hector 06-07-2010 21:44 1448611

Цитата:

Цитата Habetdin
в скрипте стерите строку BrandingText »

где именно?
насчет копирайтов, это картинка для примера, к Lisbon'y отношения не имеет.

Habetdin 06-07-2010 22:02 1448621

Цитата:

Цитата Hector
где именно? »

Откуда я знаю где у вас в скрипте эта строка? :)
Ищите "BrandingText блаблабла"

Hector 06-07-2010 22:08 1448628

Habetdin, я ж говорю, картинка для примера, готового скрипта нет, я пишу его с нуля, и хочу заменить дефолтовую фразу Nullsoft Install System v2,46 внизу окна на свою

Habetdin 06-07-2010 22:10 1448630

Hector,
Код:

BrandingText "Мой текст :P"

Hector 06-07-2010 22:13 1448633

понял, спасибо

yugorian 09-07-2010 21:23 1450559

Мне потребовалось сделать инсталлятор с возможностью выбора только одного пункта. Прочитал учебник по NSIS, сделал как там описано - все работает. Однако, поскольку эти элементы однотипные, захотел их поместить в SectionGroup, но тут вышла заминка - если нажать на серый чекбокс заголовка группы секций, то реакция получается не очень адекватная - выбирается второй пункт к тому что уже выбран по дефолту. Подскажите пожалуйста, можно ли и как установить игнорирование нажатия на чекбокс заголовка группы секций?

hb860 09-07-2010 21:57 1450568

Насколько мне известно, нет

Krinkels 12-07-2010 12:41 1451664

Друзья, помогите прояснить такой момент: как в NSIS в зависимости от выбранного языка записать в ini определенную строчку?

hb860 12-07-2010 19:55 1452028

Krinkels,
В этой статье внизу расписано с примерами

Krinkels 15-07-2010 23:03 1454172

Создал я свою страничку с 3-мя RadioButton, но на ней кнопки: "<Назад" "Далее>" "Отмена" действуют одинаково, т.е. выполняют действие отмеченное в RadioButton. Можно ли как то это исправить?

hb860 17-07-2010 20:20 1455144

Вы написали неправильный код
Вот его и исправьте
Вы считаете, что кто-то на форуме является шаманом и вот как вам голословно способен помочь?
Хоть покажите, чё написали, а мы посмотрим и попробуем подсказать

Krinkels 17-07-2010 20:36 1455157

Делал на основе этого кода:
ReInstall.ini:
Код:

[Settings]
NumFields=3
[Field 1]
Type=Label
Left=0
Right=-1
Top=0
Bottom=24
Text=MyProg is already installed. Select the operation you want to perform and click Next to continue.
[Field 2]
Type=RadioButton
Left=30
Right=-1
Top=50
Bottom=58
State=1
Text=Reinstall MyProg
[Field 3]
Type=RadioButton
Left=30
Right=-1
Top=70
Bottom=78
Text=Uninstall MyProg

reinstall.nsi:
Код:

!include "MUI.nsh"

!define MUI_ABORTWARNING

;!!!!!!!!!!!!!!!
InstallDirRegKey HKLM "Software\Antaris\TestReInstall" "Install_Dir"
Name "TestReInstall"
OutFile "TestReInstall.exe"
InstallDir "$PROGRAMFILES\MyNSISTest\TestReInstall"

!insertmacro MUI_PAGE_WELCOME
Page custom PageReinstall
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

ReserveFile "ReInstall.ini"
!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS

Function .onInit
        !insertmacro MUI_INSTALLOPTIONS_EXTRACT "ReInstall.ini"
FunctionEnd

Section Files
        SetOutPath "$INSTDIR"
        ;File "1.exe"
SectionEnd

Section -Post
;!!!!!!!!!!!!!!!
        WriteRegStr HKLM "Software\Antaris\TestReInstall" "Install_Dir" "$INSTDIR"
        WriteUninstaller "$INSTDIR\uninstall.exe"
SectionEnd

Function PageReinstall
        !insertmacro MUI_HEADER_TEXT "Already Installed" "Choose the maintenance option to perform."
        ReadRegStr $R0 HKLM "Software\Antaris\TestReInstall" "Install_Dir"
        StrCmp $R0 "" 0 +2
        Abort
        StrCpy $R0 "2"

        !insertmacro MUI_INSTALLOPTIONS_DISPLAY "ReInstall.ini"
        !insertmacro MUI_INSTALLOPTIONS_READ $R1 "ReInstall.ini" "Field 2" "State"
        StrCmp $R0 "1" 0 +1
        StrCmp $R0 "2" 0 +2
        StrCmp $R1 "1" reinst_done
        ExecWait '$INSTDIR\uninstall.exe'
        Quit
        reinst_done:
FunctionEnd

Function un.onInit
        MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "Are you sure you want to completely remove MyProg?" IDYES +2
        Abort
FunctionEnd

Section Uninstall
        Delete "$INSTDIR\1.exe"
        Delete "$INSTDIR\uninstall.exe"
        RMDir "$INSTDIR"
        DeleteRegKey HKLM "Software\Antaris\TestReInstall"
SectionEnd

.
Просто добавил лишний RadioButton который ничего не делает. В этом коде тот же косяк, "<Назад" и "Далее>" действуют одинаково.

hb860 18-07-2010 01:33 1455322

Код:

Page  custom [creator_function] [leave_function]
У вас написано
Код:

Page custom PageReinstall
т.е. одна функция на всё. Я полагаю, дело в этом
Попробуйте
Код:

Page custom PageIn PageReinstall
function PageIn оставьте без кода

Krinkels 18-07-2010 12:35 1455442

hb860
Цитата:

Цитата hb860
Попробуйте
Код:
Page custom PageIn PageReinstall
function PageIn оставьте без кода »

Если так поставить то страница вообще не появляется

WolfSoul 18-07-2010 19:46 1455615

Используя ваш пример «Создание собственных страниц инсталлятора», вот сделал такую страничку.
Пример кода:
Цитата:

;-Создание собственной страницы инсталлятора (страница "Выбор установки ключа регистрации"), начало функций
Var Dialog1
Var GroupBox
Var RadioButtonA
Var RadioButtonB
Var RadioButtonC

Function fnCustomInit2
!insertmacro MUI_HEADER_TEXT "Вабор регистрационого ключа для Total Commander 6.55" "Выбирите из предлогаемого списка один из ключей"
nsDialogs::Create 1018
Pop $Dialog

${NSD_CreateGroupBox} 0 5% 100% 50% "Регистрационные ключи для Total Commander 6.55:"
Pop $GroupBox

${NSD_CreateRadioButton} 10 18u 70% 10% "Browseup Ltd"
Pop $RadioButtonA

${NSD_CreateRadioButton} 10 30u 70% 10% "CNRS IRIT-UMR 5505"
Pop $RadioButtonB

${NSD_CreateRadioButton} 10 42u 70% 10% "COMVERSE CNS"
Pop $RadioButtonC

nsDialogs::Show
FunctionEnd

Function fnCustomDestroy2
${NSD_GetState} $RadioButtonA $R0
StrCmp $R0 1 0 SkipA
SetOutPath "$INSTDIR"
File "..\Setups\TotalCmd\Browseup Ltd\WinCmd.key"
SkipA:

${NSD_GetState} $RadioButtonB $R0
StrCmp $R0 1 0 SkipB
SetOutPath "$INSTDIR"
File "..\Setups\TotalCmd\CNRS IRIT-UMR 5505\WinCmd.key"
SkipB:

${NSD_GetState} $RadioButtonC $R0
StrCmp $R0 1 0 SkipC
SetOutPath "$INSTDIR"
File "..\Setups\TotalCmd\COMVERSE CNS\WinCmd.key"
SkipC:
FunctionEnd
;-Конец функций
В ней пользователь должен выбрать один из предлагаемых трёх элементов.
Всё работает лишь тогда когда прописывается путь полностью…
Пример кода:

Цитата:

Function fnCustomDestroy2
${NSD_GetState} $RadioButtonA $R0
StrCmp $R0 1 0 SkipA
SetOutPath "$INSTDIR"
File "..\Setups\TotalCmd\Browseup Ltd\WinCmd.key"
SkipA:

${NSD_GetState} $RadioButtonB $R0
StrCmp $R0 1 0 SkipB
SetOutPath "$INSTDIR"
File "..\Setups\TotalCmd\CNRS IRIT-UMR 5505\WinCmd.key"
SkipB:

${NSD_GetState} $RadioButtonC $R0
StrCmp $R0 1 0 SkipC
SetOutPath "$INSTDIR"
File "..\Setups\TotalCmd\COMVERSE CNS\WinCmd.key"
SkipC:
FunctionEnd
Я пробовал изменить код, ну чтобы не прописывать путь к файлу полностью…
Пример кода 1:

Цитата:

Function fnCustomDestroy2
${NSD_GetState} $RadioButtonA $R0
StrCmp $R0 1 0 SkipA
SetOutPath "$INSTDIR"
File /r "TotalCmd\Browseup Ltd\WinCmd.key"
SkipA:

${NSD_GetState} $RadioButtonB $R0
StrCmp $R0 1 0 SkipB
SetOutPath "$INSTDIR"
File /r "TotalCmd\CNRS IRIT-UMR 5505\WinCmd.key"
SkipB:

${NSD_GetState} $RadioButtonC $R0
StrCmp $R0 1 0 SkipC
SetOutPath "$INSTDIR"
File /r "TotalCmd\COMVERSE CNS\WinCmd.key"
SkipC:
FunctionEnd
или
Пример кода 2:

Цитата:

Function fnCustomDestroy2
${NSD_GetState} $RadioButtonA $R0
StrCmp $R0 1 0 SkipA
SetOutPath "$INSTDIR"
File /r "TotalCmd\*.key*"
SkipA:

${NSD_GetState} $RadioButtonB $R0
StrCmp $R0 1 0 SkipB
SetOutPath "$INSTDIR"
File /r "TotalCmd\*.key*"
SkipB:

${NSD_GetState} $RadioButtonC $R0
StrCmp $R0 1 0 SkipC
SetOutPath "$INSTDIR"
File /r "TotalCmd\*.key*"
SkipC:
FunctionEnd
Но так не срабатывает.
ВОПРОС
Как сделать, чтобы не прописывать путь к файлу полностью?

kotkovets 19-07-2010 02:51 1455809

Цитата:

Цитата WolfSoul
Как сделать, чтобы не прописывать путь к файлу полностью? »

Так:
File /r "TotalCmd\*.*"

или так:
File /r "TotalCmd\*.key"

Скрипт должен находится на одном уровне с папкой TotalCmd

Sauron3 19-07-2010 18:50 1456213

Доброго времени суток. У меня возник следующий вопрос(заранее прошу прошения, если такая тема уже всплывала)
при создании инсталятора, мне необходимо открыть файл (не exe) дождаться чтобы пользователь проделал с ним какие-либо операции? закрыл этот файл и только потом установка продолжилась. Открываю файл с помощью
Код:

ExecShell "open"
, он открывается, но установка продолжается. Команада
Код:

ExecWait
не помогает.
Заранее Спасибо.

kotkovets 19-07-2010 22:30 1456349

Цитата:

Цитата Sauron3
мне необходимо открыть файл (не exe) дождаться, чтобы пользователь проделал с ним какие-либо операции, закрыл этот файл и только потом установка продолжилась »

Можно так:
Код:

ExecWait 'notepad "Путь к файлу.txt"'
или так:
Код:

ExecShell "open" "Путь к файлу.txt" 
MessageBox MB_ICONQUESTION|MB_YESNO "Вы сделали все? продолжим?" IDNO NO IDYES YES
NO:
Quit
YES: 
;продолжение скрипта


Sauron3 20-07-2010 09:24 1456538

Спасибо!

WolfSoul 21-07-2010 01:27 1457171


Код:

Спасибо вам за ранее оказанную помощь в написание данного кода.
Подскажите, пожалуйста, как сделать CheckBox активным в самодельном окне?
И как сделать, чтобы запоминался выбор пользователя?
Пример кода:
;-Создание собственной страницы инсталлятора (страница "Ярлыки и автозагрузка"), начало функций
Var Dialog
Var CheckBoxSM
Var CheckBoxD
Var CheckBoxQL
Var CheckBoxA
Var GroupBox1
Var GroupBox2

Function fnCustomInit1
!insertmacro MUI_HEADER_TEXT "Выбирите допольнительные задачи" "Какие дополнительные задачи необходимо выполнить?"
nsDialogs::Create 1018
Pop $Dialog

${NSD_CreateGroupBox} 0 5% 100% 50% "Ярлыки программы:"
Pop $GroupBox1

${NSD_CreateCheckBox} 10 18u 70% 10% "В меню Пуск"
Pop $CheckBoxSM

${NSD_CreateCheckBox} 10 30u 70% 10% "На рабочем столе"
Pop $CheckBoxD

${NSD_CreateCheckBox} 10 42u 70% 10% "В панели быстрого запуска"
Pop $CheckBoxQL

${NSD_CreateGroupBox} 0 -25% 100% 25% "Запуск программы вместе с системой:"
Pop $GroupBox2

${NSD_CreateCheckBox} 10 -22u 70% 10% "Добавить программу в автозапуск"
Pop $CheckBoxA

nsDialogs::Show
FunctionEnd

Function fnCustomDestroy1
${NSD_GetState} $CheckBoxSM $R0
StrCmp $R0 1 0 SkipSM
        CreateDirectory "$SMPROGRAMS\AudioGrabber"
        CreateShortCut "$SMPROGRAMS\AudioGrabber\Help.lnk" "$INSTDIR\AudioGrabber.hlp" "" "" "" "" "" "Помощь!!!"
        CreateShortCut "$SMPROGRAMS\AudioGrabber\AudioGrabber.lnk" "$INSTDIR\AudioGrabber.exe" "" "" "" "" "" "AudioGrabber 1.83.0.1"
        CreateShortCut "$SMPROGRAMS\AudioGrabber\Website.lnk" "$INSTDIR\${PRODUCT_NAME}.url" "" "" "" "" "" "Посетить сайт автора -> AudioGrabber"
        CreateShortCut "$SMPROGRAMS\AudioGrabber\Uninstall.lnk" "$INSTDIR\Uninstall.exe" "" "" "" "" "" "Удалить -> AudioGrabber с Вашей системы"
SkipSM:

${NSD_GetState} $CheckBoxD $R0
StrCmp $R0 1 0 SkipD
        CreateShortCut "$DESKTOP\AudioGrabber.lnk" "$INSTDIR\AudioGrabber.exe" "" "" "" "" "" "AudioGrabber 1.83.0.1"
SkipD:

${NSD_GetState} $CheckBoxQL $R0
StrCmp $R0 1 0 SkipQL
        CreateShortCut "$QUICKLAUNCH\AudioGrabber.lnk" "$INSTDIR\AudioGrabber.exe" "" "" "" "" "" "AudioGrabber 1.83.0.1"
SkipQL:

${NSD_GetState} $CheckBoxA $R0
StrCmp $R0 1 0 SkipA
        WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Run" "AudioGrabber" "$INSTDIR\AudioGrabber.exe"
SkipA:
FunctionEnd
;-Конец функций


Krinkels 21-07-2010 11:17 1457400

WolfSoul
Ну по первому вопросу, нужно было делать страничку через ini, там все проще делается. В ini в параметрах чекбокса можно поставить State=1 и он будет отмечен.
По второму вопросу. Скорее всего придется сохранять значение в реестре, и про следующем запуске его читать

hb860 21-07-2010 17:06 1457726

Цитата:

Цитата Krinkels
Ну по первому вопросу, нужно было делать страничку через ini, там все проще делается. В ini в параметрах чекбокса можно поставить State=1 и он будет отмечен. »

Кажому своё. Мне проще через модуль nsDialogs. И Вы так и не ответили человеку на вопрос.


WolfSoul, чтобы отметить флажок изначально, в INIT-функции (fnCustomInit1) напишите в конце
Код:

${NSD_SetText} $CheckBoxSM 1
Цитата:

Цитата WolfSoul
И как сделать, чтобы запоминался выбор пользователя? »

Запоминался где? Уточните, я не совсем понял о чем вы.

Krinkels 22-07-2010 08:22 1458109

hb860
Цитата:

Цитата hb860
И Вы так и не ответили человеку на вопрос. »

Потому что я не знал как можно такое реализовать.

Цитата:

Цитата hb860
И как сделать, чтобы запоминался выбор пользователя? »

Он скорее всего имеет ввиду чекбоксы, запомнить отмечен или нет. Ну а если нет то телепаты в отпуске

WolfSoul 22-07-2010 21:30 1458729

hb860
Большое спасибо за ответ!
Лично мне он очень пригодился.
Цитата:

И как сделать, чтобы запоминался выбор пользователя?
Этот вопрос отпадает, не к чему это.

WolfSoul 22-07-2010 21:58 1458748

Можно ли в NSIS реализовать вот такое окно с background
Как сделать background я знаю, а как поставить надпись не пойму.
Нужна надпись в нижнем правом углу как на этой картинки.


kotkovets 23-07-2010 13:44 1459140

Цитата:

Цитата WolfSoul
Можно ли в NSIS реализовать вот такое окно с background »

Посмотри пример в папке Examples\BgImage

читать дальше »

Код:

Name "BgImage.dll test" 
OutFile "BgImage.exe" 
XPStyle on 
ShowInstDetails show
   
!define DEBUG 
!macro GetReturnValue 
!ifdef DEBUG 
Pop $R9 
StrCmp $R9 success +2 
DetailPrint "Error: $R9"
!endif 
!macroend
   
Function .onGUIInit 
 !ifdef DEBUG
 BgImage::SetReturn on 
 !endif 
 BgImage::SetBg /GRADIENT 0 0x80 0 0x80 0 0
 !insertmacro GetReturnValue 
 CreateFont $R0 "Tahoma" 17 700  ;шрифт
 BgImage::AddText "Testing 1... 2... 3..." $R0 0 0 255 790 720 1024 768  ;(R G B) (координаты текста - x;y) (разрешение экрана - X;Y) 
 !insertmacro GetReturnValue
 BgImage::Redraw 
FunctionEnd
 
Function .onGUIEnd 
 BgImage::Destroy 
FunctionEnd
 
Section 
SectionEnd


WolfSoul 23-07-2010 14:02 1459150

Спасибо за ответ, попробую.

Lisabon 23-07-2010 23:42 1459526

Может, кто-то подскажет...

Мне необходимо сделать проверку перед инсталляцией на пользователя... если это будет "Администратор" ("Admin"), то папка установки c:\Program Files\Программа\ , а если "Пользователь" ("User") - с ограниченными правами, то папка установки c:\Программа\ . Если можно привести пример. Заранее спасибо...

kotkovets 24-07-2010 13:49 1459797

Цитата:

Цитата Lisabon
Мне необходимо сделать проверку перед инсталляцией на пользователя... если это будет "Администратор" ("Admin"), то папка установки c:\Program Files\Программа\ , а если "Пользователь" ("User") - с ограниченными правами, то папка установки c:\Программа\ »

читать дальше »

Код:

!include "LogicLib.nsh"
!include "FileFunc.nsh"

var SYSDRIVE

SilentInstall Silent
OutFile "Test.exe"

!macro IsUserAdmin RESULT
 !define Index "Line${__LINE__}"
  StrCpy ${RESULT} 0
  System::Call '*(&i1 0,&i4 0,&i1 5)i.r0'
  System::Call 'advapi32::AllocateAndInitializeSid(i r0,i 2,i 32,i 544,i 0,i 0,i 0,i 0,i 0, \
  i 0,*i .R0)i.r5'
  System::Free $0
  System::Call 'advapi32::CheckTokenMembership(i n,i R0,*i .R1)i.r5'
  StrCmp $5 0 ${Index}_Error
  StrCpy ${RESULT} $R1
  Goto ${Index}_End
  ${Index}_Error:
  StrCpy ${RESULT} -1
  ${Index}_End:
  System::Call 'advapi32::FreeSid(i R0)i.r5'
 !undef Index
!macroend

Function .onInit
 !insertmacro IsUserAdmin $R0
FunctionEnd

Section
; с правами администратора
 ${If} $R0 == 1
  MessageBox MB_OK "$PROGRAMFILES\Программа"
 ${EndIf}
; c ограниченной учеткой
 ${If} $R0 == 0
  StrCpy $SYSDRIVE $WINDIR 2
  MessageBox MB_OK "$SYSDRIVE\Программа"
 ${EndIf}
SectionEnd


maximum142 25-07-2010 14:55 1460304

Всем привет подскажите начинающему в NSIS хочу добавить информацию с помощью экзешника в oeminfo.ini
прописываю так
Код:

WriteINIStr $SYSDIR\Oeminfo.ini Support Information "Line1=--"
но при компиляции выходит так
Код:

WriteINIStr: [Support] Information=Line1=-- in $SYSDIR\Oeminfo.ini
подскажите как надо прописать чтобы на выходе в Oeminfo.ini получилось так
Код:

[Support Information]
Line1=--


kotkovets 25-07-2010 17:54 1460362

maximum142

Код:

WriteINIStr $SYSDIR\Oeminfo.ini "Support Information" Line1 --

Lisabon 25-07-2010 20:57 1460447

kotkovets,

Цитата:

Цитата kotkovets
Цитата Lisabon:Мне необходимо сделать проверку перед инсталляцией на пользователя... если это будет "Администратор" ("Admin"), то папка установки c:\Program Files\Программа\ , а если "Пользователь" ("User") - с ограниченными правами, то папка установки c:\Программа\ »
читать дальше » »

За совет конечно спасибо, но это не совсем, то, что нужно... то что вы привели в качестве примера, есть в c:\Program Files\NSIS\Examples\ ... Мне нужно чтоб перед установкой делалась проверка на пользователя... если это будет "Администратор" ("Admin"), то папка установки c:\Program Files\Программа\ , а если "Пользователь" ("User") - с ограниченными правами, то папка установки c:\Программа\ ,

тобишь надо чтоб перед установкой сделалась проверка на пользователя и в зависимости от от пользователя Администратор или Пользователь, менялось значение InstallDir, при Администраторе - InstallDir "$PROGRAMFILES\${PRODUCT_NAME}" , а при пользователе InstallDir "$SYSDRIVE\${PRODUCT_NAME}"

kotkovets 25-07-2010 22:26 1460492

Lisabon ,что вам мешает в функции .onInit менять значение $INSTDIR в зависимости от переменной
$R0 ???
читать дальше »

Код:

Function .onInit
 !insertmacro IsUserAdmin $R0
 ; с правами администратора
 ${If} $R0 == 1
  StrCpy $INSTDIR "$PROGRAMFILES\Программа"
  MessageBox MB_OK "$INSTDIR"
 ${EndIf}
; c ограниченной учеткой
 ${If} $R0 == 0
  StrCpy $SYSDRIVE $WINDIR 2
  StrCpy $INSTDIR "$SYSDRIVE\Программа"
  MessageBox MB_OK "$INSTDIR"
 ${EndIf}
FunctionEnd


XCV 02-08-2010 13:53 1465158

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

kotkovets 02-08-2010 14:50 1465211

Цитата:

Цитата XCV
как заставить деинсталятор перед началом удаления убить запущенный процесс удаляемой проги »

Код:

Function un.onInit
 ExecWait 'TASKKILL /F /IM процесс.exe' 
FunctionEnd

или Плагин

Tolian 13-08-2010 09:53 1472682

Привет всем!Люди я начинающий в среде NSIS...Подскажите пожалуйста как отобразить страницу с вводом параметров?

kotkovets 13-08-2010 15:13 1472928

Цитата:

Цитата Tolian
отобразить страницу с вводом параметров? »

Параметров чего?

Tolian 13-08-2010 15:48 1472952

при установке выбирается какие программы устанавливать, потом отображается страница ввода параметровнекотрой программы...

Я накидал что то похожее:

Function SozdStr

!insertmacro MUI_HEADER_TEXT "" ""

File /oname=$PLUGINSDIR\Forma.ini "*.ini"

InstallOptions::initDialog "$PLUGINSDIR\*.ini"

InstallOptions::Show

FunctionEnd

Tolian 13-08-2010 16:22 1472971

как сделать чтобы если не выбрана программа для установки из писка, то пропускать определенную страницу?

Tolian 13-08-2010 17:29 1473037

скажите пожалуйста с чего начать написание плагина???

kotkovets 13-08-2010 18:41 1473104

Цитата:

Цитата Tolian
как сделать, чтобы если не выбрана программа для установки из cписка, то пропускать определенную страницу? »

Вот примерчик, изучайте:
читать дальше »

Код:

!include "MUI.nsh"

!insertmacro MUI_PAGE_COMPONENTS
Page custom Моя_страница
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH

!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS
!insertmacro MUI_LANGUAGE "Russian"

OutFile "setup.exe"
InstallDir "$PROGRAMFILES\Моя программа"

Section "Настройка программы" test ;test -индефикатор секции
SectionEnd


Function Моя_страница
SectionGetFlags ${test} $9 ;считытывает значение секции и записывает в переменную $9
                          ;если $9 =1 - секция отмечена, $9 =0  - секция не отмечена
StrCmp $9 0 Next        ;сравнение: при $9 =0 переход к Next
Initpluginsdir
!insertmacro INSTALLOPTIONS_EXTRACT "Dialog.ini"
!insertmacro MUI_HEADER_TEXT "Установка" "Настройка программы"
!insertmacro MUI_INSTALLOPTIONS_DISPLAY "Dialog.ini"
Next:
FunctionEnd

Dialog.ini
Код:

[Settings]
NumFields=8
NextButtonText=Установить
RTL=0

[Field 1]
Type=Label
Text=Вы попали на страницу настройки программы
Left=5
Right=301
Top=1
Bottom=20



Цитата:

Цитата Tolian
скажите пожалуйста с чего начать написание плагина??? »

Изучением NSIS , шапки темы и языков программирования

Tolian 14-08-2010 10:05 1473423

например, как пишется плагин на delphi?есть примеры плагинов?

Belial4444 15-08-2010 12:21 1474068

Здравствуйте я новичок в нсис, собрал свой инсталлятор почти нормально). Есть проблема: при выборе пользователем папку установки после нажатия ок к папке установки автоматически приписывается \Left 4 dead 2 Берется это приписывание видимо осюда : InstallDir $PROGRAMFILES\Left4 dead 2 . Как такое возможно? Ведь эта команда просто отвечает за дефолтный путь. Причем если я напишу InstallDir $PROGRAMFILESLeft4 dead 2 то у меня не приписывается ничего, все нормально. Посмотрел примеры в папке нсис, там такая же ситуация). SetOutPath $***INSTDIR у меня стоит, может что-то в ней?

kotkovets 15-08-2010 16:03 1474181

Belial4444,
команда InstallDir записывает значение в переменную $INSTDIR
читать дальше »

Код:

OutFile "Test.exe"

Page Directory
Page InstFiles
InstallDir "$PROGRAMFILES\Left4 dead 2"

Section "test"
MessageBox MB_ICONINFORMATION|MB_OK "$INSTDIR"
SectionEnd


Нельзя так писать:
InstallDir $PROGRAMFILESLeft4 dead 2, a то у вас получится C:\Program FilesLeft4 dead 2 :cool:
SetOutPath $INSTDIR , а не SetOutPath $***INSTDIR
P.S
Имена папок,файлов имеющие пробел обязательно брать в "кавычки" - "$PROGRAMFILES\Left4 dead 2"

Tolian 15-08-2010 17:20 1474214

Привет всем!люди как писать плагин?подскажите будьте добры.

Tolian 15-08-2010 18:52 1474255

Ау?!есть кто?:)Не могу сообразить как написать плагин который будет при установке записывать данные в файл с определенной страницы где мы вводили некоторые данные.

Belial4444 15-08-2010 19:44 1474266

kotkovets, видимо я на форум не так скопировал. В скрипте у меня нет звездочек. А про C:\Program FilesLeft4 dead 2, я написал чтобы акцентировать внимание нга том что при выборе папки установки не приписывается \Left 4 dead 2. Ковычки я поставил все равно после выбора папки установки к ней приписывается \ Left 4 dead 2.Вот скрипт http://rapidshare.com/files/413111679/patch.nsi Вот скомпилированный вариант http://rapidshare.com/files/41311198...pdate_2033.exe

kotkovets 15-08-2010 23:42 1474417

Belial4444,
как вариант1:
Eсли вам надо, что бы файлы распаковывались в разные папки:
Код:

SetOutPath "Ваш Путь"
File /r *.*
SetOutPath "Ваш Путь1"
File /r *.*

Если не нужно,то страницу выбора директории исключаем
Команду InstallDir также исключаем

как вариант2:
Код:

!include "MUI.nsh"
Name "Universal L4D2 Patch"
!define MUI_ABORTWARNING
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"
OutFile "l4d2_universal_update_2033.exe"
;InstallDir "$PROGRAMFILES\Left 4 dead 2"
Section ""
SetOutPath $INSTDIR
MessageBox MB_ICONINFORMATION|MB_OK "$INSTDIR"
;File /r /x *.nsi *.*
SectionEnd

$PROGRAMFILES - Предопределенная переменная
C:\Program FilesLeft4 dead 2 - вы просто указываете на определенную папку т.е абсолютный путь
А подробней все расскажет:
Справочник по NSIS

kotkovets 16-08-2010 00:20 1474436

hb860, вы уж извините ,что за вас в этой теме отвечаю на все посты... :)

hb860 16-08-2010 00:51 1474444

kotkovets, я только ЗА. у меня как раз со временем ппц полный

Belial4444 16-08-2010 06:37 1474492

kotkovets
Спасибо большое за информативность. Оказывается дело в другом. Когда я проставил палку в конце \ то все стало работать. То есть надо было так писать: InstallDir "$PROGRAMFILES\Left 4 dead 2\". Может это здесь кому-нибудь из начинающих поможет. Если что я ещё буду вопросы задавать). А за справочник отдельное спасибо, полезная штука.
У меня новый вопрос: если я пишу DirText "Для применения обновления Вам необходимо будет
указать путь к каталогу в котором находится система.
Только если Вы правильно укажете путь,
можно будет установить обновление." И выдает ошибку:
Error: unterminated string parsing line at C:\patch\patch.nsi:17
Error in script "C:\patch\patch.nsi" on line 17 -- aborting creation process
Если по английски пишу, то норм все)

kotkovets 16-08-2010 09:22 1474541

Belial4444,
Код:

DirText "text" "subtext" "browse_button_text" "browse_dlg_text"
Давайте скрипт взглянем.
Пожалуйста скрипты заключайте в тег [code],легче читать

Tolian 16-08-2010 09:24 1474543

люди добрые помогите написать плагин...очень нужно... :cry:

CyberMaster 16-08-2010 10:07 1474564

Помогите пожалуйста решить такую задачу:
Есть файл с атрибутом "Только чтение" File.ext в нем нужно найти и заменить две строчки

Text1 "bla bla bla"
Text2 "bla bla bla"

Заменить на

Text3 "ololo"
Text4 "ololo"

Как это сделать?
P.s атрибут "Только чтение" файлу File.ext нужно вернуть обратно после его редактирования.
P.p.s замена этого файла, на заранее отредактированный файл не катит.

kotkovets 16-08-2010 10:34 1474582

Tolian,
Не изобретайте,велосипед,все давно уже сделано:
WriteiniStr - записывает данные в *.ini или *.inf файлы
ReadINIStr - читает секции из *.ini или *.inf файлов и помещает данные в переменную
FileWrite - запись данных в файл
FileRead - чтение данных из файла и помещает данные в переменную
Откройте help самой программы,введите в указатель эти команды.
Дополнительно,почитайте о переменных :
их аж целых 20 штук ,которые не надо объявлять..удобно размещать в них даннные
Справочник по NSIS

Tolian 16-08-2010 10:37 1474585

Я все понимаю просто задание такое...написать плагин, который будет сохранять введенные данные в файл... :cry:

kotkovets 16-08-2010 11:04 1474598

Tolian, интересное задание.... :clapping:

CyberMaster
Файл *.ini или *.inf ?

Tolian 16-08-2010 11:12 1474604

в конкретный ini файл, он дан...вот такие задания для начинающих даются :sorry:

kotkovets 16-08-2010 11:23 1474615

Tolian а где такие задания даются ?

Tolian 16-08-2010 11:30 1474620

kotkovets да товарищу на учебе, попросил помочь, вот голову и грею...и самому интересно стало разобраться... :)

kotkovets 16-08-2010 11:47 1474628

Tolian
Абсолютно,не стоит того,чтобы писать плагин,
Юзайте WriteiniStr , а примеры я уже вам давал...
Или просите помощи здесь

Tolian 16-08-2010 11:58 1474639

kotkovets спасибо хоть на этом...буду ломать мозг

kotkovets 16-08-2010 13:22 1474706

Tolian,Специально для вас:
читать дальше »

Код:

!include "MUI.nsh"

!insertmacro MUI_PAGE_COMPONENTS
Page custom Моя_страница
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH

!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS
!insertmacro MUI_LANGUAGE "Russian"

OutFile "setup.exe"
InstallDir "$PROGRAMFILES\Моя программа"

Section "Настройка программы" test ;test -индефикатор секции
SectionEnd


Function Моя_страница
SectionGetFlags ${test} $9 ;считытывает значение секции и записывает в переменную $9
                          ;если $9 =1 - секция отмечена, $9 =0  - секция не отмечена
StrCmp $9 0 Next          ;сравнение: при $9 =0 переход к Next
Initpluginsdir
!insertmacro INSTALLOPTIONS_EXTRACT "Dialog.ini"
!insertmacro MUI_HEADER_TEXT "Установка" "Настройка программы"
!insertmacro MUI_INSTALLOPTIONS_DISPLAY "Dialog.ini"
ReadINIStr $0 "$PLUGINSDIR\Dialog.ini" "Field 1" "State" ;чтение секции и помещение результата в переменную $0
ReadINIStr $1 "$PLUGINSDIR\Dialog.ini" "Field 2" "State" ;чтение секции и помещение результата в переменную $1
StrCmp $1 1 0 +2 ;сравнение если $1 =1 - отмечен
WriteINIStr "$EXEDIR\Test.ini" "Настройка программы" Checkbox1 "Отмечен" ;запись
StrCmp $0 1 0 +2 ;сравнение если $0 =1 - отмечен
WriteINIStr "$EXEDIR\Test.ini" "Настройка программы" Checkbox "Отмечен" ;запись
StrCmp $1 0 0 +2 ;если $1 =0 - не отмечен
WriteINIStr "$EXEDIR\Test.ini" "Настройка программы" Checkbox1 "Не oтмечен" ;запись
StrCmp $0 0 0 +2 ;если $0 =0 - не отмечен
WriteINIStr "$EXEDIR\Test.ini" "Настройка программы" Checkbox "Не oтмечен" ;запись
ExecShell "Open" "$EXEDIR\Test.ini"
Next:
FunctionEnd

Dialog.ini
Код:

[Settings]
NumFields=2

[Field 1]
Type=Checkbox
Text=Checkbox
Left=18
Right=82
Top=30
Bottom=41
State=0

[Field 2]
Type=Checkbox
Text=Checkbox1
Left=18
Right=82
Top=55
Bottom=65
State=0


В результате рядом с инсталятором файл Test.ini

Tolian 16-08-2010 14:32 1474767

kotkovets спасибо большое. посмотрим что и как :cool:

Tolian 16-08-2010 15:45 1474834

Да kotkovets и не надо ничего выдумывать :) но все же можешь помочь разобраться как работать с delhi для написания плагина?лучше на примере.

kotkovets 16-08-2010 16:08 1474857

Tolian, с Delphi не помогу...сам пока учусь что и как...
гугл вам в помощь :tongue:

Tolian 16-08-2010 16:22 1474867

kotkovets, ну ладно спасибо и на том:)

если что попадется подобное сообщи:)

Tolian 16-08-2010 17:04 1474889

kotkovets ты может быть знаешь как записать данные со страницы в файл?страницу созданная мной.на ней ввожу некоторые данные

kotkovets 16-08-2010 17:47 1474909

Tolian, я примером показал как делать...

CyberMaster 16-08-2010 17:50 1474911

Цитата:

Цитата kotkovets
CyberMaster
Файл *.ini или *.inf ? »

Файл вообще с расширением .gam, но там текст.

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

Собственно вот содержимое того файла:
Код:

game "Counter-Strike"
url_info "www.counter-strike.net"
url_dl ""
version "1.6"
size "184000000"
svonly "0"
secure "0"
type "multiplayer_only"
cldll "1"
hlversion "1111"
nomodels "1"
nohimodel "1"
mpentity "info_player_start"
gamedll "dlls\mp.dll"
gamedll_linux "dlls/cs_i386.so"
trainmap "tr_1"

Две строки которые нужно заменить
gamedll "dlls\mp.dll"
gamedll_linux "dlls/cs_i386.so"

kotkovets 16-08-2010 18:28 1474934

CyberMaster, Поздно вечером че нибудь придумаю и отпишусь...

CyberMaster 16-08-2010 20:32 1474999

kotkovets, спасибо буду ждать :)
P.s Вот справка на этот счет Replacing Lines in a Text File но в аглицком мало понимаю :( Пробую разбираться...

kotkovets 17-08-2010 01:14 1475178

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

CyberMaster
В каталоге NSIS\Bin есть замечательная утилитка GenPat.exe тобишь:
1) Файл *.gam открываем блокнотом, редактируем как вам нужно, и сохраняем в файл *_new.gam
2) Создаем батник следующего содержания:
Код:

GenPat.exe "*.gam" "*_new.gam" "Path.pat"
на выходе получаем файлик Path.pat.
Код:

OutFile "test.exe"

Section
  SetOutPath "Bашь путь"
  File "*.gam"
  SetFileAttributes "Bашь путь\*.gam" "NORMAL"
  Rename "Bашь путь\*.gam" "Bашь путь\*_.gam"
  InitPluginsDir
  File /oname=$PLUGINSDIR\path.pat "path.pat"
  vpatch::vpatchfile "$PLUGINSDIR\path.pat" "Bашь путь\*_.gam" "Bашь путь\*.gam"
  Delete "Bашь путь\*_.gam"
  SetFileAttributes "Bашь путь\*.gam" "READONLY"
SectionEnd

Path.pat - файл изменений.
Тобишь, файл *.gam не заменяется, а изменяется т.е патчится

CyberMaster 17-08-2010 02:49 1475205

Спасибо за помощь
Цитата:

Цитата kotkovets
Средствами NSIS я не нашел, как поменять строку в файле »

Category:Text Files Manipulation Functions

Belial4444 17-08-2010 07:29 1475239

kotkovets, спасибо с текстом разобрался. У меня новый вопрос: у меня не работает команда записи значения параметра в ини файл. Компилируется без ошибок, но после установки файл ини остается неизменным.
Код:

Function fnTextChange   
Pop $1
${NSD_GetText} $Text $R0
WriteINIStr $INSTDIR\rev.ini steamclient PlayerName $R0
FunctionEnd

В установщике пользователь вводит текст, текст записывается в переменную и потом эта переменная должна записываться в ини файл, но этого не происходит.

kotkovets 17-08-2010 09:18 1475288

Belial4444
Попробуйте вместо WriteIniStr,,,,,,,, MessageBox MB_OK "$R0"
Вы увидите содержимое $R0 или нет.... :dont-know
Код:

Function fnTextChange   
Pop $1
${NSD_GetText} $Text $R0 ;считывает текст
${NSD_SetText} $Label "Текст в поле ввода: $R0"
MessageBox MB_OK "$R0"
FunctionEnd

${NSD_SetText} - обработчик событий, если ничего не измените в поле ввода , то ничего не изменится и не запишится :)
Полное описание модуля , правда на английском.
И вообще если вы хотите записать данные в файл, то лучше делать так:
Код:

Page custom Bla Bla1
-----------------
-----------------
Function Bla1
${NSD_GetText} $Text $R0
WriteINIStr $INSTDIR\rev.ini steamclient PlayerName $R0
FunctionEnd

Функция Bla1 выполняется при закрытии или переходе на другую страницу.

Tolian 17-08-2010 10:00 1475315

как пользоваться !insertmacro MUI_INSTALLOPTIONS_READ?

kotkovets 17-08-2010 11:22 1475373

Tolian
Этот макрос читает секции из *.ini файла настроек и помещает результат в переменную:
Код:

!insertmacro INSTALLOPTIONS_READ $R5 "Dialog.ini" "Field 1" "State"
Точно также как ReadIniStr :
Код:

ReadINIStr $R5 "$PLUGINSDIR\Dialog.ini" "Field 1" "State"

Tolian 17-08-2010 11:28 1475380

что вводить можно в $R5? у меня ошибку дает

kotkovets 17-08-2010 11:49 1475416

Tolian
Я не телепат...
Цитата:

Цитата Tolian
что вводить можно в $R5? »

Все что угодно..... :) ну или почти...
Код:

StrCpy $R5 Tolian
MessageBox MB_OK "$R5"


Tolian 17-08-2010 11:55 1475419

kotkovets, А это верно?:


Function Show

SectionGetFlags ${11} $9

StrCmp $9 0 Next

File /oname=$*.ini "*.ini"

InstallOptions::initDialog "*.ini"

InstallOptions::Show

Next:

FunctionEnd


Function zak

!insertmacro MUI_INSTALLOPTIONS_READ $R1 "*.ini" "Field 2" "State"

!insertmacro MUI_INSTALLOPTIONS_READ $R2 "*.ini" "Field 4" "State"

Push “*.INI”

Push $R1

Push $R2

xxxx::SaveParam

Pop $R0

FunctionEnd

kotkovets 17-08-2010 12:10 1475430

Цитата:

Цитата Tolian
SectionGetFlags ${11} $9 »

($0 - $9) - 10 переменных которых не нужно объявлять
($R0 - $R9) - 10 переменных которых не нужно объявлять
Цитата:

Цитата Tolian
MoiPlagin::SaveParam »

Ваш плагин ???? интересно посмотреть.....
Цитата:

Цитата Tolian
Function ShowPage и Function LeavePage »

Эти функции откуда вызываются?

Tolian,возьмитесь за учебник,читайте посты...справку

Tolian 17-08-2010 12:15 1475435

kotkovets, по поводу плагина, да я пытаюсь написать его...

а это функции с Page custom тянутся...

kotkovets 17-08-2010 12:23 1475444

Цитата:

Цитата Tolian
по поводу плагина, да я пытаюсь написать его »

Прежде чем писать плагин изучите NSIS: принципы работы и синтаксис

CyberMaster 17-08-2010 22:34 1475906

Как сделать так, что бы если необходимый файл не найден, инсталлятор говорил типа "Файл не найден. Продолжить устоновку?"

kotkovets 17-08-2010 23:14 1475932

CyberMaster
Код:

Section 
 IfFileExists "Путь к файлу" Next 
 MessageBox MB_ICONQUESTION|MB_YESNO "Файл не найден. Продолжить установку?" IDNO NO IDYES Next 
 NO:
 Quit 
 Next: 
 ;продолжение скрипта 
SectionEnd


Belial4444 18-08-2010 10:03 1476168

kotkovets, мне надо не вывести переменную а записать её в ини файл и для этого вроде есть только команда WriteINIStr.
У меня она выглядит так WriteINIStr "$INSTDIR\rev.ini" "steamclient" "PlayerName "$R0" и Компилируется все без ошибок. Дак почему у меня не записывается ничего?). Может тебе дать скрипт и скомпилированный вариант снова?)

kotkovets 18-08-2010 10:55 1476213

Цитата:

Цитата Belial4444
Может тебе дать скрипт »

Давай только скрипт...
Поглядим...
Цитата:

Цитата Belial4444
мне надо не вывести переменную а записать её в ини файл »

В место WriteIniStr я подставил MessageBox в качестве примера, чтобы вы увидели содержимое $R0 ...для отладки вашего скрипта...Вы поняли? :)

kotkovets 18-08-2010 18:05 1476497

Для участников форума выкладываю скрипт для замены строки в текстовом файле (txt, ini, inf и т.п)
Скрипт был взят отсюда .
Я доработал скрипт,так как в оригинале скрипт создает файл-пустышку,
если указываемого в скрипте файла не существует,
что в некоторых случаях бывает недопустимо.
Собственно доработанный мною скрипт:
Код:

!include FileFunc.nsh

!define line "Oszone.net" ;Сюда пишем искомую строку для замены
!define line_replace "Oszone.forum.net" ;Сюда пишем строку замены

OutFile "Test.exe"

Section
  ClearErrors
  FileOpen $0 "Путь к файлу" r
  GetTempFileName $R0
  FileOpen $1 $R0 w
 loop:
  FileRead $0 $2
  IfErrors done
  StrCmp $2 '${line}$\r$\n' 0 +2
  StrCpy $2 '${line_replace}$\r$\n'
  StrCmp $2 '${line}' 0 +2
  StrCpy $2 '${line_replace}'
  FileWrite $1 $2
  Goto loop
 done:
  FileClose $0
  FileClose $1
  ${GetFileName} $R0 $R1
  ${Locate} $TEMP "/L=F /S=0:0B /M=$R1" "Del"
  IfFileExists $R0 0 +4
  CopyFiles /SILENT $R0 "Путь к файлу"
  Delete $R0
  Push $0
SectionEnd

Function Del
 Delete $R0
 Push $0
FunctionEnd

Если строка такого вида: "Oszone. "forum" ".net"" и т.п , то пишем как то так:
Код:

!define line '"Oszone."net""'
!define line_replace '"Oszone. "forum" ".net""'


hb860 19-08-2010 01:45 1476775

Цитата:

Цитата CyberMaster
Файл вообще с расширением .gam, но там текст.
Насчет редактирования забыл сказать: Если это упростит задачу, Те две строки можно удалить и записать две новые в конец файла
Собственно вот содержимое того файла:
Код:
game "Counter-Strike"
url_info "www.counter-strike.net"
url_dl ""
version "1.6"
size "184000000"
svonly "0"
secure "0"
type "multiplayer_only"
cldll "1"
hlversion "1111"
nomodels "1"
nohimodel "1"
mpentity "info_player_start"
gamedll "dlls\mp.dll"
gamedll_linux "dlls/cs_i386.so"
trainmap "tr_1"
Две строки которые нужно заменить
gamedll "dlls\mp.dll"
gamedll_linux "dlls/cs_i386.so" »

Вот я бы как сделал
Код:

!include "WordFunc.nsh"
!insertmacro WordReplace

.
.
.

FileOpen $0 $INSTDIR\file.dat a
IfErrors done
FileRead $0 $1
${WordReplace} $1 'gamedll "dlls\mp.dll"' 'gamedll dlls\newdll.dll' "+*" $R0
FileWrite $0  $R0
FileClose $0
done:

Вроде и не особо сложно

kotkovets 19-08-2010 09:17 1476915

hb860
Код:

FileOpen $0
$INSTDIR\file.dat a 
IfErrors done 
FileRead $0 $1 
${WordReplace} $1 'gamedll "dlls\mp.dll"' 'gamedll dlls\newdll.dll' "+*" $R0 
FileWrite $0  $R0 
FileClose $0 
done:

В этом коде не заменяется строка, а дописывается.
команда FileRead в этом коде читает только первую строку...а вдруг искомая строка не первая?
команда FileWrite - не умеет перезаписывать строки, а только записывать!
A команда WriteIniStr умеет перезаписывать , но работает только с файлами имеющие структуру inf или ini файла
Код:


!include "WordFunc.nsh"
!insertmacro WordReplace
OutFile Test.exe

Section ""
 WriteINIStr $EXEDIR\Test.ini Path Directory "%programfiles%"
 ReadINIStr $R0 $EXEDIR\Test.ini Path Directory
 ${WordReplace} $R0 "%programfiles%" "$PROGRAMFILES" "+" $R1
 WriteINIStr $EXEDIR\Test.ini Path Directory $R1
SectionEnd

Так, что сей способ не пригоден!

hb860 20-08-2010 00:38 1477664

Вложений: 1
Вот чёрт, и правда
Ударил в грязь лицом :)

Испавил, добавил цикл. Файл создается в памяти в переменной R1 и перезаписывается в локации
Оформил макросом для удобства вызова в любом скрипте - просто вставить макрос и вызвать
Код и файлом во вложении
Код:

!include "WordFunc.nsh"
!insertmacro WordReplace

Name "Example1"

OutFile "example1.exe"

InstallDir $DESKTOP\Example1

RequestExecutionLevel user

Page directory
Page instfiles




!macro ReplaceInFile FileName FindWhat ReplaceWith
!Define ID ${__LINE__}

StrCpy $R1 ''
FileOpen $0 ${FileName} r
IfErrors done_${ID}
 
Repeat_${ID}:   
Push $1
Push $R0

FileRead $0 $1
IfErrors Close_${ID}

${WordReplace} $1 "${FindWhat}" "${ReplaceWith}" "+" $R0
StrCpy $R1 $R1$R0
Goto Repeat_${ID}

Close_${ID}:
FileClose $0

FileOpen $0 ${FileName} w
IfErrors done_${ID}
FileWrite $0 $R1
FileClose $0

done_${ID}:

!undef ID
!macroend       



Section "" ;No components page, name is not important

  SetOutPath $INSTDIR
 
  File file.gam

  !InsertMacro ReplaceInFile "$INSTDIR\file.gam" "gamedll $\"dlls\mp.dll$\"" "Строка 1, которую нужно заменить"
  !InsertMacro ReplaceInFile "$INSTDIR\file.gam" "gamedll_linux $\"dlls/cs_i386.so$\"" "Строка 2, которую нужно заменить"

SectionEnd ; end the section

Цитата:

Цитата kotkovets
A команда WriteIniStr умеет перезаписывать , но работает только с файлами имеющие структуру inf или ini файла »

А это чё такое? Я разве предлагал её использовать?

kotkovets 20-08-2010 00:48 1477667

Цитата:

Цитата hb860
Цитата kotkovets:A команда WriteIniStr умеет перезаписывать »

В качестве примера :)
Цитата:

Цитата hb860
Оформил макросом »

Надо поучится мне макросы писать..

Belial4444 20-08-2010 09:18 1477778

kotkovets, спасибо большое запахало, действительно надо было использовать функцию Bla1, а что касается той функции, которую я юзал, там даже значение переменной не выводилось). У меня ещё 2 вопроса: 1.если я хочу создать несколько своих страниц инсталятора, то как их нужно указывать по - другому. Не писать же Page custom Bla Bla1 два раза. Наверное надо Page custom Bla Bla1 (2) и что - то вроде этого? 2. Как можно командой File (или другой) исключить папку из сборки инсталятора, или наоборот включить её. С файлами я знаю, а про папки не нашел.

kotkovets 20-08-2010 10:41 1477832

Цитата:

Цитата Belial4444
Не писать же Page custom Bla Bla1 два раза»

Код:

Page custom Bla Bla1
Page custom Bla2 Bla3 ; 2 страницa

File /r Папка\*.* - добавляет из каталога Папка все файлы включая вложенные папки

Belial4444 20-08-2010 14:17 1477996

Ок, новый вопрос: как правильно посчитать координаты нужного места для размещения, надписи, картинки например. И как можно изменить картинку слева?) http://s45.radikal.ru/i108/1008/f3/fdf7eeab792f.png. И ещё: как можно сменить цвет фона установщика? Например как здесь http://s45.radikal.ru/i108/1008/80/19680a3a23c8.png

kotkovets 20-08-2010 14:44 1478010

Цитата:

Цитата Belial4444
как правильно посчитать координаты нужного места для размещения, надписи, картинки »

как то путем проб всё время: одно значение меняешь и смотришь изменения...... :unsure:
${NSD_CreateLabel} <координатаХ> <координатаУ> <Ширина> <Высота> <”Текст”>
Цитата:

Цитата Belial4444
И как можно изменить картинку слева? »

Код:

!define MUI_WELCOMEFINISHPAGE_BITMAP "Путь\картинка.bmp"
картинка должна быть размерами 164 x 314
Примеры картинок в каталоге NSIS\Contrib\Graphics\Wizard

Belial4444 20-08-2010 14:53 1478017

Ок спасибо), про размеры догадывался, раньше через smart install maker делал там такие же)

CyberMaster 21-08-2010 10:55 1478493

Подскажите пожалуйста, как сделать что бы после инсталляции сразу открывало сайт (без запроса) ?

kotkovets 21-08-2010 13:30 1478563

Цитата:

Цитата CyberMaster
как сделать что бы после инсталляции сразу открывало сайт (без запроса) ? »

Код:

Function .onInstSuccess
 HideWindow
 Exec 'RUNDLL32 url.dll, FileProtocolHandler "http://forum.oszone.net/"'
FunctionEnd


hb860 22-08-2010 18:12 1479438

kotkovets, проще надо быть, проще!
Чёй то вы там понаписали?
Во:
Код:

ExecShell "open" "http://www.winreview.ru"

kotkovets 22-08-2010 19:10 1479488

Ах да да!!! :tomato2:
как раз был открыт Справочник по командам Windows :happy:

boss911 23-08-2010 23:27 1480417

Есть исходник NSIS, в скрипте которого я мало чего понимаю. Если скомпилить скрипт, то в компонентах увидим чекбокс 'Mozilla plugin'. Скажите, плиз, есть ли в инсталляторе проверка на то, установлена ли в системе Мозила? Я подозреваю, что она должна быть, то есть, если Мозила установлена, то галка на чекбоксе установлена, если нет, то и галка снята. Если такая проверка есть, подскажите, на какой маркер он ссылается, узнает, установлена ли Мозила или нет. Или нет там такой проверки?

Комсомолец 24-08-2010 15:22 1480780

boss911, скрипт в студию.

kotkovets 25-08-2010 00:43 1481084

boss911,
Скрипт весь в макросах.......ужас.Сложновато чытаты :o
Цитата:

Цитата boss911
Скажите, плиз, есть ли в инсталляторе проверка на то, установлена ли в системе Мозила? »

при инсталляции похоже нету......
Код:

!ifdef INSTALL_MOZILLA
Section /o $Name_Section03 SEC03
  SectionIn 3

  SetOutPath "$INSTDIR"
  !insertmacro OpenUninstallLog
  !insertmacro InstallFile mozilla\npvlc.dll
  !insertmacro InstallFile mozilla\npvlc.dll.manifest
  !insertmacro CloseUninstallLog

!define Moz "SOFTWARE\MozillaPlugins\@videolan.org/vlc,version=${VERSION}"
  WriteRegStr HKLM ${Moz} "Description" "VLC Multimedia Plugin"
  WriteRegStr HKLM ${Moz} "Path" "$INSTDIR\npvlc.dll"
  WriteRegStr HKLM ${Moz} "Product" "VLC media player"
  WriteRegStr HKLM ${Moz} "Vendor" "VideoLAN"
  WriteRegStr HKLM ${Moz} "Version" "${VERSION}"
SectionEnd
!endif

У этой секции всегда снята галочка
а вот при деинсталяции чета есть:
Код:

    ; Check for Key
    EnumRegKey $R0 HKLM "SOFTWARE\Mozilla" "$R1"
    StrCmp $R0 "" "${Index}-End"
    IntOp $R1 $R1 + 1
    ReadRegStr $R2 HKLM "SOFTWARE\Mozilla\$R0\Extensions" "Plugins"
    StrCmp $R2 "" "${Index}-Loop" ""

    ; old files (0.8.5 and before) that may be lying around
    Delete /REBOOTOK "$R2\npvlc.dll"
    Delete /REBOOTOK "$R2\libvlc.dll"
    Delete /REBOOTOK "$R2\vlcintf.xpt"
    Goto "${Index}-Loop"

EnumRegKey - перебирает ключи реестра в ветке HKLM "SOFTWARE\Mozilla"
Проверяет, какая версия, Mozilla
ReadRegStr $R2 HKLM "SOFTWARE\Mozilla\$R0\Extensions" "Plugins"
Читает путь, к плагинами Mozilla

boss911 25-08-2010 01:49 1481105

Цитата:

Цитата kotkovets
при инсталляции похоже нету...... »

Спасибо, я так и подозревал.

Дело в том, что я пишу скрипт для Inno, там хочу сделать проверку установки Мозилы в системе, но я не знаю, где в системе найти подходящий маркер, что она действительно установлена. Думал, что нечто подобное реализовано в скрипте NSIS для VLC. А вот это:
Цитата:

Цитата kotkovets
EnumRegKey - перебирает ключи реестра в ветке HKLM "SOFTWARE\Mozilla"
Проверяет, какая версия, Mozilla »

не решает мою задачу. Для эксперимента, я у друга взял папку с установленной Мозилой и запустил ее у себя, так в "HKLM, SOFTWARE\Mozilla" ничего не записалось. Так что, это плохой маркер для обнаружения установленной Мозиоы, так как его там может просто не существовать. Буду искать что-то другое, более надежнее.

kotkovets 25-08-2010 02:15 1481110

boss911
При инсталяции Mozilla ветка "HKLM, SOFTWARE\Mozilla" создается, тока проверил.
там же и версия и путь к Mozilla
А за скрипт спасибо! будет на чем тренироваться

boss911 25-08-2010 04:57 1481136

Цитата:

Цитата kotkovets
При инсталяции Mozilla ветка "HKLM, SOFTWARE\Mozilla" создается, тока проверил. »

Цитата:

Цитата boss911
Для эксперимента, я у друга взял папку с установленной Мозилой и запустил ее у себя, так в "HKLM, SOFTWARE\Mozilla" ничего не записалось. »

То есть, запись создает инсталлятор Мозилы, но не она сама. Кто-то возьмет себе портабл версию Мозилы, как я, и записи "HKLM, SOFTWARE\Mozilla" не будет, то есть, этот маркер обнаружения Мозилы в системе не надежный, вот об этом я и говорю. Ладно, то такое, поищу что-то другое, а если не найду, то и фиг с ним. То, что я хотел узнать из этого скрипта, я уже узнал благодаря вам, спасибо еще раз.

asetin_9207 25-08-2010 23:26 1481792

Здравствуйте, я этом деле я новичок, поэтому не прошу сильно судить, будут несколько вопросов к вам и рассчитываю на вашу помощь.
Занялся сборкой установщика и возникло несколько вопросов:
1. На приветствии установщика я использовал и имя, и версию, но почему-то версия скосилась и ее практически не видно... Удлинять имя не стал и не буду, так как нужно, чтобы именно с таким именем и было.
Вот, собственно, сам скриншот: http://rghost.ru/2442700.view
Кто знает как исправить и чтобы все нормально было видно?
2. Имеются 2 секции в одной группе, но нужно сделать так, чтобы при выборе одной секции невозможно было выбрать одновременно другую (блокировалось), так же и наобороот. Может кто знает код или переменную?
3. В компонентах устанавливаемой программы имеется иконка (справа). Так вот как ее сменить, чтобы она отличалась от иконки окна установщика (заголовок) и какой максимальный размер можно при этом употребить?
Вот, собственно, сам скриншот: http://rghost.ru/2442761.view
4. Кто знает как делать предустановочную анимацию? Например, запустил установщик и сначала вылезло небольшое видео, а потом открылось само окно установщика.

kotkovets 26-08-2010 00:11 1481815

Цитата:

Цитата asetin_9207
но почему-то версия скосилась и ее практически не видно »

почитайте ранние посты там уже это было
Цитата:

Цитата asetin_9207
чтобы при выборе одной секции невозможно было выбрать одновременно другую »

читать дальше »

Код:

Name "One Section"
OutFile "one-section.exe"
RequestExecutionLevel user
Page components

Section "Group 1 - Option 1" g1o1
SectionEnd

Section /o "Group 1 - Option 2" g1o2
SectionEnd

Function .onInit
  StrCpy $1 ${g1o1} ; Group 1 - Option 1 is selected by default
FunctionEnd

Function .onSelChange

  !insertmacro StartRadioButtons $1
    !insertmacro RadioButton ${g1o1}
    !insertmacro RadioButton ${g1o2}
  !insertmacro EndRadioButtons

FunctionEnd


Цитата:

Цитата asetin_9207
Кто знает как делать предустановочную анимацию? »

http://nsis.sourceforge.net/AnimGif_plug-in
Цитата:

Цитата asetin_9207
В компонентах устанавливаемой программы имеется иконка (справа). Так вот как ее сменить, чтобы она отличалась от иконки окна установщика (заголовок) и какой максимальный размер можно при этом употребить? »

читать дальше »

Код:

!define MUI_HEADERIMAGE
!define MUI_HEADERIMAGE_BITMAP "Мой рисунок.bmp"

Если нужно справа, то добавляем:
Код:

!define MUI_HEADERIMAGE_RIGHT
Размер картинки: 150x57

Почитайте
Справочник по NSIS

asetin_9207 26-08-2010 11:17 1482025

kotkovets спасибо, но не во всем я разобрался, с секциями, например. Сделал анологию кода, но полезли ошибки, вроде бы все как по образцу, но все же...
Мой код секции:

Код:

Section "!Обновление игры" secUpdate  SectionIn 1 2  SetOutPath "$INSTDIR"  File /r /x *.nsi *.*  SectionEnd    SectionGroup /e "!Эмуляторы" secEmulator    Section "Stryder emulator(для Garena)" secStryder  SectionIn 3  SetOutPath "$INSTDIR"  File /r E:\stryder\*.*  SectionEnd    Section /o "Revolution Crew emulator(рекомендуемый)" secRevcrew  SectionIn 4  1  SetOutPath "$INSTDIR"  File /r E:\revcrew\*.*  SectionEnd    SectionGroupEnd
Также насчет анимации... там есть примеры, да они работают, но не там, где хотелось бы видеть. Мне надо, чтобы анимация выходила перед самим окном установщика, а в примерах то в приветственном лого стоят, то в лого справа. Это не совсем то...

Извините, а нельзя страниц конкретную с проблемой скоса версии в приветствии?
Справочник у меня есть, но, к сожалению, там не все, чего хотелось бы.
Также хотелось бы узнать: каким образом можно сменить\изменить фон установщика? Например, http://s45.radikal.ru/i108/1008/80/19680a3a23c8.png

kotkovets 26-08-2010 14:47 1482189

Цитата:

Цитата asetin_9207
не во всем я разобрался, с секциями»

Пост #307
Выбор в группе двойным нажатием
Цитата:

Цитата asetin_9207
Также насчет анимации... »

http://nsis.sourceforge.net/Animate_plug-in
Цитата:

Цитата asetin_9207
а нельзя страниц конкретную с проблемой скоса версии в приветствии? »

Короче напишите:
Код:

Name "BLA BLA BLA"
Цитата:

Цитата asetin_9207
изменить фон установщика?»

Это скин читайте внимательно шапку темы
Расширение функциональности

Belial4444 26-08-2010 15:26 1482214

kotkovets , слушай у меня появились 2 новых вопроса:
1. Как мне считать данные из файла .inf без секции с помощью функции ReadINIStr? Выставление " " на месте параметра секции не помогло.
2. Будет ли в нсисе разбивка на файлы, если дистрибутив больше 2 гигабайт, можно ли будет этим файлам задать имена?

hb860 26-08-2010 15:37 1482226

Цитата:

Цитата kotkovets
Цитата asetin_9207:а нельзя страниц конкретную с проблемой скоса версии в приветствии? »
Короче напишите:
Код:
Name "BLA BLA BLA" »

А вот тут я позволю себе не согласиться! Почему-то многие разрабочики решают эту проблему именно вот таким, дубовым способом. А между прочим, ответ легко находится в справке.
Достаточно определить константу
Код:

!define MUI_WELCOMEPAGE_TITLE_3LINES
И всё, на странице приветствия название будет расширено до трех строчек, которых всегда хватает даже для очень длинного названия.

RTFM, господа

Belial4444 26-08-2010 17:30 1482324

Народ, как можно сделать, чтобы с группы секций нельзя было снять галку?

kotkovets 26-08-2010 18:18 1482356

Цитата:

Цитата Belial4444
Народ, как можно сделать, чтобы с группы секций нельзя было снять галку? »

читать дальше »

Код:

SectionGroup /e "some stuff"

Section "test1" section1
SectionIn RO
SectionEnd

Section  "test2" section2
SectionIn RO
SectionEnd

SectionGroupEnd


asetin_9207 26-08-2010 21:27 1482494

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

kotkovets 26-08-2010 23:15 1482578

asetin_9207,
Покажите скрипт
---------------------------------
Из справки:
Функция .onInit выполняется после инициализации инсталлятора. Это самая первая функция, которая выполняется при запуске вашего инсталлятора.
Код:

Function .onInit
 MessageBox MB_YESNO "Это установка приложения. Продолжить?" IDYES NoAbort
    Abort
 NoAbort:
FunctionEnd


asetin_9207 26-08-2010 23:26 1482588

Скрипт:

Function .onInit
SetOutPath $INSTDIR - пытался надеть скин, но не получилось.
File "${NSISDIR}\Plugins\Accent.skf"
NSIS_SkinCrafter_Plugin::skin /NOUNLOAD "$INSTDIR\Accent.skf"
!insertmacro MUI_LANGDLL_DISPLAY

SetOutPath '$PLUGINSDIR' - использовал стандартную аниме, но также нету никакой анимешки. Надо чтобы она была перед запуском самого установщика (окна).
File "E:\sonic.gif"
AnimGif::play /NOUNLOAD '$PLUGINSDIR\sonic.gif'
; Add your page code here
AnimGif::stop
Delete '$PLUGINSDIR\sonic.gif'


FunctionEnd

kotkovets 27-08-2010 00:45 1482635

Цитата:

Цитата Belial4444
Как мне считать данные из файла .inf без секции с помощью функции ReadINIStr »

Никак.

Может этот пример поможет в вашем вопросе:
читать дальше »

Код:

Section
ClearErrors
FileOpen $0 $EXEDIR\test.txt r  #открываем файл в режиме чтения
IfErrors done
loop:
StrCmp $1 "" Done          #если искомая строка не найдена или файла нет - переход к Done
FileRead $0 $1            #чтение файла, строка помещается в  переменную $1
StrCmp $1 "Box ZEROO" 0 +2 #сравнениие если $1=Box ZEROO переход к Yes, а вдруг искомая строка
                          #первая или последняя!?
Goto Yes
StrCmp $1 "Box ZEROO$\r$\n" 0 +2 #сравнениие если $1="Box ZEROO"
Goto Yes  #переход к Yes
Goto loop #переход к loop (получается цикл пока не будет найдена искомая строка)
done:
FileClose $0 #закрытие файла
MessageBox MB_ICONSTOP|MB_OK "Ничего не найдено!" #мессага
Quit #Выход из инсталлятора
Yes:
MessageBox MB_ICONINFORMATION|MB_OK "Найдена строка: $1" #мессага
SectionEnd
#В скрипте искомая строка Box ZEROO

файл test.txt
Код:

Setup
Box ZEROO
Box1

Box2

Box3


asetin_9207 27-08-2010 18:13 1483090

Может мне кто-нибудь поможет или нет?
kotkovets, сорри, я прочистил ящик, отправьте плиз.
Может у вас есть СБО? (средство быстрого общения). Например, скайп или агент.

asetin_9207 29-08-2010 12:43 1484055

Народ, не подгружается скин, что делаю не так? Вроде делал все по инструкции от K.A.V.:

Function .onInit
SetOutPath "$PLUGINSDIR"
File "${NSISDIR}\Plugins\V-touch.skf"
NSIS_SkinCrafter_Plugin::skin /NOUNLOAD "${NSISDIR}\Plugins\V-touch.skf"
FunctionEnd

Function .onGUIEnd
NSIS_SkinCrafter_Plugin::destroy
FunctionEnd

Не получается с функцией .onVerifyInstDir сделать запрет на установку, если нету файла (ов).

Function .onVerifyInstDir
IfFileExists "E:\Left 4 Dead 2\left4dead2\bin\Client.dll" PathGood
Abort
PathGood:
FunctionEnd

Создавал собственную страничку, где прописывал текст в определенном файле:

Function fnCustomInit
nsDialogs::Create 1018

Pop $Dialog
${NSD_CreateLabel} 0 5u 100u 10u "Введите свой ник"
Pop $Label
${NSD_CreateText} 0 20u 100% 15u "L4D-Portal.Ru"
Pop $Text
nsDialogs::Show
FunctionEnd

Function fnCustomDestroy
${NSD_GetText} $Text $R0
WriteINIStr $INSTDIR\rev.ini steamclient PlayerName $R0
FunctionEnd



но теперь нужно сделать проверку на наличие устанавливаемого файла (допустим имя его - Х), если его нету (Х), то прописывать текст в другом файле (Y) и также наоборот.

kotkovets 29-08-2010 14:08 1484128

Цитата:

Цитата asetin_9207
Народ, не подгружается скин, что делаю не так? »

Код:

Function .onInit
;-----------------
 ;анимашка
;-----------------
 SetOutPath $TEMP
 File "Путь к файлу\Skinastic.skf"
 NSIS_SkinCrafter_Plugin::skin /NOUNLOAD "$TEMP\Skinastic.skf"
 Delete "$TEMP\Skinastic.skf"
FunctionEnd

Код:

Function .onGUIEnd
 NSIS_SkinCrafter_Plugin::destroy
FunctionEnd

Скин (Skinastic.skf) прекрасно подгружается!
Цитата:

Цитата asetin_9207
SetOutPath "$PLUGINSDIR" »

В переменную $PLUGINSDIR значение записывается после команды InitPluginsDir:
Код:


Section
 InitPluginsDir
 MessageBox MB_OK "$PLUGINSDIR"
SectionEnd


asetin_9207 29-08-2010 14:45 1484159

Function .onInit
;анимашка

SetOutPath $TEMP
File "${NSISDIR}\Plugins\Accent.skf"
NSIS_SkinCrafter_Plugin::skin /NOUNLOAD "$TEMP\Accent.skf"
Delete "$TEMP\Accent.skf"

FunctionEnd


Function .onGUIEnd ;подгрузка скина
NSIS_SkinCrafter_Plugin::destroy
FunctionEnd

Так почему не грузится скин?! Файл скина лежит в папке плагинов, путь указан к этой папке.

kotkovets 29-08-2010 15:10 1484185

Цитата:

Цитата asetin_9207
Так почему не грузится скин?! »

А другой скин не пробЫвал?
и поменять библиотеку (NSIS_SkinCrafter_Plugin.dll) на версию 2.6.3.0
ANSI NSIS SkinCrafter Plugin

asetin_9207 29-08-2010 17:12 1484259

Все равно нету скина. Может потому что у меня сборка винды? Хп зверь стоит. Но mfc71.dll есть у меня, проверял.

kotkovets 29-08-2010 17:23 1484267

Цитата:

Цитата asetin_9207
Все равно нету скина.»

Версию сменил плагина ?
Цитата:

Цитата asetin_9207
Может потому что у меня сборка винды Хп зверь? »

без понятия

Belial4444 29-08-2010 17:37 1484277

Нашел инсталлятор хороший и у меня возникли новые вопросы:
1. Можно ли редактировать стандартные страницы?
2. Как можно производить операции с текстом на странице? (менять стандартный, менять цвет, шрифт)
3. Есть ли визуальный редактор страниц установщика? (осталась проблема с определением нужных координат, а подбирать вручную очень долго и геморройно)

asetin_9207 29-08-2010 18:05 1484296

kotkovets, спасибо новая версия помогла. Теперь хотелось бы уточнить с проверкой.
Идея такая: Имеется 2 компонента (секции). В 1 устанавливаемом компоненте есть файл Х, во втором устанавливаемом компоненте файл Y.
Так вот, допустим, что я выбрал для установки 1-ый компонент и при написании на моей новой страничке текста, он (текст) должен писаться в устанавливаемый компонент Х, если выбрал 2-ой компонент должно писаться в устанавливаемый файл Y.
Создаваться ничего не должно, только писаться в файлах исходя из выбранного компонента (секции). Как это реализовать?
Моя страничка:

Function fnCustomInit
nsDialogs::Create 1018

Pop $Dialog
${NSD_CreateLabel} 0 5u 100u 10u "Введите свой ник"
Pop $Label
${NSD_CreateText} 0 20u 100% 15u "L4D-Portal.Ru"
Pop $Text
nsDialogs::Show
FunctionEnd

Мои секции:


Section "Stryder emulator(для Garena)" secStryder
SectionIn 3
SetOutPath "$INSTDIR"
File /r E:\stryder\*.*

SectionEnd

Section "Revolution Crew emulator(рекомендуемый)" secRevcrew
SectionIn 4 1
SetOutPath "$INSTDIR"
File /r E:\revcrew\*.*

SectionEnd

kotkovets 29-08-2010 18:08 1484297

Цитата:

Цитата Belial4444
Можно ли редактировать стандартные страницы? »

Можно
Цитата:

Цитата Belial4444
Как можно производить операции с текстом на странице? »

Можно
читать дальше »
Код:

!include "MUI.nsh"

!define MUI_HEADERIMAGE
!define MUI_PAGE_HEADER_TEXT "Установка Belial4444"
!define MUI_PAGE_HEADER_SUBTEXT "Выберите эту установку"
!define MUI_HEADER_TRANSPARENT_TEXT  # Устанавливает прозрачный фон для надписи-заголовка

!define MUI_CUSTOMFUNCTION_GUIINIT MyGUIInit

!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES

!insertmacro MUI_LANGUAGE "Russian"

Name "Программы"
OutFile "Header.exe"

Function MyGUIInit
 !include "WinMessages.nsh"
 GetDlgItem $R0 $HWNDPARENT 1037        # получаем указатель на элемент
 GetDlgItem $R1 $HWNDPARENT 1038        # получаем указатель на элемент
 SetCtlColors $R0 0xFF8040 transparent  # цвет текста зеленый, фон прозрачный
 SetCtlColors $R1 0x00FF00 transparent  # цвет текста красный, фон прозрачный
 CreateFont $1 "Verdana" 10 400          # создаём шрифт
 SendMessage $R0 ${WM_SETFONT} $1 0      # применяем созданный шрифт
 CreateFont $1 "Verdana" 8 400 /ITALIC  # создаём наклонный шрифт
 SendMessage $R1 ${WM_SETFONT} $1 0      # применяем созданный шрифт
FunctionEnd

Section -Post
SectionEnd

# 1037 это элемент текста верхнего контрола
# 1038 это элемент текста нижнего контрола


Гляньте это ...\NSIS\Docs\Modern UI\Readme.html

asetin_9207 29-08-2010 19:06 1484339

kotkovets, спасибо новая версия помогла. Теперь хотелось бы уточнить с проверкой.
Идея такая: Имеется 2 компонента (секции). В 1 устанавливаемом компоненте есть файл Х, во втором устанавливаемом компоненте файл Y.
Так вот, допустим, что я выбрал для установки 1-ый компонент и при написании на моей новой страничке текста, он (текст) должен писаться в устанавливаемый компонент Х, если выбрал 2-ой компонент должно писаться в устанавливаемый файл Y.
Создаваться ничего не должно, только писаться в файлах исходя из выбранного компонента (секции). Как это реализовать?
Моя страничка:

Код:

Function fnCustomInit
nsDialogs::Create 1018

Pop $Dialog
${NSD_CreateLabel} 0 5u 100u 10u "Введите свой ник"
Pop $Label
${NSD_CreateText} 0 20u 100% 15u "L4D-Portal.Ru"
Pop $Text
nsDialogs::Show
FunctionEnd

Мои секции:


Код:

Section "Stryder emulator(для Garena)" secStryder
SectionIn 3
SetOutPath "$INSTDIR"
File /r E:\stryder\*.*

SectionEnd

Section "Revolution Crew emulator(рекомендуемый)" secRevcrew
SectionIn 4 1
SetOutPath "$INSTDIR"
File /r E:\revcrew\*.*

SectionEnd


kotkovets 29-08-2010 19:17 1484346

Вот уже лучше
Цитата:

Цитата asetin_9207
Теперь хотелось бы уточнить с проверкой.
Идея такая: Имеется 2 компонента (секции). В 1 устанавливаемом компоненте есть файл Х, во втором устанавливаемом компоненте файл Y.
Так вот, допустим, что я выбрал для установки 1-ый компонент и при написании на моей новой страничке текста, он (текст) должен писаться в устанавливаемый компонент Х, если выбрал 2-ой компонент должно писаться в устанавливаемый файл Y.
Создаваться ничего не должно, только писаться в файлах исходя из выбранного компонента (секции). Как это реализовать? »

По понятней изложите, что куда, зачем, какой файл...а то догадываться надоедает!!!

asetin_9207 29-08-2010 19:29 1484355

1 секция - Stryder emulator(для Garena)
2 секция - Revolution Crew emulator(рекомендуемый)
Я запустил установщик, выбрал 1-ую секцию для установки, потом выходит моя страница для смены ника:

Код:

Function fnCustomInit
nsDialogs::Create 1018

Pop $Dialog
${NSD_CreateLabel} 0 5u 100u 10u "Введите свой ник"
Pop $Label
${NSD_CreateText} 0 20u 100% 15u "Сюда ввожу текст"
Pop $Text
nsDialogs::Show
FunctionEnd

При установке 1-ой секции устанавливается файл - stryder.ini
Так вот надо сделать так, чтобы вводимый текст на моей страничке менял строку
Код:

Settings Name=Текст
в устанавливаемом файле - stryder.ini

Действие 2-ое:
Я запустил установщик, выбрал 2-ую секцию для установки, потом выходит моя страница для смены ника в которой надо все сделать также как выше, НО уже в другом устанавливаемом файле - rev.ini и строка будет уже такая:
Код:

steamclient
PlayerName ="Текст"

Коды моих секции:
Секция 1:
Код:

Section "Stryder emulator(для Garena)" secStryder
SectionIn 3
SetOutPath "$INSTDIR"
File /r E:\stryder\*.*
SectionEnd

Секция 2:
Код:

Section "Revolution Crew emulator(рекомендуемый)" secRevcrew
SectionIn 4 1
SetOutPath "$INSTDIR"
File /r E:\revcrew\*.*
SectionEnd


kotkovets 29-08-2010 23:07 1484487

asetin_9207
Я реализовал че вы хотели,
но тут глюк один, если в секции ничего - не изменять, то получается запись одновременно двух файлов
если изменить чебоксы на секциях, и даже вернуть в первоначальное состояние секций - то нормуль.
Попробуйте реализовать на своей странице:
C помощью команды RadioButton — зависимый флажок-точка, подобно выбору секций, на стр. выбора компонентов
C помощью команды Label - надпись , описание, как в секциях
А от секций "Stryder emulator(для Garena)" и "Revolution Crew emulator(рекомендуемый) вовсе избавиться!

Помогу вам, тока через форум
Готовый вариант не просите!

asetin_9207 29-08-2010 23:25 1484500

Ну чебоксы - это украшение инсталлятора, также как и скин для него. Давайте посмотрим скрипт, который вы реализовали.
Чебокс такой обязателен. Нельзя никак обойти глюк? Может есть код, который исключает запись 2-го файла? Например, что-то наподобие секциях, когда исключаешь файлы скрипта из папки: File /r /x *.nsi *.*

Цитата:

Цитата kotkovets
А от секций "Stryder emulator(для Garena)" и "Revolution Crew emulator(рекомендуемый) вовсе избавиться! »

Так эти секцие обязательные, как избавиться?! Не понимаю.

kotkovets 29-08-2010 23:33 1484506

Цитата:

Цитата asetin_9207
Давайте посмотрим скрипт, который вы реализовали »

смысла нету! скрипт не рабочий.
Со своей страницы проще сделать, я себе делал инсталл с 5-ю зависимыми чебоксами - стандартно, не получилась (через секции).
А вызовом модуля nsDialogs на раз всё сделал!

asetin_9207 29-08-2010 23:35 1484508

Цитата:

Цитата kotkovets
я себе делал инсталл с 5-ю зависимыми чебоксами - стандартно »

И никак нельзя оставить навороченную галочку?

Цитата:

Цитата kotkovets
Попробуйте реализовать на своей странице:
C помощью команды RadioButton — зависимый флажок-точка, подобно выбору секций, на стр. выбора компонентов
C помощью команды Label - надпись , описание, как в секциях »

Так ведь страница выбора секции и страница ввода ника - разные страницы. Как они будт отражены? Я не понимаю.

kotkovets 30-08-2010 00:59 1484531

Цитата:

Цитата asetin_9207
Так ведь страница выбора секции и страница ввода ника - разные страницы. Как они будт отражены? Я не понимаю »

Секции "Stryder emulator(для Garena)" и "Revolution Crew emulator(рекомендуемый) скрываем.
из справки:
Код:

Section "-hidden section"
SectionEnd

Вот пример:
читать дальше »
Код:

!include "MUI.nsh"
!include "nsDialogs.nsh"

!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_DIRECTORY
Page custom fnCustomInit fnCustomDestroy ;функция будет выполняться во время открытия стр. MUI_PAGE_COMPONENTS
!define MUI_PAGE_CUSTOMFUNCTION_Show Page
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

OutFile "test.exe"
InstallDir "$PROGRAMFILES\Left 4 Dead 2\"
ShowInstDetails show

Var Dialog
Var Label
Var Text
Var CheckBox
Var CheckBox1

Function fnCustomInit
nsDialogs::Create 1018
  Pop $Dialog

 !insertmacro MUI_HEADER_TEXT "Выбор ника" "  Ввод своего ника"
 
      ${NSD_CreateLabel} 0 5u 100u 10u "Введите свой ник"
                Pop $Label
               
      ${NSD_CreateText} 0 20u 100% 15u "Сюда ввожу ник"
                Pop $Text
               
      ${NSD_CreateCheckBox} 0 50u 235 10u "Revolution Crew emulator(рекомендуемый)"
                Pop $CheckBox
                ${NSD_OnClick}  $CheckBox Check
                ${NSD_SetState} $CheckBox 1
               
      ${NSD_CreateCheckBox} 0 70u 170 10u "Stryder emulator(для Garena)"
                Pop $CheckBox1
                ${NSD_OnClick}  $CheckBox1 Check1
                ${NSD_SetState} $CheckBox1 0
nsDialogs::Show
FunctionEnd

Function Check
        Pop $CheckBox
        ${NSD_GetState} $CheckBox $1
        ${If} $1 == 1
          ${NSD_SetState} $CheckBox1 0
        ${Else}
            ${NSD_SetState} $CheckBox1 1
        ${EndIf}
FunctionEnd

Function Check1
        Pop $CheckBox1
        ${NSD_GetState} $CheckBox1 $1
        ${If} $1 == 1
            ${NSD_SetState} $CheckBox 0
        ${Else}
            ${NSD_SetState} $CheckBox 1
        ${EndIf}
FunctionEnd

Function fnCustomDestroy
 ${NSD_GetText} $Text $Text
 ${NSD_GetState} $CheckBox $CheckBox
 ${NSD_GetState} $CheckBox1 $CheckBox1
FunctionEnd

Function Page
 StrCmp $Text "Сюда ввожу ник" 0 +3
 MessageBox MB_ICONEXCLAMATION "Введите ник!"
 Call GotoPage
 StrCmp $Text "" 0 +3
 MessageBox MB_ICONEXCLAMATION "Введите ник!"
 Call GotoPage
FunctionEnd

Function GotoPage ; Функция для произвольного перехода по страницам
  StrCpy $R9 -1
  IntCmp $R9 0 0 Move Move
  StrCmp $R9 "-1" 0 Move  ;-1 переход на предыдущую страницу
  StrCpy $R9 "120"
  Move:
  SendMessage $HWNDPARENT "0x408" "$R9" ""
FunctionEnd

Section "-Revolution Crew emulator(рекомендуемый)" ;скрываем секцию
 StrCmp $CheckBox 1 0 Next
 MessageBox MB_ICONINFORMATION|MB_OK "Revolution: отмечено"
 SetOutPath "$INSTDIR"
;File /r E:\stryder\*.*
 WriteIniStr "$INSTDIR\rev.ini" steamclient PlayerName $Text
 Next:
SectionEnd

Section "Секция"
SectionEnd

Section "-Stryder emulator(для Garena)" ;скрываем секцию
 StrCmp $CheckBox1 1 0 Next
 MessageBox MB_ICONINFORMATION|MB_OK "Stryder: отмечено"
 SetOutPath "$INSTDIR"
 ;File /r E:\revcrew\*.*
 WriteIniStr "$INSTDIR\stryder.ini" steamclient PlayerName $Text
 Next:
SectionEnd


Зависимость выбора сделал через CheckBox, хотя для этого есть RadioButton
Реализована корректность ввода ника.

asetin_9207 30-08-2010 10:37 1484683

Конечно спасибо вам за предоставленный скрипт, но на моей странице появился баг со 2 секцией: http://rghost.ru/2481490.view
После создания такой собственной страницы потерялся выбор компонентов: http://rghost.ru/2481501.view
Теперь пользователь при установке их не сможет прочесть про эмуляторы, про их описание, а то как-то делятся компоненты. Эмуляторы тут, а все остальное здесь.
Тем более при отключении секции на странице компонентов теряются остальные файлы установки этих 2-х секции. Ведь там не только же задействованы файлы stryder.ini и rev.ini, но и в каждой секции есть еще по несколько файлов.

Цитата:

Цитата kotkovets
Секции "Stryder emulator(для Garena)" и "Revolution Crew emulator(рекомендуемый) скрываем. »

Нужно чтобы было на одной странице.

Никак нельзя реализовать секции на странице выбора компонентов? Или хотя бы показать и дать им возможность выбора, но уже на странице "ввода ника" нельзя было снять галочку с выбранной секции на предыдущей странице? (странице выбора компонентов).

Допустим, я запустил установщик, прошла страница приветствия, потом вышла страница выбора компонентов, я выбрал один из нужных мне эмуляторов, далее страница ввода ника, на которой уже стоит галочка (и ее нельзя снять) выбранной мной эмулятора на предыдущей странице. Может так удастся избежать бага?

kotkovets 30-08-2010 11:28 1484721

Цитата:

Цитата asetin_9207
моей странице появился баг со 2 секцией »

${NSD_CreateCheckBox} 0 50u 235 10u "Revolution Crew emulator(рекомендуемый)"
"Длина" контрола "жирным" выставь подходящие значение.
Цитата:

Цитата asetin_9207
при установке их не сможет прочесть про эмуляторы, про их описание, »

${NSD_CreateLabel} - в зап-ло воспользоваться на своей стр? под каждым чебоксом сделать описание?
Цитата:

Цитата asetin_9207
Тем более при отключении секции на странице компонентов теряются остальные файлы установки этих 2-х секции. Ведь там не только же задействованы файлы stryder.ini и rev.ini, но и в каждой секции есть еще по несколько файлов »

Но так вынеси Секции "Stryder emulator(для Garena)" и "Revolution Crew emulator" из группы
удали эту функцию
Код:

Function .onSelChange
FunctionEnd

ВЫБОР ЭТИХ СеКциЙ ДЕЛАЕТСЯ УЖЕ НА ОДНОЙ СТРАНИЦЕ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ИЛИ ПО АРАБСКИ НАПИСАТЬ??????????????

asetin_9207 30-08-2010 11:33 1484727

Цитата:

Цитата kotkovets
ВЫБОР ЭТИХ СеКциЙ ДЕЛАЕТСЯ УЖЕ НА ОДНОЙ СТРАНИЦЕ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ИЛИ ПО АРАБСКИ НАПИСАТЬ?????????????? »

Надо чтобы было все на странице компонентов и выбор, и секции все, и описание. А на странице выбора ника всего лишь вводимый текст. Неужели скрипт будет не работать?! Вон кляпают другие же такие установщики, где выбираешь, а потом вводишь ник. Почему нельзя так? Почему надо секции переносить на стр ввода ника? Неужели нельзя все осуществлять на странице выбора компонентов?!

kotkovets 30-08-2010 11:57 1484744

Цитата:

Цитата asetin_9207
Почему надо секции переносить на стр ввода ника? »

Потому что, .onSelChange работает только тогда, когда вы измените состояние секций, тобишь идентификаторы (${secStryder} и ${secRevcrew}) секций искаженно "перенесутся" на страницу выбора ника.
если вы ничего не изменили на стр. компонетов:
${secStryder}=1 1=запись stryder.ini
${secRevcrew}=1 1=запись rev.ini
Что неправильно!
а нужно
${secStryder}=1 1=запись stryder.ini
${secRevcrew}=0 0=не зап. rev.ini
или
${secStryder}=0 0=не зап. stryder.ini
${secRevcrew}=1 1=запись rev.ini
Всё из этого!
Если у вас есть другой механизм обработки идентификаторов секций, то оглашайте!

asetin_9207 30-08-2010 12:07 1484754

То есть вы говорите о том, что когда используешь идентификаторы ${secStryder} и ${secRevcrew} они идут для правильного выбора компонентов (1 их 2-х предложеных).
А для описания не можете найти другой индефикатор?
Для описани можно использовать - ID_1, ID_2 и тд.
То есть ${secStryder} и ${secRevcrew} будут для корректного выбора секции (1 из 2-х) и устанавливаемых файлов stryder.ini и rev.ini.

kotkovets 30-08-2010 12:14 1484761

Цитата:

Цитата asetin_9207
То есть вы говорите о том, что когда используешь идентификаторы ${secStryder} и ${secRevcrew} они идут для правильного выбора компонентов (1 их 2-х предложеных) »

ДА

asetin_9207 30-08-2010 12:17 1484763

Ну вот для выбора и записи используем - ${secStryder} и ${secRevcrew}
А для описания - ID_1, ID_2

kotkovets 30-08-2010 12:17 1484764

Цитата:

Цитата asetin_9207
А для описания не можете найти другой индефикатор? »

ВЫ сами выбираете "название" идентификаторов! суть то не изменится!
Состояние секций снимается (отмечена или нет) командой:
Код:

SectionGetFlags ${ID} $1
Состояние секции записывается в переменную $1
$1=1 - секция отмечена
$1=0 - секция не отмечена
Затем сравнение:
Код:

StrCmp $1 1 0 +2
$1=1, то запись и наоборот

asetin_9207 30-08-2010 12:18 1484766

Цитата:

Цитата kotkovets
ВЫ сами выбираете "название" идентификаторов! суть то не изменится! »

Почему не изменится?
Ведь для описание использем другой идентификатор, а для выбора и записи - другой.

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

kotkovets 30-08-2010 12:30 1484772

Цитата:

Цитата asetin_9207
Почему не изменится?
Ведь для описание использем другой идентификатор, а для выбора и записи - другой »

Один и тот же. посмотрите скрипт свой!
!insertmacro MUI_DESCRIPTION_TEXT ${secRevcrew} $(DESC_REVCREW)

asetin_9207 30-08-2010 12:35 1484779

А если добавим такой же код, но уже с дргим идентификатором?

kotkovets 30-08-2010 12:47 1484784

как вариант, для создания своих страниц есть в NSIS модуль InstallOptions
Смотри описание в C:\Program Files\NSIS\Docs\InstallOptions\Readme.html
Примеры: C:\Program Files\NSIS\Examples\InstallOptions\
Там корректно снимается состояние секций, в группе не тестировал!
Смотри пример

asetin_9207 30-08-2010 13:13 1484800

А нельзя редагнуть страницу "выбор компонентов" и подключить как-то и корректный выбор секции (1 из 2-х), и запись в секциях файлов. А то писать заново страницу... Лучше редактировать стандартную. Если можно - то как?

Цитата:

Цитата kotkovets
Смотри описание в C:\Program Files\NSIS\Docs\InstallOptions\Readme.html »

Простите, с английским не очень хорошо.
Цитата:

Цитата kotkovets
Примеры: C:\Program Files\NSIS\Examples\InstallOptions\ »

Так там установщики вообще крохотные. Лучше редактировать стандартную страницу - Выбор компонентов.

kotkovets 30-08-2010 13:40 1484819

Цитата:

Цитата asetin_9207
А нельзя редагнуть страницу "выбор компонентов" и подключить как-то и корректный выбор секции (1 из 2-х) »

Можно как то, не пробЫвал..
Цитата:

Цитата asetin_9207
Простите, с английским не очень хорошо »

Тож самое, беру пример и какую нибудь команду и потиху осмысливаешь, че она творит!
то и вам советую :cool:

asetin_9207 30-08-2010 14:40 1484867

У меня не получается, куча ошибок да и в справочнике такого НЕТУ!

asetin_9207 30-08-2010 14:57 1484878

Наверно редактить страницу тяжело... Помогите сделать описание к этим секция на странице "Ввод ника". Вы говорили использую ${NSD_CreateLabel}, но как? И чтобы координаты были кажется. Я не умею.

kotkovets 30-08-2010 15:06 1484890

Цитата:

Цитата asetin_9207
Наверно редактить страницу тяжело... Помогите сделать описание к этим секция на странице "Ввод ника". Вы говорили использую ${NSD_CreateLabel}, но как? И чтобы координаты были кажется. Я не умею. »

${NSD_CreateLabel} <координатаХ> <координатаУ> <Ширина> <Высота> <”Текст”>
Координаты, ширина и высота могут быть заданы в трех единицах измерения: пиксели, единицы измерения диалога(dialog units) или проценты от пространства окна страницы. Они могут иметь и отрицательные значения, что указывает, что отсчёт величины будет в обратную сторону, т.е. снизу или справа.
Ну и придется CheckBox-ы сместить вниз.
Да в справочнике по NSIS там все рассказано!
Спасибо hb860!!!

asetin_9207 30-08-2010 15:08 1484891

Не могу высчитать, не умею высчитывать координаты:
Код:

${NSD_CreateCheckBox} 0 50u 170 10u "Stryder emulator(для Garena)"
                Pop $CheckBox
                ${NSD_OnClick}  $CheckBox Check
                ${NSD_SetState} $CheckBox 0
                ${NSD_CreateLabel} 0 5u 100u 10u "Установить Stryder emulator"
                                Pop $Label
  ${NSD_CreateCheckBox} 0 70u 235 10u "Revolution Crew emulator(рекомендуемый)"
                Pop $CheckBox1
                ${NSD_OnClick}  $CheckBox1 Check1
                ${NSD_SetState} $CheckBox1 1
                                ${NSD_CreateLabel} 0 5u 100u 10u "Установить Revolution Crew emulator"
                                Pop $Label

И можно ли сделать нечто похожее на стандарт страницу с описанием, ну там рамку. Ну чтобы было красиво.
Также сменить значки секции, например, на те же синие, что на странице с компонентами.
Код какой? !define MUI_COMPONENTSPAGE_CHECKBITMAP "E:\программы\важные\nsis\Contrib\Graphics\Checks\colorful.bmp"?

kotkovets 30-08-2010 15:17 1484902

Цитата:

Цитата asetin_9207
И можно ли сделать нечто похожее на стандарт страницу с описанием, ну там рамку. Ну чтобы было красиво »

Можно создать следующие элементы управления при помощи макросов ${NSD_Create*}:
Hline — горизонтальная линия
Vline — вертикальная линия
Label - надпись
Icon - значок(ICO)
Bitmap – картинка BMP
BrowseButton – кнопка «...»
Link - ссылка
Button - кнопка
GroupBox — контейнер группы
CheckBox - флажок
RadioButton — зависимый флажок-точка
Text — текстовое поле
Password — поле ввода пароля
Number - цифра
FileRequest — поле ввода имени файла
DirRequest — поле ввода папки
ComboBox — выпадающий список с возможностью ввода текста
DropList — выпадающий список с фиксированными значениями
ListBox — список значений
ProgressBar — индикатор выполнения

В справочнике все рассказано!
посмотрите: C:\Program Files\NSIS\Docs\nsDialogs\Readme.html
примеры: C:\Program Files\NSIS\Examples\nsDialogs\
Цитата:

Цитата asetin_9207
Также сменить значки секции, например, на те же синие, что на странице с компонентами.
Код какой? !define MUI_COMPONENTSPAGE_CHECKBITMAP "E:\программы\важные\nsis\Contrib\Graphics\Checks\colorful.bmp"? »

Не знаю скорее нет.

asetin_9207 30-08-2010 15:23 1484905

Так ладно, коды я могу достать, но координаты высчитать?!
Может есть визуальный редактор, чтобы смотреть коррдинаты, а то подбирать - геморой!

kotkovets 30-08-2010 15:40 1484918

Цитата:

Цитата asetin_9207
Может есть визуальный редактор, чтобы смотреть коррдинаты, а то подбирать - геморой »

Хорошо бы согласен! найдешь сообщи! :clapping:

asetin_9207 30-08-2010 15:54 1484935

А у меня появились еще вопросы:
1. http://rghost.ru/2484080.view Нельзя "введите ник" сделать по центру что ли? А то справа совсем пусто.
2. Почему это окно http://rghost.ru/2484089.view не оделось? То есть скин не такой как у установщика? И как одеть его так же как и все остальные окна?

kotkovets 30-08-2010 16:47 1484977

Цитата:

Цитата asetin_9207
http://rghost.ru/2484080.view Нельзя "введите ник" сделать по центру что ли? А то справа совсем пусто »

типа так:
Код:

MessageBox MB_ICONEXCLAMATION "      Введите ник!"
Цитата:

Цитата asetin_9207
Почему это окно http://rghost.ru/2484089.view не оделось? »

эту мессагу в скрипте удалите, для отладки скрипта прописывал.

asetin_9207 30-08-2010 17:14 1484988

Цитата:

Цитата kotkovets
MessageBox MB_ICONEXCLAMATION " Введите ник!" »

Не так как-то не очень, если по центру ставить, то и треугольник с вопросительным знаком надо переносить в центр. Как быть?

И кстати, у меня появилась идея с вводом ника. Мысль такова:
Запускаю инсталлятор, дошел до выбора компонентов и все(!) секции у меня на месте (не скрыты) и в рабочем состоянии. А дальше выходит страница "ввода ника", но(!) уже без выбора секции, обычная страница с вводом ника (как раньше).
Может сделать так: выбрал один из эмуляторов (одну из секции), далее страница "ввода ника" (простая без секции, так как секции уже на странице "выбор компонентов"). Написал ник и он ищет один из устанавливаемых файлов (stryder.ini или rev.ini), найдя один из них (а он полюбому будет, так как выбирать надо одну из секции) пропишет там текст (или в stryder.ini, или в rev.ini), но нужно переменную, которая будет писать в stryder.ini в строке - Name, а в rev.ini в строке - Playername.

Как идея? И не надо парится с созданием\редактированием новой страницы. К тому же страница компонентов - общая!

kotkovets 30-08-2010 17:51 1485010

Цитата:

Цитата asetin_9207
Как идея? И не надо парится с созданием\редактированием новой страницы. К тому же страница компонентов - общая! »

Хозяин барин. сделаете потестим.. :cool: .
Цитата:

Цитата asetin_9207
Не так как-то не очень, если по центру ставить, то и треугольник с вопросительным знаком надо переносить в центр. Как быть? »

Никак. если не ошибаюсь мессага вызывает user32.dll оттуда и иконку берет.
Код:

System::Call 'user32::MessageBoxA(i $HWNDPARENT, t "Введите ник", t "asetin_9207", i 0x30) i.r9'

asetin_9207 30-08-2010 18:08 1485026

Цитата:

Цитата kotkovets
Хозяин барин. сделаете потестим.. »

Так реазиловать не могу! Я в этом ноль, а если и буду делать, то 100 процентов ошибки будут в каждой строчке.
Например, как сделать проверку на наличие этих файлов.
Прошу, напишите скрипт на проверку этих устанавливаемых файлов и запись ника в один из найденный файл.

asetin_9207 30-08-2010 22:27 1485194

Нашел баг с анимешкой! На Windows 7 (Seven) не проигрывается анимешка! Ее просто нету! Что делать? Как исправить? А другие инсталляторы у них на 7-ке с аниме идут, а мой - нет!
Хех, я походу понял, что у меня работает только Анси, а у 7-ок - Уникод. Поэтому так выходит. Если сделать наоборот. У них будет работать - у меня не будет.
А для обе ОС нельзя сделать? Чтобы и на хп, и на 7-ке работало? Может есть общий плагин?

kotkovets 30-08-2010 23:00 1485218

Цитата:

Цитата asetin_9207
На Windows 7 (Seven) не проигрывается анимешка! »

c аистом всё в порядке.чёй вы там на нахимичели...

asetin_9207 31-08-2010 12:35 1485533

С анимацией разобрался.
Ну помогите сделать страницу "ввода ника" примерно такой: http://rghost.ru/2492888.view
Ну не могу я сделать такое оформление, чтобы было и описание, и красиво, и значки выбора другие.

kotkovets 31-08-2010 13:53 1485591

asetin_9207
Нашел способ как, как корректно вытащить значения секций.
Способ не нов, но работает надежно (в этом скрипте).
В функции .onInit предопределяем состояние секций!
можете все секции вернуть на страницу компонентов!
читать дальше »
Код:

SetCompressor /SOLID lzma

!include "nsDialogs.nsh"
!include "MUI.nsh"

!define PRODUCT_NAME "Left 4 Dead 2 Update"
!define PRODUCT_VERSION "2.0.1.4 - 2.0.3.4"
!define MUI_ABORTWARNING
!define MUI_COMPONENTSPAGE_SMALLDESC
!define MUI_CUSTOMFUNCTION_GUIINIT MUIGUIInit
!define MUI_WELCOMEPAGE_TITLE_3LINES

!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_DIRECTORY

;===================================
;тут порядок страниц не менять!!!!
!define MUI_PAGE_CUSTOMFUNCTION_Leave Flags
!insertmacro MUI_PAGE_COMPONENTS
Page custom fnCustomInit fnCustomDestroy
!define MUI_PAGE_CUSTOMFUNCTION_Show Page
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"
;===================================

InstType "Полная установка"
InstType "Только обновление"
InstType "Только Stryder emulator"
InstType "Только Revolution Crew emulator"

Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
Caption "Установка ${PRODUCT_NAME} ${PRODUCT_VERSION}"
InstallDir "$PROGRAMFILES\Left 4 Dead 2\"
OutFile "${PRODUCT_NAME} ${PRODUCT_VERSION}.exe"
ShowInstDetails show

Var Dialog
Var Label
Var Text

Function .onInit
 StrCpy $2 1 ;предопределение секции
 StrCpy $1 0 ;предопределение секции
 ;продолжение скрипта
FunctionEnd

Function MUIGUIInit
;скрипт
FunctionEnd

Function .onGUIEnd
 ;скрипт
FunctionEnd

Function Flags ;в этой функции проверяется корректность выбора секций
 StrCmp $1 $2 0 +3
 MessageBox MB_ICONEXCLAMATION "Выберите необходимый эмулятор!"
 Abort
FunctionEnd

Function Page ;в этой функции проверяется корректность ввода ника
 StrCmp $Text "" 0 +2
 Goto +2
 StrCmp $Text "Сюда ввожу ник" 0 +3
 MessageBox MB_ICONEXCLAMATION "              Введите Ваш ник!"
 Call GotoPage
FunctionEnd

Function GotoPage ; Функция для произвольного перехода по страницам
  StrCpy $R9 -1
  IntCmp $R9 0 0 Move Move
  StrCmp $R9 "-1" 0 Move  ;-1 переход на предыдущую страницу
  StrCpy $R9 "120"
  Move:
  SendMessage $HWNDPARENT "0x408" "$R9" ""
FunctionEnd

Function fnCustomInit
                nsDialogs::Create 1018
                Pop $Dialog
 !insertmacro MUI_HEADER_TEXT "Выбор ника" "  Ввод своего ника"

 ${NSD_CreateLabel} 0 5u 100u 10u "Введите свой ник"
                Pop $Label
 ${NSD_CreateText} 0 20u 100% 15u "Сюда ввожу ник"
                Pop $Text
nsDialogs::Show
FunctionEnd

Function fnCustomDestroy
 ${NSD_GetText} $Text $Text
FunctionEnd

Section "!Обновление игры" secUpdate
SectionIn 1 2
SetOutPath "$INSTDIR"
 ;скрипт
SectionEnd

SectionGroup /e "!Эмуляторы" secEmulator

Section "Revolution Crew emulator(рекомендуемый)" secRevcrew ;<<индефикатор секции
 SectionIn 4  1
 ;File /r E:\revcrew\*.*
 WriteIniStr "$INSTDIR\rev.ini" steamclient PlayerName $Text
SectionEnd

Section /o "Stryder emulator(для Garena)" secStryder
 SectionIn 3
 ;File /r E:\stryder\*.*
 WriteIniStr "$INSTDIR\stryder.ini" steamclient PlayerName $Text
SectionEnd

SectionGroupEnd

 Function .onSelChange
  SectionGetFlags ${secStryder} $1
  SectionGetFlags ${secRevcrew} $2
 
  StrCmp $1 "1" 0 N1
  SectionGetFlags ${secRevcrew} $0
  IntOp $0 $0 & ${SECTION_OFF}
  SectionSetFlags ${secRevcrew} $0
  N1:
  StrCmp $2 "1" 0 N2
  SectionGetFlags ${secStryder} $0
  IntOp $0 $0 & ${SECTION_OFF}
  SectionSetFlags ${secStryder} $0
  N2:
FunctionEnd


LangString DESC_UPDATE ${LANG_RUSSIAN} "Обновление игры с 2.0.1.4 до 2.0.3.4 версии"
LangString DESC_EMULATOR ${LANG_RUSSIAN} "Выберите один из предложенных эмуляторов для игры в Left 4 Dead 2 No-Steam"
LangString DESC_STRYDER ${LANG_RUSSIAN} "Установить Stryder emulator$\r$\nВЫБОР ДВОЙНЫМ НАЖАТИЕМ!!!"
LangString DESC_REVCREW ${LANG_RUSSIAN} "Установить Revolution Crew emulator$\r$\nВЫБОР ДВОЙНЫМ НАЖАТИЕМ!!!"

!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
!insertmacro MUI_DESCRIPTION_TEXT ${secUpdate} $(DESC_UPDATE)
!insertmacro MUI_DESCRIPTION_TEXT ${secEmulator} $(DESC_EMULATOR)
!insertmacro MUI_DESCRIPTION_TEXT ${secStryder} $(DESC_STRYDER)
!insertmacro MUI_DESCRIPTION_TEXT ${secRevcrew} $(DESC_REVCREW) 
!insertmacro MUI_FUNCTION_DESCRIPTION_END


Реализовано корректность выбора секции.
Реализовано корректность выбора ника.

asetin_9207 31-08-2010 15:12 1485684

Спасибо большое! Так намного лучше. Хотелось бы уточнить с окном "Введите Ваш ник!" - нельзя его уменшить (окно), чтобы пустые места не бросались, то есть компактно будет.

kotkovets 31-08-2010 15:23 1485692

Цитата:

Цитата asetin_9207
Хотелось бы уточнить с окном "Введите Ваш ник!" - нельзя его уменшить (окно), чтобы пустые места не бросались »

Заголовок сообщения, (текста меньше):
Код:

Caption "полезное сообщение"

asetin_9207 31-08-2010 16:59 1485761

Цитата:

Цитата kotkovets
Caption "полезное сообщение" »

Что то я не понял вас. Да, полезное сообщение, я отметил на форуме пост. А как уменшить окно "введите ваш ник"?

kotkovets 31-08-2010 18:33 1485856

Цитата:

Цитата asetin_9207
Что то я не понял вас. Да, полезное сообщение, я отметил на форуме пост. А как уменшить окно "введите ваш ник"? »

:laugh:
У вас скрипте такой код:
Код:

Caption "Установка ${PRODUCT_NAME} ${PRODUCT_VERSION}"
Можно сделать так:
Код:

Caption "${PRODUCT_NAME}"

asetin_9207 31-08-2010 18:34 1485858

Цитата:

Цитата kotkovets
Caption "${PRODUCT_NAME}" »

Так ведь таких установщиков будет не один же! Версии много, поэтому версия важна.
Цитата:

Цитата asetin_9207
А как уменшить окно "введите ваш ник"? »


kotkovets 31-08-2010 18:50 1485867

asetin_9207
Версия у вас и так достаточна везде видна!
но можно и так:
Вместо MessageBox MB_ICONEXCLAMATION "Введите ваш ник!" добавляешь:
Код:

System::Call 'user32::MessageBoxA(i $HWNDPARENT, t "Введите ваш ник!", t "Ошибка ника!", i 0x30) i.r5'

asetin_9207 31-08-2010 19:09 1485884

Хех, ну поставил, но и тут не от начала теперь идет, надо ближе к значку вопросительному
Левее надо http://rghost.ru/2496971.view

kotkovets 31-08-2010 19:28 1485900

asetin_9207 Серьезно
НЕ пора ли вам взяться за учебник, читать справки???

asetin_9207 31-08-2010 21:38 1485990

kotkovets, а в справках не все написано, ждем новые версии.
Так вы знаете как исправить? Если - нет, то и на этом спасибо.

kotkovets 31-08-2010 22:16 1486009

asetin_9207

Заголовок и "Текст сообщения" определяют размер окна!
Код:

System::Call 'user32::MessageBoxA(i $HWNDPARENT, t "Текст сообщения Текст сообщения Текст сообщения Текст сообщения$\r$\nТекст сообщения Текст сообщения$\r$\nТекст сообщения Текст сообщения", t "Заголовок Заголовок Заголовок Заголовок Заголовок", i 0x30) i.r5'
Здесь системная функция вызывается и она (функция) прорисовает окно сообщения, расположение иконки, текста и т.д
То бишь мы ее только и вызываем.
С MessageBox - почти тож самое.

asetin_9207 01-09-2010 09:01 1486213

Действие: Имеется установщик, версия установки которого с 2.0.3.4 до 2.0.3.5, то есть обновляет игру с 34-ой до 35-ой версии.

Цель: После выбора директории установки идет инсталл, но бац! - вылазит окно, в котором пишется следующее: "Упсс! Этот патч нужно ставить на 2.0.3.4 версию игры. Ваша версия - 2.0.3.0"

То есть версия игры у пользователя не та, которая нужна для установки и совершается аборт (ему приходится закрывать установщик). А если все верно ( у него нужная версия - в данном случае, 2.0.3.4-ая), то инстал пройдет успешно.
Версия определяется в этом файле - steam.inf (директория \Left 4 Dead 2\left4dead2). А установщик ставится в InstallDir "$PROGRAMFILES\Left 4 Dead 2\" (то есть в этой папке есть такая же папка, только пишется слитно и с маленькой буквы).

Возможно реализовать?

Ссылка на действующий файл - http://rghost.ru/2501569 (в файле прописана версия 2.0.3.4, можно менять вручную цифры)

Показательный пример: http://rghost.ru/2501575.view

kotkovets 01-09-2010 11:52 1486302

asetin_9207
В какой секции строка PatchVersion=2.0.3.2 в файле steam.inf ?
Код:

[?????]  ;<секция
PatchVersion=2.0.3.2


asetin_9207 01-09-2010 11:53 1486303

По идее он должен считывать (проверь) с компа версию пользователя. А в установщике в секции "обновление игры".
Этот файл есть на клиенте (игре) у пользователя, вот надо, чтобы считывало с его компа этот файл (проверяло версию).

kotkovets 01-09-2010 12:39 1486329

Цитата:

Цитата kotkovets
В какой секции строка PatchVersion=2.0.3.2 в файле steam.inf ?
Код:
[?????] << ЭТО секция в файле. Название секции в студию!
PatchVersion=2.0.3.2 »

М-ля .....

asetin_9207 01-09-2010 12:51 1486333

Секция? Секция в файле? Я не понимаю.
В этом файле нету такой секции! Он такой - какой в ссылке.
Это же не .ini, где есть такое. Тут нету.

kotkovets 01-09-2010 13:04 1486344

asetin_9207
покажь все содержимое файла steam.inf
до и после установки обновлений. он должен изменяться.
или ищите другой маркер для определения версии патча или че там..
А если версия патча новее в папке установленной игры, а в вашем инсталляторе версия патча старее ???

asetin_9207 01-09-2010 14:23 1486395

Цитата:

Цитата kotkovets
покажь все содержимое файла steam.inf »

Это и так все содержимое.
Цитата:

Цитата kotkovets
до и после установки обновлений. он должен изменяться. »

Изменяются только цифры обновления. Версии идут начиная с 2.0.0.0 до 2.0.3.5. 35 патчей всего! Всегда только цифры и меняются.
Цитата:

Цитата kotkovets
А если версия патча новее в папке установленной игры, а в вашем инсталляторе версия патча старее ???[/post]

То же окно, только наоборот. Пишется что устанавливаемый патч ниже вашей текущей версии и аборт.
Скриншот: http://rghost.ru/2503199.view

kotkovets 01-09-2010 14:29 1486397

Цитата:

Цитата asetin_9207
Цитата kotkovets:содержимое файла steam.inf » »

Это плохой маркер.
Посмотри версии самих файлов обновления...

asetin_9207 01-09-2010 14:34 1486399

При любом обновлении, будь то вверх или вниз меняется только эта строчка:
Код:

PatchVersion=2.0.3.5
А эти 2-е строчки так и остаются:
Код:

ProductName=left4dead2 
appID=550

А всего в этом файле 3 строчки. Но патч можно обманывать, если менять циферки. Но мне нужно, чтобы хотя бы вот так не давал устанавливать им, а то будут не правильно устанавливать и жаловаться, что не могут. Это чисто как борьба против не правильной установки.

kotkovets 01-09-2010 14:47 1486407

asetin_9207
версии самих файлов обновления смотрели?
Файл steam.inf когда изменяется, после установки игры или запуска игры?
Мало данных..............................
В реестр не записывается версия патча?

asetin_9207 01-09-2010 14:49 1486408

После установки (обновления) файлов игры, соответственно, меняется и steam.inf, там в патчах уже лежит обновленный steam.inf. Вот и все.
Для сравнения могу дать ссылки на 2 разных патча:
патч 2.0.3.3 - 2.0.3.4 - http://rghost.ru/2400318
патч 2.0.3.4 - 2.0.3.5 - http://rghost.ru/2464400

kotkovets 01-09-2010 15:22 1486439

asetin_9207
Качать не собираюсь - трафик не резиновый.
Посмотри версии самих файлов обновления!!! ,а не самого патча.
Имя файла, путь и версию.
Также просмотри файлы предыдущего патча. Найди одинаковые файлы, но с разными версиями.
Это и будет маркер!

asetin_9207 01-09-2010 15:52 1486476

Код:

Посмотри версии самих файлов обновления!!!
Версии на файлах не пишутся! Версия игры пишется только в этом файле - steam.inf.
steam.inf 2.0.3.4 версии:
Код:

PatchVersion=2.0.3.4
ProductName=left4dead2
appID=550

steam.inf 2.0.3.5 версии:
Код:

PatchVersion=2.0.3.5
ProductName=left4dead2
appID=550

Вот и все, чем они отличаются. Всего одной версией, а других файлов, чтобы там писалась версия игры - нету! Есть файлы только обновляющие игру, но на них никогда ничего не пишется! Только в steam.inf пишется.
Вот скрин 2- папок с разными версиями: http://rghost.ru/2503983.view

Пс: Я думаю, что маркер в этом и есть (в цифрах). Так как меняя их (цифры) на нужные - блокиратор не выходит.

kotkovets 01-09-2010 16:02 1486485

asetin_9207
Ва так и не нашли надежный маркер для инсталлятора...
Так, что ничем помочь не могу!!

asetin_9207 01-09-2010 16:11 1486490

Ну если его нету! Ведь это такая игра, где файлы обновляются каждый раз, а версия пишется только в одном файле! Что я поделаю? Наверное на эти цифры и надо делать. Такой скрипт, определяющий в steam.inf версию пользователя.
Ведь при установке идет код - InstallDir "$PROGRAMFILES\Left 4 Dead 2\".
Неужели нельзя сделать так, чтобы при наведении на InstallDir "$PROGRAMFILES\Left 4 Dead 2\" он считывал left4dead2\steam.inf и смотрел версию этого файла и исходя из цифер - делал то или иное действие (или аборт, или продолжал инсталл).
Ведь на образце так и есть! Если я буду менять цифру и сделаю подходящей - установка пойдет дальше. Ну попробывать же можно, если вы и говорите, что не надежно. Главное, чтобы он делал аборт, если не верная версия.

kotkovets 01-09-2010 16:44 1486534

Цитата:

Цитата asetin_9207
Неужели нельзя сделать так, чтобы при наведении на InstallDir "$PROGRAMFILES\Left 4 Dead 2\" он считывал left4dead2\steam.inf »

в файле секций нету > [ ]

asetin_9207 01-09-2010 16:58 1486548

kotkovets
Ну так ведь ее и никогда не было! Но каким образом тогда сделан этот установщик?! Ведь других файлов, определяющих версию нету!

kotkovets 01-09-2010 19:30 1486672

Цитата:

Цитата asetin_9207
Но патч можно обманывать, если менять циферки »

Цитата:

Цитата asetin_9207
Ну так ведь ее и никогда не было! Но каким образом тогда сделан этот установщик?! »

Так может это патч то и делает, изменяет, читает steam.inf , а не инсталлятор.
Реестр смотрели, версии патчей, пишет в реестр?

asetin_9207 01-09-2010 19:39 1486679

Цитата:

Цитата kotkovets
Так может это патч то и делает, изменяет, читает steam.inf , а не инсталлятор. »

В каждом патче лежит этот файт - steam.inf. И с каждым новым патче цифра другая идет.
Цитата:

Цитата kotkovets
Реестр смотрели, версии патчей, пишет в реестр? »

Честное слово, не знаю где смотреть. Версии смотрю только в этом файле.

kotkovets 03-09-2010 02:00 1487558

asetin_9207
Давайте так, я вам пример, вы изучате мой пример и делаете выводы!
А то получается, сделайте мне эту фичу,
вставьте мне код этой фичи в мой скрипт, а то я не знаю как!
Если вы пишите в эту тему, то предполагается, что вы изучили, шапку темы,
и основы работы со скриптовым языком NSIS, но у вас появился вопрос...
По этому поводу я писал вам в PM !!!!

Тут нужна дополнительная библиотека.
Берем библиотеку здесь
Копируем VersionCheck.nsh в папку ${NSISDIR}\Include

В самом начале скрипта добавляем:
Код:

!include "WordFunc.nsh"
!include "VersionCheck.nsh" ; подключаем библиотеку

!define NEW_Version "2.0.3.5" ;здесь пишем версию обновления в инсталляторе
!define OLD_Version "2.0.3.4" #здесь пишем предыдущую версию обновления
!define NOT_Version "2.0.3.0"  ;здесь пишем версию, которую нельзя обновлять

читать дальше »
Код:

Section "!Обновление игры" secUpdate
SectionIn 1 2
 IfFileExists "Путь к файлу\steam.inf" 0 Next
 ClearErrors
 FileOpen $R3 "Путь к файлу\steam.inf" r  #открываем файл в режиме чтения
 IfErrors Next
 loop:
 FileRead $R3 $R4
 StrCmp $R4 "" Next #если искомая строка не найдена
 StrCpy $R5 $R4 12  #хитрая команда, типа обрезания
 StrCmp $R5 "PatchVersion" 0 +2 #сравнениие если $R5=PatchVersion переход к Yes
 Goto +2
 Goto loop      #переход к loop (получается цикл пока не будет найдена искомая строка)
 FileClose $R3  #закрываем файл
 StrCpy $R6 $R4 "" 13
 ${StrFilter} "${NOT_Version}" "1" "" "." $R0 ;фильтруем строку, оставляем цифры
 ${StrFilter} $R6 "1" "" "." $R8
 ${VersionCheck} ${NEW_Version} $R6 $R7 ;если ${NEW_Version}=$R6, то $R7=0
                                        ;если ${NEW_Version}>$R6, то $R7=1
                                        ;если ${NEW_Version}<$R6, то $R7=2
 StrCmp $R8 $R0 0 +3
 MessageBox MB_ICONSTOP|MB_OK "Упсс! Этот патч нужно ставить на версию игры ${OLD_Version} ! Ваша версия игры - $R6"
 Quit ;тут так надежней! с Abort иногда бывают глюки
 StrCmp $R7 0 0 +3
 MessageBox MB_ICONEXCLAMATION|MB_YESNO "Версия обновления игры и инсталлятора равны!$\r$\nПродолжить установку?" IDYES +2
 Quit
 StrCmp $R7 2 0 +3
 MessageBox MB_ICONSTOP|MB_OK "Версия обновления игры новее, чем в инсталляторе!"
 Quit
 Next:
 SetOutPath "$INSTDIR"
 ;продолжение скрипта
SectionEnd


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

asetin_9207 03-09-2010 10:14 1487679

Да, сделал выводы. Это замечательно, но...
1. Как сделать запрещенными не только версию (2.0.3.0), но и другие. Начиная с 2.0.0.0 до 2.0.3.4 версии. Всего 34 версии. Каким образом?
Пробовал, но будет некторректно:
Код:

!define NOT_Version "2.0.3.0"
2. Моя текущая версия: 2.0.3.4. А патч называется (с 2.0.3.4 до 2.0.3.5), то есть устанавливает 2.0.3.5. Так ведь выходит сообщение, что моя версия игры и устанавливаемая в инсталляторе - равны! Но это же не так, если в инсталляторе версия 35-ая, моей игры - 34-я, то там переменная не правильна? Какую-нибудь R-ку надо менять что ли?

3. Как окрасить в шкуру мою все эти предупредительные сообщения? А то по умолчанию окно стандартное.

kotkovets 03-09-2010 11:02 1487725

Цитата:

Цитата asetin_9207
Как сделать запрещенными не только версию (2.0.3.0), но и другие. Начиная с 2.0.0.0 до 2.0.3.4 версии. Всего 34 версии. Каким образом? »

строку !define NOT_Version "2.0.3.0" удаляем
заменяем все строки до перехода Next

читать дальше »
Код:


;скрипт
 StrCpy $R6 $R4 "" 13
 ${StrFilter} "${OLD_Version}" "1" "" "." $R0
 ${StrFilter} $R6 "1" "" "." $R8
 ${VersionCheck} ${NEW_Version} $R6 $R7

 StrCmp $R8 $R0 0 +2
 Goto Next

 StrCmp $R7 1 0 +3
 MessageBox MB_ICONSTOP|MB_OK "Упсс! Этот патч нужно ставить на версию игры ${OLD_Version} ! Ваша версия игры - $R6"
 Quit
 StrCmp $R7 0 0 +3
 MessageBox MB_ICONEXCLAMATION|MB_YESNO "Версии обновлений игры и инсталлятора равны!$\r$\nПродолжить установку?" IDYES +2
 Quit
 StrCmp $R7 2 0 +3
 MessageBox MB_ICONSTOP|MB_OK "Версия обновления игры новее, чем в инсталляторе!"
 Quit
 Next:
 ;продолжение скрипта


Теперь инсталлятор будет обновлять только предыдущую версию обновления.
Цитата:

Цитата asetin_9207
Как окрасить в шкуру мою все эти предупредительные сообщения? А то по умолчанию окно стандартное »

Не знаю. У разработчиков скинов спросите....

Electron19 03-09-2010 20:09 1488093

Как сделать что-бы в окне COMPONENTS RadioButton выглядили круглыми а Checkbox остались галочными? Как на рисунке.
http://saveimg.ru/show-image.php?id=...e426640a171595

Есть ли возможность в цикле перечислить пути и имена копируемых файлов? Не могу найти взаимодействие с окном Details. Находил некоторые способы но там нельзя уловить при копировании File "${INDIR}\*.*" таким способом.

kotkovets 03-09-2010 23:11 1488173

Цитата:

Цитата Electron19
Как сделать что-бы в окне COMPONENTS RadioButton выглядили круглыми а Checkbox остались галочными? »

На скрине Inno Setup...
Стандартно нет! Можно создать подобное, если "нарисовать" свою страницу (модуль nsDialogs).
В справочнике по NSIS отлично описан. Почитайте здесь - правда на английском.
Примеры - ..\NSIS\Examples\nsDialogs\

asetin_9207 04-09-2010 08:19 1488284

Код:

Function .onVerifyInstDir
1. Делал на один файл проверку, а хочется на много файлов сделать.
Пробывал таких несколько -
Код:

IfFileExists путь\бла бла бла PathGood
Не корректно выходит.

kotkovets 04-09-2010 10:38 1488308

Цитата:

Цитата asetin_9207
Делал на один файл проверку, а хочется на много файлов сделать »

Код:

IfFileExists "путь к папке\*.*" PathGood
На все файлы в этой папке.
Точнее даже на наличие этой папки...

Electron19 04-09-2010 14:56 1488430

Цитата:

Цитата kotkovets
В справочнике по NSIS отлично описан. »

Спасибо друг за ссылку справочника, хорошие примеры описываються, которые я всё время в инете ищу.
Цитата:

Цитата kotkovets
Стандартно нет! Можно создать подобное, если "нарисовать" свою страницу (модуль nsDialogs). »

Я думал что можно стандартно, спасибо за ответ, попробую нарисовать. Останется узнать как ListView нарисовать и какой командой индекс рисунка назначать, поищу по вашим ссылкам.

kotkovets 04-09-2010 15:38 1488447

Цитата:

Цитата Electron19
какой командой индекс рисунка назначать »

можно как то так:
Код:

Var Image  ;объявление переменой
Var Image1  ;объявление переменой

${NSD_CreateBitmap} координаты ""
 Pop $Image
${NSD_SetImage} $Image "Путь\картинка.bmp" $Image1

Цитата:

Цитата Electron19
ListView нарисовать »

Код:

Var ListBox

${NSD_CreateListBox} координаты
Pop $ListBox


asetin_9207 04-09-2010 18:01 1488539

Код:

IfFileExists "путь к папке\*.*" PathGood
Дело в том, что когда указываешь на папку, а эта папка - $INSTDIR, то можно легко обмануть установщик, то есть создать папку $INSTDIR, а она у меня - InstallDir "$PROGRAMFILES\Left 4 Dead 2\". То есть человек создал эту папку, закинул что хочет и может спокойно установить...
Может есть другой способ добавить много файлов?

kotkovets 04-09-2010 18:16 1488555

Цитата:

Цитата asetin_9207
Может есть другой способ добавить много файлов? »

Код:

IfFileExists "путь к папке\*.inf" PathGood
На любой файл с расширением inf
Можно на любое другое расширение ставить.
Можно на любой файл, который должен находится рядом с инсталлятором
Код:

IfFileExists "$EXEDIR\*.inf" PathGood

asetin_9207 05-09-2010 16:49 1488984

А как сделать, чтобы после установки выполнялась распаковка батника?
Речь идет о decall.bat

Belial4444 05-09-2010 18:57 1489079

Снова здравствуйте, у меня возникла небольшая проблема: мне надо чтобы была проверка на существование файла, и в зависимости от его наличия в какой-либо файл записывалась строка.У меня это выглядит так: IfFileExists $INSTDIR\rev.ini "WriteINIStr $INSTDIR\rev.ini steamclient PlayerName $R6"
"WriteINIStr $INSTDIR\stryder.ini settings Name $R6"
Но не компилируется, выдает ошибку. Мне надо если существуют рев ини в него записывать, если нет то в страйдер ини

kotkovets 05-09-2010 23:04 1489256

Belial4444
Из справки:
Код:

IfFileExists $WINDIR\notepad.exe 0 +2
 MessageBox MB_OK "блокнот есть"

+2 -если есть блокнот, то выполнить ниже строчку, если нет, то наоборот.
Закономерный вопрос, если нет rev.ini и stryder.ini ?
кнопопочку # видите? скрипт в сообщении выделяем и жмём...

kotkovets 06-09-2010 01:38 1489320

Очередное обновление: Справочник по NSIS
Скачать

asetin_9207 06-09-2010 16:34 1489694

А как сделать, чтобы после установки выполнялась распаковка батника?
Речь идет о decall.bat

kotkovets 06-09-2010 16:55 1489720

asetin_9207
Цитата:

Цитата asetin_9207
А как сделать, чтобы после установки выполнялась распаковка батника? »

или запуск после распаковки?

Belial4444 06-09-2010 18:48 1489770

Спасибо, вроде получилось. Ток как сделать если файла нету, чтобы ничего не происходило?)

kotkovets 06-09-2010 19:37 1489796

Цитата:

Цитата Belial4444
Ток как сделать если файла нету »

Это вам решать :drug:

asetin_9207 06-09-2010 20:18 1489819

Цитата:

Цитата kotkovets
или запуск после распаковки? »

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

kotkovets 06-09-2010 21:17 1489874

Цитата:

Цитата asetin_9207
Просто в батнике лежат файлы игры, которые необходимы, они там закодированы »

:lol:
Код:

ExecWait "Путь к файлу\decall.bat"
Без комментарий...вылазили лучше бы из... командника...

Caymanroc 07-09-2010 10:56 1490165

Привет!

В моем инсталляторе, написанном в NSIS, необходимо запускать установку небольшой программки, инсталлятор кт написан в InstallShield. Собственно синтаксис:

Код:

ExecWait '"$INSTDIR\InstallShieldProgramm.exe" /s /v" /qf INSTALLDIR=$INSTDIR\folder"'
Проблема: последняя часть ( /v" /qf INSTALLDIR=$INSTDIR\folder") обозначает ключи MSI и заключается в том, чтобы определить папку установки InstallShieldProgramm.exe. Так вот, при использовании в нем описанного выше синтаксиса вылетает ошибка о недопустимых ключах MSI. При этом, если я пишу:

Код:

ExecWait '"$INSTDIR\InstallShieldProgramm.exe" /s /v" /qf INSTALLDIR=С:\folder"'
либо

Код:

ExecWait '"$INSTDIR\InstallShieldProgramm.exe" /s /v" /qf INSTALLDIR=$TEMP:\folder"'
все работает благополучно. При этом я так понял (но не уверен), что работает установка по любой переменной среды через $.
Возможно ли как-то решить проблему установки в нужную папку, задаваемую при установке в nsis инсталляторе?

kotkovets 07-09-2010 12:24 1490216

Цитата:

Цитата Caymanroc
В моем инсталляторе, написанном в NSIS, необходимо запускать установку небольшой программки, инсталлятор кт написан в InstallShield »

Попробуйте так:
Код:

SetOutPath $TEMP
File "Путь к файлу\InstallShieldProgramm.exe"
ExecWait '"$TEMP\InstallShieldProgramm.exe" /s /v /qf INSTALLDIR=$INSTDIR\folder'

или так:
откройте в проводнике папку %TEMP% и не закрывая эту папку, запустите установку InstallShield, к примеру до первого диалога, если в InstallShield добавлена поддержка msi, создаться папка в каталоге %TEMP% с msi-файлом , скопируйте msi-файл в любое удобное место.
Вот здесь пример (Тихая установка)

shao 10-09-2010 23:35 1492782

Здравствуйте!
Подскажите пожалуйста есть ли возможность "вытащить" скрипт из инсталлятора ?
Что-то наподобие , как с InnoSetup .

kotkovets 10-09-2010 23:40 1492784

shao
из шапки темы:
Цитата:

В настоящее время инсталляторы NSIS не могут быть полностью декомпилированы. Сам инсталлятор не содержит в себе никаких функций для того, чтобы извлечь сценарий и/или файлы без инсталляции. Это - выбор разработчика, доступны ли исходный текст и/или файлы для инсталлятора для публики или нет. Есть, однако, внешние инструментальные средства, которые позволяют это сделать. 7-zip поддерживает частичную распаковку NSIS инсталляторов с алгоритмом сжатия lzma или bzip. Так же существует мульти-архивный плагин для TotalCommander...

shao 11-09-2010 01:30 1492828

kotkovets, спасибо я это видел.
Перефразирую вопрос:
Возможно есть другие методы. Или всё так безнадёжно ?

kotkovets 11-09-2010 01:49 1492831

Цитата:

Цитата shao
Возможно есть другие методы »

програмульку Регшот знаете ?

shao 11-09-2010 02:08 1492833

Цитата:

Цитата kotkovets
програмульку Регшот знаете ? »

:) Да, конечно. Но это не 100 % выход из ситуации, а хотелось бы весь скрипт "на блюдечке с голубой каёмочкой".

kotkovets 11-09-2010 02:18 1492834

Цитата:

Цитата shao
хотелось бы весь скрипт "на блюдечке с голубой каёмочкой »

всем бы хотелось....и мне...а так снимки сделал и вперед код строчить.... :)

shao 11-09-2010 02:38 1492840

Ну у меня недостаточно знаний по скрипту NSIS, чтобы строчить код по снимкам реестра.

Вообще то я пользуюсь, в основном, Inno Setup , а в последнее время всё чаще попадаются программы созданные NSIS, вот и думал раздобыть скриптики от него и переделывать под Inno .

kotkovets 11-09-2010 02:48 1492844

Цитата:

Цитата shao
в основном, Inno Setup »

раньше тоже Inno пользовался, но подкупил NSIS своей чрезвычайной гибкостью и возможностями....
тут есть подборка скриптов

shao 11-09-2010 03:26 1492849

Цитата:

Цитата kotkovets
.....NSIS своей чрезвычайной гибкостью и возможностями »

Я пошёл изучать хелп по NSIS.... :teeth:

kotkovets 11-09-2010 10:25 1492929

Цитата:

Цитата shao
Я пошёл изучать хелп по NSIS... »

желаю удачи в изучении... :laugh:

Caymanroc 12-09-2010 11:29 1493549

Прошу прощения за задержку с ответом, т.к. был в командировке.

Цитата:

Цитата kotkovets
Попробуйте так:
»

Первый вариант - инсталлятор вообще не пытается установить программу. После распаковки InstallShieldProgramm.exe инталлятор переходит к выполнению, а затем сразу же перескакивает на следующий шаг, т.е. по всей видимости ExecWait вообще не осуществляется.

Второй вариант:
Код:

ExecWait "msiexec.exe /i $\"$INSTDIR\installer\install.msi$\" /qb INSTALLDIR=$INSTDIR TRANSFORMS=$\"INSTDIR\installer\install.mst$\""
Вылетает аналогичная ошибка, что и с самого начала. Мне кажется, что проблема в том, что msi не может обработать INSTALLDIR=$INSTDIR, т.к. повотрюсь, что при другом значении INSTALLDIR установка завершается успешно.

Если как-то поможет, то скрин ошибки:



P.S. Пока решение - просто запускать ExecWait вообще без параметров, где пользователь вводит папку, аналогичную NSIS, но, как понимаете, это не очень хорошо, и все же хотелось бы отыскать решение.

kotkovets 12-09-2010 12:04 1493571

Цитата:

Цитата Caymanroc
Если как-то поможет, то скрин ошибки »

это не ошибка, неправильная передача параметров
выложите, свой InstallShield ,гляну что и как .... :)
a вы задали в своем скрипте, значение переменной $INSTDIR ?

Caymanroc 12-09-2010 12:23 1493589

Цитата:

Цитата kotkovets
это не ошибка, неправильная передача параметров
выложите, свой InstallShield ,гляну что и как .... »

Отправил в пм. Спасибо за помощь!

Цитата:

Цитата kotkovets
a вы задали в своем скрипте, значение переменной $INSTDIR ? »

Да,
Код:

InstallDir "$PROGRAMFILES\Lotus Forms\Viewer\3.5\"

kotkovets 12-09-2010 13:00 1493623

Цитата:

Цитата Caymanroc
InstallDir "$PROGRAMFILES\Lotus Forms\Viewer\3.5\" »

Уберите в конце левый слеш \
Вобщем так:
1. Распаковываем InstallShield по этому примеру
2. Извлекаем файлы: .msi и 1049.MST , остальное мусор
3. Переименовываем msi файл в Install.msi
4 "Ложим" файлы Install.msi и 1049.MST рядом со скриптом.
Пишем:
Код:

InstallDir "$PROGRAMFILES\My Program"
OutFile "OutFile.exe"

Section
 SetOutPath $TEMP
 File "1049.MST"
 File "install.msi"
 ExecWait 'msiexec.exe /i "$TEMP\install.msi" /qn INSTALLDIR="$INSTDIR\folder" TRANSFORMS="$TEMP\1049.MST"'
 Delete "$TEMP\1049.MST"
 Delete "$TEMP\install.msi"
SectionEnd

У нас прекрасная тихая установка.

Caymanroc 12-09-2010 13:25 1493637

Цитата:

Цитата kotkovets
Уберите в конце левый слеш \
Вобщем так: »

В общем, все заработало. А дело, как обычно было в мелочах - в одинарных кавычках в ExecWait, и в кавычках на INSTALLDIR="$INSTDIR\folder". :)

Спасибо большое за помощь!

kotkovets 12-09-2010 13:49 1493653

Цитата:

Цитата Caymanroc
А дело, как обычно было в мелочах »

мелочи решают всё :) ...

asetin_9207 13-09-2010 17:38 1494554

Цитата:

Цитата kotkovets
ExecWait "Путь к файлу\decall.bat" »

Куда писать этот код? Нужно чтобы выполнялась задача после установки инсталлятора.
Может есть и другие варианты? Например, во время установки инсталлятора или до?

a8sent 13-09-2010 20:30 1494654

Всем привет!!! Прошу помочь в написании формы ввода логина и пароля, с дальнейшей записью их в файл!

kotkovets 13-09-2010 20:36 1494660

Цитата:

Цитата asetin_9207
Куда писать этот код? »

пост 764......:biggrin:
Функция будет выполнена после завершения инсталляции:
Код:

Function .onInstSuccess
 ExecWait "Путь к файлу\decall.bat"
FunctionEnd

Цитата:

Цитата a8sent
Прошу помочь в написании формы ввода логина и пароля, с дальнейшей записью их в файл »

И ,что же у вас там не получается, по конкретней!

a8sent 14-09-2010 10:12 1494960

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

kotkovets 14-09-2010 11:55 1495030

Цитата:

Цитата a8sent
будет записываться в зашифрованном виде в файл »

А что, когда, например на своей странице, вводим пароль и логин,
данные считывается из памяти и записываются в назначенные переменные уже не катит? :o
Цитата:

Цитата a8sent
при первом запуске миранды, заносит данные содержащиеся в нём в профиль пользователя »

Интересно, если миранда шифрует данные пользователя то,
Каким образом вы зашифруете с помощью NSIS данные, чтобы миранда "поняла" параметры?
Разработчики миранды вам алгоритм шифрования и дешифрования дадут?:o

Lisabon 14-09-2010 16:00 1495199

kotkovets, может быть подскажете, возможно ли встроенными средствами NSIS, или при помощи плагинов, скрыть отображение (отрабатывание) запущенной консольной программы... Если не возможно, то какими средствами можно сие организовать, и если можно приведите пример, как это будет выглядеть в NSIS.

kotkovets 14-09-2010 16:43 1495227

Цитата:

Цитата Lisabon
скрыть отображение (отрабатывание) запущенной консольной программы »

ExecCmd
Пример:
Код:

ExecCmd::exec 'DOS.bat'
или так:
Код:

ExecCmd::exec 'cmd /c "DOS.bat"'
Все консольные окна скрыты и ожидание отработки до сл. команды.

Lisabon 14-09-2010 17:39 1495266

kotkovets,

что-то не получается, точнее не отрабатывает программа... Может у меня ошибка?
Вот код:
Код:

Section Install
HideWindow
SetOutPath "$TEMP\USB_Safely_Remove\"
File /r "USB_Safely_Remove\*"
ExecCmd::exec '"$TEMP\USB_Safely_Remove\USB_Safely_Remove.exe" -flash /all'
ExecCmd::exec '"$TEMP\USB_Safely_Remove\usr.exe" stop -n "USB Device"'
SetOutPath "$TEMP"
RMDir /r /rebootok "$TEMP\USB_Safely_Remove"
Quit
SectionEnd

До этого было вот так:

Код:

Section Install
HideWindow
SetOutPath "$TEMP\USB_Safely_Remove\"
File /r "USB_Safely_Remove\*"
ExecWait '"$TEMP\USB_Safely_Remove\USB_Safely_Remove.exe" -flash /all'
ExecWait '"$TEMP\USB_Safely_Remove\usr.exe" stop -n "USB Device"'
SetOutPath "$TEMP"
RMDir /r /rebootok "$TEMP\USB_Safely_Remove"
Quit
SectionEnd

С этим кодом работает

kotkovets 14-09-2010 17:52 1495277

Цитата:

Цитата Lisabon
что-то не получается, точнее не отрабатывает программа »

Попробуйте так:
Код:

ExecCmd::exec '"$TEMP\USB_Safely_Remove\USB_Safely_Remove.exe -flash /all"'
или так:
Код:

ExecCmd::exec "$TEMP\USB_Safely_Remove\USB_Safely_Remove.exe -flash /all"

Lisabon 14-09-2010 18:49 1495323

kotkovets,
Цитата:

Цитата kotkovets
Попробуйте так:
Код:
ExecCmd::exec '"$TEMP\USB_Safely_Remove\USB_Safely_Remove.exe -flash /all"'
или так:
Код:
ExecCmd::exec "$TEMP\USB_Safely_Remove\USB_Safely_Remove.exe -flash /all" »

Попробовал, но результат один и тот же - не отрабатывает программа... Точнее после запуска скомпилированного инсталлятора, в процессах висит сам инсталлятор и не завершается, приходится лезть в диспетчер задач, для убивания инсталлятора.

Если идей других нет, то ладно, фиг с ним отображением... как говорится - нет, так нет...

MKN 15-09-2010 12:05 1495780

Есть файлы драйверов - cdrbsdrv.sys и cdrbsdrv_x64.sys (CD-ROM Filter Driver for Windows2000/xp).
Необходимо установливать их в ОСх32 или х64, как драйверы. В документации ничего не нашёл относительно sys файлов, всё про exe...
Подскажите пожалуйста, как реализовать мою задачу ?

kotkovets 15-09-2010 12:43 1495806

Цитата:

Цитата MKN
Необходимо установливать их в ОСх32 или х64, как драйверы »

Есть плагин
InstDrv 100% не даю, что сработает,
под х64 - по моему не работает.
Установка по inf файлу драйвера, 100% результата не гарантирую:
Код:

ExecWait "rundll32.exe setupapi,InstallHinfSection DefaultInstall 132 C:\Script.inf"
где:
InstallHinfSection - имя вызываемой функции (точка входа);
DefaultInstall - первый параметр для вызываемой функции, означает имя выполняемой секции в INF-скрипте;
132 - второй параметр для вызываемой функции, флаг для обработки скрипта;
C:\Script.inf - третий параметр для вызываемой функции, полный путь к файлу скрипта.Обратите внимание, требуется именно полный путь, так как простое указание имени файла подразумевает расположение файла скрипта в системной директории Windows. Это же примечание в равной мере относится и к интерпретатору AdvancedINF.
Есть утилитка Dpinst, установка по inf файлу:
Код:

ExecWait 'dpinst.exe /path "Путь к папке с драйверами" /lm /sa /sh /sw'
х64 - dpinst.exe нужен под эту архитектуру.

MKN 16-09-2010 09:18 1496483

kotkovets,
Благодарю, но как быть с установкой на х64 без сторонних утилит ?

kotkovets 16-09-2010 11:31 1496593

MKN
Точно не знаю, но думаю без сторонних утилит не обойтись.
Я использую dpinst, меньше заморочек... с драйверами.

Caymanroc 22-09-2010 13:01 1501575

Привет!

На днях развлекался с nsis и наткнулся на интересную особенность. Есть пример , как создавать url ссылку. Запускаем первый раз - все нормально работает. Второй раз меняем адрес ссылки, например
Код:

....
!insertmacro "CreateURL" "Nsis Website" "http://nsis.sourceforge.net/Create_Internet_Shorcuts_during_installation" "Visit NSIS Website"
...

и получаем ссылку на первый адрес, т.е. на http://nsis.sf.net. Есть какие-нибудь предположения, что надо сделать, чтобы ссылка обновлялась?

kotkovets 23-09-2010 12:09 1502409

Цитата:

Цитата Caymanroc
чтобы ссылка обновлялась? »

Дело в проводнике, что именно не знаю, достаточно изменить
имя url-ярлыка:
Код:

!insertmacro "CreateURL" "Web" "http://nsis.sourceforge.net/Create_Internet_Shorcuts_during_installation" "Visit NSIS Website"

hb860 24-09-2010 18:10 1503439

URL-файл перед повторным созданием удалять пробовали?

kotkovets 24-09-2010 19:43 1503503

Цитата:

Цитата hb860
URL-файл перед повторным созданием удалять пробовали? »

hb860 я пробЫвал скриптом, и все также, если ручками удалить, то бывает спустя некоторое время обновится ссылка.
или сразу обновится ссылка после перезагрузки проводника...$RefreshShellicon не выручает.

hb860 24-09-2010 23:21 1503649

А чем плох ОБЫЧНЫЙ ярлык?
Код:

CreateShortCut  "$SMPROGRAMS\${PRODUCT_NAME}\Сайт ${PRODUCT_NAME}.lnk" "http://wwww.aimp.ru"  "" "$PROGRAMFILES\Internet Explorer\iexplore.exe" 1
Вот такой например?

kotkovets 24-09-2010 23:33 1503661

Дык ничем :)
AIMPу 4 года! зато узнал :)

MKN 25-09-2010 11:40 1503864

Как в NSIS реализовать функцию проверки установленного ПО из MSI, по его коду ?
К примеру, в Setup Factory проверку установлен ли VC++2005sp1 я проверяю с помощью :
Код:

-- Get the product's installed state.
nState = MSI.QueryProductState("{837b34e3-7c30-493c-8f6a-2b0f04e2912c}");
if (INSTALLSTATE_DEFAULT ~= nState) then
  result = File.Run(SessionVar.Expand("%TempLaunchFolder%\\vc.exe"), "", "", SW_SHOWNORMAL, false);
end

Каким будет аналог этого скрипта в NSIS ?

И ещё вопрос : Каким образом лучше реализовать поиск перед установкой, запущенного процесса (программы) и его закрытия в случае обнаружения ?
Обнаружил несколько плагинов вроде как для этих целей, но сомневаюсь...

kotkovets 25-09-2010 14:07 1503952

Цитата:

Цитата MKN
Как в NSIS реализовать функцию проверки установленного ПО из MSI, по его коду ? »

Я проверку по реестру делаю, на примере 7-zip упакованный в MSI:
Код:

OutFile OutFile.exe

Section
 ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{23170F69-40C1-2701-0916-000001000000}" "DisplayName"
 StrCmp $0 "" +3 #если в переменной $0  "какое то значение" , то выполняем ниже 2 строчки кода
 MessageBox MB_ICONINFORMATION|MB_OK "$0 установлен!"
 Quit
 MessageBox MB_ICONINFORMATION|MB_OK "7-zip не установлен!"
SectionEnd

0916 - версия 7-zip. Эти цифры меняются в зависимости от версии.
Чтобы сделать проверку на все версии, делаю цикл.

kotkovets 25-09-2010 14:56 1504002

Цитата:

Цитата MKN
И ещё вопрос : Каким образом лучше реализовать поиск перед установкой, запущенного процесса (программы) и его закрытия в случае обнаружения ? »

На примере плагина http://nsis.sourceforge.net/Processes_plug-in
Код:

Function .onInit
 Processes::FindProcess "Explorer.exe"
 Pop $R0
 StrCmp $R0 1 0 +3
 MessageBox MB_OK "Explorer запущен($R0)"
 Processes::KillProcess "Explorer.exe"
 StrCmp $R0 0 0 +2
 MessageBox MB_OK "Explorer не запущен($R0)"
FunctionEnd

предпочитаю http://nsis.sourceforge.net/NsProcess_plugin
читать дальше »
Код:

OutFile OutFile.exe

Function .onInit
 nsProcess::_FindProcess /NOUNLOAD "explorer.exe"
 Pop $R0
 StrCmp $R0 0 0 +3
 MessageBox MB_OK "$R0 | Explorer запущен"
 nsProcess::_KillProcess /NOUNLOAD "explorer.exe"
 StrCmp $R0 603 0 +2
 MessageBox MB_OK "$R0 | Explorer не запущен"
 Quit
FunctionEnd


MKN 26-09-2010 09:46 1504478

kotkovets, подскажи пожалуйста :
Что означает в скриптах +2 , +3 (и где про это узнать подробнее и по русски ) ?

И как организовать после определения наличия (или отсутствия) установленного ПО ? :

1. Если ПО не установлено, то запуск необходимого приложения из $Temp с последующим удалением исходного файла запуска после установки.
(Если установлено - продолжение установки без всяких сообщений.)

и такой вариант :

2. Если ПО не установлено, то вызов сообщения : "Приложение такое то не установлено". И в нём же (в его окне) выбор кнопок : "Установить ?" (А затем его запуск) " Отмена" и " Продолжить установку".

kotkovets 26-09-2010 13:47 1504657

MKN я сообщения использую для отладки скриптов! Никто же вам не мешает их убирать с моих примерах!
Цитата:

Цитата MKN
Что означает в скриптах +2 , +3 »

На примере команды сравнения значений:
StrCmp [значение 1] [значение 2] 0 +5, если [значение 1]=[значение 2], то выполнить ниже 4 строчки кода
StrCmp [значение 1] [значение 2] +5, если [значение 1]=[значение 2], то не выполнять ниже 4 строчки кода
Цитата:

Цитата MKN
Если ПО не установлено, то вызов сообщения : "Приложение такое то не установлено". И в нём же (в его окне) выбор кнопок : "Установить ? »

На примере 7-zip
Код:

Function .onInit
 ReadRegStr $1 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{23170F69-40C1-2701-0916-000001000000}" "ModifyPath"
 StrCmp $1 "" +3
 ExecWait "$1" ;запуск с ожиданием, что прочитали в реестре
 Quit ;выход
 MessageBox MB_ICONQUESTION|MB_YESNO "Приложение не установлено!$\n$\rУстановить?" IDYES YES IDNO NO
 YES: # метка перехода
 SetOutPath "$TEMP"
 File "soft.exe"
 ExecWait "$TEMP\soft.exe"
 Delete "$TEMP\soft.exe"
 NO:
FunctionEnd

Если нужно изменить название кнопок качаем http://nsis.sourceforge.net/MessageBox_plug-in
Командой Pop снимаем коды возврата кнопок, и по кодам, с помощью StrCmp, назначаем функции кнопкам. В описании плагина там есть пример.
Коды снимаем стандартными сообщениями:
Код:

....
messagebox::show ..................
Pop $9
MessageBox MB_OK "$9"

Цитата:

Цитата MKN
Если ПО не установлено, то запуск необходимого приложения из $Temp с последующим удалением исходного файла запуска после установки.
(Если установлено - продолжение установки без всяких сообщений.)»

Код:

Function .onInit
 ReadRegStr $1 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{23170F69-40C1-2701-0916-000001000000}" "ModifyPath"
 StrCmp $1 "" 0 Next ;Если ПО установлено, то переходим к метке Next
 SetOutPath "$TEMP"
 File "soft.exe"
 ExecWait "$TEMP\soft.exe"
 Delete "$TEMP\soft.exe"
 Next:
FunctionEnd

Добавлю в справочник.
Справочник по NSIS

MKN 26-09-2010 16:34 1504819

kotkovets,
Такой вопрос : Возможно ли реализовать при выборочной установке, гиперссылку на всплывающее или просто открывающееся новое окно с текстом-описанием выбранного компонента ?

Например, выбирая какой-нибудь компонент из секции установки, рядом с его описанием присутствует и фраза "Подробнее", являющееся своеобразной гиперссылкой, при клике на которой открывается окно с описанием этого выбранного компонента. И возможно ли в этом окне, кроме текстового описания, поместитть ещё и рисунок (рисунки) ?

Было бы очень полезно для визуализации выбора вариантов устанавливаемых Templates для DVD меню, скинов и многого другого,

Если такое не реально сделать средствами NSIS_а, то хотя бы реализовать открытие в отдельном окне (с заданными размерами) файла типа html или графического файла.

Вопрос 2 : Возможно ли реализовать выбор компонентов не с помощью галок чекбоксов, а с помощью стандартных кликабельных кнопок.
При нажатии на кнопку, чтобы менялся её цвет или на ней появлялся символ галки, свидетельствующий о выполнении ?
Или при нажатии на кнопку, сменялось одно изображение на другое, рядом находящееся с кнопкой, если не возможно это сделать на самой кнопке...
Типа, как это часто делают в AutоIT скриптах.

kotkovets 26-09-2010 16:44 1504827

MKN, в предыдущем посте я вам дал ссылку к справочнику, там есть пример (на примере Оперы) при наведении курсора мышки читаем описание компонента.
Цитата:

Цитата MKN
Вопрос : Возможно ли реализовать выбор компонентов не с помощью галок чекбоксов, а с помощью стандартных кликабельных кнопок. »

Модуль nsDialogs:Создаем нестандартные страницы.
Цитата:

Цитата MKN
Если такое не реально сделать средствами NSIS_а, то хотя бы реализовать открытие в отдельном окне (с заданными размерами) файла типа html или графического файла. »

Не делал такое, но можно попробовать, через функцию .onSelChange
Как нибудь пробну реализовать... :)

MKN 26-09-2010 17:00 1504839

Цитата:

Цитата kotkovets
при наведении курсора мышки читаем описание компонента. »

Это не оч. удобно, т.к нет фиксации. Стронул мышку и пропало описание... И как насчёт рисунков в описании ?

kotkovets 26-09-2010 17:04 1504841

Цитата:

Цитата MKN
И как насчёт рисунков в описании ? »

Картинки-превьюшки для радиокнопок

MKN 26-09-2010 17:11 1504847

kotkovets,
Ещё вопрос (я чувствую, что уже превысил лимит твоего терпения, но всё же... :) )
Как бы продолжить большое и оч. полезное дело с GUI для NSIS_а. Не те обрубки c минимальными возможностями, что уже имеются в сети, а полнофункциональный и расширяемый GUI. Типа, что начал делать K.A.V. http://forum.oszone.net/thread-151756.html, но к сожалению не завершил...
Цены бы не было такому проекту. (У меня в голове уже каша от обилия разномастной скриптоинформации для разных приложений и случаев... :) )

kotkovets 26-09-2010 17:20 1504853

Цитата:

Цитата MKN
Как бы продолжить большое и оч. полезное дело с GUI для NSIS_а »

Я им не пользуюсь, ибо самый гибкий скрипт, создается, только ручками!
И исходников у меня нет...И не гуру в программировании С++ или Delphi
Цитата:

Цитата MKN
У меня в голове уже каша от обилия разномастной скриптоинформации для разных приложений и случаев... »

Бывает, по началу у меня было такое.. :)
Я разбиваю одну сложную задачу, на несколько простых задач и решаю их, потом все собираю в одно целое...

Неплохие редакторы с мастером создания скриптов:
http://forum.oszone.net/post-1078220-114.html

kotkovets 29-09-2010 12:52 1507247

MKN, просил же... :)
$0, $1, $2, $3, $4, $5, $6, $7, $8, $9, $R0, $R1, $R2, $R3, $R4, $R5, $R6, $R7, $R8, $R9 ? че за звери? :o
Это переменные , которые , не нужно обЪявлять!, для хранения каких либо значений, что очень удобно!
Если хотим объявить свою переменную, то пишем:
Код:

Var MKN
...
StrCpy $MKN "Справочник по NSIS" ;помещаем значение в переменную $MKN
MessageBox MB_OK "$MKN"

В справочнике, что я вам давал все это есть!
Читайте внимательно!

MKN 29-09-2010 13:28 1507277

Цитата:

Цитата kotkovets
Это переменные , которые , не нужно обЪявлять! »

Если их не нужно объявлять, значит они уже кем то "объявлены" и что то означают ? Что ? Про это ни слова. Или совершенно не "по-русски" написано, что сразу и не поймёшь... Как ими пользоваться то и что они означают конкретно ?
Цитата:

Цитата kotkovets
Если хотим объявить свою переменную »

Или это "оно" и есть ?

kotkovets 29-09-2010 14:23 1507325

Цитата:

Цитата MKN
Если их не нужно объявлять, значит они уже кем то "объявлены" и что то означают ? Что ? »

открываем ${NSISDIR}\Include\defines.nsh.
В этой папке хранятся заголовочные файлы - библиотеки(инклюиды)
Цитата:

Цитата MKN
Как ими пользоваться то »

ну уж можно понять...если мы храним значение, то можно и сравнить, и вывести и изменить...
Код:

ReadRegStr $1 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion" "ProgramFilesDir"
 MessageBox MB_OK "$1"


MKN 29-09-2010 15:09 1507371

Цитата:

Цитата kotkovets
открываем ${NSISDIR}\Include\defines.nsh »

Нет у меня такой библиотеки. (и тут http://nsis.sourceforge.net/Include/ - не значится) Или она доустанавливается отдельно ?

kotkovets 29-09-2010 16:41 1507470

Цитата:

Цитата MKN
открываем ${NSISDIR}\Include\defines.nsh »

${NSISDIR} - это папка куда установлен NSIS...(C:\Program Files\NSIS)
извиняюсь, defines.nsh - не идет в стандартной комлектации,..это по моему для плагинов, заголовочный файл.

MKN 29-09-2010 16:43 1507472

kotkovets,
Дык, где всё-таки про расшифровку $0, $1, $2, $3, $4, $5, $6, $7, $8, $9, $R0, $R1, $R2, $R3, $R4, $R5, $R6, $R7, $R8, $R9 узнать ?

kotkovets 29-09-2010 16:56 1507483

Цитата:

Цитата MKN
Дык, где всё-таки про расшифровку... »

Ну вы сами сказали, статистические переменные, изначально в NSIS заложена такая возможность.

MKN 29-09-2010 17:05 1507488

kotkovets,
Мне не ясно, что каждая из них означает и в каких случаях используется.
Когда, к примеру, используются $R0, $R1, а когда $0, $1 ? И почему именно они ?

kotkovets 29-09-2010 17:57 1507519

Цитата:

Цитата MKN
Мне не ясно, что каждая из них означает и в каких случаях используется »

Дык в любых, на вкус и цвет... :) хоть $0 или $R9 не важно.

MKN 29-09-2010 18:01 1507520

kotkovets,
Мдя... Ясности не появилось... Можно конкретный пример с подробными комментариями ?

kotkovets 29-09-2010 18:23 1507546

Цитата:

Цитата MKN
что каждая из них означает »

Изначально ничего.. но хранить или записать значение можно и использовать в своих задачах...:)
Код:

ReadRegStr $1 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion" "ProgramFilesDir"
 MessageBox MB_OK "$1"

Вместо $1 можно записать от $0 до $R9.
Свои переменные объявляем, если стандартных не хватает,бывает часто..если много фич и проверок в инсталляторе.
Код:

Var MKN
...
ReadRegStr $MKN HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion" "ProgramFilesDir"
 MessageBox MB_OK "$MKN "

Суть тоже не изменится :)
ReadRegStr $1 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion" "ProgramFilesDir" - Читаем реестр результат в $1

XCV 29-09-2010 22:08 1507741

Уважаемые эксперты, подскажите пожалуйста как реализовать в nsis следующее:
во время установки инсталятор выполняет определенные действия, после чего выдает сообщение: "установка продолжится после перезагрузки компьютера нажмите "ок" чтобы перезагрузить компьютер сейчас или "отмена" чтобы перезагрузить компьютер позже." После чего либо перезагрузить компьютер (кнопка "ок") и самостоятельно вновь запустить установку, либо просто закрыть инсталятор, а после перезагрузки пользователем самостоятельно вновь запуститься. Еще одно пожелание если инсталятор был запущен с ключем "/S" то он должен вести себя как будто была нажата кнопка отмена, но после перезагрузки он самостоятельно запустился бы, но с ключем "/S".
Это возможно реализовать? или хотя бы часть этого?
ЗЫ: заранее спасибо.

kotkovets 30-09-2010 00:06 1507816

Цитата:

Цитата XCV
Это возможно реализовать? »

Можно.
Если все сделать как вы написали, то нужно проверку делать, че установилось(как у Alcohol 120%),
а то получится вечный запуск или сообщение: перезагрузить или нет.. :)

XCV 30-09-2010 00:54 1507845

Цитата:

Цитата kotkovets
проверку делать »

с этим я уже разобрался, зацикливания не будет...
Цитата:

Цитата kotkovets
Можно. »

сори за наглость, а можно поподробнее =)

kotkovets 30-09-2010 01:17 1507855

Цитата:

Цитата XCV
а можно поподробнее »

Легко!
Код:

Section
 ;скрипт
 IfFileExists "Путь к файлу че установилось" Not_Install ;если что то установилось переход Not_Install
 IfSilent Silent
 MessageBox MB_OKCANCEL "Установка продолжится после перезагрузки!$\r$\n\
 Перезагрузить компьютер сейчас?" IDCANCEL CANCEL
 WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce" "Setup" '"$EXEPATH"'
 ;здесь выполнение скрипта будет только с обычным запуском
 Reboot ;перезагрузка
 CANCEL:
 Quit ;Выход, если пользователь нажал кнопку отмена
 Silent:
 ;здесь выполнение скрипта будет только с ключом /S !!!
 WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce" "Setup" '"$EXEPATH /S"'
 ;продолжение скрипта
 Not_Install:
SectionEnd


MKN 30-09-2010 09:01 1507939

Цитата:

Цитата kotkovets
хранить или записать значение »

Т.е. это своеобразныйи указатель на сохраняемое, типа как в регистре, значение ? И далее можно оперировать именно этим указателем-регистром, а не самими значениями ? Если так , то ясно и почему бы в справке сразу так не указать...

Только возникает ещё вопрос - почему их только 20 (а вдруг надо 50 ?) и почему они именно таким образом обозначены (а не $A $B $C или просто вольно - $фигня1, 2 и т.д. ) ? И чем они в таком случае отличаются от назначаемых(объявляемых) мной переменных ?

kotkovets 30-09-2010 09:10 1507945

Цитата:

Цитата MKN
Т.е. это своеобразныйи указатель на сохраняемое, типа как в регистре, значение ? И далее можно оперировать именно этим указателем-регистром, а не самими значениями ? »

Совершенно верно!
Цитата:

Цитата MKN
Только возникает ещё вопрос - почему их только 20 »

Никогда таким вопросом не задавался.Скриптовый язык NSIS отдаленно смахивает на язык С\С++, вот и оттуда, может
тянутся хвосты.

XCV 30-09-2010 09:14 1507948

ещё вопрос, можно ли при помощи nsis создать службу? если да то какой командой?

kotkovets 30-09-2010 11:30 1508031

Цитата:

Цитата XCV
ещё вопрос, можно ли при помощи nsis создать службу? »

http://nsis.sourceforge.net/NsSCM_plug-in
http://nsis.sourceforge.net/Services_plug-in

mshak 04-10-2010 11:55 1510986

Подскажите, можно ли средствами NSIS создавть вирульные каталоги IIS?

kotkovets 04-10-2010 12:31 1511011

вирульные каталоги... А ето че такое?

mshak 04-10-2010 13:23 1511050

если у Вас установлен IIS (Internet Information Services) (это WEB сервер от Microsoft) выберите в нем свой веб-узел. и в менюшке - создать - виртуальный каталог... а дальше там все понятно :)

kotkovets 04-10-2010 14:20 1511093

mshak,
Честно и не знаю, не задавался таким вопросом.
http://nsis.sourceforge.net/Category:Plugins не ходили? может там есть че....

mshak 04-10-2010 16:03 1511164

о! спасибо. надеюсь вот это http://nsis.sourceforge.net/NsisIIS_plug-in поможет.

MKN 06-10-2010 13:18 1512684

Для определеничя установленного приложения по наличию ключа в реестре (если ключа нет - уст vc.exe , если есть - продолжается установка) делаю так, как и советовали :
Код:

ReadRegStr $1 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{837b34e3-7c30-493c-8f6a-2b0f04e2912c}"  ""
 StrCmp $1 "" 0 Next
 SetOutPath "$TEMP"
 File "vc.exe"
 ExecWait "$TEMP\vc.exe"
 Delete "$TEMP\vc.exe"
 Next:

Это ключ в реестре есть, но vc.exe всё равно запускается, не обращая на его наличие внимания... Почему ?

kotkovets 06-10-2010 14:53 1512770

MKN
Ну вы же читаете, значение ключа в реестре, по умолчанию, а значение пустое! соответственно $1=""
Код:

ReadRegStr $1 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{837b34e3-7c30-493c-8f6a-2b0f04e2912c}"  ""
Вот так будет лучше:
Код:

ReadRegStr $1 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{837b34e3-7c30-493c-8f6a-2b0f04e2912c}"  "DisplayName"
IfErrors 0 Next
....

В переменной $1 будет значение ключа DisplayName реестра, если VC установлен.
Советую вам для отладки скриптов пользоваться messagebox

mshak 06-10-2010 14:58 1512776

Совет для тех у кого название программы слишком длинное и не умещается на странице приветствия:
по умолчанию размер метки соствляет 28u, что примерно 2 с половиной строки. Естественно если название должно выводится на трех строчках, то оно не влезает. Это решается добавление в коде константы MUI_WELCOMEPAGE_TITLE_3LINES и тогда высота метки будет составлять 38u, что вполне достаточно для вывода трех строк.
пример:
Код:

...
!define MUI_WELCOMEPAGE_TITLE_3LINES
!insertmacro MUI_PAGE_WELCOME ;страничка привествия
...

А вот что необходимо сделать пользователям у которых не вмещается и на три строки:
открываем файл C:\Program Files\NSIS\Contrib\Modern UI 2\Pages\Welcome.nsh (C:\Program Files\NSIS - папка куда установлен NSIS, у Вас может отличаться) предварительно сделав копию этого файла.
Находим 80-82 строки со следующим содержанием
Код:

  !insertmacro MUI_UNSET MUI_WELCOMEPAGE_TITLE
  !insertmacro MUI_UNSET MUI_WELCOMEPAGE_TITLE_3LINES
  !insertmacro MUI_UNSET MUI_WELCOMEPAGE_TEXT

и дописываем после них
Код:

  !insertmacro MUI_UNSET MUI_WELCOMEPAGE_TITLE_CUSTOM_HEIGHT
далее ищем строки 138-142 со следующим содержанием
Код:

    ;Title   
    !ifndef MUI_WELCOMEPAGE_TITLE_3LINES
      !define MUI_WELCOMEPAGE_TITLE_HEIGHT 28
    !else
      !define MUI_WELCOMEPAGE_TITLE_HEIGHT 38
    !endif

и заменяем их следующим кодом:
Код:

    ;Title  ;12u - высота одной строки
    !ifndef MUI_WELCOMEPAGE_TITLE_3LINES
                !ifdef MUI_WELCOMEPAGE_TITLE_CUSTOM_HEIGHT
                        !define MUI_WELCOMEPAGE_TITLE_HEIGHT ${MUI_WELCOMEPAGE_TITLE_CUSTOM_HEIGHT}
                !else
                        !define MUI_WELCOMEPAGE_TITLE_HEIGHT 28
                !endif
    !else
                        !define MUI_WELCOMEPAGE_TITLE_HEIGHT 38
    !endif

при этом сохраняется полная совместимость со старым скриптом.

а вот пример использования если название умещается аж на пять строк:
Код:

!define MUI_WELCOMEPAGE_TITLE_CUSTOM_HEIGHT 60 ;12u - высота одной строки
!insertmacro MUI_PAGE_WELCOME ;страничка привествия

Надеюсь кому-нибудь поможет.

MKN 06-10-2010 15:19 1512793

kotkovets,
Подскажи, если перед установкой необходима проверка наличия нескольких процессов, запущенной службы и нескольких установленных приложений (с запуском их установки в случае отсутствия), то каким образом в Function .onInit правильно организовать их последовательное выполнение ?
Поместить в скрипте друг за другом в пределах этой секции ?

И как быть в аналогичном случае с закрытием процессов, остановкой службы перед деинсталляцией ?

И почему при наличии !define BRANDING "Текст" - на страницах "брэнд" не отображается ?

kotkovets 06-10-2010 15:57 1512842

Цитата:

Цитата MKN
И почему при наличии !define BRANDING "Текст" - на страницах "брэнд" не отображается ? »

В констакту BRANDING помещаем значение "Текст"
Код:

!define BRANDING "Текст" ;
BrandingText "${BRANDING}"

Цитата:

Цитата MKN
перед установкой необходима проверка »

Код:

Function .OnInit
  ;команда1
  ;команда2
FunctionEnd

Строки скрипта выполняются последовательно,сначала команда1, команда2 и т.д
Цитата:

Цитата MKN
перед деинсталляцией аналогично »

Код:

Function un.OnInit
FunctionEnd


MKN 07-10-2010 08:57 1513319

Цитата:

Цитата kotkovets
Ну вы же читаете, значение ключа в реестре, по умолчанию, а значение пустое! »

А разве нельзя делать определение наличия только ключа ? Без "содержимого". Этого вполне достаточно.
Если ключ существует, то - результат. Если не существует - результат. (Собственно я так всегда и делал в Setup Factory)

kotkovets 07-10-2010 10:42 1513389

Цитата:

Цитата MKN
А разве нельзя делать определение наличия только ключа ? Без "содержимого" »

Можно. В скрипте реализован цикл, на поиск ключа в реестре, находим ключ- продолжаем установку, не находит - устанавливаем VC и продолжаем установку.
Код:

Section
 StrCpy $0 0
 loop:
  EnumRegKey $1 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" $0
  StrCmp $1 "" Done
  StrCmp $1 "{CB2F7EDD-9D1F-43C1-90FC-4F52EAE172A1}" 0 +3
  StrCpy $0 1
  Goto Done
  IntOp $0 $0 + 1
  Goto Loop
 Done:
  StrCmp $0 1 Next
  ;здесь пишем код если VC не установлен
 Next:
SectionEnd


MKN 07-10-2010 15:03 1513576

kotkovets,
Возможны ли в NSIS действия с элементами окон (как в AutuIT) ? Или может есть какие либо хитрости для такой реализации ?

kotkovets 07-10-2010 15:32 1513601

Цитата:

Цитата MKN
Возможны ли в NSIS действия с элементами окон (как в AutuIT) ? »

Конкретно, что ты имеешь в виду?
поковыряй WinMessages.nsh и команды FindWindow , SendMessage и т.д
Вплотную этим не занимался пока... :)
Закрытие всех окон IE

MKN 07-10-2010 17:42 1513719

Цитата:

Цитата kotkovets
Конкретно, что ты имеешь в виду? »

Фокус и переходы по контролам, нажатие кнопок, копирование-вставка в разные поля и т.п.

Вопрос: как сделать неактивной или совсем убрать кнопку "Show Details" при инсталляции ?
И возможно ли вообще убрать неактивные кнопки "Back" и "Cancel" на финишных страницах ?

mshak 07-10-2010 18:01 1513736

возможно.... вот тебе функция которая блокирует кнопку назад (например может пригодиться на кастомных страницах)...
Код:

Function DisableBackButton
        GetDlgItem $R1 $HWNDPARENT 3
;        FindWindow $R1 "Button" "< &Назад" $HWNDPARENT
        EnableWindow $R1 0
FunctionEnd

EnableWindow можно потом заменить на что-нибудь "посущественнее"... ведь хендл кнопки то у нас есть

======
а вот еще одна интересная функция.. может кому нибудь и пригодится.. не знаю выкладывали ли ее здесь ранее..
Код:

Function RelGotoPage ; Функция для произвольного перехода по страницам
; Вызывать след образом:
; StrCpy $R9 X ; где Х - относительный номер страницы (например: -1 переход на одну назад, 1 - на одну вперед)
; Call RelGotoPage
  IntCmp $R9 0 0 Move Move
    StrCmp $R9 "X" 0 Move
      StrCpy $R9 "120"
  Move:
  SendMessage $HWNDPARENT "0x408" "$R9" ""
FunctionEnd


kotkovets 07-10-2010 18:46 1513756

Цитата:

Цитата MKN
Вопрос: как сделать неактивной или совсем убрать кнопку "Show Details" при инсталляции ? »

Из справки:
ShowInstDetails
hide|show|nevershow
==========================================
ShowInstDetails hide - показываем кнопку и скрываем окно деталей
ShowInstDetails nevershow -скрываем все
ShowInstDetails show - показываем окно деталей без кнопки
==========================================
При деинсталляции:
ShowUninstDetails

MKN 08-10-2010 10:45 1514156

при наличии в скрипте функции
Код:

!define MUI_CUSTOMFUNCTION_GUIINIT MyGUIInit
Function MyGUIInit
и т.д. как в справке

раскрашивается почему то текст страницы выбора компонентов, а не страницы приветсвия, как было задумано...
И возможно ли изменить фон страницы приветствия (без скин-плагинов) ?

mshak 08-10-2010 11:47 1514185

MKN, к твоему вопросу по картинке:
попробуй так:
Код:

; записываем картинки в окно установщика
!define MUI_HEADERIMAGE ; - возможность запихнуть в заголовок рисунок
!define MUI_HEADERIMAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Header\win.bmp" ; - сам рисунок в заголовке
; !define MUI_HEADERIMAGE_RIGHT ; - рисунок в заголовке будет находиться справа


MKN 08-10-2010 11:50 1514187

mshak,
Благодарю. Но я уже разобрался и удалил свой вопрос...
У меня не было !define MUI_HEADERIMAGE
А как изменить значок в полосе шапки окна ( рядом с "Установка и т.д." ) ?

mshak 08-10-2010 12:04 1514194

!define MUI_ICON "Install.ico" ; - иконка на файл установщика
!define MUI_UNICON "UnInstall.ico" ; - иконка на файл установщика

MKN 08-10-2010 15:36 1514361

Подскажите пожалуйста, каким образом "отвязать" текст от правого края поля страницы приветствия
!define MUI_WELCOMEPAGE_TITLE "${PRODUCT_NAME} ${PRODUCT_VERSION}"
расположив PRODUCT_NAME и PRODUCT_VERSION по центру ?

kotkovets 08-10-2010 15:46 1514367

Цитата:

Цитата MKN
И возможно ли изменить фон страницы приветствия (без скин-плагинов) ? »

Открываем файл ${NSISDIR}\Contrib\Modern UI 2\MUI2.nsh и заменяем строку
!include "Pages\Welcome.nsh" на !include "Pages\Welcome_1.nsh" сохраняем
изменения в файл MUI_2.nsh
Открываем файл ${NSISDIR}\Contrib\Modern UI 2\Pages\Welcome.nsh и заменяем все константы ${MUI_BGCOLOR} на 0xFFFF80 (здесь цвет желтый) и сохраняем изменения в файл Welcome_1.nsh.
Подключаем измененый интерфейс Modern:
Код:

!include "${NSISDIR}\Contrib\Modern UI 2\MUI_2.nsh"
Все эти манипуляции нужны для того, что бы фон стартовой страницы не распространялся на все скрипты!

MKN 08-10-2010 16:06 1514391

kotkovets,
Есть ли какой либо приём, для регистрации одной командой всех DLL, находящихся в папке ?
К примеру, есть у меня папка с полсотней библиотек, требующих регистрации. Неужели каждую в отдельности прописывать ?

mshak 08-10-2010 16:14 1514399

касательно закрашивания заднего фона не обязательно редактировать страницу. можно попробовать след образом:
Код:

!define MUI_BGCOLOR 0x00FF00

!insertmacro MUI_PAGE_WELCOME ;страничка привествия

!insertmacro MUI_UNSET MUI_BGCOLOR
!define MUI_BGCOLOR "FFFFFF" ; если "" то будет цветом окна.

второе определение MUI_BGCOLOR нужно чтобы след страницы отображались другим цветом.

kotkovets 08-10-2010 16:14 1514400

Цитата:

Цитата MKN
Подскажите пожалуйста, каким образом "отвязать" текст от правого края поля страницы приветствия »

Поиграйся с пробелом:
Код:

!define MUI_WELCOMEPAGE_TITLE "          ${PRODUCT_NAME}          ${PRODUCT_VERSION}"

MKN 09-10-2010 16:55 1515077

Цитата:

Цитата kotkovets
Поиграйся с пробелом: »

Да, это помогло выровнять текст.

MKN 10-10-2010 18:31 1515779

Ещё раз про значок в полосе шапки окна ( рядом с "Установка и т.д." ) - как его вообще убрать ?
Предположил, что с помощью WindowIcon on|off ( 4.8.1.45 Sets whether or not the installer's icon is being displayed. ) для этого.
Но нет не помогло...

И относительно ShowInstDetails nevershow - кнопка то скрывается, а устанавливаемый контент над "индикатором прогресса" установки, мельтешит всё равно. Как это ликвидировать ?

Допустимо ли с скрипте совпадение SetOutPath для файла-папки и точно такого же местоположения в File ? Т.е. компилировать файлы оттуда, куда и устанавливать...

Как реализовать такую конструкцию (для администратора с оч. "шаловливыми пользователями" ?
Перед установкой программы поверх уже установленной предыдущей версии, надо сделать бэкап её настроек(ini файлика), который останется в папке вновь установленной программы), но :
Этот бэкап поместить в запароленный архив, и назначить файлу или"максимальные" права доступа или соответствующий атрибут (чтобы этот архив хотя бы с ходу нельзя было удалить).

kotkovets 10-10-2010 18:48 1515790

Цитата:

Цитата MKN
устанавливаемый контент над "индикатором" установки, мельтешит всё равно »

Пиши в самом начале секции или в каждой секции или в секции - название устанавливаемого компонента:
Код:

Section
 SetDetailsPrint textonly
 DetailPrint "Установка DVD..."
 SetDetailsPrint listonly
 ---
SectionEnd

Заодно в справке посмотри эти команды

kotkovets 10-10-2010 19:07 1515804

Цитата:

Цитата kotkovets
Ещё раз про значок в полосе шапки окна »

Забыл, ну избавиться можно, например так:
1.Открываем любым редактором ресурсов файл ${NSISDIR}\Contrib\UIs\modern.exe
2.Находим диалог 105, удаляем строчку ICON 103, 1039, 300, 8, 21, 20, WS_GROUP
3.Сохраняем как modern_noicon.exe
4.В самом начале скрипта пишем:
Код:

!Include "Mui.nsh"
!define MUI_UI "${NSISDIR}\Contrib\UIs\modern_noicon.exe"


kotkovets 10-10-2010 19:30 1515812

Вот еще нашел элегантный способ, скрывать элементы, без правки файлов, через WinApi функцию.
Код:

!Include "Mui.nsh"
!define MUI_CUSTOMFUNCTION_GUIINIT MyGUIInit
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

OutFile "OutFile.exe"

!macro DestroyWindow HWND IDC
  GetDlgItem $R0 ${HWND} ${IDC}
  System::Call 'user32::DestroyWindow(i R0)'
!macroend

Function MyGUIInit
  !insertmacro DestroyWindow  $HWNDPARENT 1039
FunctionEnd

Section

SectionEnd

1039 - указатель на иконку в заголовке.
То бишь, зная указатель, можно и скрывать другие элементы.

kotkovets 10-10-2010 23:29 1515961

Цитата:

Цитата MKN
Допустимо ли с скрипте совпадение SetOutPath для файла-папки и точно такого же местоположения в File ? »

рулите флагом SetOverwrite
SetOverwrite on - перезаписывать файлы
SetOverwrite off - наоборот...
Цитата:

Цитата MKN
Как реализовать такую конструкцию (для администратора с оч. "шаловливыми пользователями" ?
Перед установкой программы поверх уже установленной предыдущей версии, надо сделать бэкап её настроек(ini файлика), который останется в папке вновь установленной программы), но :
Этот бэкап поместить в запароленный архив, и назначить файлу или"максимальные" права доступа или соответствующий атрибут (чтобы этот архив хотя бы с ходу нельзя было удалить) »

Ну для этого есть консольные утилиты 7z.exe и 7za.exe - c параметрами нужными запускаешь.
Что то типа так(справку почитай по 7z):
Код:

SetOutPath "$TEMP"
File "7z.exe"
File "7z.dll"
nsExec::exec '"$TEMP\7z.exe" -p{Password}:1234 -o{Directory}'
SetFileAttributes "Путь к созданному архиву.7z" "READONLY" #устанавливаем аттрибут "только для чтения"

Все консольные окна будут скрыты, с ожиданием завершения.

MKN 11-10-2010 09:06 1516094

Необходимо, чтобы при снятии отметки с чекбокса(чекбоксов) выбора устанавливаемых компонентов,
в файле скрипта $TEMP\app.nsi удалялись(или комментировались) все записи о секции этого компонента.

Т.е. , если чекбокс не отмечен, то из файла скрипта "физически" удаляются все записи-строки, относящиеся к секции этого компонента.

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

Далее, из изменённого скрипта, командой компилируется новый дистрибутив в указанное место (например, в $DOCUMENTS\NewSetup) и очищается содержимое $TEMP.
Всё необходимое для компиляции (включая и сам NSIS(только нужное), при запуске "конструктора", распаковывается в $TEMP (или в $TEMP\package).

ps Эта процедура необходима для реализации идеи конструктора(пока в упрощённом виде) создания нового отдельного дистрибутива из выбранных компонентов.
Обсуждалось http://forum.oszone.net/thread-151756-12.html с K.A.V., который заинтересовался этой идеей, но до реализации дело не дошло по объективным причинам...

Подскажите пожалуйста, как такое реализовать ?

mshak 12-10-2010 13:30 1517083

а кто нибудь пробовал вызывать vb скрипты из NSIS методами кроме:
... exec "cscript 1.vbs" ...
... exec "wscript 1.vbs" ...
может плагин есть какой либо?
....
прошу прощения.. поторопился ))
http://nsis.sourceforge.net/Run_a_VBScript_from_NSIS

....
но вопрос все-таки есть. Возможно ли как то раскрашивать вывод команды DetailPrint?
например когда происходит ошибка - вывести ее красным цветом..

kotkovets 12-10-2010 23:28 1517524

Цитата:

Цитата mshak
Возможно ли как то раскрашивать вывод команды DetailPrint? »

InstallColors "цвет текста" "цвет фона" или !define MUI_INSTFILESPAGE_COLORS "цвет текста" "цвет фона"

mshak 13-10-2010 11:08 1517759

спасибо. но про эти команды я знаю. меня интерисует раскрасить конкретную запись лога.
точнее я это уже сделал.. но скрипт пока сыроват для его публикации :)... опубликую на днях.

kotkovets 13-10-2010 11:52 1517806

Цитата:

Цитата mshak
но скрипт пока сыроват для его публикации »

mshak с нетерпением буду ждать...

mshak 13-10-2010 17:51 1518076

в общем need help по его доработке.
вот тестовый скрипт:
файл ColorDetailPrint.nsi
Код:

!include "MUI2.nsh"
!include "ColorDetailPrint.nsh"

Name "Color DetailPrint"
OutFile "ColorDetailPrint.exe"
InstallDir "$EXEDIR"
RequestExecutionLevel user

!define MUI_ABORTWARNING
!insertmacro MUI_PAGE_COMPONENTS
;!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES

!insertmacro MUI_LANGUAGE "Russian"

;--------------------------------
!insertmacro InitColors ;добавить что бы не было проблем с системными цветами

ShowInstDetails show

Section "Color DetailPrint" SecDummy
  SetOutPath "$INSTDIR"
 
        DetailPrint "тест тест тест1"
        DetailPrint "тест тест тест ${LVM_FIRST}"
        DetailPrint "тест тест тест3 ${LVM_SETTEXTBKCOLOR}"
        DetailPrint "тест тест тест4"
        DetailPrint "тест тест тест5"
        DetailPrint "тест тест тест6"
        DetailPrint "тест тест тест7"
 
                !insertmacro ColorPrint 0xFF0000 0x00FF00 `Первый тест`

        DetailPrint "тест тест тест1"
        DetailPrint "тест тест тест2"
        DetailPrint "тест тест тест3"
        DetailPrint "тест тест тест4"
        DetailPrint "тест тест тест5"
        DetailPrint "тест тест тест6"
        DetailPrint "тест тест тест7"
 
                !insertmacro ColorPrint 0x00FF00 0x000FF `Второй тест`
               
        DetailPrint "тест тест тест11"
        DetailPrint "тест тест тест21"
        DetailPrint "тест тест тест31"
        DetailPrint "тест тест тест41"
        DetailPrint "тест тест тест51"
        DetailPrint "тест тест тест61"
        DetailPrint "тест тест тест71"

                !insertmacro ColorPrint 0x0000FF 0xFF0000 `Третий тест`
               

SectionEnd

;--------------------------------

файл ColorDetailPrint.nsh
Код:

/*
******************************************
NSIS ColorDetailPrint - Version 1.0 (alfa) 
******************************************
*/

!ifndef USE_ColorDetailPrint

        !define LVM_SETTEXTCOLOR 4132 ; устанавливаем цвет текста
        !define LVM_SETTEXTBKCOLOR 4134 ; устанавливаем цвет фона
        !define LVM_GETITEMCOUNT 4100 ; получаем количество
        !define LVM_REDRAWITEMS 4117 ; перерисовываем
        !define LVM_UPDATE 4138 ; обновляем


        !macro InitColors
                InstallColors "000000" "FFFFFF"
        !macroend

        !macro ColorPrint FORECOLOR BGCOLOR TEXT
                !ifdef MUI_INCLUDED
                        SendMessage $mui.InstFilesPage.Log ${LVM_SETTEXTCOLOR} 0 ${FORECOLOR}
                        SendMessage $mui.InstFilesPage.Log ${LVM_SETTEXTBKCOLOR} 0 ${BGCOLOR}
                !endif

                DetailPrint `${TEXT}`
               
                !ifdef MUI_INCLUDED
                        SendMessage $mui.InstFilesPage.Log ${LVM_SETTEXTCOLOR} 0 0
                        SendMessage $mui.InstFilesPage.Log ${LVM_SETTEXTBKCOLOR} 0 0xFFFFFF
                !endif

        !macroend

        /*
        !ifndef ColorDetailPrint
                !define ColorDetailPrint !insertmacro ColorPrint
        !endif
        */
!endif

цветом пишет, но попробуйте свернуть и развернуть установщик.... вот как это побороть?

kotkovets 13-10-2010 18:18 1518096

Цитата:

Цитата mshak
попробуйте свернуть и развернуть установщик.... вот как это побороть? »

Не знаю, перекрывается чем то, нужен какой то API вызов:
System::Call..(вот не знаю точно !) для восстановления.
или же не все обновляется...предположения....
Или запретить свертывание...

mshak 13-10-2010 19:23 1518143

дело не в сворачивании... а в перерисовке.
если прокрутить лог установки будет тоже самое..

XCV 17-10-2010 13:08 1520680

чтобы задать "боковую" картинку в инсталяторе nsis используется команда:
!define MUI_WELCOMEFINISHPAGE_BITMAP "Win.bmp"
какой командой можно задать аналогичную картинку в деинсталяторе?

kotkovets 17-10-2010 14:14 1520735

Цитата:

Цитата XCV
чтобы задать "боковую" картинку в инсталяторе nsis используется команда:
!define MUI_WELCOMEFINISHPAGE_BITMAP "Win.bmp"
какой командой можно задать аналогичную картинку в деинсталяторе? »

Код:

!define MUI_UNWELCOMEFINISHPAGE_BITMAP "Win.bmp"

truth 21-10-2010 02:10 1523632

Доброго времени суток :) Возможно в этом топике найдется тот, кто сможет мне помочь..
Вот в этом топике я пытался распаковать одну софтину, как выяснилось, это просто проект NSIS, основанный. С помощью Universal Extractor я распаковал его, но сам скрип то никак не вытащить.. возможно кто-то может написать скрипт, для сборки проекта в рабочее состояние (извлеченные ресурсы в указанном ранее топике).
Такая "прога" выполняет всего 3 не сложных действия:
1. Предлагает пользователю ввести ник, после подставляет его в тег и заносит в рядом лежащий конфиг.
2. Предлагает пользователю выбрать путь к папку для скачки, опять же подставляет выбранный путь в нужный тег и заносит в конфиг.
3. Определяет IP пользователя и выводит ему, далее опять подставляет в нужный тег и заносит в конфиг.

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

Спасибо.

kotkovets 21-10-2010 03:00 1523653

truth, Насчет вашего вопроса, если вы дело имели с NSIS,
тут сборник плагинов: http://nsis.sourceforge.net/Category:Plugins
Там есть описание каждого из плагинов (из распакованной папки $PLUGINSDIR) и как пользоваться
В помощь Справочник по NSIS
Цитата:

Цитата truth
Думаю, человеку, который разбирается в этом, будет не сложно состряпать такой скриптик.. если найдутся такие »

Вам, никто не напишет готовый код. Но в конкретном вопросе поможем...

truth 21-10-2010 10:22 1523781

Цитата:

Цитата kotkovets
Вам, никто не напишет готовый код. Но в конкретном вопросе поможем... »

Спасибо, просто скрипт по идее должен быть относительно маленьким, думал может кто набросает на скорую руку..
*ушел штудировать справочник*

Lisabon 25-10-2010 20:05 1527191

kotkovets, нужна помощь по работе с флагами...

Есть у меня три секции, например, section1, section2, section3
Мне необходимо, чтобы при выборе любой секции, устанавливался на других тот же флаг. Тобишь выбрал или снял я чек бокс с section1 (или section2 или section3), и на других секциях, тоже снялся чек бокс... а если установлю чек бокс, то на других установился...
Если можно пример...

kotkovets 25-10-2010 23:04 1527335

Цитата:

Цитата Lisabon
Есть у меня три секции, например, section1, section2, section3
Мне необходимо, чтобы при выборе любой секции, устанавливался на других тот же флаг. Тобишь выбрал или снял я чек бокс с section1 (или section2 или section3), и на других секциях, тоже снялся чек бокс... а если установлю чек бокс, то на других установился...
Если можно пример.. »

А что мешает объединить, в таком случае 3 секции в одну секцию ?
Отметил секцию - выполнились все команды в секции, и наоборот

Lisabon 25-10-2010 23:15 1527343

Цитата:

Цитата kotkovets
А что мешает объединить, в таком случае 3 секции в одну секцию ?
Отметил секцию - выполнились все команды в секции, и наоборот »

Все секции находятся в разных SectionGroup, и хотелось чтоб было по эстетичнее...

kotkovets 26-10-2010 17:59 1527976

Цитата:

Цитата Lisabon
Есть у меня три секции, например, section1, section2, section3
Мне необходимо, чтобы при выборе любой секции, устанавливался на других тот же флаг »

читать дальше »
Код:

OutFile "Section.exe"
!include "MUI2.nsh"
!include "LogicLib.nsh"
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

Section !секция_1 sec_1
SectionEnd
       
Section секция_2 sec_2
SectionEnd       

Section секция_3 sec_3
SectionEnd

Function .onSelChange
 ${If} ${SectionIsSelected} ${sec_1}
    !insertmacro SelectSection ${sec_2}
    !insertmacro SelectSection ${sec_3}
 ${Else}
    !insertmacro UnSelectSection ${sec_2}
    !insertmacro UnSelectSection ${sec_3}
 ${EndIf}
FunctionEnd


Получилось у меня так. Только первая секция управляет состоянием двух других секций.
Функцию .onSelChange в скрипте размещаем после всех секций в скрипте, это нужно для корректного считывания индетификаторов секций

MaGoth 26-10-2010 18:58 1528016

Приветствую, :)
Собственно мой вопрос не совсем по Нсис, но, около него.
Меня интересует все что касается темы создания плагинов для Нсис.
На офф сайте пошарился но что-то инфу по этой теме не нашел, если что и есть по этой теме, то только сам "результат" этой деятельности в виде плагинов и их описания функционала.
Может плохо искал?!

Что-то типа СДК или подобное, оно вообще существует в природе, и как, с чего желательно начинать работу по созданию плагинов для Нсис?

Использую в работе Нсис Юникод, плагин планирую делать для него.
Буду благодарен за ответы и помощь.

Krinkels 27-10-2010 23:16 1529024

MaGoth
Если нужно то могу скинуть сорцы многих плагинов.

MaGoth 28-10-2010 03:50 1529115

Krinkels, Не помешает, хотя многие скачать с сайта можно.
А ты сам случаем не занимался этим вопросом, и если опыт есть, может подсобишь немного (по аське желательно)?

Зы, ты случаем не с бороды ру, что-то ник знакомый...?!

Krinkels 28-10-2010 08:02 1529166

MaGoth
В личку загляни

mshak 15-11-2010 10:34 1542981

Доброго времени суток.
подскажите пожалуйста:
- как узнать существует ли файл?
- как заменить системный файл? (или файл который используется)
я знаю что существует PendingFileRenameOperations (это ключ в ветке реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager) но его тип должен быть REG_MULTI_SZ. а как создавать ключ (или дописывать в случае если уже существует... )

mshak 15-11-2010 11:14 1543006

на первый вопрос ответ нашел... ifFileExists

kotkovets 15-11-2010 17:26 1543264

Цитата:

Цитата mshak
- как заменить системный файл? »

Полезно почитать:http://winreview.ru/Poleznosti/392/K...-Windows-Vista
И плугин есть для этих целей:http://nsis.sourceforge.net/AccessControl_plug-in
AccessControl::SetFileOwner - для файла
AccessControl::GrantOnFile - для директории

Lisabon 16-11-2010 23:10 1544351

kotkovets, помогите разобраться.

Есть чудесный плагин Registry (http://nsis.sourceforge.net/Registry...DIT4_format.29)

так вот мне необходимо произвести импорт\экспорт ветви реестра, например, HKEY_CURRENT_USER\Software\прога

Собственно проблема не пойму как правильно вписать код в скрипт, чтоб работало. Если можно примерчик.

kotkovets 17-11-2010 01:11 1544440

Цитата:

Цитата Lisabon
мне необходимо произвести импорт\экспорт ветви реестра »

На примере Registry.dll
Обязательно смотрим код возврата:
1. В секции экспорта, если $R0= -1, то ошибка, то бишь нужной ветки в реестре нету, если $R0=0 -все ОК!
2. В секции импорта если $R0= -1, то ошибка, файл не найден или нету, если $R0=0 -все ОК!
читать дальше »
Код:

Name "RegistryTest"
OutFile "RegistryTest.exe"

!include "Registry.nsh"
!include "Sections.nsh"

Page components
Page instfiles


Section "Экспортировать ветку в файл реестра" sec1
        ${registry::SaveKey} "HKEY_CURRENT_USER\Software\прога" "$EXEDIR\Test.reg" "/G=1 /D=0" $R0
        ${registry::Unload}
        MessageBox MB_OK "$R0"
SectionEnd

Function .onInit
  StrCpy $1 ${sec1}
FunctionEnd


Section /o "Импортировать из файла в реестр" sec2
        ${registry::RestoreKey} "$EXEDIR\Test.reg" $R0
        ${registry::Unload}
        MessageBox MB_OK "$R0"
SectionEnd



Function .onSelChange
!insertmacro StartRadioButtons $1
    !insertmacro RadioButton ${sec1}
    !insertmacro RadioButton ${sec2}
!insertmacro EndRadioButtons
FunctionEnd


vahe-91 21-11-2010 20:42 1548093

Как в NSIS создать ключи в ветке реестра HKEY_USERS\S-1-5-21-xxxxxx-xxxxx-xxxx\Software\, если для каждого компа эти x разные ?

kotkovets 22-11-2010 02:28 1548286

Цитата:

Цитата vahe-91
Как в NSIS создать ключи в ветке реестра HKEY_USERS\S-1-5-21-xxxxxx-xxxxx-xxxx\Software\, »

А зачем? Для этого ветка есть HKEY_CURRENT_USER\Software\ и везде одинакова.

vahe-91 22-11-2010 13:01 1548506

Цитата:

Цитата kotkovets
А зачем? Для этого ветка есть HKEY_CURRENT_USER\Software\ и везде одинакова. »

Нужно именно в HKEY_USERS. Если кто-то знает метод говорите пожалуйста :help:

kotkovets 22-11-2010 14:23 1548589

Цитата:

Цитата vahe-91
Нужно именно в HKEY_USERS »

HKEY_CURRENT_USER. Здесь содержатся настройки оболочки пользователя (например, Рабочего стола, меню "Пуск", ...), вошедшего в Windows. Они дублируют содержимое подраздела HKEY_USER\name, где name - имя пользователя, вошедшего в Windows. Если на компьютере работает один пользователь и используется обычный вход в Windows, то значения раздела берутся из подраздела HKEY_USERS\.DEFAULT
Код:

  SetShellVarContext current
  WriteRegStr HKCU "Software\123" "" "%WINDIR%\notepad.exe"

Эти же ключ запишется и HKEY_USERS\S-1-5-21-xxxxxx-xxxxx-xxxx\Software\

vahe-91 22-11-2010 15:56 1548676

Цитата:

Цитата kotkovets
SetShellVarContext current »

спасибо, получилось :clapping:

hb860 23-11-2010 22:49 1549969

Давно не писал ничего про NSIS. Продолжил благое начинание.
Определение версии и редакции операционной системы в NSIS

MKN 26-11-2010 16:17 1552149

Подскажите пожалуйста, как в NSIS выглядит переменная c:\Documents and Settings\All Users ?
Именно таким образом без "продолжения" пути. (Продолжением пути будет произвольное имя App)

И какая переменная в Windows 7 для С:\Users\Public ?

MKN 26-11-2010 17:12 1552176

Lisabon,
Вот так : $PROFILE\..\All Users\ - работает. Без точек - нет...
Интересно, а для Windows 7 С:\Users\Public - таким же образом делать ?

Lisabon 26-11-2010 17:31 1552188

Цитата:

Цитата MKN
Интересно, а для Windows 7 С:\Users\Public - таким же образом делать ? »

Может попробовать считать переменную среду %Public% через ReadEnvStr, ну и потом использовать в своих целях. Я не пробовал, но по идее должно помочь.

Код:

Name "Example1"
OutFile "example1.exe"

Section ""
  ReadEnvStr $0 "COMSPEC"
  ReadEnvStr $1 "USERNAME"
  ReadEnvStr $2 "HOMEDRIVE"
  ReadEnvStr $3 "HOMEPATH"
  ReadEnvStr $4 "ALLUSERSPROFILE"
  ReadEnvStr $5 "LOGONSERVER"
  ReadEnvStr $6 "PUBLIC"

 MessageBox MB_OK "COMSPEC: $0 $\r$\n USERNAME: $1 $\r$\n HOMEDRIVE: $2 $\r$\n HOMEPATH: $3 $\r$\n ALLUSERSPROFILE: $4 $\r$\n LOGONSERVER: $5 $\r$\n PUBLIC: $6 $\r$\n"
SectionEnd


kotkovets 26-11-2010 17:34 1552190

SetShellVarContext all
MessageBox MB_OK "$DOCUMENTS"
Код:


!include "FileFunc.nsh"
---
SetShellVarContext ALL
 ${GetParent} "$DOCUMENTS" "$R0"
 MessageBox MB_OK "$R0"


kotkovets 26-11-2010 18:09 1552203

Кстати неплохие примеры пишут через WinAPI:
http://nsis.sourceforge.net/Get_the_...System_plugin)

MKN 26-11-2010 18:11 1552204

kotkovets,
А можно для создания вышеискомых переменных, определив системный диск в переменную, подставить эту переменную вместо C:\ ?

kotkovets 26-11-2010 18:15 1552209

MKN можно, но зачем? :o

MKN 26-11-2010 18:34 1552217

После выхода из инсталлятора (его закрытия) необходимо убить процесс и удалить его файл .
Процесс выгружаю так:
Код:

Function .onGUIEnd
nsProcess::_FindProcess /NOUNLOAD "APP.exe"
 Pop $R0
 StrCmp $R0 0 0 +3
 nsProcess::_KillProcess /NOUNLOAD "APP.exe"
 StrCmp $R0 603 0 +2
FunctionEnd

А вот как удалить ставший не нужным файл APP.exe (из $temp) - не могу придумать. Инсталлятор то уже закрыт...
Что можно сделать ?

kotkovets 26-11-2010 18:47 1552222

Цитата:

Цитата MKN
Что можно сделать ? »

Попробуй так:
Код:

Function .onGUIEnd
 nsProcess::_FindProcess /NOUNLOAD "APP.exe"
 Pop $R0
 StrCmp $R0 0 0 Done
 nsProcess::_KillProcess /NOUNLOAD "APP.exe"
 Sleep 500 ;пауза на всяк случай 0,5с
 Delete /REBOOTOK "$temp\APP.exe"
 Done:
FunctionEnd


Krinkels 26-11-2010 23:50 1552431

Друзья, сделал плагин для NSIS с помощю которого можно комфортно использовать unarc.dll в инсталяторе NSIS. В архиве так же присутствует скрипт с примером. nsisarc.dll и unarc.dll нужно закинуть в папку NSIS\Plugins. Это первая версия, по этому прошу не сильно пинать :)
Скрин
Скачать

kotkovets 27-11-2010 00:16 1552443

Krinkels A а мануальчик, как использовать то?
Код:

nsisarc::ArcExtract "1.arc" "tmp" "" "" ""
И что, можно подставить в пустые кавычки ???

Krinkels 27-11-2010 00:20 1552446

Упс, пардон.
nsisarc::ArcExtract
"1.arc" - Архив. Когда у себя тестил он лежал рядом с инсталятором
"tmp" - Папка куда нужно распаковать архив
"" - Вроде для пароля
"" - Без понятия для чего, нужно у автора спрашивать
"" - Без понятия для чего, нужно у автора спрашивать

kotkovets 27-11-2010 01:12 1552461

Krinkels,
Я думал вы автор, беспарольные архивы распаковывает, как заявлено, а вот с паролем никак!
Уточните у автора параметры все таки!

Krinkels 27-11-2010 01:40 1552472

kotkovets
Попробуй во вторые пустые кавычки вставить пароль, должно помочь

MKN 27-11-2010 09:53 1552566

Подскажите пожалуйста, как решить такую задачу :
Необходимо дождаться появления(создания) file.txt в $TEMP и как только он появится (когда именно - неизвестно), закрыть инсталлятор.

kotkovets 27-11-2010 13:10 1552671

MKN,
А кто будет создавать file.txt в $TEMP ? :)

MKN 27-11-2010 13:22 1552677

Цитата:

Цитата kotkovets
А кто будет создавать file.txt в $TEMP ? »

Сторонняя программа, запущенная из скрипта (или сама по себе, извне). А скрипт должен отследить создание этого файла и закрыться.
Полагаю, надо как то организовать цикл проверки существования этого файла... В документации ничего путного по этому поводу не обнаружил...

kotkovets 27-11-2010 13:28 1552680

А проблема, то в чем? как минимум:
Код:

ExecWait "процесс.exe" ;команда будет ждать завершения процесса
 IfFileExists "$Temp\file.txt" 0 +2 ;будет файлик - будет и выход
 Quit


MKN 27-11-2010 13:35 1552682

kotkovets,
Не подходит, первым делом пробовал... И процесс здесь не нужно учитывать. Ориентир - только файл. Может связано с тем что скрипт ещё запускает последовательно несколько программ...

kotkovets 27-11-2010 13:45 1552688

MKN,
Покажь проблемный кусок кода

MKN 27-11-2010 13:54 1552690

kotkovets,
Макет такой :
Код:

Section -Post
Exec "App1.exe"

Exec "App2.exe"

ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\App3" "Path"
Exec "$R0\App3.exe"

SectionEnd

App1 должно запускаться первым, затем App2, после получения пути - App3.

Все эти проги должны работать одновременно. App3 создаёт файл либо "сама" либо после запуска извне App4.
Как только появится этот файл, App1 и App2 становятся не нужны, но App3 должно оставаться открытым.

kotkovets 27-11-2010 14:43 1552720

Как все запутано!
Здесь организован бесконечный цикл, до тех пор, пока не появится файлик Txt.txt
Для четвертого запуска app.exe или продолжения скрипта нужно время "жизни" цикла

Код:

!include "LogicLib.nsh"
---
Section -Post
Exec "App1.exe"
Exec "App2.exe"
ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\App3" "Path"
Exec "$R0\App3.exe"
 ${Do}
  StrCpy $0 0
  IfFileExists "$Temp\Txt.txt" 0 +2
  StrCpy $0 1
  ${If} $0 == 1
        Quit
  ${EndIf}
${LoopUntil} $0 == 1

SectionEnd


kotkovets 28-11-2010 14:43 1553443

Последнее время мне часто задают вопросы: как поместить свой текст описания, в зависимости от выбранного языка установщика?
Для этих целей служит команда LangString
Код:

LangString message ${LANG_ENGLISH} "English message"
 LangString message ${LANG_FRENCH} "French message"
 LangString message ${LANG_KOREAN} "Korean message"
 MessageBox MB_OK "A translated message: $(message)"

В отличии от определения констант (defines) использующие изогнутые скобы - {}, здесь используются круглые скобки - ().
Всегда устанавливайте текст описания строки для каждого языка в вашем скрипте.
Пример многоязычного инсталлятора посмотрите C:\Program Files\NSIS\Examples\Modern UI\MultiLanguage.nsi
читать дальше »
Код:

  !include "MUI2.nsh"
  Caption "MultiLanguage Modern UI Test"
  Name "MultiLanguage Test"
  OutFile "Test MultiLanguage.exe"
;--------------------------------
 !define MUI_WELCOMEPAGE_TITLE "$(WELCOMEPAGE_TITLE)"
 !define MUI_WELCOMEPAGE_TEXT "$(WELCOMEPAGE_TEXT)"
;--------------------------------
 !define MUI_FINISHPAGE_TITLE "$(FINISHPAGE_TITLE)"
 !define MUI_FINISHPAGE_TEXT "$(FINISHPAGE_TEXT)"
;--------------------------------
  !define MUI_COMPONENTSPAGE_SMALLDESC
;--------------------------------
  !insertmacro MUI_PAGE_WELCOME
  !insertmacro MUI_PAGE_COMPONENTS
  !insertmacro MUI_PAGE_INSTFILES
  !insertmacro MUI_PAGE_FINISH
;--------------------------------
  !insertmacro MUI_LANGUAGE "Russian" ;first language is the default language
  !insertmacro MUI_LANGUAGE "English"
  !insertmacro MUI_RESERVEFILE_LANGDLL
;--------------------------------
 Function .onInit
  !insertmacro MUI_LANGDLL_DISPLAY
 FunctionEnd
;--------------------------------
 Section "$(NAME_SECTION)" SecDummy
    MessageBox MB_ICONINFORMATION|MB_OK "$(Text_MessageBox)"
 SectionEnd
 
;--------------------------------------------------------------------
;Текст описания странички приветствия
LangString WELCOMEPAGE_TITLE ${LANG_RUSSIAN} "ДОБРО ПОЖАЛОВАТЬ!"
LangString WELCOMEPAGE_TITLE ${LANG_ENGLISH} "WELCOME!"
LangString WELCOMEPAGE_TEXT ${LANG_RUSSIAN} "Это пример показывает как поместить свой текст описания в \
                                            зависимости от выбранного языка инсталлятора!$\r$\n$\r$\n$_CLICK"
LangString WELCOMEPAGE_TEXT ${LANG_ENGLISH} "This example shows how to put your text descriptions, \
                                            depending on the selected language installer!$\r$\n$\r$\n$_CLICK"
;--------------------------------------------------------------------
;Текст описания странички завершения
LangString FINISHPAGE_TITLE ${LANG_RUSSIAN} "ЭТО СТРАНИЦА ЗАВЕРШЕНИЯ!"
LangString FINISHPAGE_TITLE ${LANG_ENGLISH} "COMPLETION OF THIS PAGE!"
LangString FINISHPAGE_TEXT ${LANG_RUSSIAN} "Теперь вы знаете как поместить свой текст описания в \
                                            зависимости от выбранного языка установщика!$\r$\n$\r$\nНажмите кнопку $\"Готово$\" \
                                            для выхода из программы установки."
                                           
LangString FINISHPAGE_TEXT ${LANG_ENGLISH} "Now you know how to put your descriptive text depending on \
                                            the language of the installer!$\r$\n$\r$\nClick Finish to close this wizard."
;--------------------------------------------------------------------
;Текст сообщения
LangString TEXT_MESSAGEBOX ${LANG_RUSSIAN} "Выбран Русский язык установщика!$\r$\n ID языка: $LANGUAGE"
LangString TEXT_MESSAGEBOX ${LANG_ENGLISH} "The English language installer!$\r$\n ID language: $LANGUAGE"
;--------------------------------------------------------------------
;Текст названия(имя) секции
LangString SECTION ${LANG_RUSSIAN} "Русское описание секции"
LangString SECTION ${LANG_ENGLISH} "The English description of section"
;Текст описания секции
LangString NAME_SECTION ${LANG_RUSSIAN} "Это русское название секции"
LangString NAME_SECTION ${LANG_ENGLISH} "This is the english name of the section"
;Макрос, который показавает текст описания секции
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
  !insertmacro MUI_DESCRIPTION_TEXT ${SecDummy} $(SECTION)
!insertmacro MUI_FUNCTION_DESCRIPTION_END


MaGoth 29-11-2010 03:39 1553874

kotkovets, Наверное стоит указать что данный пример кода будет корректно работать в Нсис (кодировка Анси) только в случае использования связки английский/русский, не более.
Для всех остальных случаев потребуется использовать версию Нсис - Юникод... ;)


MfG MaGoth, WoG.ru-Community.

kotkovets 29-11-2010 11:30 1553993

Цитата:

Цитата MaGoth
Наверное стоит указать что данный пример кода будет корректно работать в Нсис (кодировка Анси) только в случае использования связки английский/русский, не более »

Это с чего так? добавь C:\Program Files\NSIS\Examples\Modern UI\MultiLanguage.nsi константу:
Код:

!define MUI_LANGDLL_ALLLANGUAGES
И будут тебе все языки, доступны в ANSI-NSIS, большинство пользователей используют ANSI сборку NSIS.
A Юникод в частности, в этом случае, добавляет поддержку "экзотических" языков. А многие русскоязычные пользователи крайне редко будут добавлять такую возможность, лично мне - ни к чему,
достаточно английского языка, что бы тебя поняли многие :)

MKN 29-11-2010 12:50 1554039

Кто нибудь работал с плагином nsisFirewall 1.2 ? (http://wiz0u.free.fr/prog/nsisFirewall/)

У меня возникла необходимость при установке, занести в список разрешённых связку "программа-файл".
Плагин nsisFirewall показался самым подходящим для этого, т.к. позволяет :
Цитата:

Add an application to Windows Firewall exception list
Remove an application from Windows Firewall exception list
Но не работает...

Даже при компиляции собственного примера из архива плагина - ошибка...
Цитата:

Invalid command: nsisFirewall::AddAuthorizedApplication
Error in script "C:\Program Files\NSIS\Examples\nsisFirewall\Sample.nsi" on line 15 -- aborting creation process
Есть ли иные способы работы с Firewall (для всех ОС) ?

kotkovets 29-11-2010 14:41 1554134

Цитата:

Цитата MKN
Есть ли иные способы работы с Firewall (для всех ОС) ? »

Для ANSI версии NSIS - копируешь файл nsisFirewall.dll в C:\Program Files\NSIS\Plugins
Для Unicod версии NSIS - копируешь файл nsisFirewallW.dll в C:\Program Files\NSIS\Unicod\Plugins (или как там).
Работает нормально, как на XP, так и на 7 (не проверял на x64 ОС)
В 7 смотри Дополнительные параметры>Правила для входящих поключений - что изменилось.
читать дальше »
Код:

Name "Sample nsisFirewall"
OutFile "Sample.exe"
ShowInstDetails show       

Section "Main program"
        ;Добавляет в список исключений
        nsisFirewall::AddAuthorizedApplication "$WINDIR\Notepad.exe" "nsisFirewall Test"
        Pop $0
        IntCmp $0 0 +3
        MessageBox MB_OK "A problem happened while adding program to Firewall exception list (result=$0)"
        Return
        Exec "rundll32.exe shell32.dll,Control_RunDLL firewall.cpl"
        MessageBox MB_OK "Program added to Firewall exception list.$\r$\n(close the control panel before clicking OK)"
        ;Удаляет из списка исключений
        nsisFirewall::RemoveAuthorizedApplication "$WINDIR\Notepad.exe"
        Pop $0
        IntCmp $0 0 +3
        MessageBox MB_OK "$0"
        Return
        Exec "rundll32.exe shell32.dll,Control_RunDLL firewall.cpl"
        MessageBox MB_OK "Program removed to Firewall exception list"
SectionEnd


MaGoth 29-11-2010 19:03 1554393

kotkovets, Хм, или я не понял или ты, одно из двух.
В анси кодировках текста нет возможности использовать более 2х языков, например скрипт *.nsi а в нем содержатся строки текста на русском и на английском, да здесь проблем не будет ни каких. А если как у меня - 8 языков, русский испанский немецкий и прочии и все строки текста находятся в одном *.nsi файле скрипта ?!
Имхо, в этом случае MultiLanguage.nsi летит в трубу вместе с компилятором Нсис Анси. ;)

Цитата:

И будут тебе все языки, доступны в ANSI-NSIS, большинство пользователей используют ANSI сборку NSIS.
Это не так, возможно они и будут, но когда юзер станет юзать свой или другой язык в инсталлере, то вместо текста будут кракозябры по всему инсталлеру.

Цитата:

A Юникод в частности, в этом случае, добавляет поддержку "экзотических" языков. А многие русскоязычные пользователи крайне редко будут добавлять такую возможность, лично мне - ни к чему, достаточно английского языка, что бы тебя поняли многие.
Опять эта песня про "экзотические языки", они тут совершенно не причем.
Проблема в другом, с Юникодом все тексты - всегда и везде, будут отображаться корректно, вне зависимости от языка Системы, или того что выбрал пользователь в диалоге инсталлятора.


MfG MaGoth, WoG.ru-Community.

kotkovets 30-11-2010 01:52 1554709

Цитата:

Цитата MaGoth
В анси кодировках текста нет возможности использовать более 2х языков, например скрипт *.nsi а в нем содержатся строки текста на русском и на английском, да здесь проблем не будет ни каких. А если как у меня - 8 языков, русский испанский немецкий и прочии и все строки текста находятся в одном *.nsi файле скрипта ?! »

Касательно выше цитаты, RTFM!
читать дальше »
Код:

!include "MUI2.nsh"
  Caption "MultiLanguage Modern UI Test"
  Name "MultiLanguage Test"
  OutFile "Test MultiLanguage.exe"
;--------------------------------
 !define MUI_WELCOMEPAGE_TITLE "$(WELCOMEPAGE_TITLE)"
;--------------------------------
  !define MUI_COMPONENTSPAGE_SMALLDESC
;--------------------------------
  !insertmacro MUI_PAGE_WELCOME
  !insertmacro MUI_PAGE_INSTFILES
;--------------------------------
!define MUI_LANGDLL_ALLLANGUAGES
;--------------------------------
  !insertmacro MUI_LANGUAGE "Russian" ;first language is the default language
  !insertmacro MUI_LANGUAGE "English"
  !insertmacro MUI_LANGUAGE "German"
  !insertmacro MUI_LANGUAGE "Spanish"
  !insertmacro MUI_LANGUAGE "Indonesian"
 
  !insertmacro MUI_RESERVEFILE_LANGDLL
;--------------------------------
 Function .onInit
  !insertmacro MUI_LANGDLL_DISPLAY
 FunctionEnd
;--------------------------------
 Section
 SetAutoClose true
 SectionEnd
;--------------------------------------------------------------------
;Текст описания странички приветствия
LangString WELCOMEPAGE_TITLE ${LANG_RUSSIAN} "ДОБРО ПОЖАЛОВАТЬ!"
LangString WELCOMEPAGE_TITLE ${LANG_ENGLISH} "WELCOME!"
LangString WELCOMEPAGE_TITLE ${LANG_GERMAN} "WILLKOMMEN!"
LangString WELCOMEPAGE_TITLE ${LANG_SPANISH} "BIENVENIDO!"
LangString WELCOMEPAGE_TITLE ${LANG_INDONESIAN} "SELAMAT DATANG!"


Цитата:

Цитата MaGoth
Проблема в другом, с Юникодом все тексты - всегда и везде, будут отображаться корректно »

Это и так ясно, приведенные выше пример использования языков, будет корректно отображаться везде. :closed-to

MKN 02-12-2010 15:21 1556652

Ещё раз о плагине nsisFirewall.

Что то ведёт он себя на W7 странно и не стабильно. Использовал другой плагин - Simple Firewall Plugin

http://nsis.sourceforge.net/NSIS_Simple_Firewall_Plugin , к которому пока нет вопросов.

beowulf0208 11-12-2010 09:13 1563114

Есть ли возможность у данной программы создавать инсталяторы, у которых была бы возможностью выбора устанавливаемых компонентов?
Т.е. я хочу упаковать в инсталятор несколько папок и мне нужно чтоб в дальнейшем при запуске этого инсталятора он давал выбрать какую папку распаковывать (устанавливать), а какую не надо. Или может кто-нибудь посоветует другую программу для создания данного инсталятора, по функциональности мне подходит SFX модуль в WinRar, но всёже там нет в дальнейшем возможности выборв распакуемых компонентов архива.

kotkovets 11-12-2010 13:15 1563215

beowulf0208
Справочник по NSIS
Шапку темы почитайте вкладку>Документация

Lesterman 12-12-2010 20:41 1564302

Доброе время суток, уважаемые.

Нужно на linux-сервере генерировать установщик программ для windows. msi, exe - неважно - главное, чтобы пользователь на html-странице кликнул на ссылку, скачал инсталлятор и установил у себя программу.
По-моему, nsis - это единственная система, которая на сервере под линуксом способна генерировать windows-инсталляторы.
Проблема в том, что файл makensis под linux нужно собирать из исходников самому.
Я все делал, как написано в статье http://mtaalamu.ru/blog/1370.html или http://www.xdevsoftware.com/blog/pos...on-Linux-.aspx - вылетают ошибки и билдиться программа не хочет. В линуксе я нуб, поэтому не мог ли кто-нибудь выложить уже готовый файл makensis?
Или где скачать его можно? Поиск не помог:(

nibble74 13-12-2010 16:44 1564892

Здравствуте,

возник один вопрос по поводу установки одной программы в скрытом режиме. Запускаю с параметром /S и почти уже перед окончанием установки вылетает окошко с выбором языка, нужно нажать ОК, и далее ещё одно с подтверждением установки настроек по умолчанию, нажать ДА или ОТМЕНА. Так вот, как избежать появления этих окошек. Возможно нужно ещё что-то прописать после параметра /S

подскажите пожалуйста, заранее спасибо

kotkovets 13-12-2010 18:16 1564970

Цитата:

Цитата nibble74
Так вот, как избежать появления этих окошек »

Никак!Только переупаковкой инсталлятора.
Можно пояснить это не желанием (не знанием) или не доработкой "создателя" инсталлятора.
написать скрипт на AutoIt, но это не та тема

kotkovets 16-12-2010 02:07 1566904

Пример выбора одного компонента из нескольких, находящихся в одной группе.
В этом примере был замечен "глюк" NSIS. При нажатии группы "Компоненты", непредсказуемо отмечались секции в группе.
читать дальше »
Код:

!include "MUI2.nsh"
!include "Sections.nsh"

!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"
OutFile "File.exe"

SectionGroup /e "Компоненты" IDG

Section "Компонент №1" ID_1
SectionEnd

Section /o "Компонент №2" ID_2
SectionEnd

Section /o "Компонент №3" ID_3
SectionEnd

SectionGroupEnd

Function .onInit
  StrCpy $1 ${ID_1}
FunctionEnd

Function .onSelChange
  !insertmacro StartRadioButtons $1
    !insertmacro RadioButton ${ID_1}
    !insertmacro RadioButton ${ID_2}
    !insertmacro RadioButton ${ID_3}
  !insertmacro EndRadioButtons
FunctionEnd


Решение.
"Отключить" секционную группу и определить начальное состояние компонентов в функции .OnInit
читать дальше »
Код:

!include "MUI2.nsh"
!include "Sections.nsh"

!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"
OutFile "File.exe"

SectionGroup /e "Компоненты" IDG

Section "Компонент №1" ID_1
SectionEnd

Section /o "Компонент №2" ID_2
SectionEnd

Section /o "Компонент №3" ID_3
SectionEnd

SectionGroupEnd

Function .onInit
  SectionSetFlags ${IDG} ${SECTION_OFF}  #отключаем группу
  SectionSetFlags ${ID_1} ${SF_SELECTED} #определяем, как отмеченный компонент
  StrCpy $1 ${ID_1}
FunctionEnd

Function .onSelChange
  !insertmacro StartRadioButtons $1
    !insertmacro RadioButton ${ID_1}
    !insertmacro RadioButton ${ID_2}
    !insertmacro RadioButton ${ID_3}
  !insertmacro EndRadioButtons
FunctionEnd


kotkovets 18-12-2010 19:27 1569008

Очередное обновление справочника по NSIS
Что нового?
  • Дополнительно про переменные.
Примеры кодов:
  • Множественность запуска
  • Замена строк в файле
  • Определение продукта msi
  • Логические конструкции
Работа со строками:
  • StrCmp, StrLen, IntCmp
Перевод справки:
  • Работа с реестром
  • Работа с ini файлами
  • Относительные переходы
  • Безусловные переходы и много др.
Исправлены мелкие недоработки и замечания.
Если вы заметите какие-то ошибки, неточности пожалуйста сообщите мне!
Рассматриваются предложения, что бы вы хотели увидеть в справочнике и чего не хватает.
За помощь в переводе спасибо участнику конференции mshak
Скачать cправочник по NSIS

punsh 19-12-2010 12:59 1569482

Кто знает, подскажите пожалуйста, как правильно в скрипте прописать
c:\Documents and Settings\All Users\Application Data\ - ?

если $APPDATA - это c:\Documents and Settings\ user \Application Data\


хочу прописать
CreateDirectory "c:\Documents and Settings\All Users\Application Data\IObit" - только через переменную

так правильно или я ошибаюсь!?:::
SetShellVarContext all
CreateDirectory "$APPDATA\IObit"

kotkovets 19-12-2010 13:15 1569492

Цитата:

Цитата punsh
SetShellVarContext all
CreateDirectory "$APPDATA\Download Master" »

Это правильно

CyberMaster 19-12-2010 13:47 1569512

Подскажите, как прочитать путь к папке из реестра и запихнуть его в InstallDir ?

kotkovets 19-12-2010 14:09 1569532

CyberMaster,
Код:

ReadRegStr $INSTDIR HKLM "Software\NSIS" ""
или лучше
InstallDirRegKey HKLM Software\NSIS ""


jackrv 30-12-2010 00:35 1577383

Ткните носом. Как можно изменить внешний вид страницы с выбором компонентов? Нужно это окошко (где отображаются секции) сделать немножко шире..
Надеюсь на вашу помощь.

kotkovets 30-12-2010 03:35 1577434

jackrv,
Добавьте строчку в начале скрипта:
!define MUI_COMPONENTSPAGE_NODESC - позволяет не использовать описание.
Если этого мало правьте любым редактором ресурсом, файлы в папке C:\Program Files\NSIS\Contrib\UIs :
modern_smalldesc.exe - ресурс с маленькой областью описания
modern_nodesc.exe - ресурс без описания
или по умолчанию в файле modern.exe - 104 диалог.

jackrv 30-12-2010 20:05 1578003

kotkovets, было бы лучше убрать тот текст что с лева, но и так нормально..
Спасибо!

kotkovets 30-12-2010 22:05 1578083

Цитата:

Цитата jackrv
было бы лучше убрать тот текст что с лева »

Это тоже не проблема.
http://forum.oszone.net/post-1515812-847.html
--
Но можно и так, точнее в данном случае только так.
Код:

!include "MUI2.nsh"

OutFile Components.exe
Caption "Пример"

!define MUI_COMPONENTSPAGE_NODESC

!insertmacro MUI_PAGE_WELCOME
!define MUI_PAGE_CUSTOMFUNCTION_SHOW COMPONENTS
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

Function COMPONENTS
 ShowWindow $mui.ComponentsPage.ComponentsText ${SW_HIDE}
 ShowWindow $mui.ComponentsPage.SpaceRequired ${SW_HIDE}
FunctionEnd

Section
SectionEnd


Oleg48 02-01-2011 21:15 1579382

Может кто работает с таким редактором как HM NIS Edit? Появилась проблемма работы с мастером, невозможно выбрать язык установки. Если кто знает в чем проблема, отпишитесь, буду очень благодарен.

----- Снимаю этот вопрос-----
После перезапуска компьютера мастер заработал нормально.
Еще раз СОРИ (извените)

mspevkin 06-01-2011 00:18 1581690

Здравствуйте. Подскажите пожалуйста, можно ли из скрипта запускать исполняемый файл программы с ключом?

Например. Нужно, чтобы файл VM_Restorer.exe запустился по окончании установки с ключом /I.
читать дальше »

Код:

!define MUI_FINISHPAGE_RUN "$INSTDIR\VM_Restorer.exe /I"
!define MUI_FINISHPAGE_RUN_CHECKED


kotkovets 06-01-2011 01:48 1581748

Цитата:

Цитата mspevkin
Нужно, чтобы файл VM_Restorer.exe запустился по окончании установки с ключом /I »

Код:

!define MUI_FINISHPAGE_RUN "$INSTDIR\VM_Restorer.exe"
!define MUI_FINISHPAGE_RUN_PARAMETERS "/I"

И вообще почитайте Справочник по NSIS там достаточно подробно описан интерфейс MUI

mspevkin 06-01-2011 01:57 1581751

Ох, нашёл в спавке. Спасибо за ответ.

jackrv 06-01-2011 12:20 1581985

Где можно почитать про реализацию ключей при "тихой установке" которая используется тут?

kotkovets, Спасибо, все мотаю на ус, но не подходит мне такой вариант. Желательно описание оставить, а правую область на ноль свести. Пока не правил ехешку, но вскоре придется.
Кстати вопрос навскидку: как прописать иную ехешку в скрипте?

kotkovets 06-01-2011 15:44 1582210

Цитата:

Цитата jackrv
Где можно почитать про реализацию ключей »

Создание своего инсталлятора на NSIS. Реализация дополнительных ключей командной строки
Цитата:

Цитата jackrv
как прописать иную ехешку в скрипте? »

Код:

!define MUI_UI "файл ресурса.ехе" - основной ресурс MUI (modern.exe)
!define MUI_UI_COMPONENTSPAGE_SMALLDESC "файл ресурса.ехе" - ресурс диалога IDD_SELCOM с маленькой областью описания
!define MUI_UI_COMPONENTSPAGE_NODESC "файл ресурса.ехе" - ресурс диалога IDD_SELCOM без области описания


jackrv 10-01-2011 18:05 1585354

Цитата:

Цитата kotkovets
Создание своего инсталлятора на NSIS. Реализация дополнительных ключей командной строки »

Мне было интересно как реализовываеться механизм /SHORTCUT=ххх
В принципе поковырявшись, все сам понял.

jackrv 10-01-2011 21:05 1585551

Вот например строка, если я ошибаюсь - поправьте меня.
Код:

StrCmp  1 0 NoDesktopShortCuts
Данная строка работает по принципу условного оператора, в данном контексте читается как:
Если в переменной $shDesktop находится значение 1, то выполняем следующую строку, если же значение 0, значит переходим к лейблу NoDesktopShortCuts

А перед этой строкой в .onInit есть еще одна занимательная математика:
Код:

StrCpy $shDesktop $shCMD 1 0
Читается как Прочитать и переменной $shCMD в переменную $shDesktop 1 символ начиная с 0ой позиции.

Вот этого я хотел найти на форуме. Если ошибаюсь, прошу дополнить/поправить меня

kotkovets 10-01-2011 22:49 1585656

jackrv,
на 92 страничке скачайте справочник по NSIS, там есть разбор строк.
Условные и безусловные переходы.
Код:

StrCpy $0 "a string" 3 -4
Отсчитать 4 символа с конца строки и взять 3 последующих символа
Результат в $0 после выполнения команды: "rin"
Код:

StrCmp str1 str2 [метка перехода, если значения str1 и str2 равны] [метка перехода, если значения str1 и str2 не равны]

hb860 17-01-2011 17:05 1590815

Потребовалось из скрипта запустить батник, который кое-какие махинации делал в C:\Windows\System32
Запустил инсталлер на Windows 7 x64 , и он там заработал некорректно, вместо System32 полез в SysWOW64. Ну да, инсталлятор то х86 компилится, соответственно и cmd.exe для батника вызывается "неправильный"... вобщем, в итоге я его запустил в C:\Windows\System32, а свои изыскания оформил в статью:
Запуск "родного" x64 процесса из x86 инсталлятора NSIS. Перенаправление папок
Надеюсь, будет полезно кому-то ещё.

kotkovets 17-01-2011 17:56 1590871

С той же проблемой столкнулся ранее, нужно было в x64 воспроизвести с помощью системной библитеки звук .wav - отключил перенаправление, и пошло дело :)

mariolast 17-01-2011 23:15 1591085

Как можно после установки приложения увидеть лог установки? Во время установки есть кнопочка Детали..., нажав которуюможно эти детали установки лицезреть. может еасть какой тоключ при запуске?

kotkovets 17-01-2011 23:22 1591089

Цитата:

Цитата mariolast
Как можно после установки приложения увидеть лог установки? »

Есть такой плагин - http://nsis.sourceforge.net/DumpLog_plug-in, все, что попадает в окно деталей записывается в файл.
Прописываем плагин после всех секций в скрипте (т.е в последней секции)
На 92стр. скачайте справочник по NSIS там есть пример без плагина.
Извиняюсь , то не то было, ссылку изменил на плагин.

mariolast 18-01-2011 12:33 1591374

kotkovets,
А как сделать на "живой" программе, если скрипта нету?

kotkovets 18-01-2011 15:08 1591490

Цитата:

Цитата mariolast
А как сделать на "живой" программе »

http://forum.oszone.net/thread-67386-23.html
Это вряд ли, ну если автозакрытие на стр. установки не прописано и окно деталей не выключено, то можно через буфер обмена (CTRL+C). Да и если повезет, то в окно не попадают записи в реестр. Для этого куда выгодней использовать RegShot или ProcMon

silione 27-01-2011 02:23 1598041

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

Как я понял, радиобутонами такое сделать можно, если просто добавить "пустой" третий компонент, при выборе которого не будет, соответственно, устанавливаться ни один из первых двух. Считаю такое решение не очень красивым.

Слышал что можно сделать выбор с помощью обычных чекбоксов, на вроде проверки. Если стоит галочка 1, то галочка 2 убирается и наоборот, если стоит галочка 2, то галочка 1 убирается. При этом галочку можно убрать совсем ,и ни один из двух компонентов выбран не будет. Но никак не соображу как такое реализовать.

Подскажите пожалуйста, лучше с примером сразу.

kotkovets 27-01-2011 12:30 1598290

Цитата:

Цитата silione
Слышал что можно сделать выбор с помощью обычных чекбоксов, на вроде проверки. »

Можно сделать и так, но нужно делать промежуточное состояние секций.
Т.е выбор нужной секции - двойным нажатием.
читать дальше »
Код:

!include "MUI2.nsh"
!include "Sections.nsh"

!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"
OutFile "File.exe"

SectionGroup /e "Компоненты" IDG

Section "Компонент №1" ID_1
SectionEnd

Section /o "Компонент №2" ID_2
SectionEnd

SectionGroupEnd

Function .onInit
  StrCpy $1 ${ID_1}
FunctionEnd

Function .onSelChange
  !insertmacro StartRadioButtons $1
    !insertmacro RadioButton ${ID_1}
    !insertmacro RadioButton ${ID_2}
    SectionSetFlags ${IDG} ${SECTION_OFF}
  !insertmacro EndRadioButtons
FunctionEnd


silione 03-02-2011 14:36 1603563

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

SectionSetFlags ${IDG} ${SECTION_OFF}

с групп секций (всех) перестают сбрасываться флажки.

Например, если секции в группах относятся к разным InstType и при одном из вариантов должны отключаться все секции в одной из групп, то секции-то отключаются, а вот флажок на самой группе - нет (отключается только если по нему вручную щелкнуть).

Можно ли это как-то исправить?

Код:

!include "MUI2.nsh"
!include "Sections.nsh"

!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

InstType "все"
InstType "один"

OutFile "File.exe"

Section "Компонент №0" ID_0
  SectionIn 1 2
SectionEnd

SectionGroup /e "Компоненты" IDG

Section "Компонент №1" ID_1
  SectionIn 1
SectionEnd

Section /o "Компонент №2" ID_2
SectionEnd

SectionGroupEnd

SectionGroup /e "Компоненты 2" IDG2

Section "Компонент №3" ID_3
  SectionIn 1
SectionEnd

Section /o "Компонент №4" ID_4
  SectionIn 1
SectionEnd

SectionGroupEnd

Function .onInit
  StrCpy $1 ${ID_1}
FunctionEnd

Function .onSelChange
  !insertmacro StartRadioButtons $1
    !insertmacro RadioButton ${ID_1}
    !insertmacro RadioButton ${ID_2}
    SectionSetFlags ${IDG} ${SECTION_OFF}
  !insertmacro EndRadioButtons
FunctionEnd


kotkovets 03-02-2011 17:45 1603683

silione,
Ну здесь, уже не прокатит трюк фиктивного отключения группы - в наличие неопределенные состояния групп, отсюда и глюки.
1. Нужно определить начальное состояние секций и групп.
2. Разработать логику переключения и рулить флагами секций.
И дальше "прыгать" по логическим меткам (Это вечная проблема с секциями в NSIS).
читать дальше »
Код:

!include "MUI2.nsh"
!include "Sections.nsh"

!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

InstType "все"
InstType "один"

OutFile "File.exe"

Section "Компонент №0" ID_0
  SectionIn 1 2
SectionEnd

SectionGroup /e "Компоненты" IDG

Section "Компонент №1" ID_1
  SectionIn 1
SectionEnd

Section /o "Компонент №2" ID_2
SectionEnd

SectionGroupEnd

SectionGroup /e "Компоненты 2" IDG2

Section "Компонент №3" ID_3
  SectionIn 1
SectionEnd

Section /o "Компонент №4" ID_4
  SectionIn 1
SectionEnd

SectionGroupEnd

Function .onInit
  Push $0
  StrCpy $R0 ${ID_1}
  SectionGetFlags ${ID_1} $0
  IntOp $0 $0 | ${SF_SELECTED}
  SectionSetFlags ${ID_1} $0
  SectionGetFlags ${ID_2} $0
  IntOp $0 $0 & ${SECTION_OFF}
  SectionSetFlags ${ID_2} $0
  Pop $0
FunctionEnd

Function .onSelChange
  Push $0
  StrCmp $R0 ${ID_1} Check_ID_1
  SectionGetFlags ${ID_1} $0
  IntOp $0 $0 & ${SF_SELECTED}
  IntCmp $0 ${SF_SELECTED} 0 Done Done
  StrCpy $R0 ${ID_1}
  SectionGetFlags ${ID_2} $0
  IntOp $0 $0 & ${SECTION_OFF}
  SectionSetFlags ${ID_2} $0
  Goto Done
  Check_ID_1:
  SectionGetFlags ${ID_2} $0
  IntOp $0 $0 & ${SF_SELECTED}
  IntCmp $0 ${SF_SELECTED} 0 Done Done
  StrCpy $R0 ${ID_2}
  SectionGetFlags ${ID_1} $0
  IntOp $0 $0 & ${SECTION_OFF}
  SectionSetFlags ${ID_1} $0
  Done:
  Pop $0
FunctionEnd


shell7777 04-02-2011 17:34 1604520

Есть
скрипт
; one-section.nsi
;
; This example demonstrates how to control section selection.
; It allows only one of the sections of a group to be selected.

;--------------------------------

; Section define/macro header file
; See this header file for more info

!include "Sections.nsh"

;--------------------------------

Name "One Section"
OutFile "one-section.exe"
RequestExecutionLevel user

;--------------------------------

; Pages

Page components

;--------------------------------

; Sections


SectionGroup /e "GROUP" www

Section "Group 1 - Option 1" g1o1
SectionEnd

Section /o "Group 1 - Option 2" g1o2
SectionEnd

Section /o "Group 1 - Option 3" g1o3
SectionEnd

Section "Group 2 - Option 1" g2o1
SectionEnd

Section /o "Group 2 - Option 2" g2o2
SectionEnd

Section /o "Group 2 - Option 3" g2o3
SectionEnd
SectionGroupEnd
;--------------------------------

; Functions

; $1 stores the status of group 1
; $2 stores the status of group 2

Function .onInit

StrCpy $1 ${g1o1} ; Group 1 - Option 1 is selected by default
StrCpy $2 ${g2o1} ; Group 2 - Option 1 is selected by default

FunctionEnd

Function .onSelChange

!insertmacro StartRadioButtons $1
!insertmacro RadioButton ${g1o1}
!insertmacro RadioButton ${g1o2}
!insertmacro RadioButton ${g1o3}
!insertmacro EndRadioButtons

!insertmacro StartRadioButtons $2
!insertmacro RadioButton ${g2o1}
!insertmacro RadioButton ${g2o2}
!insertmacro RadioButton ${g2o3}

!insertmacro EndRadioButtons

FunctionEnd

из инета, который ставить радиобаттон в группе только на одну секцию из этой группы, но при нажатии на общую группу "GROUP"в случайном порядке выставляются галочки, что совсем не нужно. Подскажите плиз как сделать так, чтобы при клике на "GROUP" галочки выставлялись по умолчанию на первые секции в группе?

kotkovets 04-02-2011 17:40 1604525

shell7777,
По этому поводу я уже отвечал здесь
Код:

Function .onInit
SectionSetFlags ${www} ${SECTION_OFF}  #отключаем группу
SectionSetFlags ${g1o1} ${SF_SELECTED} #определяем, как отмеченный компонент
SectionSetFlags ${g2o1} ${SF_SELECTED} #определяем, как отмеченный компонент
StrCpy $1 ${g1o1} ; Group 1 - Option 1 is selected by default
StrCpy $2 ${g2o1} ; Group 2 - Option 1 is selected by default
FunctionEnd


shell7777 04-02-2011 17:47 1604527

kotkovets,
огромнейшее приогромнейшее спасибо!!!!
Урааа....

silione 06-02-2011 12:32 1605857

Я, видимо, дуб.
Почему у меня "компонент №3" может отмечаться одновременно с первым или вторым?
И как при всем этом сделать так, чтобы при нажатии на группу "компоненты 1" галочка, либо снималась совсем, либо происходил последовательный перебор между 1, 2 и 3 компонентой?
Код:

!include "MUI2.nsh"
!include "Sections.nsh"

!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

InstType "все"
InstType "не все"

OutFile "File.exe"

Section "Компонент 0" ID_0
  SectionIn 1 2
SectionEnd

SectionGroup /e "Компоненты 1" IDG1

Section /o "Компонент 1" ID_1
  SectionIn 2
SectionEnd

Section "Компонент 2" ID_2
  SectionIn 1
SectionEnd

Section /o "Компонент 3" ID_3
SectionEnd

SectionGroupEnd

SectionGroup /e "Компоненты 2" IDG2

Section "Компонент 4" ID_4
  SectionIn 1
SectionEnd

Section "Компонент 5" ID_5
  SectionIn 1
SectionEnd

SectionGroupEnd

Function .onInit
  Push $0
  StrCpy $R0 ${ID_2}
  SectionGetFlags ${ID_1} $0
  IntOp $0 $0 & ${SECTION_OFF}
  SectionSetFlags ${ID_1} $0
  SectionGetFlags ${ID_2} $0
  IntOp $0 $0 | ${SF_SELECTED}
  SectionSetFlags ${ID_2} $0
  SectionGetFlags ${ID_3} $0
  IntOp $0 $0 & ${SECTION_OFF}
  SectionSetFlags ${ID_3} $0
  Pop $0
FunctionEnd

Function .onSelChange
  Push $0
  StrCmp $R0 ${ID_1} Check_ID_1
  SectionGetFlags ${ID_1} $0
  IntOp $0 $0 & ${SF_SELECTED}
  IntCmp $0 ${SF_SELECTED} 0 Done Done
  StrCpy $R0 ${ID_1}
  SectionGetFlags ${ID_2} $0
  IntOp $0 $0 & ${SECTION_OFF}
  SectionSetFlags ${ID_2} $0
  SectionGetFlags ${ID_3} $0
  IntOp $0 $0 & ${SECTION_OFF}
  SectionSetFlags ${ID_3} $0
  Goto Done
  Check_ID_1:
  StrCmp $R0 ${ID_2} Check_ID_2
  SectionGetFlags ${ID_2} $0
  IntOp $0 $0 & ${SF_SELECTED}
  IntCmp $0 ${SF_SELECTED} 0 Done Done
  StrCpy $R0 ${ID_2}
  SectionGetFlags ${ID_1} $0
  IntOp $0 $0 & ${SECTION_OFF}
  SectionSetFlags ${ID_1} $0
  SectionGetFlags ${ID_3} $0
  IntOp $0 $0 & ${SECTION_OFF}
  SectionSetFlags ${ID_3} $0
  Check_ID_2:
  SectionGetFlags ${ID_3} $0
  IntOp $0 $0 & ${SF_SELECTED}
  IntCmp $0 ${SF_SELECTED} 0 Done Done
  StrCpy $R0 ${ID_3}
  SectionGetFlags ${ID_1} $0
  IntOp $0 $0 & ${SECTION_OFF}
  SectionSetFlags ${ID_1} $0
  SectionGetFlags ${ID_2} $0
  IntOp $0 $0 & ${SECTION_OFF}
  SectionSetFlags ${ID_2} $0
  Done:
  Pop $0
FunctionEnd


kotkovets 06-02-2011 14:54 1605958

silione,
Могу в этом случае (дабы не выносить мозг :) ) порекомендовать так:
http://forum.oszone.net/post-1326443-307.html

silione 06-02-2011 20:35 1606241

Ыыыыыыыыыыыыы... Ну да, это работает, но сейчас задам самый тупой вопрос...
А как при всем этом сделать чтобы только один раз щелкать по строке?
У меня такое ощущение, что замкнутый круг получается, исправляя одну траблу, получаем другую...

kotkovets 07-02-2011 00:05 1606355

Цитата:

Цитата silione
А как при всем этом сделать чтобы только один раз щелкать по строке? »

Это вряд ли - ограничение NSIS, ведь когда отмечаешь чебокс группы, должны отмечатся чебоксы или снимается чебоксы в секционной группе, следовательно изменяются флаги секций с 0 на 1. И при отметке чебоксов секций флаги изменяются (с двух сторон палят пушками в секции :), куда им деваться то!). В последнем примере - именно так сделано на такой логике переключения секций, т.е при флаге равным 0 - секция не отмечена и наоборот.

ЗЫ. хотя явно утверждать не буду, что нельзя именно так и сделать переключения...Ведь я всего в NSIS не знаю:)

hb860 16-02-2011 19:29 1614671

Цитата:

Цитата jackrv
Где можно почитать про реализацию ключей при "тихой установке" которая используется тут? »

Я, как автор "ключей", готовлю техническую статью о том, как такое сделать, и в частности, как сделать генератор ответов для интсталлятора. Всё будет.

treylav 17-02-2011 00:17 1614931

Столкнулся со следующей проблемой:
Для хранения пути к папке, из которой скрипт берёт файлы на упаковку, я использую переменную. Внутри этой переменной я успешно использую другие переменные, объявленные внутри скрипта, но не могу использовать переменные окружения (например, $PROGRAMFILES): компилятор не преобразует их в пути, а воспринимает как простой текст.
Пример участка кода:
Код:

!define PRODUCT_NAME "Mega_Project"
!define INSTALL_FILES_PATH "$PROGRAMFILES\${PRODUCT_NAME}"

Section "Install"
                File /r "${INSTALL_FILES_PATH}\*.*"
SectionEnd

Реакция компилятора на подобный код:
Код:

File: Returning to: "$PROGRAMFILES\Mega_Project"
File: "$PROGRAMFILES\Mega_Project\*.*" -> no files found.
Usage: File [/nonfatal] [/a] ([/r] [/x filespec [...]] filespec [...] |
  /oname=outfile one_file_only)

Вопрос: NSIS просто не позволяет делать такие финты или хромает моя реализация?
Спасибо.

kotkovets 17-02-2011 01:39 1614972

Цитата:

Цитата treylav
хромает ... реализация »

И полное отсутствие чтения справки и просмотров примеров в папке NSIS...
!define - вообще то, эта команда препроцессора NSIS - помещает опр. значение в константу INSTALL_FILES_PATH (в вашем примере). А константа означает - постоянное, неизменное значение. А вы же пытаетесь, предопределенную переменную $PROGRAMFILES засунуть в константу, а на этапе компиляции эта переменная еще не определена !
Читайте справку по NSIS ! и почитайте Справочник по NSIS
А делать нужно так:

Код:

!define INSTALL_FILES_PATH "C:\Program files\Proga"
!define PRODUCT_NAME "Mega_Project"
InstallDir "$PROGRAMFILES\${PRODUCT_NAME}"

Section "Install"
      SetOutPath "$INSTDIR"
File /r "${INSTALL_FILES_PATH}\*.*"
SectionEnd

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

BSL 20-02-2011 19:01 1617826

Добрый вечер, только начал изучать NSIS.

Есть проблемка. Во время установки если пользователь выбирает определенную Section скажем установка «Сервера приложений», то перед установкой необходимо дополнительно запросить к примеру порт. То есть как я понимаю перед установкой должно появиться окно с параметром. Как этого добиться?

kotkovets 20-02-2011 21:05 1617904

Цитата:

Цитата BSL
необходимо дополнительно запросить к примеру порт. То есть как я понимаю перед установкой должно появиться окно с параметром. Как этого добиться? »

Если Вы так хотите сделать, то нужно делать:
1) проверить, отмечена ли нужная секция
2) Если отмечена секция вызывать соответствующий диалог и вызывать при закрытии стр. выбора компонентов.
Самый простой пример, это с использованием плагина DialogsEx
файлик DialogsEx.dll закидываем в C:\Program Files\NSIS\Plugins
и хедер dialogs.nsh закидываем в C:\Program Files\NSIS\Include
читать дальше »
Код:

!include "MUI2.nsh"
!include "dialogs.nsh"

!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_DIRECTORY
 !define MUI_PAGE_CUSTOMFUNCTION_LEAVE COMPONENTSLEAVE ; функция будет выполнена при закрытии стр. компонентов.
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "Russian"

ShowInstDetails show
InstallDir "$EXEDIR"
OutFile Test.exe
Caption "Test"

Section "Port" SecPort
  MessageBox MB_OK "Номер выбраннога порта: $0" ;показываю в качестве примера значение $0
SectionEnd

Function COMPONENTSLEAVE
  ${If} ${SectionIsSelected} SecPort ;проверка выбрана ли нужная секция
    ${InputTextBox} "Окно выбора номера порта" "Введите номер порта в поле ввода..." "" "4" "" "" 0
    ;число 0 - в переменной $0 будет хранится введеное значение порта
    ;число 4 - соответствует максимально возможному количеству вводимых символов
    StrCmp $0 `` 0 +2 ;если в переменной $0 пустое значение возврат на стр. выбора компонентов
    Abort
  ${EndIf}
FunctionEnd


BSL 21-02-2011 09:43 1618146

kotkovets спасибо, большое. Предложенный вариант работает, и для меня это выход.
Но возник дополнительный вопрос.
Возможно ли сделать так что после выбора компонентов, и нажатие кнопки "Далее", возникало не отдельное окно с контролом порт, а была бы следующая страница с контролом порт, А после этого уже установка.

hb860 21-02-2011 10:43 1618181

BSL, вы можете "нарисовать" свою собственную страницу. Это очень просто. Посмотрите этот пример. Как я понял, вам нужно будет создать только одно текстовое поле и одну надпись.

BSL 21-02-2011 11:08 1618205

hb860, и изучал эту ссылку. Загвоздка в том я смогу создать свою страницу, но как научить ее отображать её или нет в зависимости от выбранной секции.

kotkovets 21-02-2011 12:57 1618278

Цитата:

Цитата BSL
Загвоздка в том я смогу создать свою страницу, но как научить ее отображать её или нет в зависимости от выбранной секции »

Делается точно также, но с небольшой "модификацией". Нечто подобное делал для себя, вот кусок скрипта:
читать дальше »
Код:

!include "MUI2.nsh"
!include "dialogs.nsh"

!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_DIRECTORY
  !define MUI_PAGE_CUSTOMFUNCTION_SHOW COMPONENTSSHOW
!insertmacro MUI_PAGE_COMPONENTS
  Page custom PortShow PortLeave
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "Russian"

ShowInstDetails show
InstallDir "$EXEDIR"
OutFile Test.exe
Caption "Test"

Var Dialog
Var Label
Var Number
Var Port

Section /o "Port" SecPort
  MessageBox MB_OK "Номер выбраннога порта: $Port" ;показываю в качестве примера значение $0
SectionEnd

Function COMPONENTSSHOW ;функция при открытии стр. компонентов
  ${If} ${SectionIsSelected} SecPort ;если выбрана секция
      GetDlgItem $0 $HWNDPARENT 1
      ${NSD_SetText} $0 `$(^NextBtn)` ;переименовываем кнопку
  ${ElseIfNot} ${SectionIsSelected} SecPort ;если не выбрана секция
      GetDlgItem $0 $HWNDPARENT 1
      ${NSD_SetText} $0 `$(^InstallBtn)` ;переименовываем кнопку
  ${EndIf}
FunctionEnd

Function .onSelChange
  ${If} ${SectionIsSelected} SecPort ;если выбрана секция
      GetDlgItem $0 $HWNDPARENT 1
      ${NSD_SetText} $0 `$(^NextBtn)` ;переименовываем кнопку
  ${ElseIfNot} ${SectionIsSelected} SecPort ;если не выбрана секция
      GetDlgItem $0 $HWNDPARENT 1
      ${NSD_SetText} $0 `$(^InstallBtn)` ;переименовываем кнопку
  ${EndIf}
FunctionEnd

Function PortShow
  ${If} ${SectionIsSelected} SecPort ;проверка выбрана ли нужная секция
    nsDialogs::Create 1018
      Pop $Dialog
      ${NSD_CreateLabel} 0 0u 130u 13u "Введите в поле ввода номер порта:"
      Pop $Label
      ${NSD_CreateNumber} 0 13u 40% 13u "" ;ввод только цифры
      Pop $Number
      ${NSD_SetTextLimit} $Number 4 ;лимит на 4 символа
    nsDialogs::Show
  ${EndIf}
FunctionEnd

Function PortLeave
  ${NSD_GetText} $Number $Port ;считываем текст контрола
  StrLen $2 $Port ;считываем количество введенных символов с $Port в $2
  IntCmp $2 4 +2 0 0 ;если меньше или больше 4 символов - возврат назад
  Abort
FunctionEnd


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

hb860 21-02-2011 16:32 1618439

kotkovets, я обычно в секции задаю значение переменной
выглядит примерно так
Код:

section "Покажите мне следующую страницу"
strcpy $R0 "1"
sectionend

ну и далее по предложенному выше сценарию

kotkovets 21-02-2011 17:57 1618515

hb860, Можно и так, или через стек, назначать метку отмеченной секции
но мне на макросах, как то удобней, особенно в сложных скриптах.
На то и NSIS - вариантов реализации предостаточно.

jackrv 27-02-2011 21:31 1623222

Кто нибудь сталкивался с проблемой создания нестандартных диалогов (nsDialog) на нестандартном интерфейсе (Ultra ModernUI)
Такая вот бяка с фоном получается :(

kotkovets 27-02-2011 22:43 1623272

jackrv, Цвет выделения текста при открытии странички?
Вообще цвет контролов можно менять так:
SetCtlColors [хэндл контрола] [цвет текста] [цвет фона]
Код:

SetCtlColors $Text `0x0000FF` `0xFFFFFF`
цвет текста - синий | цвет фона - белый

jackrv 27-02-2011 22:54 1623285

Скорее всего ты меня не понял..
Светлый фон на котором контролы находятся он по идее должен быть таким же цветом как и весь мастер.
Т.е. нужно заменить #EAEBEC на #566978
Правда цвета на фоне форумного фона не очень видно %)

kotkovets 27-02-2011 22:59 1623291

jackrv, Я все прекрасно понял, вот примерчик:
читать дальше »
Код:

Function fnCustomInit
  nsDialogs::Create 1044
    Pop $Dialog
        SetCtlColors $Dialog `0x0000FF` `0x00FF00`
    ${NSD_CreateLabel} 15u 5u 100u 10u "Это надпись"
    Pop $Label
        SetCtlColors $Label `0x0000FF` `0x00FF00`
    ${NSD_CreateText} 15u 20u 90% 15u "Здесь можно печатать..."
    Pop $Text
        SetCtlColors $Text `0x0000FF` `0xFFFFFF`
    ${NSD_CreateCheckBox} 15u 45u 100u 10u "Можно отметить флажком"
    Pop $CheckBox
        SetCtlColors $CheckBox `0x0000FF` `0x00FF00`
  nsDialogs::Show
FunctionEnd


Цитата:

Цитата jackrv
Светлый фон на котором контролы находятся он по идее должен быть таким же цветом как и весь мастер »

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

jackrv 27-02-2011 23:29 1623304

kotkovets, вы были правы.. Классно когда тебя понимают даже тогда когда ты сам запутался)
Вопрос второй, у меня есть кастомная страница и страница UMUI_PAGE_ABORT. Так вот если посреди инсталяции нажать отмену, то перед вызовом UMUI_PAGE_ABORT открывается та самая кастомная страница, что собственно говоря не есть желанным..
Где мог быть косяк?)

kotkovets 27-02-2011 23:38 1623311

jackrv, Трудно сказать вслепую, скрипт приведите...
хотя я Ultra ModernUI не пользуюсь и без этого фейса позволяю себе творить почти любую чертовщину :biggrin:

jackrv 27-02-2011 23:45 1623318

Вот почти весь код (за исключением инклюдов..)
Правда, не думаю что он покажется вам легкочитаемым..
читать дальше »
Код:

; Все это добро накалякал jackrv[jackrv.org.ua].
; Версия компилятора: NSIS-2.46[ANSI]
; Используются плагины:
; - UltraModernUI[NSISSheild]
;        - DotNetVer.nsh
; - Inetc
; При редактировании первое на что обратите внимание, так это строка [19] Константа {PRODUCT_PKG_DIR}
; Важно указать дирекотрию с исходными файлами продукта

; Следующие константы желательно подстроить под свой проект
  !define PRODUCT_NAME              "Etach Server"                                                          ; Имя проекта
  !define PRODUCT_VERSION          "3.1.1"                                                          ; Текущая версия
  !define PRODUCT_FILENAME          "Atott.Chat.Server.Manage.exe"                                    ; Имя исполняемого файла
  !define PRODUCT_UNFILENAME        "uninst.exe"                                                      ; Имя файла деинсталяции
  !define PRODUCT_PUBLISHER        "Etach Group"                                                    ; Компания
  !define PRODUCT_WEB_SITE          "http://etach.ru"                                                ; Офф.Сайт
  !define PRODUCT_ICOFILE          "${NSISDIR}\project\EtachClient\Orange128.ico"                    ; Иконка установцика
  !define PRODUCT_UNICOFILE        "${NSISDIR}\project\EtachClient\Silver128.ico"                    ; Иконка деинсталятора
  !define PRODUCT_PKG_DIR          "D:\Applications\NSIS\project\EtachClient\source"                ; Путь к проекту на ЖД
  !define URLDownloads              "http://etach.ru/Downloads/"                                      ; Адрес папки загрузки
  !define FileDotNet                "dotNetFx40_Full_x86_x64.exe"                                    ; Имя инсталятора .Net FrameWork 4.0
  !define URLEtachClient            ""                                                                ; Имя файла инсталятора клиента
  !define URLEtachServer            ""                                                                ; Имя файла инсталятора сервера

; Нижеследующие константы изменять не нужно
  !define PRODUCT_DIR_REGKEY        "Software\${PRODUCT_FILENAME}"                                    ; Ветвь реестра с доп.данными инсталятора
  !define PRODUCT_UNKEY            "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
  !define /date                    NOW "%d.%m.%Y"                                                    ; Формируем сегодняшнюю дату
  !define URLDotNet                ${URLDownloads}${FileDotNet}

; Кое-какие переменные
  Var Dialog
  Var Label
  Var Text
  Var CheckBox
; --------------------------------------------------------------------------------------------------
; Установка компрессора
  SetCompress force
  SetCompressor /SOLID lzma
; --------------------------------------------------------------------------------------------------
; Основные настройки инсталятора
  Name                "${PRODUCT_NAME}"                                                              ; Имя програмы
  Caption            "$(LANG_CAPTION) ${PRODUCT_NAME} ${PRODUCT_VERSION}"                            ; Заголовок инсталятора
  BrandingText        "${PRODUCT_PUBLISHER}"                                                          ; Текст описания (на полоске, в низу)
  OutFile            "${PRODUCT_NAME}-${PRODUCT_VERSION}_build-${NOW}.exe"                          ; Имя файла после компиляции
  InstallDir          "$PROGRAMFILES\${PRODUCT_NAME}"                                                ; Директория установки по-умолчанию
  ShowInstDetails    hide                                                                            ; Не отображать список копируемых файлов
  ShowUninstDetails  hide                                                                            ; Не отображать список удаляемых файлов

; Производим подключение вспомагательных скриптов
  !include "DotNetVer.nsh"                                                                            ; Проверка установленного .Net
  !include "UMUI.nsh"                                                                                ; Подключаем стильный дизайн
  !include "LogicLib.nsh"                                                                            ; Подключаем разширеную логику
  !include "nsDialogs.nsh"                                                                            ; Подключаем дополнительный редактор окон
; !include "macro.nsi"                                                                                ; Мои макросы

; Настройки интерфейса
  ; Общие настройки
    !define MUI_ABORTWARNING                                                                          ; Подтвержление при выходе
    !define MUI_COMPONENTSPAGE_NODESC                                                                ; MUI без описания (большая область для компонентов)
    !define UMUI_USE_INSTALLOPTIONSEX
    !define UMUI_PARAMS_REGISTRY_ROOT          HKCU                                                  ; Ветка реестра для записи доп.данных инсталятора
    !define UMUI_PARAMS_REGISTRY_KEY            "${PRODUCT_DIR_REGKEY}"                              ; Путь в реестре для доп.данных
    !define UMUI_INSTALLDIR_REGISTRY_VALUENAME  "InstallPath"                                        ; Имя переменной, хрянящей путь к инсталяции
    !define UMUI_LANGUAGE_REGISTRY_VALUENAME    "Language"                                            ; Имя переменной, зранящей язык установки
    !define UMUI_USE_ALTERNATE_PAGE
    !define UMUI_SKIN                          "NSISShield"
  ; Установки иконок файлов
    !define MUI_ICON                            "${PRODUCT_ICOFILE}"                                  ; Иконка инсталятора
    !define MUI_UNICON                          "${PRODUCT_UNICOFILE}"                                ; Иконка деинсталятора
; --------------------------------------------------------------------------------------------------
; Настройка страниц при установке
  ; Основные страницы
    !insertmacro UMUI_PAGE_MULTILANGUAGE                                                              ; Страница выбора языка
;  !insertmacro MUI_PAGE_LICENSE              "$(License)"                                          ; Страницв лицензии
    !insertmacro MUI_PAGE_DIRECTORY                                                                  ; Страница выбора директорий
    Page custom fnCustomInit fnCustomDestroy
    !insertmacro UMUI_PAGE_ADDITIONALTASKS addtasks_function
    ; Страница отображения сведений об установке
      !define UMUI_CONFIRMPAGE_TEXTBOX confirm_function
      !insertmacro UMUI_PAGE_CONFIRM                                                                  ; Страница сведений утановки
    !insertmacro MUI_PAGE_INSTFILES                                                                  ; Страница выполнения скрипта
  ; Страница завершения установки
    !define MUI_FINISHPAGE_NOAUTOCLOSE                                                                ; Не закрывать автоматичесски
    ; Чекбоксы на финишной странице, запуск программы и офф.сайт
      !define MUI_FINISHPAGE_RUN                RunProgram                                            ; Путь к программе
      !define MUI_FINISHPAGE_RUN_TEXT          "$(LANG_FINISHRUN)"                                  ; Текст на чекбоксе запуска
      !define MUI_FINISHPAGE_RUN_CHECKED                                                              ; По-умолчанию выбрано
      !define MUI_FINISHPAGE_LINK              "$(LANG_FINISHURL)"                                  ; Текст ссылки
      !define MUI_FINISHPAGE_LINK_LOCATION      "${PRODUCT_WEB_SITE}"                                ; Адрес офф.сайта
    !insertmacro MUI_PAGE_FINISH                                                                      ; Финишная страница
    !insertmacro UMUI_PAGE_ABORT
; --------------------------------------------------------------------------------------------------
; Настройка деинсталятора
  !insertmacro MUI_UNPAGE_INSTFILES                                                                  ; Страница хода удаления
; --------------------------------------------------------------------------------------------------
; Настройка локализации
  !insertmacro MUI_LANGUAGE "Russian"                                                                ; Подключаем Русс.яз.
  !insertmacro MUI_LANGUAGE "English"                                                                ; Подключаем Англ.яз.
  !insertmacro MUI_LANGUAGE "Ukrainian"                                                              ; Подключаем Укр.яз.
  ; Так-же подключаем файлы определений/переопределений языковых строк
    !include "Language\ru.nsh"
    !include "Language\en.nsh"
    !include "Language\ua.nsh"
; --------------------------------------------------------------------------------------------------
; Макросы
  !macro DotNetInstall
    !insertmacro UMUI_ADDITIONALTASKS_IF_CKECKED DotNet
      inetc::get /CAPTION "Загрузка .NET Framework 4.0" /CANCELTEXT "Отмена" /HEADER "Загрузка .Net Framework 4.0" /POPUP "${URLDotNet}" ${URLDotNet} "C:\dotnetfx.exe" /END
      Pop $0
      StrCmp $0 "OK" InstDotNet
        Delete "C:\dotnetfx.exe"
        Abort "Установка отменена."
      InstDotNet:
        ExecWait "C:\dotnetfx.exe"
        Delete "C:\dotnetfx.exe"
    !insertmacro UMUI_ADDITIONALTASKS_ENDIF
  !macroend
; --------------------------------------------------------------------------------------------------
; Функция инициализации
  Function .onInit
    !insertmacro UMUI_MULTILANG_GET                                                                  ; Выбор языка установки
    !insertmacro MUI_INSTALLOPTIONS_EXTRACT "login.ini"
;  !insertmacro CheckDotNet                                                                          ; Проверка версии .Net
  FunctionEnd

; Функция старта деинсталяции
  Function un.onInit
    MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "$(LANG_unOnInit)" IDYES +2
    Abort
  FunctionEnd

  Function addtasks_function
    ${If} $R0 == ""
      MessageBox MB_ICONINFORMATION|MB_OK|MB_DEFBUTTON2 "Имя администратора будет admin$\nВы можете вернуться на предыдущую страницу и указать нужный вам логин!"
    ${EndIf}
    !insertmacro UMUI_ADDITIONALTASKSPAGE_ADD_LABEL "$(LANG_ADDITIONAL_ICONS)"
    !insertmacro UMUI_ADDITIONALTASKSPAGE_ADD_TASK DESKTOP 1 "$(LANG_DESKTOP_ICON)"
    !insertmacro UMUI_ADDITIONALTASKSPAGE_ADD_TASK QUICK_LAUNCH 0 "$(LANG_QUICK_LAUNCH_ICON)"
    !insertmacro UMUI_ADDITIONALTASKSPAGE_ADD_EMPTYLINE
    !insertmacro UMUI_ADDITIONALTASKSPAGE_ADD_LABEL "$(LANG_ADDITIONAL_DotNet)"
    !insertmacro UMUI_ADDITIONALTASKSPAGE_ADD_TASK DotNet 0 "$(LANG_DotNet_ICON)"
  FunctionEnd

; Функция отображения инфы об установке
  Function confirm_function
    StrCpy $R1 0
    !insertmacro UMUI_CONFIRMPAGE_TEXTBOX_ADDLINE "$(UMUI_TEXT_INSTCONFIRM_TEXTBOX_DESTINATION_LOCATION)"
    !insertmacro UMUI_CONFIRMPAGE_TEXTBOX_ADDLINE "    - $INSTDIR"
    !insertmacro UMUI_CONFIRMPAGE_TEXTBOX_ADDLINE ""

    !insertmacro UMUI_ADDITIONALTASKS_IF_CKECKED DESKTOP
      StrCpy $R1 1
      !insertmacro UMUI_CONFIRMPAGE_TEXTBOX_ADDLINE "$(LANG_ADD_ICONS)"
      !insertmacro UMUI_CONFIRMPAGE_TEXTBOX_ADDLINE "    - $(LANG_ADD_ICONS_0)"
    !insertmacro UMUI_ADDITIONALTASKS_ENDIF

    !insertmacro UMUI_ADDITIONALTASKS_IF_CKECKED QUICK_LAUNCH
      ${If} $R1 = 0
        !insertmacro UMUI_CONFIRMPAGE_TEXTBOX_ADDLINE "$(LANG_ADD_ICONS)"
        StrCpy $R1 1
      ${EndIf}
      !insertmacro UMUI_CONFIRMPAGE_TEXTBOX_ADDLINE "    - $(LANG_ADD_ICONS_1)"
    !insertmacro UMUI_ADDITIONALTASKS_ENDIF
    ${If} $R1 = 1
      !insertmacro UMUI_CONFIRMPAGE_TEXTBOX_ADDLINE ""
    ${EndIf}

    !insertmacro UMUI_ADDITIONALTASKS_IF_CKECKED DotNet
      !insertmacro UMUI_CONFIRMPAGE_TEXTBOX_ADDLINE "$(LANG_ADD_PRGM)"
        ${If} ${HasDotNet4.0}
          MessageBox MB_ICONINFORMATION|MB_OK|MB_DEFBUTTON2 "$(LANG_CheckDotNet1)"
        ${EndIf}
        !insertmacro UMUI_CONFIRMPAGE_TEXTBOX_ADDLINE "    - .Net Framework 4.0"
        Goto End
    !insertmacro UMUI_ADDITIONALTASKS_ENDIF
    ${If} ${HasDotNet4.0}
    ${Else}
      MessageBox MB_ICONINFORMATION|MB_OK|MB_DEFBUTTON2 "$(LANG_CheckDotNet0)"
    ${EndIf}
   
    ${If} $R0 == ""
      StrCpy $R0 "admin"
    ${EndIf}
      !insertmacro UMUI_CONFIRMPAGE_TEXTBOX_ADDLINE "Админпанель"
      !insertmacro UMUI_CONFIRMPAGE_TEXTBOX_ADDLINE "    - Логин суперпользователя: $R0"
    ${If} $R9 = 1
      !insertmacro UMUI_CONFIRMPAGE_TEXTBOX_ADDLINE "    - Будет создан файл run.bat"
    ${EndIf}
      !insertmacro UMUI_CONFIRMPAGE_TEXTBOX_ADDLINE ""
    End:
  FunctionEnd
 
  Function RunProgram
    Exec "$INSTDIR\${PRODUCT_FILENAME} admin:$R0"
  FunctionEnd
 
  Function fnCustomInit
    nsDialogs::Create 1018
    Pop $Dialog
    SetCtlColors $Dialog "0x000000" "0x566978"
    ${NSD_CreateLabel} 5u 5u 100% 30u "Перед установкой вам необходимо указать логин будущего суперадминистратора.$\nЭтот пользователь будет иметь наивысшиее права, имейте это в виду!"
    Pop $Label
    SetCtlColors $Label "0xB4D3EA" "0x566978"
    ${NSD_CreateLabel} 25u 40u 150u 10u "Логин будущего суперадминистратора: "
    Pop $Label
    SetCtlColors $Label "0xB4D3EA" "0x566978"
    ${NSD_CreateText} 180u 38u 100u 15u ""
    Pop $Text
    SetCtlColors $Text "0xFFFFFF" "0x566978"
    ${NSD_CreateLabel} 5u 60u 100% 20u "По необходимости можно создать bat-файл$\nВ него будут занесены необходимые параметры для запуска сервера"
    Pop $Label
    SetCtlColors $Label "0xB4D3EA" "0x566978"
    ${NSD_CreateCheckBox} 10u 80u 100u 10u "Создать bat-файл"
    Pop $CheckBox
    SetCtlColors $CheckBox "0xB4D3EA" "0x566978"
    ${NSD_CreateLabel} 5u 100u 120% 30u "Важно!$\n  Сервер изначально не настроен, т.е. не содержит никаких данных абсолютно!$\n  Поэтому при первом входе вам нужно зарегистрироваться!"
    Pop $Label
    SetCtlColors $Label "0xFF9900" "0x566978"
    nsDialogs::Show
  FunctionEnd

  Function fnCustomDestroy
    ${NSD_GetText} $Text $R0
    ${NSD_GetState} $CheckBox $R9
  FunctionEnd
 
  Function WriteToFile
    Exch $0 ;file to write to
    Exch
    Exch $1 ;text to write

    FileOpen $0 $0 a #open file
    FileSeek $0 0 END #go to end
    FileWrite $0 $1 #write to file
    FileClose $0

    Pop $1
    Pop $0
  FunctionEnd

  !macro WriteToFile String File
    Push "${String}"
    Push "${File}"
    Call WriteToFile
  !macroend
  !define WriteToFile "!insertmacro WriteToFile"
; --------------------------------------------------------------------------------------------------
; Секции установки (компоненты)
  Section "!$(LANG_SECETACH)" SEC01
    !insertmacro DotNetInstall
    SetOutPath        "$INSTDIR"                                                                      ; Меняем паку распаковки
    File              "source\Atott.Core.dll"
    File              "source\Atott.Chat.Server.Manage.exe.config"
    File              "source\Atott.Chat.Server.Manage.exe"
    File              "source\Atott.Chat.Server.Core.dll"
    File              "source\Atott.Chat.Core.dll"
    File              "source\Atott.Chat.Client.Plugin.dll"
    File              "source\Atott.Chat.Client.Controls.dll"
    WriteUninstaller  "$INSTDIR\${PRODUCT_UNFILENAME}"                                                ; Создаем деинсталятор
    WriteIniStr      "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}"  ; Создаем ярлык офф.сайта
    ; Ярлык на рабочем столе
        !insertmacro UMUI_ADDITIONALTASKS_IF_CKECKED DESKTOP
          CreateShortCut "$DESKTOP\${PRODUCT_NAME}.lnk" "$INSTDIR\${PRODUCT_FILENAME}" "admin:$R0" "$INSTDIR\${PRODUCT_UNFILENAME}" 0 SW_SHOWNORMAL ALT|CONTROL|SHIFT|F4  "$(LANG_ShRUN) $(^Name)"
        !insertmacro UMUI_ADDITIONALTASKS_ENDIF
       
        !insertmacro UMUI_ADDITIONALTASKS_IF_CKECKED QUICK_LAUNCH
          CreateShortCut "$QUICKLAUNCH\${PRODUCT_NAME}.lnk" "$INSTDIR\${PRODUCT_FILENAME}" "admin:$R0" "$INSTDIR\${PRODUCT_UNFILENAME}" 0 SW_SHOWNORMAL ALT|CONTROL|SHIFT|F4  "$(LANG_ShRUN) $(^Name)"
        !insertmacro UMUI_ADDITIONALTASKS_ENDIF
    ; Создание файла Run.bat
      ${If} $R9 == 1
        ${WriteToFile} "Atott.Chat.Server.Manage.exe admin:$R0" "$INSTDIR\Run.bat"
      ${EndIf}
    ; Регистрация деинсталятора
      WriteRegStr HKCU "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\${PRODUCT_FILENAME}"
      WriteRegStr HKLM "${PRODUCT_UNKEY}" "DisplayName"      "$(^Name)"
      WriteRegStr HKLM "${PRODUCT_UNKEY}" "UninstallString"  "$INSTDIR\${PRODUCT_UNFILENAME}"
      WriteRegStr HKLM "${PRODUCT_UNKEY}" "DisplayIcon"      "$INSTDIR\${PRODUCT_FILENAME}"
      WriteRegStr HKLM "${PRODUCT_UNKEY}" "DisplayVersion"  "${PRODUCT_VERSION}"
      WriteRegStr HKLM "${PRODUCT_UNKEY}" "URLInfoAbout"    "${PRODUCT_WEB_SITE}"
      WriteRegStr HKLM "${PRODUCT_UNKEY}" "Publisher"        "${PRODUCT_PUBLISHER}"
  SectionEnd
; --------------------------------------------------------------------------------------------------
; Секции деинсталятора
  Section Uninstall
    Delete "$INSTDIR\*.*"
    Delete "$DESKTOP\${PRODUCT_NAME}.lnk"
    RMDir /r "$INSTDIR"

    DeleteRegKey HKLM "${PRODUCT_UNKEY}"
    DeleteRegKey HKCU "${PRODUCT_DIR_REGKEY}"
  SectionEnd
; --------------------------------------------------------------------------------------------------
; Информация о файле (о том что после компиляции появляется)
  VIProductVersion ${PRODUCT_VERSION}.0
  VIAddVersionKey /LANG=${LANG_RUSSIAN} ProductName    "${PRODUCT_NAME}"
  VIAddVersionKey /LANG=${LANG_RUSSIAN} ProductVersion  "${PRODUCT_VERSION}"
  VIAddVersionKey /LANG=${LANG_RUSSIAN} CompanyName    "${PRODUCT_PUBLISHER}"
  VIAddVersionKey /LANG=${LANG_RUSSIAN} CompanyWebsite  "${PRODUCT_WEB_SITE}"
  VIAddVersionKey /LANG=${LANG_RUSSIAN} FileVersion    "${PRODUCT_VERSION}"
  VIAddVersionKey /LANG=${LANG_RUSSIAN} FileDescription "${PRODUCT_PUBLISHER}"
  VIAddVersionKey /LANG=${LANG_RUSSIAN} LegalCopyright  "Copyright © ${PRODUCT_PUBLISHER}"
  VIAddVersionKey /LANG=${LANG_RUSSIAN} Comments        "Windows XP, Vista, Win7 $\t .Net Framework 4.0"
  VIAddVersionKey /LANG=${LANG_RUSSIAN} OriginalFilename "${PRODUCT_FILENAME}"


kotkovets 28-02-2011 00:14 1623327

Хм.. чтобы инсценировать ситуацию, нужен Ultra ModernUI, не качал.
Хотя вроде бы все верно, видно не совсем дружат совместно Ultra ModernUI и стандартный MUI.
!define MUI_ABORTWARNING - cтандарт MUI, по идее должно быть - !define UMUI_ABORTWARNING (когда нажимается кнопка отмена, вызывается мессага)
В таких случаях рекомендую создать простой отладочный скриптик со своей страничкой и последовательно добавлять странички, функции - до появления глюка и отслеживать значение используемых переменных в разные моменты, через DetailPrint или MessageBox.

jackrv 28-02-2011 00:28 1623330

Убрал !insertmacro UMUI_PAGE_ABORT проблема иссякла, не сильно нужно то окошко, поэтому как временный выход из ситуации..

Kolobaxa 04-03-2011 08:42 1626942

Здравствуйте.
Дело в том что делаю инсталлер FlylinkDC++ для своего провайдера.
Не могу понять как например в отдельном окне сделать окна типа "ввод никнейма", "ввод IP адресса" и .т.п. и связать их с "DCPlusPlus.xml" т.е. файлом настроек.
Вообще хотел бы сделать много окон с пояснениями т.к. многим пользователям и не нужно лазить в настройках что-то где-то устанавливать, искать и т.п. Сразу все ввел и довольный пользуешься =)
Примерный билд инстала:
1 Страница. приветствие (в скрипте уже реализована)
2 Страница. выбор директории (в скрипте уже реализована)
3 Страница. Ввод никнейма Ввод мыла Ввод IP адресса
4 Страница. Настройка избранных хабов Название Адресс Никнейм Пароль Способ соединения
5 Страница. Шара т.е. вывод полного дерева и выбор пользователю что он хочет расшарить
6 Страница. Директория для скачивания
7 Страница. Вывод соглашения с правилами поведения на хабе и наказания за несоблюдение
Вот как то так =)
Буду очень благодарен за разъяснения хотя бы по пункту 3. И по завязке его с файлом настроек. дальше думаю по аналогии с остальным разберусь =)

kotkovets 04-03-2011 13:15 1627104

Цитата:

Цитата Kolobaxa
разъяснения хотя бы по пункту 3. »

Создание своих страниц - в шапке, и куча примеров на предыдущих страничках темы.
Парсинг XML - пример в шапке.
В помощь плагины - http://nsis.sourceforge.net/Category:Plugins и по своим страничкам:
http://nsis.sourceforge.net/Category:NsDialogs_Examples
и еще в довесок:
Справочник по NSIS

Kolobaxa 04-03-2011 14:41 1627146

Цитата:

Цитата kotkovets
Цитата Kolobaxa:
разъяснения хотя бы по пункту 3. »
Создание своих страниц - в шапке, и куча примеров на предыдущих страничках темы.
Парсинг XML - пример в шапке.
В помощь плагины - http://nsis.sourceforge.net/Category:Plugins и по своим страничкам:
http://nsis.sourceforge.net/Category:NsDialogs_Examples
и еще в довесок:
Справочник по NSIS »

Ок, спасибо. Буду разбираться =)

zmeykas 08-03-2011 11:11 1629814

Необходимо покрасить текст на странице приветствия в белый цвет.

Сделал так:
Код:

!define MUI_PAGE_CUSTOMFUNCTION_SHOW WelcomePageSetupShow
!insertmacro MUI_PAGE_WELCOME

Function WelcomePageSetupShow
    FindWindow $1 "#32770" "" $HWNDPARENT
    GetDlgItem $2 $1 1201
    SetCtlColors $2 '0xFFFFFF' transparent
    GetDlgItem $2 $1 1202
    SetCtlColors $2 '0xFFFFFF' transparent
FunctionEnd

Текст действительно стал белым, но если со страницы лицензионного соглашения вернуться обратно на страницу приветствия - текст снова черный. Как от этого избавится?
И еще вопрос, как узнать ID элементов диалогов (1201, 1202)? Я их нашел совершенно случайно в примерах...

kotkovets 08-03-2011 13:23 1629921

zmeykas,
Я использую только MUI2.nsh, где странички приветствия/завершения рисуются через nsDialogs.
А значит, что уже контролы уже сформированы и все хэндлы контролов уже в "кармане"
Contrib\Modern UI 2\Pages\Welcome.nsh - в этом заголовочном файле хранится все, что нужно, для странички приветствия.
читать дальше »
Код:

!include "MUI2.nsh"
!define MUI_WELCOMEFINISHPAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Wizard\orange.bmp"

OutFile "test.exe"
ShowInstDetails show

!define MUI_PAGE_CUSTOMFUNCTION_SHOW WelcomePageShow
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE "${NSISDIR}\COPYING"
!insertmacro MUI_LANGUAGE Russian

/*
$mui.WelcomePage ;HWND странички риветствия
$mui.WelcomePage.Title ;HWND контрола титульного текста
$mui.WelcomePage.Text  ;HWND контрола текста под титулом
*/

Function WelcomePageShow
  SetCtlColors $mui.WelcomePage "" `0xFFD993`
  CreateFont $1 "Verdana" "14" "700" /ITALIC ; создаем шрифт
  SendMessage $mui.WelcomePage.Title ${WM_SETFONT} $1 1 ; применяем шрифт к титулу
  SetCtlColors $mui.WelcomePage.Title `0xC0C0C0` `0xFFD993`
  SetCtlColors $mui.WelcomePage.Text `0x8080FF` `0xFFD993`
FunctionEnd

Section Main
SectionEnd


wolkow70 09-03-2011 12:22 1630601

Товарищи, помогите конвертнуть в NSIS значения реестра:


[HKEY_CURRENT_USER\Software\Classes\Directory\shell\treesize_fs]
@="TreeSize Professional &File Search"

[HKEY_CURRENT_USER\Software\Classes\Directory\shell\treesize_fs\command]
@="\"E:\\Program Files\\JAM Software\\TreeSize Professional\\TreeSize.exe\" /SEARCH /TABS 5 \"%1\""

[HKEY_CURRENT_USER\Software\Classes\Folder\shell\treesize5]
@="TreeSize Professional &5"

[HKEY_CURRENT_USER\Software\Classes\Folder\shell\treesize5\command]
@="\"E:\\Program Files\\JAM Software\\TreeSize Professional\\TreeSize.exe\" /CONTEXT \"%1\""

Reg2Nsis не помогает. Выдает такое:

WriteRegStr HKEY_CURRENT_USER "Software\Classes\Directory\shell\treesize_fs" "" "TreeSize Professional &File Search"
WriteRegStr HKEY_CURRENT_USER "Software\Classes\Directory\shell\treesize_fs\command" "" "\$\"$PROGRAMFILES\JAM Software\TreeSize Professional\TreeSize.exe\$\" /SEARCH /TABS 5 \$\"%1\$\""
WriteRegStr HKEY_CURRENT_USER "Software\Classes\Folder\shell\treesize5" "" "TreeSize Professional &5"
WriteRegStr HKEY_CURRENT_USER "Software\Classes\Folder\shell\treesize5\command" "" "\$\"$PROGRAMFILES\JAM Software\TreeSize Professional\TreeSize.exe\$\" /CONTEXT \$\"%1\$\""

Что то с путями путает. Короче там в реестре лишняя / получается перед буквой диска. В этом видимо проблема... Пункты контекстного меню не запускают программу.

kotkovets 09-03-2011 15:26 1630721

Цитата:

Цитата wolkow70
Товарищи, помогите конвертнуть в NSIS значения реестра: »

Из справки:
Код:

WriteRegStr [root_key] [subkey] [key_name] [value]
Записывает строку value в параметр key_name раздела subkey ветки root_key

читать дальше »
Код:

WriteRegStr HKCU "Software\Classes\Directory\shell\treesize_fs" "" "TreeSize Professional &File Search"
WriteRegStr HKCU "Software\Classes\Directory\shell\treesize_fs\command" "" '"$PROGRAMFILES\JAM Software\TreeSize Professional\TreeSize.exe" /SEARCH /TABS 5 "%1"'
WriteRegStr HKCU "Software\Classes\Folder\shell\treesize5" "" "TreeSize Professional &5"
WriteRegStr HKCU "Software\Classes\Folder\shell\treesize5\command" "" '"$PROGRAMFILES\JAM Software\TreeSize Professional\TreeSize.exe" /CONTEXT "%1"'


zmeykas 09-03-2011 15:46 1630740

Следующая проблема. Как покрасить текст в чекбоксе на FinishPage?

Вот так не выходит:
Код:

Function FinishPageSetupShow
 SetCtlColors $mui.FinishPage.Title `0xFFFFFF` transparent
 SetCtlColors $mui.FinishPage.Text `0xFFFFFF` transparent
 SetCtlColors $mui.FinishPage.Run `0xFFFFFF` transparent
FunctionEnd

Текст не красится вообще. А фон вместо прозрачного становится черным. Если transparent заменить на `0xCCCCCC` к примеру, то фон станет серым. Но вопрос именно в цвете текста.

kotkovets 09-03-2011 15:58 1630750

Цитата:

Цитата zmeykas
Как покрасить текст в чекбоксе »

Не получится, рисуется через API и зависит о темы оформления WINDOWS
А вот при классической теме WINDOWS - раскрашивается.
Это то же касается в частности и GroupBox

zmeykas 09-03-2011 16:40 1630794

Код:

CreateShortcut "$SMPROGRAMS\$StartMenuGroup\MyProg.lnk" $INSTDIR\MyProg.exe
Ссылка на файл создается отлично, но параметр "Рабочая папка" для ярлыка устанавливается из пути "$SMPROGRAMS\$StartMenuGroup\". Как это изменить? Для моей программы обязательно необходимо, чтоб рабочая папка была "$INSTDIR", да и по логике вещей это куда правильней.

------------------------
Извиняюсь за беспокойство, оказалось просто SetOutPath надо на "$INSTDIR" установить.

wolkow70 10-03-2011 06:51 1631186

Ребята, разбираюсь с регистрацией и разрегистрацией DLL при удалении, подскажите пожалуйста конкретное значение таких макросов:

!insertmacro InstallLib REGDLL NOTSHARED REBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib REGDLL NOTSHARED NOREBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib REGDLL NOTSHARED REBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib REGDLL NOTSHARED NOREBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR

и соответственно:

!insertmacro UninstallLib REGDLL NOTSHARED NOREMOVE $INSTDIR\test.dll
!insertmacro UninstallLib REGDLL NOTSHARED REBOOT_PROTECTED $INSTDIR\test.dll
!insertmacro UninstallLib REGDLL NOTSHARED NOREBOOT_PROTECTED $INSTDIR\test.dll
!insertmacro UninstallLib REGDLL NOTSHARED REBOOT_NOTPROTECTED $INSTDIR\test.dll
!insertmacro UninstallLib REGDLL NOTSHARED NOREBOOT_NOTPROTECTED $INSTDIR\test.dll

kotkovets 10-03-2011 14:16 1631543

NOREMOVE
· библиотеку нельзя удалить. Используется для общих или важных системных файлов, таких как Visual Basic/C ++/MFC runtimes.
REBOOT_PROTECTED
· Удаляет библиотеку при перезагрузке, когда она использутся программой (требуется для системных файлов).
· Удаляет библиотеку, если файл не защищен Windows File Protection (для ХР)
NOREBOOT_PROTECTED
· Предупреждает пользователя, когда библиотека используется.
· Удаляет библиотеку, если файл не защищен Windows File Protection.
REBOOT_NOTPROTECTED
· Удаляет библиотеку при перезагрузке (требуется для системных файлов).
· Удаляет библиотеку без проверки Windows File Protection. (для ХР)
NOREBOOT_NOTPROTECTED
· Предупреждает пользователя, когда библиотека используется.
· Удаляет библиотеку без проверки Windows File Protection. (для ХР)
NOTSHARED -библиотека не общая, удаляется сразу
SHARED -библиотека общедоступна и будет удалена, если счетчик обращений равен 0
т.ь есть при каждой установке библиотеки счетчик обращений увеличивается на единицу,
при удалении уменьшается на единицу.

wolkow70 13-03-2011 15:10 1633860

Собираю инсталлятор, не отрабатывает комманда в секции деинсталляции:

RMDir /r "$INSTDIR"

хотя все файлы из папки удаляются без проблем.

Вариант RMDir /REBOOTOK "$INSTDIR" работает. Но ведь нет никаких занятых файлов.
Реестр тоже чистый. Не подскажите в чем может быть дело?

kotkovets 13-03-2011 16:14 1633905

wolkow70,
Откуда деинсталлятор запускается? Деинсталятор помещает в $INSTDIR - текущий путь, откуда запущен деинсталлятор. Так что, сейчас проверил - все работает.
Проблема может еще быть в проводнике - не выгружена из буфера какая-нибудь библиотека, используемая ранее. Это все равно, что пытаться удалить текущую открытую папку. Попробуйте перезагрузить оболочку.

wolkow70 13-03-2011 17:48 1633971

Вложений: 1
Деинсталятор запускается из $INSTDIR. Если какие нибудь библиотеки используются, то они не удаляются из папки, а у меня все файлы удаляются. Папка The Bat! остается совершенно пустой, но не удаляется. Пока сделал вариант RMDir /REBOOTOK "$INSTDIR". Работает, но папка удаляется после перезагрузки.
Вот скрипт прикрепил, если, что...

kotkovets 13-03-2011 21:11 1634103

wolkow70,
и правильно, что не удаляет! Я же писал:
Цитата:

Цитата kotkovets
Деинсталятор помещает в $INSTDIR - текущий путь, откуда запущен деинсталлятор »

SetOutPath "$INSTDIR" - совершенно не нужно в деинсталляторе. (Указывает на текущую директорию - примерно тоже самое, что вы открыли папку проводником и ее же пытаетесь удалить)
Достаточно: RMdir /r "$INSTDIR" без всяких Delete...
И если вы делаете ассоциации в скрипте, то для обновления кеша иконок следует прописать макрос в секции:
${RefreshShellIcons}

wolkow70 14-03-2011 13:33 1634546

kotkovets,

SetOutPath "$INSTDIR" удалил из секции деинсталляции. Все стало нормально удалятся без перезагрузки.
${RefreshShellIcons} случайно попало в скрипт, удалил.
На днях выложу инсталлятор для общего блага в соответствующей теме..
Работает безукоризненно.

Sauron3 14-03-2011 15:08 1634634

Доброго времени суток! Проблема в следующем: создается NSISый инсталлятор , необходимо чтобы через меню пуск можно было по ярлыку открыть папку в INSTDIR. Т.е. если мне необходмо в пуске сделать ссылку на exe-шный файл я прописываю следующее:
CreateDirectory "$SMPROGRAMS\Документация"
CreateShortCut "$SMPROGRAMS\Документация\Руководство пользователя Word 2003.lnk" "$INSTDIR\doc\manual.doc"
Как сделать что бы открывалась отдельно взятая папка, а не файл?
Заранее спасибо!

kotkovets 14-03-2011 16:42 1634713

Цитата:

Цитата Sauron3
открыть папку в $INSTDIR »

CreateShortCut "$SMPROGRAMS\Документация\Руководство пользователя Word 2003.lnk" "$INSTDIR\doc"

Sauron3 15-03-2011 09:11 1635169

Цитата:

Цитата kotkovets
CreateShortCut "$SMPROGRAMS\Документация\Руководство пользователя Word 2003.lnk" "$INSTDIR\doc" »

При такой записи, при попытке открыть папку пишет что не найден ярлык

kotkovets 15-03-2011 12:50 1635331

Цитата:

Цитата Sauron3
При такой записи, при попытке открыть папку пишет что не найден ярлык »

Это как понять? и кто говорит?
все работает, создается ярлык, кликаешь ярлык - открывается папка
Код:

OutFile File.exe

Section ""
  CreateShortCut "$DESKTOP\NSIS_DOCS.lnk" "${NSISDIR}\docs"
  ;или открыть папку
  ExecShell open "${NSISDIR}\docs"
SectionEnd


Sauron3 16-03-2011 14:44 1636221

Спасибо! Все получилось!

wolkow70 22-03-2011 11:05 1640795

Товарищи, подскажите пожалуйста как к следующей строке приклеить свою иконку Core.ico (находится в одной директории с файлом CoreAVCDecoder.ax), а то встроенная в него иконка не радует глаз.

CreateShortCut "$SMPROGRAMS\CoreCodec\CoreAVC Configure.lnk" rundll32.exe "CoreAVCDecoder.ax,Configure" "$INSTDIR\CoreAVC Professional Edition\CoreAVCDecoder.ax"

kotkovets 22-03-2011 12:29 1640894

Код:

CreateShortCut "$SMPROGRAMS\My Program.lnk" "$INSTDIR\My Program.exe" \
"some command line parameters" "$INSTDIR\My Program.exe" "2" "SW_SHOWNORMAL" \
"ALT|CONTROL|SHIFT|F5" "description"

CreateShortCut "имя ярлыка" "ссылка на файл" "параметры запуска, ключи" "файл - откуда брать иконку" "индекс иконки" "тип запуска (скрытно, на весь экран)" "горячая клавиша" "описание ярлыка"
1 Параметры которые не нужны пишем пустые кавычки ""
2 Индекс иконки, считается не от цифры и названия иконки в файле, а от единицы .
Как то так :
Код:

 
CreateShortCut "$DESKTOP\shell.lnk" "$WINDIR\explorer.exe" "" "$SYSDIR\shell32.dll" "4" "" "" "Вид ярлыка - папочка )))"


wolkow70 23-03-2011 09:21 1641663

Товарищи никому не доводилось делать инсталлятор на VLC media player?
Скачал с ихнего сайта скрипт. Там по умолчанию выбрана ассоциация с типами файлов. Вот, ломаю голову как отключить ассоциации по умолчанию, что бы чекбоксы были пустые.
Пробовал в секции:
SectionGroup "File type associations" SEC06
SectionGroup "Audio Files"
!insertmacro MacroAudioExtensions RegisterExtensionSection
SectionGroupEnd
SectionGroup "Video Files"
!insertmacro MacroVideoExtensions RegisterExtensionSection
SectionGroupEnd
SectionGroup "Other"
!insertmacro MacroOtherExtensions RegisterExtensionSection
SectionGroupEnd
SectionGroupEnd

ставить /0 - не помогает.

kotkovets 23-03-2011 09:42 1641675

Цитата:

Цитата wolkow70
ставить /0 - не помогает »

так не нолик надо писать, а букву o - причем английскую

wolkow70 23-03-2011 10:24 1641707

Вложений: 1
Цитата:

Цитата kotkovets
так не нолик надо писать, а букву o - причем английскую »

SectionGroup /o "File type associations" SEC06
SectionGroup /o "Audio Files"
!insertmacro MacroAudioExtensions RegisterExtensionSection
SectionGroupEnd
SectionGroup /o "Video Files"
!insertmacro MacroVideoExtensions RegisterExtensionSection
SectionGroupEnd
SectionGroup /o "Other"
!insertmacro MacroOtherExtensions RegisterExtensionSection
SectionGroupEnd
SectionGroupEnd


Не помогает.
Выходит так:

kotkovets 23-03-2011 10:44 1641731

А кто в группе ставит /o в справке такого нет, в макросе нужно писать, скрипт дурацкий и устарелый, проще новый написать, чем копаться..
Код:

!macro RegisterExtensionSection EXT
  Section /o ${EXT}
    SectionIn 1 3
    Push $R0
    StrCpy $R0 ${EXT}
    Call RegisterExtension
    Pop $R0
  SectionEnd
!macroend


wolkow70 23-03-2011 10:58 1641744

Вложений: 1
Цитата:

Цитата kotkovets
!macro RegisterExtensionSection EXT
Section /o ${EXT}
SectionIn 1 3
Push $R0
StrCpy $R0 ${EXT}
Call RegisterExtension
Pop $R0
SectionEnd
!macroend »

Да, так сработало. Спасибо. А скрипт официальный, хоть и старый с сайта.

martinello 25-03-2011 00:05 1643297

Доброго времени суток!

При создании аддона с помощью NSIS возникла необходимость читать значения ключа из реестра по "плавающему" пути.
Значение ключа KEY лежит в HKEY_LOCAL_MACHINE\Software\Alter\ВЕРСИЯ\Prog . где "ВЕРСИЯ" - версия программы, которая
может быть любой и постоянно меняется... Как в этом случае можно считать значение ключа KEY?

Заранее спасибо.

kotkovets 25-03-2011 00:18 1643302

martinello
Только в цикле с перечислением ключей и значений выбранной ветки реестра EnumRegKey или EnumRegValue
И кстати приведите несколько значений "ВЕРСИЯ" что-то должно совпадать.
либо в начале или в конце строки, что-то общее должно быть и дальше методом сравнения общего, прочитать значение ключа.
Как то так...

martinello 25-03-2011 09:40 1643410

kotkovets
Примеры ВЕРСИЯ: 10.0, 10.4, 11.8, 12.3, 13.0, 14.7 и т.д. Из общего тут, вроде только точка в третьем разряде. Версий уже слишком много вышло, да и выйдет еще множество, поэтому просто завязываться на конкретное поле - не самый лучший вариант. Все ведь не перечислишь. И для будущих версий тоже должно работать... Вот и ломаю голову.

kotkovets 25-03-2011 14:35 1643648

Цитата:

Цитата martinello
Все ведь не перечислишь »

Может быть, но кое-что все же, можно сделать.
По сути значения "версия" состоит из 3 цифр и четырех символов.
1. Натравливаем в цикле с перечислением, фильтр, который отсекает все значения, кроме числовых.
2. Проверяем длину строк на 4 символа, все остальное отсекаем.
3. У нас уже есть путь к ветке реестра, можем уже считывать ключи реестра
Недостаток в том, если есть еще ветки удовлетворяющим условиям, то будут ложные данные считаны
И довольно все это сложно перемудрено не туда...
Код:

!include "MUI2.nsh"
!include "WordFunc.nsh"

!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

OutFile "StrDo.exe"
ShowInstDetails show

Section
 ${Do}
    ;перечисляем разделы в ветке After (разделы в $1)
    EnumRegKey $1 HKLM "SOFTWARE\After" $0
    IntOp $0 $0 + 1
    ${StrFilter} "$1" "1" "." "" "$2" ;фильтр: только цифры и точка в $2
    StrLen $3 $2 ;вычисляем длину строки в $3
    ${IfNot} $2 == "" ; оператор If с условием, если $2 не равно пустому значению
    ${AndIf} $3 = 4  ; логика И (если $2 не равно пустому значению И длина строки $3 = 4)
          DetailPrint "найденный раздел: $1"
          ReadRegStr $4 HKLM "SOFTWARE\After\$1\Prog" "Key" ;теперь можно считывать значения ключеей (к примеру: Key)
          DetailPrint `Значение ключа [ Key ] - "$4"`
        ${Break} ;выход из цикла
  ${EndIf}
 ${LoopUntil} $1 == ""
SectionEnd


martinello 25-03-2011 17:12 1643759

Цитата:

Цитата kotkovets
И довольно все это сложно перемудрено не туда... »

Это верно...
Решил проблему с помощью плагина Registry для NSIS http://nsis.sourceforge.net/Registry_plug-in
В итоге открываю ветку для поиска HKEY_LOCAL_MACHINE\Software\Alter и ищу в ней тот самый KEY.
Спасибо за код, он пригодится как пример для похожих подзадач :)

martinello 27-03-2011 13:23 1644909

Доброго времени суток!

Кто-нибудь знает, есть ли возможность изменения текста на начальной странице удаления MUI_UNPAGE_WELCOME
и на конечной странице удаления MUI_UNPAGE_FINISH ?
В справке об этом молчок... Упоминается почему-то только страница подтверждения MUI_UNPAGE_CONFIRM.
Правда, есть еще UninstallText, но его включение никаким образом не влияет ни на одну надпись (или я не так им пользуюсь).

Заранее спасибо.

kotkovets 27-03-2011 14:39 1644941

Цитата:

Цитата martinello
Кто-нибудь знает, есть ли возможность изменения текста на начальной странице удаления MUI_UNPAGE_WELCOME »

Достаточно соответствующие хедеры посмотреть. Для MUI2 [Welcome.nsh] - одинаково и для MUI [System.nsh] :
!define MUI_UNTEXT_WELCOME_INFO_TITLE "Всем привет!"
!define MUI_UNTEXT_WELCOME_INFO_TEXT "Это моя супер прога!"
UninstallText text [subtext] - применяется при классическом фейсе, на страничке confirm page, на модерне напрямую эта команда игнорируется, потому что "заменена" константами !define
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
В NSIS нет стандартных страничек приветствия и завершения. Эти странички "самодельные" и прорисовываются через nsDialogs - для MUI2, и через InstallOptions - для MUI, при классике выбрать можно любой из этих стандартных плагинов в комлекте NSIS

martinello 27-03-2011 18:14 1645075

Цитата:

Цитата kotkovets
Достаточно соответствующие хедеры посмотреть. Для MUI2 [Welcome.nsh] - одинаково и для MUI [System.nsh] : »

Спасибо огромное за помощь! :) Про хедеры совсем из головы вылетело...

Столкнулся с другой проблемой. Нужно в текстовом файле искать строки, добавлять, удалять.
Если с поиском и вставкой проблем нет, то вот полностью удалить строку не получается - после
удаления в файле на этом месте образуется пустой абзац (строка без символов).
Делал через ${LineFind} и ${WordReplace}.
Как можно полностью удалить найденную строчку?..

kotkovets 27-03-2011 20:03 1645122

martinello
В NSIS пустая строка означает: $\r$\n
$\n - создание новой строки
$\r - перевод каретки на начало строки
$\t - знак табуляции
Те самые невидимые символы строки. Через макрос ${LineFind} вот так будет это выглядеть:
Код:


${WordReplace} '$R9' 'Строка' '' "+" '$R9'
${Select} "$R9"
  ${Case3} "$\r$\n" "$\r" "$\n"
      ${WordReplace} '$R9' '$R9' '' "+" '$R9'
  ${CaseElse}
${EndSelect}

Так как идет построчное чтение файла, то пустые строки удалятся, кроме последней (особо то и не нужно)
Макрос ${WordReplace} вложен в логику, для того, чтобы текст не превратился в одну строчку :)

punsh 28-03-2011 15:12 1645657

кто подскажет, как правильно написать в скрипте такую команду "bin\javaw.exe -jar JDownloader.jar"

kotkovets 28-03-2011 15:49 1645682

Цитата:

Цитата punsh
кто подскажет, как правильно написать в скрипте такую команду "bin\javaw.exe -jar JDownloader.jar" »

подробней где и как, зачем?

punsh 28-03-2011 15:54 1645688

Цитата:

Цитата kotkovets
подробней где и как, зачем? »

для лаунчера, как в PortableApps

нужно запустить JDownloader.exe, если уже есть в папке java !

kotkovets 28-03-2011 16:07 1645700

Можно так:
ExecWait '"$EXEDIR\bin\javaw.exe" -jar JDownloader.jar'
или так
nsExec::Exec '"$EXEDIR\bin\javaw.exe" -jar JDownloader.jar'
$EXEDIR - возвращает текущий путь "иницилизатора" запуска

punsh 28-03-2011 22:59 1646043

Цитата:

Цитата kotkovets
Можно так: »

что-то не хочет((

wolkow70 03-04-2011 08:24 1649839

ТОварищи подскажите ответ на такой вопрос: Программа в данном случае Firefox в каждой конфигурации создает папку для профиля со случайным названием XXXXXX.defolt.

Можно ли для скрипта присвоить этой папке переменное имя после проверки наличия в ней маркерного файла Extension.ini, и в дальнейшем использовать уже переменное название?

kotkovets 03-04-2011 12:23 1649944

Цитата:

Цитата wolkow70
Можно ли для скрипта присвоить этой папке переменное имя »

Элементарно! в справке все это есть - наберите по индексу Locate - есть пример.
К примеру предположительно Extension.ini лежит в папке C:\Firefox, где в этой папке еще папки с неизвестными именами.
Скрипт рекурсивно перерыщет все каталоги папке C:\Firefox, пока не найдет нужный файл. Если файл не найдет - установится флаг ошибки (в скрипте не будет сообщения)
Код:

!include "FileFunc.nsh"
ShowInstDetails show
outfile test.exe

Section
  ${Locate} "C:\Firefox" "/L=FDE /M=Extension.ini" "Find"
  IfErrors +2
  MessageBox MB_OK '$$R0 = "$R0" $\n$\r$$R1 = "$R1"' IDOK
SectionEnd

Function Find
        StrCpy $R0 $R8
        StrCpy $R1 $R9
        Push $0
FunctionEnd


wolkow70 03-04-2011 13:07 1649970

Цитата:

Цитата kotkovets
К примеру предположительно Extension.ini лежит в папке C:\Firefox »

Проблема в том, что сам Extension.ini лежит в папке со случайным названием "c0rkpcd2.default"
И как к этому файлу и этой папке указать путь, если абсолютный путь:

E:\Documents and Settings\Anton.OOO-940B41D8143\Application Data\Mozilla\Firefox\Profiles\c0rkpcd2.default

kotkovets 03-04-2011 13:11 1649974

wolkow70
Код:

!include "FileFunc.nsh"
ShowInstDetails show
outfile test.exe

var path
Section
SetShellVarContext all  #папка документы для всех пользователей
${GetParent} "$DOCUMENTS" $R2
${GetParent} $R2 $path
MessageBox MB_OK "$path" IDOK
  ${Locate} "$path" "/L=FDE /M=Extension.ini" "Find"
  IfErrors +2
  MessageBox MB_OK '$$R0 = "$R0" $\n$\r$$R1 = "$R1"' IDOK
SectionEnd

Function Find
        StrCpy $R0 $R8
        StrCpy $R1 $R9
        Push $0
FunctionEnd


wolkow70 03-04-2011 13:25 1649981

Цитата:

Цитата kotkovets
SetShellVarContext all #папка документы для всех пользователей
${GetParent} "$DOCUMENTS" $R2
${GetParent} "$R2" $R2
MessageBox MB_OK "$R2" IDOK
${Locate} "$R2" "/L=FDE /M=Extension.ini" "Find" »

То есть папка c0rkpcd2.default получит переменное значение "$R2", если в ней найден файл Extension.ini ?
Мне в этот файл нужно автоматом прописать строки с путями к новым плагинам. Но это я уже научился делать используя абсолютный путь.

kotkovets 03-04-2011 13:30 1649985

Цитата:

Цитата wolkow70
То есть папка c0rkpcd2.default получит переменное значение "$R2", если в ней найден файл Extension.ini ? »

${GetParent} "$DOCUMENTS" $R2
${GetParent} $R2 $path
Мы подымаемся на 2 уровня вверх и получаем корневую папку, где будет Extension.ini

wolkow70 03-04-2011 17:41 1650186

kotkovets,
В общем то, работает, но возникли еще вопросы, на которые хотелось бы получить ответы:
1. Я делаю установщик, что бы работал с ключом /S, а в процессе выводятся два диалоговых окна, как бы их блокировать?
2. Папка с профилем находится в папке текущего пользователя, если я указал

var path
Section
SetShellVarContext current
${GetParent} "$APPDATA" $R2
${GetParent} $R2 $path
MessageBox MB_OK "$path" IDOK
${Locate} "$path" "/L=FDE /M=extensions.ini" "Find"
IfErrors +2
MessageBox MB_OK '$$R0 = "$R0" $\n$\r$$R1 = "$R1"' IDOK
SectionEnd

то ничего страшного?
3. Имея абсолютный путь E:\Documents and Settings\Anton.OOO-940B41D8143\Application Data\Mozilla\Firefox\Profiles\c0rkpcd2.default

можно ли отчет уровней начать с папки Firefox, а то впапке Mozilla еще может оказаться почтовый клиент, у которого тоже есть файл extensions.ini?

kotkovets 03-04-2011 22:21 1650362

Цитата:

Цитата wolkow70
Я делаю установщик, что бы работал с ключом /S, а в процессе выводятся два диалоговых окна, как бы их блокировать? »

а кто не дает мессаги убрать? я же в качестве примера привел, наглядное отображение переменных
Зачем так этому прямолобно относится? при отладке скрипта это очень помогает и вообще я если пишу скрипт, то отлаживаю кусок кода на отладочном скрипте, когда все нормуль - добавляю в основной проект, иначе как?. Чтобы нормально написать скрипт или прогу - надо жестко пахать, а разбираться никто не хочет, что и как, вот отсюда и такие вопросы....
Цитата:

Цитата wolkow70
можно ли отчет уровней начать с папки Firefox, а то впапке Mozilla еще может оказаться почтовый клиент, у которого тоже есть файл extensions.ini? »

естественно, вы же заказываете музыку, вам нужно в первую очередь определить с какого места начать поиск
в данном случае, если папка Anton.OOO-940B41D8143, означает имя текущего пользователя, то можно так:
MessageBox MB_OK "$APPDATA\Mozilla\Firefox" если попадает путь в вашем случае на E:\Documents and Settings\Anton.OOO-940B41D8143\Application Data\Mozilla\Firefox\Profiles\c0rkpcd2.default , зачем путь вверх подымать? вот вы увидите куда вы попадете в сообщении, а SetShellVarContext current - (по умолчанию) всегда перенаправляет в папку настроек текущего пользователя. Если иначе поиск нужно начинать с Documents and Settings - писал уже в предыдущих в своих сообщениях, ведь в NSIS нет прямой переменной на папку Documents and Settings, приходится использовать $DOCUMENTS c поднятием на 2 уровня вверх.

wolkow70 04-04-2011 09:00 1650539

kotkovets,

Не подскажите, что означает ошибка в конце:
install function "GetParent" not referenced
Хотя, инсталлятор собирается и работает.
Сделал так:
var path
Section "Интеграция в браузер Firefox" sec07
SetShellVarContext current
${GetParent} "$APPDATA\Mozilla\Firefox\Profiles" $path
MessageBox MB_OK "$path" IDOK
${Locate} "$path" "/L=FDE /M=extensions.ini" "Find"
IfErrors +2
MessageBox MB_OK '$$R0 = "$R0" $\n$\r$$R1 = "$R1"' IDOK
CreateDirectory "$R0\extensions"
SetOutPath "$R0\extensions"
Push "$PROGRAMFILES\Orbitdownloader\addons\OneClickYouTubeDownloader$\r$\n"
Push "$R0\extensions\{35379F86-8CCB-4724-AE33-4278DE266C70}"
Call WriteToFile
SectionEnd

kotkovets 04-04-2011 09:18 1650551

Цитата:

Цитата wolkow70
install function "GetParent" not referenced »

${GetParent} "$APPDATA\Mozilla\Firefox\Profiles" $path - зачем ?
проще же так сразу:
${Locate} "$APPDATA\Mozilla\Firefox"...

wolkow70 05-04-2011 07:32 1651281

Ребята, помогите опять..
делаю инсталлятор XnView из скрипта hb860 вытянул такие строки. Собрал установщик, а ассоциации с файлами так и не происходят, они остаются за ACDSee.
В чем может быть дело?
Section "Ассоциация файлов" Sec06
;
!macro RegisterExtension extenstion ContentType PerceivedType ClassName DefaultIcon OpenCommand
WriteRegStr HKCR "${extenstion}" "" "${ClassName}"
WriteRegStr HKCR "${extenstion}" "PerceivedType" "${PerceivedType}"
WriteRegStr HKCR "${extenstion}" "Content Type" "${ContentType}"
WriteRegStr HKCR "${ClassName}\DefaultIcon" "" "${DefaultIcon}"
WriteRegStr HKCR "${ClassName}\shell\open\command" "" "${OpenCommand}"
!macroend
var /GLOBAL OpenCommand
StrCpy $OpenCommand "$\"$OUTDIR\${PRODUCT_NAME}.exe$\" $\"%1$\""
!insertmacro RegisterExtension ".jpg" "image/jpeg" "image" "XnView.jpg" "$OUTDIR\${PRODUCT_NAME}.exe,2" $OpenCommand
!insertmacro RegisterExtension ".bmp" "image/bmp" "image" "XnView.bmp" "$OUTDIR\${PRODUCT_NAME}.exe,2" $OpenCommand
!insertmacro RegisterExtension ".gif" "image/gif" "image" "XnView.gif" "$OUTDIR\${PRODUCT_NAME}.exe,3" $OpenCommand
!insertmacro RegisterExtension ".iff" "image/iff" "image" "XnView.iff" "$OUTDIR\${PRODUCT_NAME}.exe,4" $OpenCommand
!insertmacro RegisterExtension ".jpe" "image/jpeg" "image" "XnView.jpeg" "$OUTDIR\${PRODUCT_NAME}.exe,5" $OpenCommand
!insertmacro RegisterExtension ".jpeg" "image/jpeg" "image" "XnView.jpeg" "$OUTDIR\${PRODUCT_NAME}.exe,5" $OpenCommand
!insertmacro RegisterExtension ".jpg" "image/jpeg" "image" "XnView.jpeg" "$OUTDIR\${PRODUCT_NAME}.exe,5" $OpenCommand
!insertmacro RegisterExtension ".pcx" "image/pcx" "image" "XnView.pcx" "$OUTDIR\${PRODUCT_NAME}.exe,7" $OpenCommand
!insertmacro RegisterExtension ".png" "image/png" "image" "XnView.png" "$OUTDIR\${PRODUCT_NAME}.exe,8" $OpenCommand
!insertmacro RegisterExtension ".tga" "image/tga" "image" "XnView.tga" "$OUTDIR\${PRODUCT_NAME}.exe,9" $OpenCommand
!insertmacro RegisterExtension ".tif" "image/tif" "image" "XnView.tif" "$OUTDIR\${PRODUCT_NAME}.exe,10" $OpenCommand
!insertmacro RegisterExtension ".emf" "image/emf" "image" "XnView.emf" "$OUTDIR\${PRODUCT_NAME}.exe,11" $OpenCommand
!insertmacro RegisterExtension ".wmf" "image/wmf" "image" "XnView.wmf" "$OUTDIR\${PRODUCT_NAME}.exe,12" $OpenCommand
!insertmacro RegisterExtension ".pic" "image/pic" "image" "XnView.Image" "$OUTDIR\${PRODUCT_NAME}.exe,1" $OpenCommand
!insertmacro RegisterExtension ".dib" "image/dib" "image" "XnView.Image" "$OUTDIR\${PRODUCT_NAME}.exe,1" $OpenCommand
WriteRegStr HKCR "Applications\xnview.exe\shell\open\command" "" $OpenCommand
${RefreshShellIcons}
SectionEnd

kotkovets 05-04-2011 11:48 1651412

wolkow70,
А справка для чего? где это вы видели, чтобы макрокоманды в секции прописывались, если уж вытянули чужой макрос - вера, что ли не позволяет посмотреть скрипт, где и в каком месте макросы нарисованы и как они работают? и для чего они нужны то?
Примерно можно упрощенно сделать вот так:
Код:

!include "FileFunc.nsh"

!define Register "!insertmacro RegisterExtension"
!macro RegisterExtension extenstion ClassName DefaultIcon OpenCommand
  WriteRegStr HKLM "SOFTWARE\Classes\${extenstion}" "" "${ClassName}"
  WriteRegStr HKLM "SOFTWARE\Classes\${ClassName}\DefaultIcon" "" "${DefaultIcon}"
  WriteRegStr HKLM "SOFTWARE\Classes\${ClassName}\shell\open\command" "" "${OpenCommand}"
!macroend

Section Main
 SetOutPath "$INSTDIR\XnView" #помещает путь распаковки в $OUTDIR
${Register} ".bmp" "XnView.bmp" "$OUTDIR\XnView.exe,2" "$\"$OUTDIR\XnView.exe$\" $\"%1$\""
#---#
${RefreshShellIcons}
SectionEnd
/*
  получается в макросе вот такая запись структуры:
  WriteRegStr HKLM "SOFTWARE\Classes\.bmp" "" "XnView.bmp"
  WriteRegStr HKLM "SOFTWARE\Classes\XnView.bmp\DefaultIcon" "" "$OUTDIR\XnView.exe,2"
  WriteRegStr HKLM "SOFTWARE\Classes\.bmp\shell\open\command" "" "$\"$OUTDIR\XnView.exe$\" $\"%1$\""
*/


XCV 05-04-2011 12:01 1651420

может кто встречал конвертор cmd файлов в nsis скрипт, поделитесь пожалуйста....

wolkow70 05-04-2011 17:45 1651626

Цитата:

Цитата kotkovets
А справка для чего? »

Я справку читаю, правда многое там не понятно, потому как в английском не силен...
Учусь в основном на готовых скриптах.

wolkow70 05-04-2011 18:18 1651654

Цитата:

Цитата kotkovets
де это вы видели, чтобы макрокоманды в секции прописывались »

Переместил я макрос за пределы секции, ничего это не изменило.
Суть такова: Если графические файлы (bmp, jpg) не зарегистрированы ни за какой программой, то при установке они ассоциируются за XNView. Но, если их предварительно зарегистрировать за ACDSee или за программой просмотра изображений и факсов Windows, то при установке они остаются за ними и зарегистрированными, но не за XNView.

kotkovets 05-04-2011 21:27 1651771

wolkow70,
Справочник по NSIS там есть разбор ассоциаций реестра, предыдущий пример ассоциаций отлично работает, правда проверял на другом расширении файла, т.е для XNView может быть нужно подкорректировать записи, но макет таков и он работает иначе я бы не выкладывал не работающий пример, а готовое решение за Вами. посмотрите скрипт AIMP'а , там есть отличное решение для ассоциаций.
Цитата:

Цитата XCV
может кто встречал конвертор cmd файлов в nsis скрипт, поделитесь пожалуйста.... »

такого конвертера нет, но если есть голова и руки и знать, что cmd делает и плюс по надобности, пару вызовов API - то конвертер совершенно ник чему...

XCV 06-04-2011 10:22 1652047

Цитата:

Цитата kotkovets
такого конвертера нет, но если есть голова и руки и знать, что cmd делает и плюс по надобности, пару вызовов API - то конвертер совершенно ник чему... »

ну это как сказать, если Вы пишите скрипты 3-5 строчек и раз в месяц, то Вам ни к чему, а у меня возникает частенько желание переделать cmd файл (в котором 100-200 строк) в nsis скрипт и вот тут такой конвертер ох как нужен (лень - двигатель прогресса, а я очень ленивый =))

kotkovets 06-04-2011 12:23 1652155

Цитата:

Цитата XCV
лень - двигатель прогресса, а я очень ленивый »

Это я понял, что за cmd? что делает? я иногда батники скриптом NSIS делаю (через FileWrite) и запускаю скрытно, т.е батник создается в процессе работы установщика.
Возьмите Visual Studio или Delphi и сварганьте конвертер, если не лень конечно...:biggrin:

XCV 06-04-2011 18:51 1652416

Цитата:

Цитата kotkovets
Возьмите Visual Studio или Delphi и сварганьте конвертер, если не лень конечно... »

в том то и дело что лень, я думал может кто сделал уже такое до меня, тогда дабы не изобретать велосипед можно было бы воспользоватся чужими наработками =)
ЗЫ: инсталятор то тоже можно самому написать ;)

a--e 06-04-2011 23:22 1652597

Доброго вечера, уважаемые.
Прошу помощи в следующем вопросе:
имеются файлы с расширениями .tmp.patchFile и файл VPatch.dll
как реализовать функцию патченья при помощи данных файлов средствами zip2exe в классической оболочке с автоматическим поиском папки назначения?

За помощь буду очень благодарен и признателен. Заранее спасибо.

wolkow70 07-04-2011 09:21 1652786

Уважаемый kotkovets, подскажите почему не компилируется такая строка?

WriteRegBin HKEY_CLASSES_ROOT ".bmp\OpenWithProgids" "Paint.Picture"

Получена с помощью конвертера рег-файлов.....

kotkovets 07-04-2011 10:05 1652826

Цитата:

Цитата wolkow70
Получена с помощью конвертера рег-файлов..... »

Ну нельзя доверять полностью таким утилитам, у нее полно багов...
а запись бинарных данных записывается так:
WriteRegBin [root_key] [subkey] [key_name] [valuedata] т.е так выходит:
WriteRegBin HKLM "Software\My Company\My Software" "Binary Value" DEADBEEF01223211151
и к тому же записи такого типа полно в реестре, несложно посмотреь, но редактор бывает их сохраняет строковые значения как бинарные, утилитка это видит и делает по своему, как хозяин прописал...
В вашем случае. как то так: WriteRegStr HKCR ".bmp" "OpenWithProgids" "Paint.Picture"
Цитата:

Цитата a--e
как реализовать функцию патченья »

Вот пример, и патчить можно практически любой файл
пример

MKN 07-04-2011 10:44 1652868

И у меня вопрос по поводу записи бинарных значений в реестр.

Запись в реестр значения этого рабочего reg-файла :
Код:

[HKEY_CURRENT_USER\Software\ACD Systems\ACDSee Pro\40\en\Settings\Browser\BCGPDockManager--1]
"DockingCBAndSliders"=hex:00,00,00,00,0b,00,00,00,00,00,00,00,00,20,00,00,00,\
  00,00,00,ff,ff,ff,ff,ff,ff,ff,ff,00,00,00,00,00,00,00,00,04,00,00,00,04,00,\
  00,00,00,00,00,00,01,00,00,00,04,00,00,00,01,00,00,00,00,00,00,00,00,00,00,\
  00,88,56,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,01,00,00,00,\
  88,56,00,00,01,00,00,00,88,56,00,00,00,00,00,00,00,80,00,00,00,00,00,00,ff,\
  ff,ff,ff,ff,ff,ff,ff,00,00,00,00,00,00,00,00,04,00,00,00,04,00,00,00,00,00,\
  00,00,01,00,00,00,04,00,00,00,01,00,00,00,00,00,00,00,00,00,00,00,d8,07,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,01,00,00,00,d8,07,00,00,\
  01,00,00,00,d8,07,00,00,00,00,00,00,00,40,00,00,00,00,00,00,ff,ff,ff,ff,ff,\
  ff,ff,ff,b2,03,00,00,37,00,00,00,b6,03,00,00,b1,03,00,00,00,00,00,00,02,00,\
  00,10,04,00,00,00,01,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,ff,04,00,00,\
  00,d2,07,00,00,cf,07,00,00,d3,07,00,00,d7,07,00,00,ff,ff,02,00,14,00,43,41,\
  43,44,54,61,62,62,65,64,43,6f,6e,74,72,6f,6c,42,61,72,00,40,00,00,00,00,00,\
  00,bb,03,00,00,56,00,00,00,05,05,00,00,cd,03,00,00,b6,03,00,00,37,00,00,00,\
  00,05,00,00,b1,03,00,00,00,00,00,00,01,00,00,00,40,41,00,46,04,00,00,00,ff,\
  fe,ff,08,4f,00,72,00,67,00,61,00,6e,00,69,00,7a,00,65,00,00,00,00,00,d2,07,\
  00,00,01,00,00,00,ff,ff,ff,ff,ff,ff,ff,ff,ff,fe,ff,09,54,00,61,00,73,00,6b,\
  00,20,00,50,00,61,00,6e,00,65,00,00,00,00,00,cf,07,00,00,01,00,00,00,ff,ff,\
  ff,ff,ff,ff,ff,ff,ff,fe,ff,0a,50,00,72,00,6f,00,70,00,65,00,72,00,74,00,69,\
  00,65,00,73,00,00,00,00,00,d3,07,00,00,01,00,00,00,ff,ff,ff,ff,ff,ff,ff,ff,\
  ff,fe,ff,06,53,00,65,00,61,00,72,00,63,00,68,00,00,00,00,00,d7,07,00,00,01,\
  00,00,00,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,01,00,00,00,ff,ff,ff,ff,d2,07,00,00,01,00,00,\
  00,ff,ff,ff,ff,d2,07,00,00,00,00,00,00,00,10,00,00,01,00,00,00,ff,ff,ff,ff,\
  ff,ff,ff,ff,e2,00,00,00,37,00,00,00,e6,00,00,00,ae,03,00,00,01,00,00,00,02,\
  00,00,10,04,00,00,00,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,01,00,00,00,ff,ff,ff,ff,04,00,00,00,d1,07,00,00,d5,07,00,\
  00,cd,07,00,00,ce,07,00,00,01,80,00,10,00,00,01,00,00,00,05,00,00,00,56,00,\
  00,00,e7,00,00,00,12,02,00,00,00,00,00,00,37,00,00,00,e2,00,00,00,f3,01,00,\
  00,00,00,00,00,01,00,00,00,40,14,00,56,04,00,00,00,ff,fe,ff,07,46,00,6f,00,\
  6c,00,64,00,65,00,72,00,73,00,01,00,00,00,d1,07,00,00,01,00,00,00,ff,ff,ff,\
  ff,ff,ff,ff,ff,ff,fe,ff,08,43,00,61,00,6c,00,65,00,6e,00,64,00,61,00,72,00,\
  01,00,00,00,d5,07,00,00,01,00,00,00,ff,ff,ff,ff,ff,ff,ff,ff,ff,fe,ff,09,46,\
  00,61,00,76,00,6f,00,72,00,69,00,74,00,65,00,73,00,01,00,00,00,cd,07,00,00,\
  01,00,00,00,ff,ff,ff,ff,ff,ff,ff,ff,ff,fe,ff,0e,50,00,72,00,69,00,76,00,61,\
  00,74,00,65,00,20,00,46,00,6f,00,6c,00,64,00,65,00,72,00,00,00,00,00,ce,07,\
  00,00,01,00,00,00,ff,ff,ff,ff,ff,ff,ff,ff,00,00,00,00,00,00,00,00,d6,07,00,\
  00,01,00,00,00,00,00,00,00,01,00,00,00,01,00,00,00,ff,ff,ff,ff,00,00,00,00,\
  f3,01,00,00,e2,00,00,00,f7,01,00,00,01,00,00,00,01,00,00,10,04,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,02,00,\
  00,00,ff,ff,ff,ff,d1,07,00,00,d6,07,00,00,01,00,00,00,d6,07,00,00,01,00,00,\
  00,ff,ff,ff,ff,d1,07,00,00,00,00,00,00,00,80,00,00,00,00,00,00,ff,ff,ff,ff,\
  ff,ff,ff,ff,00,00,00,00,02,00,00,00,04,00,00,00,06,00,00,00,00,00,00,00,01,\
  00,00,00,04,00,00,00,01,00,00,00,00,00,00,00,00,00,00,00,d0,07,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,01,00,00,00,d0,07,00,00,01,00,00,\
  00,d0,07,00,00,00,00,00,00,00,00,00,00,00,00,00,00

необходимо реализовать посредством NSIS

Классический способ записи WriteRegBin [root_key] [subkey] [key_name] [valuedata] - почему то не срабатывает... Может значение слишком велико по объёму ?

Пробую Registry плагин :
Код:

Name "Bin"
OutFile testbin.exe

!include "Registry.nsh"

Section

${registry::StrToHex} "00,00,00,00,0b,00,00,00,00,00,00,00,00,20,00,00,00,\
  00,00,00,ff,ff,ff,ff,ff,ff,ff,ff,00,00,00,00,00,00,00,00,04,00,00,00,04,00,\
  00,00,00,00,00,00,01,00,00,00,04,00,00,00,01,00,00,00,00,00,00,00,00,00,00,\
  00,88,56,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,01,00,00,00,\
  88,56,00,00,01,00,00,00,88,56,00,00,00,00,00,00,00,80,00,00,00,00,00,00,ff,\
  ff,ff,ff,ff,ff,ff,ff,00,00,00,00,00,00,00,00,04,00,00,00,04,00,00,00,00,00,\
  00,00,01,00,00,00,04,00,00,00,01,00,00,00,00,00,00,00,00,00,00,00,d8,07,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,01,00,00,00,d8,07,00,00,\
  01,00,00,00,d8,07,00,00,00,00,00,00,00,40,00,00,00,00,00,00,ff,ff,ff,ff,ff,\
  ff,ff,ff,b2,03,00,00,37,00,00,00,b6,03,00,00,b1,03,00,00,00,00,00,00,02,00,\
  00,10,04,00,00,00,01,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,ff,04,00,00,\
  00,d2,07,00,00,cf,07,00,00,d3,07,00,00,d7,07,00,00,ff,ff,02,00,14,00,43,41,\
  43,44,54,61,62,62,65,64,43,6f,6e,74,72,6f,6c,42,61,72,00,40,00,00,00,00,00,\
  00,bb,03,00,00,56,00,00,00,05,05,00,00,cd,03,00,00,b6,03,00,00,37,00,00,00,\
  00,05,00,00,b1,03,00,00,00,00,00,00,01,00,00,00,40,41,00,46,04,00,00,00,ff,\
  fe,ff,08,4f,00,72,00,67,00,61,00,6e,00,69,00,7a,00,65,00,00,00,00,00,d2,07,\
  00,00,01,00,00,00,ff,ff,ff,ff,ff,ff,ff,ff,ff,fe,ff,09,54,00,61,00,73,00,6b,\
  00,20,00,50,00,61,00,6e,00,65,00,00,00,00,00,cf,07,00,00,01,00,00,00,ff,ff,\
  ff,ff,ff,ff,ff,ff,ff,fe,ff,0a,50,00,72,00,6f,00,70,00,65,00,72,00,74,00,69,\
  00,65,00,73,00,00,00,00,00,d3,07,00,00,01,00,00,00,ff,ff,ff,ff,ff,ff,ff,ff,\
  ff,fe,ff,06,53,00,65,00,61,00,72,00,63,00,68,00,00,00,00,00,d7,07,00,00,01,\
  00,00,00,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,01,00,00,00,ff,ff,ff,ff,d2,07,00,00,01,00,00,\
  00,ff,ff,ff,ff,d2,07,00,00,00,00,00,00,00,10,00,00,01,00,00,00,ff,ff,ff,ff,\
  ff,ff,ff,ff,e2,00,00,00,37,00,00,00,e6,00,00,00,ae,03,00,00,01,00,00,00,02,\
  00,00,10,04,00,00,00,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,01,00,00,00,ff,ff,ff,ff,04,00,00,00,d1,07,00,00,d5,07,00,\
  00,cd,07,00,00,ce,07,00,00,01,80,00,10,00,00,01,00,00,00,05,00,00,00,56,00,\
  00,00,e7,00,00,00,12,02,00,00,00,00,00,00,37,00,00,00,e2,00,00,00,f3,01,00,\
  00,00,00,00,00,01,00,00,00,40,14,00,56,04,00,00,00,ff,fe,ff,07,46,00,6f,00,\
  6c,00,64,00,65,00,72,00,73,00,01,00,00,00,d1,07,00,00,01,00,00,00,ff,ff,ff,\
  ff,ff,ff,ff,ff,ff,fe,ff,08,43,00,61,00,6c,00,65,00,6e,00,64,00,61,00,72,00,\
  01,00,00,00,d5,07,00,00,01,00,00,00,ff,ff,ff,ff,ff,ff,ff,ff,ff,fe,ff,09,46,\
  00,61,00,76,00,6f,00,72,00,69,00,74,00,65,00,73,00,01,00,00,00,cd,07,00,00,\
  01,00,00,00,ff,ff,ff,ff,ff,ff,ff,ff,ff,fe,ff,0e,50,00,72,00,69,00,76,00,61,\
  00,74,00,65,00,20,00,46,00,6f,00,6c,00,64,00,65,00,72,00,00,00,00,00,ce,07,\
  00,00,01,00,00,00,ff,ff,ff,ff,ff,ff,ff,ff,00,00,00,00,00,00,00,00,d6,07,00,\
  00,01,00,00,00,00,00,00,00,01,00,00,00,01,00,00,00,ff,ff,ff,ff,00,00,00,00,\
  f3,01,00,00,e2,00,00,00,f7,01,00,00,01,00,00,00,01,00,00,10,04,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,02,00,\
  00,00,ff,ff,ff,ff,d1,07,00,00,d6,07,00,00,01,00,00,00,d6,07,00,00,01,00,00,\
  00,ff,ff,ff,ff,d1,07,00,00,00,00,00,00,00,80,00,00,00,00,00,00,ff,ff,ff,ff,\
  ff,ff,ff,ff,00,00,00,00,02,00,00,00,04,00,00,00,06,00,00,00,00,00,00,00,01,\
  00,00,00,04,00,00,00,01,00,00,00,00,00,00,00,00,00,00,00,d0,07,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,01,00,00,00,d0,07,00,00,01,00,00,\
  00,d0,07,00,00,00,00,00,00,00,00,00,00,00,00,00,00" $0

  ${registry::Write} "HKCU\Software\ACD Systems\ACDSee Pro\40\en\Settings\Browser\BCGPDockManager--1" "DockingCBAndSliders" "$0" "REG_BINARY" $R0

MessageBox MB_OK "registry::StrToHex$\n$\n\
К сожалению, при данном варианте скрипта,  в реестр записалось значение, $\n$\n\
не соответствующее значению исходного REG-файла..."
SectionEnd

Значение записывается, но... не верное ! Соответственно нет результата. (точнее, происходит ряд изменений совершенно не нужных...) В чём я ошибся ?

ps Проверяю, экспортируя из реестра, ключ записанный посредством NSIS. Значение в нём другое, отличное от исходного рабочего reg-файла... Что за чертовщина ?!

kotkovets 07-04-2011 11:21 1652896

MKN, дело в стандартном NSIS у которого размер передачи и хранения данных ограничен 1024 байтами, поэтому обрезается значение до этой длины, скачай специальную версию NSIS Large strings , где размер увеличен до 8192 байта, замени все файлы из скачанного архива.Сейчас проверил, работает как нужно, сравнил значения до и после - индетичны.
читать дальше »
Код:

  WriteRegbin HKCU "Software\ACD Systems\ACDSee Pro\40\en\Settings\Browser\BCGPDockManager--1" "DockingCBAndSliders" \
  000000000b000000000000000020000000000000ffffffffffffffff000000000000000004000000040000000000000001000000040000000100\
  00000000000000000000885600000000000000000000000000000000000001000000885600000100000088560000000000000080000000000000\
  ffffffffffffffff00000000000000000400000004000000000000000100000004000000010000000000000000000000d8070000000000000000\
  0000000000000000000001000000d807000001000000d8070000000000000040000000000000ffffffffffffffffb203000037000000b6030000\
  b1030000000000000200001004000000010000000000000000000000ffffffff04000000d2070000cf070000d3070000d7070000ffff02001400\
  43414344546162626564436f6e74726f6c4261720040000000000000bb0300005600000005050000cd030000b60300003700000000050000b103\
  000000000000010000004041004604000000fffeff084f007200670061006e0069007a00650000000000d207000001000000ffffffffffffffff\
  fffeff095400610073006b002000500061006e00650000000000cf07000001000000fffffffffffffffffffeff0a500072006f00700065007200\
  740069006500730000000000d307000001000000fffffffffffffffffffeff0653006500610072006300680000000000d707000001000000ffff\
  ffffffffffffffffffff000000000000000000000000000000000000000001000000ffffffffd207000001000000ffffffffd207000000000000\
  0010000001000000ffffffffffffffffe200000037000000e6000000ae0300000100000002000010040000000100000000000000000000000000\
  0000000000000000000001000000ffffffff04000000d1070000d5070000cd070000ce070000018000100000010000000500000056000000e700\
  0000120200000000000037000000e2000000f301000000000000010000004014005604000000fffeff0746006f006c0064006500720073000100\
  0000d107000001000000fffffffffffffffffffeff08430061006c0065006e0064006100720001000000d507000001000000ffffffffffffffff\
  fffeff094600610076006f007200690074006500730001000000cd07000001000000fffffffffffffffffffeff0e500072006900760061007400\
  6500200046006f006c0064006500720000000000ce07000001000000ffffffffffffffff0000000000000000d607000001000000000000000100\
  000001000000ffffffff00000000f3010000e2000000f70100000100000001000010040000000000000000000000000000000000000000000000\
  0000000002000000ffffffffd1070000d607000001000000d607000001000000ffffffffd1070000000000000080000000000000ffffffffffff\
  ffff00000000020000000400000006000000000000000100000004000000010000000000000000000000d0070000000000000000000000000000\
  0000000001000000d007000001000000d0070000000000000000000000000000


a--e 07-04-2011 12:03 1652929

kotkovets, это конечно хорошо и спасибо за оперативную помощь, но к сожаленю в nsis я полнейший профан.
В вашем примере есть 2 различных файла, а в моём случае есть оригинальный файл и файл (надеюсь правильно выразиться) разницы с расширением tmp.patchfile который не является модифицированным, а лишь содержит информацию о модификации.
Я пробовал: сначала применить патч, затем утилитами извлечь повторно эту информацию (GenPat.exe, nsisPatchGen.exe, VPatchGUI) но в итогде потерпел с ними фиаско. Первые две файл *.pat вообще не создавали. Проверяли файлы (долго и упорно), проверили и все. VpatchGUI справлялся, но полученный на выходе файл ехе, dll и pat никоим образом в скрипт NSISa не прикрутился. (

возможно косяк в размере файлов. Всего должно пропатчиться 15 файлов среди которых 1 весит примерно 900мб.

Цитата:

GenPat.exe "*.gam" "*_new.gam" "Path.pat"
применимо для конкретного файла, а для директорий?

kotkovets 07-04-2011 13:21 1652988

a--e, я стандартным в поставке nsis пользуюсь,без глюков работает и для каждого файла нужен свой патчик,
прежде, чем патчить файл, плагин сверяет сумму файла, который нужно патчить по алгоритму MD5
должны быть: оригинал файла и патченный вариант оригинального файла - патченный файл создаете любыми средствами. GenPat.exe - генерит файл изменений на основе сравнения оригинального файла и патченного.
Предварительная подготовка, создаем батник:
GenPat.exe "путь\оригинальный файл" "путь\патченный файл" "Path.pat" т.е на выходе получается Path.pat - файл изменений относительно оригинала и патченного файла.
Далее в скрипте прописываем:
Код:

OutFile "test.exe"
InstDir "C:\Test"

Section
  SetOutPath "$INSTDIR"
  File "путь к оригинальному файлу\file" ;засовываем файл в установщик
  InitPluginsDir
  File /oname=$PLUGINSDIR\path.pat "путь к path.pat" ;засовываем файл path.pat в установщик
  vpatch::vpatchfile "$PLUGINSDIR\path.pat" "путь к оригинальному файлу\file" "путь сохранения измененого оригинального файла\file_path"
  Delete "путь к оригинальному файлу\file" ;удаляем оригинальный файл
  Rename "путь сохранения измененного оригинального файла\file_path" "путь сохранения измененого оригинального файла\file" ;переименовываем патченый файл в оригинальное имя файла
SectionEnd

Цитата:

Цитата a--e
...среди которых 1 весит примерно 900м»

)))) не делал такое, наверно долго файл .pat создаваться будет.

a--e 07-04-2011 13:38 1653004

так. если я все правильно понял, для каждого файла *.pat файл надо создавать отдельно?! О_о
Вот моя ошибка. Я постоянно директории сравнивал (на выходе файл получался, но чего-то не работало))
кусок скрипта выше это доля одного файла, а для X файлов его надо копировать n раз. так что ли?? тогда все крайне просто. Спасибо за помощь. Если будут ещё вопросы - вернусь в гости)

*Ушел убивать клавиатуру.


PS а можно патчу прикрутить авто установку в директорию по ключу в реестре?

kotkovets 07-04-2011 13:52 1653011

Цитата:

Цитата a--e
так. если я все правильно понял, для каждого файла *.pat файл надо создавать отдельно? »

совершенно верно, нужно для каждого файла, и файл .pat для конкретного файла свой
я скрипты писал и на 7000 строк и нормально, дело тренировки, можно для этих дел макрос сварганить и 15 раз вызывать.

Вот такой макрос для себя делал, пользуйтесь:
Код:

Page Instfiles
Name "Example"
OutFile "Example.exe"
ShowInstDetails show

!define VPatchFile "!insertmacro VPatchFile"
!macro VPatchFile PATCHDATA SOURCEFILE TEMPFILE VALUE
  Push $1
  Push $2
  Push $3
  Push $4
  Push `${SOURCEFILE}`
  Push `${TEMPFILE}`
  Pop $2
  Pop $3
  InitPluginsDir
  GetTempFileName `$1` $PLUGINSDIR
  File `/oname=$1` `${PATCHDATA}`
  vpatch::vpatchfile `$1` `$3` `$2`
  Pop $4
  StrCpy $4 $4 2
  StrCmp $4 "OK" +4
  SetErrors
  DetailPrint "Vpatch: error"
  Goto +6
  IntCmp ${VALUE} 1 0 +6 +6
  IfFileExists `$2` 0 +4
  Delete $3
  Rename /REBOOTOK `$3` `$2`
  Delete $1
  Pop $4
  Pop $3
  Pop $2
  Pop $1
!macroend

Section "Main"
  SetOutPath "$EXEDIR"
  File "D:\Nero_designer\Nero Burning ROM\nero.exe"
  ${VPatchFile} "Nero.pat" "$EXEDIR\Nero.exe" "Nero Express.exe" 1
SectionEnd

Nero.pat - должен лежать рядом со скриптом
Nero Express.exe - имя пропатченного файла, т.е сохраниться с указанным именем в одной директории оригинального файла
1- удалить оригинал, 0 - не удалять
Условие: имя оригинала и патченного файла не должны совпадать

a--e 07-04-2011 15:28 1653077

Прошу помощи ещё раз. *.pat файлы получил. все идёт как надо. Но запнулся при написании скрипта

код

Код:

OutFile "test.exe"

Section
  SetOutPath "C:\"
  File "c:\Temp\{app}\data\Effects.vfs"
  SetFileAttributes "c:\Temp\{app}\data\Effects.vfs" "NORMAL"
  Rename "c:\Temp\{app}\data\Effects.vfs" "c:\Temp\{app}\data\NEW_Effects.vfs"
  InitPluginsDir
  File /oname=$PLUGINSDIR\path.pat "Effects.vfs.pat"
  vpatch::vpatchfile "$PLUGINSDIR\Effects.vfs.pat" "c:\Temp\{app}\data\NEW_Effects.vfs" "c:\Temp\{app}\data\Effects.vfs"
  Delete "c:\Temp\{app}\data\NEW_Effects.vfs"
  SetFileAttributes "c:\Temp\{app}\data\Effects.vfs" "READONLY"
SectionEnd



"Error in script "stdin" on line 9 -- aborting creation process" - вот что мне говорят (
пробовал менять имя pat файла в этой строке. Без результата.

kotkovets 07-04-2011 16:15 1653112

a--e,
скачайте на 92 стр. темы справочник, там есть ответы на ваши вопросы..

File /oname=$PLUGINSDIR\path.pat "Effects.vfs.pat"
Означает взять Effects.vfs.pat и скопировать в папку $PLUGINSDIR с именем path.pat
далее ясно почему ошибка...
Delete "c:\Temp\{app}\data\NEW_Effects.vfs" и никогда не применяйте абсолютные пути в скриптах, кроме забора файлов в инсталлятор.
Delete "$PLUGINSDIR\path.pat"
Почитайте в справочнике про переменные окружения
читать дальше »
Код:

OutFile "test.exe"

Section
  SetOutPath "c:\"
  File "c:\Temp\{app}\data\Effects.vfs"
  InitPluginsDir
  File /oname=$PLUGINSDIR\Effects.vfs.pat "Effects.vfs.pat"
  vpatch::vpatchfile "$PLUGINSDIR\Effects.vfs.pat" "c:\Effects.vfs" "c:\path_Effects.vfs"
  Delete "c:\Effects.vfs"
  Rename "c:\path_Effects.vfs" "c:\Effects.vfs"
SectionEnd


a--e 07-04-2011 16:30 1653120

Спасибо. С этим разобрался.
Для теста попробовал пропатчить 1 файл. НО!! сам патч получился ровненько размера патченого файла (т.е. патч не содержит в себе информации для "дописывания" в оригинал, а прост осодержит модиф. файл).. Это лечится? :dont-know :help:
Проблема за проблемой всплывают...

kotkovets 07-04-2011 16:36 1653123

a--e, достаточно сравнить 2 файла по контрольной сумме (MD5, к примеру) и если они одинаковые, значит файл не пропатчен, как узнать контрольные суммы - погуглите.

a--e 07-04-2011 16:44 1653128

kotkovets,
Нет. Файл все же не патчится. Заменяется оригинальной версией (без патча даже).

racner 07-04-2011 21:09 1653300

Всем привет !

Наткнулся на проблему с кодировкой NSIS при вызове команды nsExec::ExecToLog,
при использовании русской Windows.

Код:

  ; Restart services
 
  nsExec::ExecToLog "cmd /u /c net stop SharedAccess"
  nsExec::ExecToLog "Test 31 Петя пошел гулять"
  DetailPrint "Stopping service... Русские буквы, тест 33333 "
  nsExec::ExecToLog "cmd /a /c net stop iphlpsvc"
  DetailPrint "Stopping service... Русские буквы, тест 22222 "
  nsExec::ExecToLog "net stop winmgmt"

Вот что пишется выводится при установке:



Если выполнить соответствующие команды вручную в cmd, то всё ок:



То есть дело в том, какая кодировка настроена для вывода текста в окне лога установки через команду nsExec::ExecToLog, как её переключить подскажите пожалуйста ?

P.S. как вы видите я экспериментировал с параметрами команды cmd:
/a - вывод в ANSI
/u - вывод в UNICODE
результата это не дало никакого.
В то же время команда DetailPrint выводит кириллицу нормально

kotkovets 07-04-2011 22:27 1653362

Цитата:

Цитата racner
То есть дело в том, какая кодировка настроена для вывода текста в окне лога установки через команду nsExec::ExecToLog, как её переключить подскажите пожалуйста ? »

Проблема в самом плагине nsExec - не поддерживает кириллицу, он же строки такие передает в ListBox (окно деталей) установщика. буржуи писали... :dont-know

Proton 08-04-2011 07:34 1653570

Здравствуйте, подскажите куда копать:

1. Делаю установщик с введение пароля , создаю через nsDialogs первый лист, на нем строка ввода и кнопка далее, если пароль неверный сообщение, что неверно ввели : выход или повторить. Выход работает, а вот повтор немогу реализовать.
Как в функции указать запуск установщика с начала? Пробовал указать на сколько команд вернуться назад, но при этом перестает показываться текстовое поле.

Код:

Page custom dogovor_vvod dogovor_confirm
!insertmacro MUI_PAGE_LICENSE "${NSISDIR}\Docs\Modern UI 2\LicenseRU.txt"
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_LANGUAGE "Russian"
       
;--------------------------------
;установка
;--------------------------------
Var dogovor
Var textdogov
Var numberdogov

Function dogovor_vvod
nsDialogs::Create 1018
!insertmacro MUI_HEADER_TEXT "Введите номер договора с ISP PalNet" "Если вы не являетесь пользователем сети PalNet, прервите установку и удалите данное приложение"
Pop $dogovor
${NSD_CreateText} 30% 30% 90u 12u ""
        Pop $textdogov
nsDialogs::Show
FunctionEnd

Function dogovor_confirm
Loop:
${NSD_GetText} $textdogov $numberdogov
${if} $numberdogov != "nsis"
MessageBox MB_ICONSTOP|MB_YESNO "        $\r$\nНеверный номер договора!        $\r$\nПопробовать снова?$\r$\n $\r$\n" IDYES Loop
Goto End
${else}
Goto Next
${endif}
End:
Quit
Next:
FunctionEnd

Как реализовать переход Loop?


2. Как сделать чтобы пароль проверялся по первым 4 символам? Имеется ли какие нибудь спец символы вроде как *

Код:

${if} $numberdogov != "nsis*"

kotkovets 08-04-2011 10:00 1653634

Цитата:

Цитата Proton
Здравствуйте, подскажите куда копать »

Поле ввода пароля: ${NSD_CreatePassword}
Цитата:

Цитата Proton
Как сделать чтобы пароль проверялся по первым 4 символам? »

Очень просто, нужно брать из введенного пароля первые 4 символа
Код:

Function dogovor_confirm
  ${NSD_GetText} $textdogov $numberdogov
  StrCpy $numberdogov $numberdogov 4
  ${ifnot}  $numberdogov == nsis ;если не равно "nsis"
      MessageBox MB_ICONSTOP "Неверный пароль !!!"
      Abort ; конец иницилизации
  ${endif}
FunctionEnd

Если сравниваете строковые значения с лучше писать с двумя знаками ==
Если числовые то с одним знаком =

MKN 08-04-2011 10:20 1653651

Подскажите пожалуйста, как решить такую задачу - удаление , одного или нескольких любых символов, в начале нескольких конкретных строк текстового файла. Т.е., например :

Удалить : 1ый любой символ в начале строк с 37 по 68 включительно.

Или : удалить 3 первых любых символа в строках с 10 по 20 и 3 первых любых символа, в 33 строке.

В справочнике ничего подходящего не обнаружил...

ps Если удление сделать нельзя, то хотя бы заменить символ на пустой...

kotkovets 08-04-2011 12:01 1653735

MKN, А зачем удалять, когда можно методом сравнения строки заменить целиком строку и код проще и гемора меньше на порядок.
вот к примеру есть строка: forum.oszone.ru
${WordReplace} '$R9' 'forum.oszone.ru' 'я на forum.oszone.ru - изучаю NSIS' "+" '$R9'
в итоге заменится строка forum.oszone.ru на я на forum.oszone.ru - изучаю NSIS
а параметры замены в оригинале смотри по индексу WordReplace или Word.
а если строку нужно удалить:
${WordReplace} '$R9' 'forum.oszone.ru' '' "+" '$R9'
Но останется пустая строка, как ее удаллить смотри здесь:
http://forum.oszone.net/post-1645122-1011.html

MKN 08-04-2011 12:24 1653751

Цитата:

Цитата kotkovets
можно методом сравнения строки заменить целиком строку и код проще и гемора меньше на порядок. »

Гемора на порядок будет больше, т.к. придётся вручную вводить текст сравниваемой строки и текст необходимого результата.

Когда в текстовом файле таких строк сотни и с чёрт знает какими записями - это убийственно...

А надо всего лишь удалить несколько символов в началах этих строк. При чём только в конкретных или в группах строк...

MKN 08-04-2011 13:22 1653798

kotkovets,
Я почти нашёл, то что нужно в TextFunc.nsh
Когда в файл примера вставляешь :
Код:


;Удалить 1 символ в строках со 2 по 5 включительно

Section
${LineFind} "C:\a.txt" "C:\a.txt" "2:5-1" "LineReplaceFunction"
SectionEnd

Function LineReplaceFunction
        ${TrimNewLines} '$R9' $R9
        StrCpy $R9 $R9 '' 1
        StrCpy $R9 '$R9$\r$\n'
       
        Push $0
FunctionEnd

то вроде как всё работает, но только в примере, а отдельно нет... И в том примере так много всего лишнего...

kotkovets 08-04-2011 13:24 1653801

MKN,а все таки справку по вордовским хренотенью плохо смотрел... там куча параметров в вхождение в строку : в начале , в середину, с какого символа, на длину и т.д
макрос ${LineFind} "[File1]" "[File2|/NUL]" "[LineNumbers]" "Function"
взгляни к примеру:
$R9 - строковые значения
$R8 - номер линии строки текста
[LineNumbers]
1;-1 - все линии читать
5:9 - читать с 5 до 9 линии
в справке все это есть же.
WordFind, WordReplace, WordFind2X в функции LineReplaceFunction вставляй с нужными параметрами

Proton 10-04-2011 16:02 1655293

Подскажите как в функции указать переход к другой функции или возврат в начало выполнения скрипта (к первой странице инсталятора)?

kotkovets 10-04-2011 21:29 1655483

Цитата:

Цитата Proton
Подскажите как в функции указать переход к другой функции »

Это извращение, проще все нужно делать, чем не устраивает простой вызов: Call Function ? из любой секции или функции..или на другой конец использование глобальных меток, где можно прыгать как угодно: Goto .Next в пределах инсталлятора, кроме секции Uninstall, и командой Return
Цитата:

Цитата Proton
возврат в начало выполнения скрипта »

а не проще цикл организовать (по условию) в одном месте, чем прыгать и скакать - выносить себе мозги.
ИМХО, в студию проблемный кусок скрипта.. а там видно будет, что и как "правильнее делать"

Proton 11-04-2011 01:59 1655598

Нашел выход в команде Abort - прекращение выполнения скрипта дальше, возможно это извращение но мне помогло

Код:

    Page custom dogovor_vvod dogovor_confirm
    ;!insertmacro MUI_PAGE_LICENSE "${NSISDIR}\Docs\Modern UI 2\LicenseRU.txt"
        !insertmacro MUI_PAGE_COMPONENTS
    ;!insertmacro MUI_PAGE_DIRECTORY
    !insertmacro MUI_PAGE_INSTFILES
    !insertmacro MUI_LANGUAGE "Russian"
       
;--------------------------------
;установка
;--------------------------------
Var dogovor
Var textdogov
Var numberdogov

Function dogovor_vvod
nsDialogs::Create 1018
!insertmacro MUI_HEADER_TEXT "Введите номер договора с ISP PalNet" "Если вы не являетесь пользователем сети PalNet, прервите установку и удалите данное приложение"
Pop $dogovor
${NSD_CreateText} 30% 30% 90u 12u ""
        Pop $textdogov
nsDialogs::Show
FunctionEnd

Function dogovor_confirm
${NSD_GetText} $textdogov $numberdogov
StrCpy $numberdogov $numberdogov 3
${ifnot} $numberdogov == pal ;если не равно pal*****
MessageBox MB_ICONSTOP|MB_YESNO "        $\r$\nНеверный номер договора!        $\r$\nПопробовать снова?$\r$\n $\r$\n" IDNO End
Abort
${else}
Goto Next
${endif}
End:
Quit
Next:
FunctionEnd

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

kotkovets 11-04-2011 11:47 1655756

Proton, Что за извращения с метками в логических конструкциях(((...
Конструкции для того и существуют, чтобы метки (безусловные переходы) не использовать...
здесь вариант на относительном переходе внутри конструкции, которая выполняется только, когда введен неправильный пароль, т.е по заданному условию в логике.
Код:

${NSD_GetText} $textdogov $numberdogov
StrCpy $numberdogov $numberdogov 3
${IfNot} $numberdogov == pal ;если не равно pal***** тогда ниже команды будут выполнены до закрытия конструкции ${EndIf}
  MessageBox MB_ICONSTOP|MB_YESNO "Неверный номер договора!$\r$\nПопробовать снова?" IDNO +2
  Abort
  Quit
${EndIf}
FunctionEnd

У вас страничка с вводом пароле первая, и вы никуда ни денетесь со странички, пока не введете верный пароль или откажетесь от ввода пароля - тогда выход. Че здесь мутить по меткам хренотень.
Скачайте Справочник по NSIS и почитайте про логические конструкции.

david141 12-04-2011 19:36 1656688

Может, кто знает, что за ошибка?
Invalid command: ${LocateNoDetails}
Error in macro CopyFilesFromDir on macroline 34

Вот исходник firefox-installer
Может, кто разберётся и выложит рабочий?

Didgik 13-04-2011 14:54 1657333

Народ привет!
А можно как нибудь получить версию файла на этапе компиляции?
Нужно для вписывания версии в имя инсталяшки.
Как я понял ${GetFileVersion} работает уже на этапе инсталяции...

kotkovets 13-04-2011 20:42 1657610

Цитата:

Цитата Didgik
А можно как нибудь получить версию файла на этапе компиляции? »

Не задавался таким вопросом, но получилось вот так...
1. Создаем батник ver.bat такого содержания:
Код:

for /f "tokens=1,2 delims=        " %%i in ('filever.exe /v "путь\file.exe"^|find.exe /i "FileVersion"') do set %%i=%%j
echo !define PRODUCT_VERSION "%FileVersion%" > FileVersion.nsh

2. ver.bat ложим рядом со скриптом, путь\file.exe - прописываем путь к файлу только абсолютный или относительно скрипта
3. Берем утилитку filever.exe от мелкомягких (во вложении) и ложим рядом со скриптом.
4. Создаем скрипт такого содержания:
Код:

!system 'ver.bat' #запускаем батник
!include "FileVersion.nsh" # подключаем созданный хедер к основному скрипту

OutFile Setup_v${PRODUCT_VERSION}.exe

Section ""
SectionEnd


Didgik 14-04-2011 13:03 1658118

kotkovets, хитро. Спасибо. )
Но жаль что нет штатного средства. А так мне всё равно надо будет передавать кое-какие параметры через /D так что буду и версию передавать.

wolkow70 15-04-2011 05:44 1658667

Товарищи, подскажите как включить в инсталлятор пустые папки?
Пробовал с помощью функции InstallFolderInternal, папки с файлами включаются в установщик, а пустые нет.

MKN 15-04-2011 08:53 1658721

Цитата:

Цитата wolkow70
как включить в инсталлятор пустые папки? »

Лучше пустые папки создавать (с необходимыми путями и именами)

wolkow70 15-04-2011 09:51 1658749

Цитата:

Цитата MKN
Лучше пустые папки создавать (с необходимыми путями и именами) »

Да, можно и создать, но мы не ищем легких путей...

Fireman68 15-04-2011 12:17 1658884

Нужна помощь. После установки программы в тихой установке с ключом /S, установленная программа сразу же запускается, что надо прописать чтоб запуска программы не было или сможет как нибудь убить этот процесс

kotkovets 15-04-2011 12:42 1658900

Вложений: 1
Для сборщиков, пересобирателей дистрибутивов приложений и любителей всяческих репаков.
Удаление всех подразделов реестра по заданной маске

Как известно, при ассоциации приложения к определенным типам файлам, встает проблема удаления однотипных разделов реестра, типа 7-zip.001, 7-zip.zip, 7-zip.rar, 7-zip.7z и т.д
Приходится делать рутинную работу, ведь в скрипте нужно прописывать десятки, а порою и сотни записей на удаления подразделов реестра, под каждое расширение - это весьма отнимает нервы и время.
Данный модуль (заголовочный файл) сделает за вас эту рутинную работу, всего лишь одной командой.
Код:

${DelRegKey} [корневой раздел реестра] [ветка реестра] [заданная маска]
Пример использования:
Копируем файл DelRegKey.nsh в папку NSIS\include
Код:


!include "DelRegKey.nsh"

 ${DelRegKey} HKLM "Software\Classes" "7-zip"
 ${DelRegKey} HKEY_CURRENT_USER "Software\Classes" "7-zip"
 ${DelRegKey} HKCR "" "7-zip"

В этом примере удалятся все разделы в HKLM в ветке Software/Classes начинающиеся с имени 7-zip, т.е по маске: 7-zip.001, 7-zip.zip, 7-zip.rar, 7-zip-7z и т.д.
Для корневого раздела HKCR поддерживается только запись с пустой веткой, так как там нет стандартных веток.
Код:

${DelRegKey} HKCR "" [заданная маска]
В следующем примере удалятся все подразделы в ветке Software начинающиеся на букву m
Код:

${DelRegKey} HKLM "Software" "m"

Удаление параметров ключей реестра по заданной маске значений этих ключей

Пример использования:
Код:

${DelRegValue} [корневой раздел реестра] [ветка реестра] [заданная маска]
Удалятся все параметры ключей реестра со значением 7-zip*******
Код:

!include "DelRegKey.nsh"
 ${DelRegValue} HKLM "Software\Classes" "7-zip"
 ${DelRegValue} HKEY_CURRENT_USER "Software\Classes" "7-zip"
 ${DelRegValue} HKCR "7-Zip.7z" "7-zip"
 ${DelRegValue} HKCR "" "7-zip"

*****
В окне деталей показываются удаленные ключи, если в окне деталей ничего нет - значит идет поиск!
Указывайте ветку реестра, насколько возможно точнее, это нужно
для сокращения времени поиска, которое может длиться весьма продолжительное время!

*****
Поиск ведется только на строковые параметры: REG_SZ и REG_EXPAND_SZ


*********************************************************************
Для полноценной работы модуля требуется плагин Registry:
http://nsis.sourceforge.net/Registry_plug-in

*********************************************************************
БУДЬТЕ ВНИМАТЕЛЬНЫ В ВЫБОРЕ МАСКИ УДАЛЕНИЯ !!!!!!!!!!
Если кто-то не понял как пользоваться данным модулем, то лучше просто не пользуйтесь и не задавайте глупых вопросов.

MKN 15-04-2011 12:51 1658913

Цитата:

Цитата wolkow70
но мы не ищем легких путей... »

Тогда помести в свои папки по скрытому файлику без расширения нулевого размера.

kotkovets,
А можно расширить функционал DelRegKey.nsh, поручив ему удалять по маске значения в ключах ?
т.е. ${DelRegKey} HKLM "Software/Classes" "любой ключ" "любое значение, начинающееся с 7-zip"

kotkovets 15-04-2011 13:01 1658927

MKN, Я уже подумываю над этим, на днях выложу.

wolkow70 15-04-2011 14:18 1658998

Цитата:

Цитата MKN
Тогда помести в свои папки по скрытому файлику без расширения нулевого размера. »

Такая мысль мне уже приходила. Нет уж, я лучше создам в скрипте пустые папки, хотя странно, что функционал NSIS не предусматривает такую мелочь....

kotkovets 15-04-2011 14:47 1659026

Цитата:

Цитата Fireman68
После установки программы в тихой установке с ключом /S, установленная программа сразу же запускается, что надо прописать чтоб запуска программы не было или сможет как нибудь убить этот процесс »

Избитый вопрос...
Можно так:
Код:

start /w Setup.exe /S
TASKKILL /F /IM процесс.exe

Но окошко моргнет...
А лучше всего сделать репак дистра.

MKN 15-04-2011 15:16 1659045

Цитата:

Цитата Fireman68
установленная программа сразу же запускается »

А с какой стати ей сразу запускаться, если сам же не попросишь в скрипте ?

kotkovets 18-04-2011 10:34 1660767

Цитата:

Цитата MKN
А можно расширить функционал DelRegKey.nsh, поручив ему удалять по маске значения в ключах ? »

Добавлена такая возможность:
Читать внимательно тут

Shukaj 18-04-2011 17:11 1661072

Добрый день. Используясь NSIS написал собственный инсталятор, но столкнулся с одной проблемой. Во время установки пользователь вводит логин и пароль, которые инсталлятор заносит в params.ini. Этого я успешно добился (с помощью изучения вашего форума, кстати говоря). но возникла следующая ситуация. По принципу "as is" программа ругается на неверный логин/пароль. Дело в том, что в ней заложена своя система шифрования, и в .ini заносится уже шифрованое значение.
Для примера, пароль 123, если ввести это значение в самой программе, то в params.ini запишется “vќ. А мой инсталлятор записывает как есть, тоесть 123.
Есть .dll, в которой прописал алгоритм шифрования. Я так понимаю, надо в процессе установки сохранить пароль, введённый пользователем, вызвать функцию шифрования, зашифровать, а затем сохранить значение в .ini. Можно ли каким-нибудь образом обратиться из инсталлятора к .dll-ке?

kotkovets 18-04-2011 17:46 1661100

Цитата:

Цитата Shukaj
Можно ли каким-нибудь образом обратиться из инсталлятора к .dll-ке? »

можно, теоретически, поместив соответствующую библиотеку в папку plugins NSIS и скомпильте какой-нибудь, любой скрипт. В логе компиляции вы увидите имя библиотеки (к примеру я закинул test.dll) и функции этой библиотеки, типа test::my_function и на этом все закончится....
Дело в том вы названия функции знаете, а прототип функции не знаете!
с какими параметрами вызывать, что передавать, какие аргументы функции и т.д. Обращаетесь к разработчикам библиотеки....ага засада! Так уж они вам все расскажут - алгоритм шифрования и дешифрования...

Shukaj 18-04-2011 19:42 1661154

Цитата:

Цитата kotkovets
Так уж они вам все расскажут - алгоритм шифрования и дешифрования... »

Разработчик библиотеки сидит в соседнем кабинете, так что пример шифрования/дешифрования он мне сегодня утром показал:) Я просто ещё не углублялся в эту тему, расчитывал по лёгкой прикрутить функцию и всё.
В любом случае, спасибо за совет, буду разбираться. Если кому будет интересно, потом скину пример.

kotkovets 18-04-2011 21:58 1661236

Shukaj,
Тогда уж лучше написать как плагин к NSIS c теме же алгоритмами работы как у приложения.
Здесь хедеры для этих дел, для обмена данными библиотеки и установщика.
http://forum.oszone.net/attachment.p...3&d=1266850604
Можно вызывать "чужую библиотеку" с помощью стандартного плагина System.dll (Docs\System\System.html)

Shukaj 21-04-2011 08:25 1662849

К сожалению, пока ничего не получается. По идее, вызываю Crypt.dll (в ней 2 функции:
function DeCode(const _Str: Pointer): Pointer; stdcall; из кодированной строки в обычную
function Code(const _Str: Pointer): Pointer; stdcall; из обычной строки в кодированную)

Вот кусок кода в инсталляторе.
Код:

Section
  InitPluginsDir
  SetOutPath $PLUGINSDIR
  File Crypt.dll
  System::Call "Crypt::Code($R1) $R2"
SectionEnd

Но ничего не происходит. Я так понимаю, проблема в том, что Crypt.dll написана на делфи.

пример использования Crypt.dll:

читать дальше »
Код:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    procedure FormShow(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    dh: cardinal;
    DeCode: function (const _Str: Pointer): Pointer; stdcall;
    Code: function(const _Str: Pointer): Pointer; stdcall;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
 var
 s:string;
begin
 s := Edit1.Text;
 Edit2.Text := String(Code(@s)^);

 Edit3.Text := String(DeCode(@s)^);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 FreeLibrary(dh);
end;

procedure TForm1.FormShow(Sender: TObject);
begin
 DH := LoadLibrary('Crypt');
 @DeCode := GetProcAddress(dh,'DeCode');
 @Code := GetProcAddress(dh,'Code');
end;

end.


Плагины к NSIS, если не ошибаюсь, пишутся на си. Получается, что придётся переписать dll-ку с делфи на си?

chites 21-04-2011 10:36 1662931

Доброе время суток!!!
А не подскажете можно ли как-то перейти на предыдущую страницу Инсталлятора при некорректном выполнении основной секции ??
Если использовать Abort, отображается текущая страница с активной кнопкой "Отмена", а мне бы хотелось, чтобы инсталлятор перешел на предыдущуб страницу, ну или хотябы была активна кнопка еще "Назад"

kotkovets 21-04-2011 10:46 1662940

Цитата:

Цитата Shukaj
Плагины к NSIS, если не ошибаюсь, пишутся на си. Получается, что придётся переписать dll-ку с делфи на си? »

можно и на делфи, не важно, но лучше все таки на си, потому что, NSIS си-подобный язык, даже больше смахивает на Visual Basic.
Цитата:

Цитата Shukaj
System::Call "Crypt::Code($R1) $R2" »

Здесь в корне не правильный синтаксис, но не значит, что будет работать. По сути передаются строковые значения, при такой записи предполагается, что Crypt лежит в system32, $R1 -пишется как R1, что типа так:
Код:

System::Call "путь\Crypt::Code(t.R1, t.R2)i.r0"
i.r0 - код возврата в $0 (переменная типа int, 0 или error (вообще, код возврата можно определить в библиотеке, error - возвращает system.dll - успешно или нет)
Здесь я вам не помогу в написании плагина , к сожалению...
О синтаксе System почитайте Docs\System\System.html и о типах переменных. Посмотрите на сайте NSIS в разделе плагины, там много плагинов идут с сырцами, попадаются и на делфи, но в основном на си.

Цитата:

Цитата chites
А не подскажете можно ли как-то перейти на предыдущую страницу Инсталлятора при некорректном выполнении основной секции ?? »

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

chites 21-04-2011 11:15 1662958

Код:

Page custom fnCustomInit fnCustomDestroy 
!insertmacro MUI_PAGE_INSTFILES

Function fnCustomInit
    !insertmacro MUI_HEADER_TEXT "Инициализация SQL-сервера" "Введите имя вашего SQL-сервера."
    nsDialogs::Create 1018

    Pop $Dialog
    ${NSD_CreateLabel} 0 5u 100u 10u "Имя SQL-сервера"
    Pop $Label
    ${NSD_CreateText} 0 20u 100% 15u "SQLEXPRESS"
    Pop $Text
    nsDialogs::Show
FunctionEnd

Function fnCustomDestroy
    ${NSD_GetText} $Text $R0
FunctionEnd

Section "MainSection" SEC01
  SetOutPath "$INSTDIR"
  SetOverwrite on

  ; Файлы для установки
  File "upd4.sql"
 
  StrCmp $R0 ""  0 +3
  ExecWait '"$INSTDIR\DATA\osql.exe" -S . -E -d hls_hc -n -i "${FILE_SQL_NAME}" -u -o "log.txt"'
  Goto +2
  ExecWait '"$INSTDIR\DATA\osql.exe" -S .\$R0 -E -d hls_hc -n -i "${FILE_SQL_NAME}" -u -o "log.txt"'
  FileOpen $R0 "$INSTDIR\log.txt" "r"
  read:
  Push $R0
  Call FileReadUnicode
  Pop $R1
  Push $R1
  Call Trim
  Pop $Report
  StrCmp $Report "1" done
  StrCmp $Report "2" done
  StrCmp $Report "3" done
  StrCmp $Report '' 0 +4
  MessageBox MB_OK "Проверьте правильность ввода имени Sql-сервера"
  Abort
  Goto done
  Goto read
  done:
  FileClose $R0

SectionEnd

вот хочется чтобы в месте Abort инсталлятор вернулся бы к странице Page custom fnCustomInit fnCustomDestroy

kotkovets 21-04-2011 11:29 1662974

chites,
Я так понял вам нужно, проверить правильность ввода имени Sql-сервера ?
Делается это в функции (в вашем fnCustomDestroy) при закрытии кастомной странички
К примеру, я в поле ввода имени, ничего не ввел...
Код:

Function fnCustomDestroy
    ${NSD_GetText} $Text $R0
    ${If} $R0 == ""  #условие, если $R0 равно пустому значению, тогда...
        MessageBox MB_ICONSTOP|MB_OK "Введите имя!"
        Abort       
    ${EndIf}
FunctionEnd


chites 21-04-2011 11:36 1662981

в том то и дело, что это поле может быть и пустым ... а првильность его ввода я могу проверить только при выполнении самого скрипта, который выполняется у меня в главной секции

kotkovets 21-04-2011 11:50 1662995

chites, Условия определите какие вам нужны, при которых код в секции отработает нормально, иначе я ничем не помогу, я вам привел пример, когда нужно обрабатывать условия

chites 21-04-2011 11:58 1663002

kotkovets, спасибо за помощь и столь быстрые ответы!!! Значит я правильно понимаю, что нельзя после выполнения основной секции вернуться на предыдущую страницу? И здесь только один выход, держать пользователя на предыдущей странице пока не удостоверимся о правильности ввода? Это конечно проблематичнее (((

kotkovets 21-04-2011 12:15 1663013

Цитата:

Цитата chites
Значит я правильно понимаю, что нельзя после выполнения основной секции вернуться на предыдущую страницу? »

все верно! я бы перенес код из секции в функцию fnCustomDestroy :unsure:

Krinkels 21-04-2011 13:35 1663079

Shukaj
Цитата:

Цитата Shukaj
Плагины к NSIS, если не ошибаюсь, пишутся на си. Получается, что придётся переписать dll-ку с делфи на си? »

Я писал плагин на дельфи(плагин для распаковки freearc архивов с отображением прогресса распаковки), и он прекрасно работает. Не важно на чем ты пишешь, важно чтоб плагин был написан правильно, иначе он просто не заработает.

wolkow70 21-04-2011 17:48 1663290

Товарищи, делаю сборку Ligth Alloy прописал с ассоциациями такие команды:

StrCpy $OpenCommand "$INSTDIR\LA.exe $\"%1$\""
StrCpy $PlayCommand "$INSTDIR\LA.exe $\"%1$\""
StrCpy $QueneCommand "$INSTDIR\LA.exe $\"%1$\" /ADD"


"Воспроизвести в LA" работает
"Открыть в LA работает"
Открыть файл двойным щелчком не работает. Приходится ткнуть кнопку воспроизведения.
С оригинальным инсталлятором все работает.
Что нужно поправить?

kotkovets 21-04-2011 19:31 1663357

wolkow70
А чем дело то? поставьте оригинал и гляньте какие записи делает, и перенесите такие же записи в свой установщик, а не за макросы сразу бросаться, научитесь для начала в реестр данные загонять в отладочном скрипте и сравниваете с оригиналом - пока не станут индетичны (заработает).
А то Вы сразу за штурвал МиГ-19 , минуя У-2

wolkow70 22-04-2011 09:01 1663657

Цитата:

Цитата kotkovets
А чем дело то? поставьте оригинал и гляньте какие записи делает, и перенесите такие же записи в свой установщик, а не за макросы сразу бросаться, научитесь для начала в реестр данные загонять в отладочном скрипте и сравниваете с оригиналом - пока не станут индетичны (заработает). »

Ставил оригинал, сохранял рег-файл, конвертировал в скрипт, и все равно также. Видимо конвертор криво работает.... А сам я в этих долларах и процентах не могу разобраться. Тем более, что конвертор часто по разному выдает результат... именно применительно к синтаксису команд.

kotkovets 22-04-2011 09:43 1663683

Цитата:

Цитата wolkow70
Ставил оригинал, сохранял рег-файл, конвертировал в скрипт, и все равно также. Видимо конвертор криво работает »

Вот с этого надо и начинать, приведите отснятый рег-файл.
Цитата:

Цитата wolkow70
А сам я в этих долларах и процентах не могу разобраться »

за одно и расскажу - для чего баксы и проценты. :)

wolkow70 22-04-2011 10:10 1663711

kotkovets, Ну вот, к примеру для файлов MP4 с оригинальной инсталляцией, все нормально открывается.


Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.MP4]
@="LAV4.MP4"
"LA_Backup"="LAV4.MP4"


Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\LAV4.MP4]
@="Light Alloy - MPEG-4 Media File"

[HKEY_CLASSES_ROOT\LAV4.MP4\DefaultIcon]
@="E:\\Program Files\\Light Alloy 4.5up\\Icons\\XPlite.icl,36"

[HKEY_CLASSES_ROOT\LAV4.MP4\Shell]
@="Play"

[HKEY_CLASSES_ROOT\LAV4.MP4\Shell\Enqueue]
@="Добавить в список в Light Alloy"

[HKEY_CLASSES_ROOT\LAV4.MP4\Shell\Enqueue\Command]
@="E:\\Program Files\\Light Alloy 4.5up\\LA.exe \"%1\" /ADD"

[HKEY_CLASSES_ROOT\LAV4.MP4\Shell\Open]
@=""

[HKEY_CLASSES_ROOT\LAV4.MP4\Shell\Open\Command]
@="E:\\Program Files\\Light Alloy 4.5up\\LA.exe \"%1\""

[HKEY_CLASSES_ROOT\LAV4.MP4\Shell\Play]
@="Воспроизвести в Light Alloy"

[HKEY_CLASSES_ROOT\LAV4.MP4\Shell\Play\Command]
@="E:\\Program Files\\Light Alloy 4.5up\\LA.exe \"%1\""

[HKEY_CLASSES_ROOT\LAV4.MP4\shellex]

[HKEY_CLASSES_ROOT\LAV4.MP4\shellex\ContextMenuHandlers]

[HKEY_CLASSES_ROOT\LAV4.MP4\shellex\ContextMenuHandlers\LA5ContextMenu]
@="{45C15F61-ACAD-48C6-8D86-321ED8A6CFC6}"

kotkovets 22-04-2011 13:13 1663870

wolkow70,
Под боком конвертера нету, делал руками.
читать дальше »
Код:

  WriteRegStr HKCR ".MP4" "" "LAV4.MP4"
  WriteRegStr HKCR ".MP4" "LA_Backup" "LAV4.MP4"
  WriteRegStr HKCR "LAV4.MP4" "" "Light Alloy - MPEG-4 Media File"
  WriteRegStr HKCR "LAV4.MP4\DefaultIcon" "" "$PROGRAMFILES\Light Alloy 4.5up\Icons\XPlite.icl,36"
  WriteRegStr HKCR "LAV4.MP4\Shell" "" "Play"
  WriteRegStr HKCR "LAV4.MP4\Shell\Enqueue" "" "Добавить в список в Light Alloy"
  WriteRegStr HKCR "LAV4.MP4\Shell\Enqueue\Command" "" "$PROGRAMFILES\Light Alloy 4.5up\LA.exe $\"%1$\" /ADD"
  WriteRegStr HKCR "LAV4.MP4\Shell\Open\Command" "" "$PROGRAMFILES\Light Alloy 4.5up\LA.exe $\"%1$\""
  WriteRegStr HKCR "LAV4.MP4\Shell\Play" "" "Воспроизвести в Light Alloy"
  WriteRegStr HKCR "LAV4.MP4\Shell\Play\Command" "" "$PROGRAMFILES\Light Alloy 4.5up\LA.exe $\"%1$\""
  WriteRegStr HKCR "LAV4.MP4\shellex\ContextMenuHandlers\LA5ContextMenu" "" "{45C15F61-ACAD-48C6-8D86-321ED8A6CFC6}"


Но я обычно такие данный загоняю в HKLM.
читать дальше »
Код:

  WriteRegStr HKLM "SOFTWARE\Classes\.MP4" "" "LAV4.MP4"
  WriteRegStr HKLM "SOFTWARE\Classes\.MP4" "LA_Backup" "LAV4.MP4"
  WriteRegStr HKLM "SOFTWARE\Classes\LAV4.MP4" "" "Light Alloy - MPEG-4 Media File"
  WriteRegStr HKLM "SOFTWARE\Classes\LAV4.MP4\DefaultIcon" "" "$PROGRAMFILES\Light Alloy 4.5up\Icons\XPlite.icl,36"
  WriteRegStr HKLM "SOFTWARE\Classes\LAV4.MP4\Shell" "" "Play"
  WriteRegStr HKLM "SOFTWARE\Classes\LAV4.MP4\Shell\Enqueue" "" "Добавить в список в Light Alloy"
  WriteRegStr HKLM "SOFTWARE\Classes\LAV4.MP4\Shell\Enqueue\Command" "" "$PROGRAMFILES\Light Alloy 4.5up\LA.exe $\"%1$\" /ADD"
  WriteRegStr HKLM "SOFTWARE\Classes\LAV4.MP4\Shell\Open\Command" "" "$PROGRAMFILES\Light Alloy 4.5up\LA.exe $\"%1$\""
  WriteRegStr HKLM "SOFTWARE\Classes\LAV4.MP4\Shell\Play" "" "Воспроизвести в Light Alloy"
  WriteRegStr HKLM "SOFTWARE\Classes\LAV4.MP4\Shell\Play\Command" "" "$PROGRAMFILES\Light Alloy 4.5up\LA.exe $\"%1$\""
  WriteRegStr HKLM "SOFTWARE\Classes\LAV4.MP4\shellex\ContextMenuHandlers\LA5ContextMenu" "" "{45C15F61-ACAD-48C6-8D86-321ED8A6CFC6}"


Синтаксис записи строковых параметров.
читать дальше »
Код:

WriteRegStr [root_key] [subkey] [key_name] [value]
пример, записать в ключ значение Light Alloy
Код:

WriteRegStr HKLM "Software\My Company" "KEY" "Light Alloy"
Записать значение: "Light Alloy" /ADD - c вложенными кавычками, для этого есть символ $\"
Код:

WriteRegStr HKLM "Software\My Company" "KEY" "$\"Light Alloy$\" /ADD"
Можно так
Код:

WriteRegStr HKLM "Software\My Company" "KEY" '"Light Alloy" /ADD'
Или так
Код:

WriteRegStr HKLM "Software\My Company" "KEY" `"Light Alloy" /ADD`

%1 - в эту системную переменную подставляется путь\file, т.е вы кликаете по файлу и он открывается соответствующей программой.
Еще очень важное замечание про расширяемый строковый параметр, параметр типа REG_EXPAND_STR
читать дальше »
Код:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders]
"Common Desktop"=hex(2):25,00,41,00,4c,00,4c,00,55,00,53,00,45,00,52,00,53,00,\
  50,00,52,00,4f,00,46,00,49,00,4c,00,45,00,25,00,5c,00,20,04,30,04,31,04,3e,\
  04,47,04,38,04,39,04,20,00,41,04,42,04,3e,04,3b,04,00,00

Это проделки реестра, если импортируйте этот файл в реестр, то получите значение ключа Common Desktop равным %ALLUSERSPROFILE%\Рабочий стол
Так вот, если вы их конвертируете в скрипт NSIS, то получите значение ключа в бинарном ввиде, а в реестре смотрим - это же расширяемый строковый параметр, здесь очень важно смотреть, какой тип параметра!
Правильно будет так:
Код:

WriteRegExpandStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" "Common Desktop" "%ALLUSERSPROFILE%\Рабочий стол"

wolkow70 22-04-2011 14:00 1663901

Я с такими параметрами и делаю:

;variables section

Var OpenCommand
Var PlayCommand
Var QueneCommand

в !macro RegisterExtension extenstion включаю:

WriteRegStr HKCR "$ClassName\Shell\Open\Command" "" "$OpenCommand"
WriteRegStr HKCR "$ClassName\Shell\Play\Command" "" "$PlayCommand"
WriteRegStr HKCR "$ClassName\Shell\Enqueue\Command" "" "$QueneCommand"

Section "-SetupIconsVariables"
StrCmp $gMode 1 NotgMode
;default icon file
StrCpy $IconFileName "XPlite.icl"
IfSilent 0 EndSection
IfFileExists $IniFile 0 EndSection
ReadINIStr $R0 $IniFile Advanced IconFileName
IfFileExists "$INSTDIR\Icons\$R0" 0 EndSection
StrCpy $IconFileName $R0
EndSection:
StrCpy $IconFile "$INSTDIR\Icons\$IconFileName"
StrCpy $OpenCommand "$INSTDIR\LA.exe $\"%1$\""
StrCpy $PlayCommand "$INSTDIR\LA.exe $\"%1$\""
StrCpy $QueneCommand "$INSTDIR\LA.exe $\"%1$\" /ADD"
StrCpy $Exe_Path "$INSTDIR\LA.exe"
NotgMode:
SectionEnd

Результат один и тот же через двойной клик не открывается файл, хотя программа запускается, но к воспроизведению не переходит. С оригинальным инсталлятором работает.
Что характерно, через контекстное меню "Воспроивести в LA" файл проигрывается. То есть, именно двойной клик не срабатывает.

kotkovets 22-04-2011 15:37 1663938

wolkow70
У меня все нормально работает, на примере LASetup_4.5.4_(build-603)
тем более там регистрируется библиотека ContextMenu.dll
Такой пример

Код:

OutFile File.exe

Section
  WriteRegStr HKLM "SOFTWARE\Classes\.avi" "" "LAV4.AVI"
  WriteRegStr HKLM "SOFTWARE\Classes\LAV4.AVI" "" "Light Alloy - Audio-Video Interleaved Media File"
  WriteRegStr HKLM "SOFTWARE\Classes\LAV4.AVI\DefaultIcon" "" "$PROGRAMFILES\Light Alloy 4.5up\Icons\PK69.icl,0"
  WriteRegStr HKLM "SOFTWARE\Classes\LAV4.AVI\Shell" "" "Play"
  WriteRegStr HKLM "SOFTWARE\Classes\LAV4.AVI\Shell\Enqueue" "" "Добавить в список в Light Alloy"
  WriteRegStr HKLM "SOFTWARE\Classes\LAV4.AVI\Shell\Enqueue\Command" "" "$PROGRAMFILES\Light Alloy 4.5up\LA.exe $\"%1$\" /ADD"
  WriteRegStr HKLM "SOFTWARE\Classes\LAV4.AVI\Shell\Open\Command" "" "$PROGRAMFILES\Light Alloy 4.5up\LA.exe $\"%1$\""
  WriteRegStr HKLM "SOFTWARE\Classes\LAV4.AVI\Shell\Play" "" "Воспроизвести в Light Alloy"
  WriteRegStr HKLM "SOFTWARE\Classes\LAV4.AVI\Shell\Play\Command" "" "$PROGRAMFILES\Light Alloy 4.5up\LA.exe $\"%1$\""
  WriteRegStr HKLM "SOFTWARE\Classes\LAV4.AVI\shellex\ContextMenuHandlers\LA5ContextMenu" "" "{45C15F61-ACAD-48C6-8D86-321ED8A6CFC6}"
  ;обновляем кэш иконoк
  System::Call 'shell32::SHChangeNotify(i 0x08000000, i 0, i 0, i 0)'
SectionEnd


wolkow70 22-04-2011 15:55 1663944

У меня версия LASetup_4.5.4_(build-603)_Standard.exe последняя с сайта.
Регистрацию библиотеки ContextMenu.dll я прописал так:

!include "Library.nsh"


Section "Контекстое меню проводника" ContextMenu
SectionIn 1 2
;read/write section state
!insertmacro ProcessSection "ContextMenu"
;if $r0 is 0 then exit section
StrCmp $R0 0 EndSection 0
;--------------section code----------------
${RefreshShellIcons}
RegDLL "$INSTDIR\ContextMenu.dll"
EndSection:
SectionEnd

Section Uninstall
!insertmacro UninstallLib REGDLL NOTSHARED NOREBOOT_PROTECTED "$INSTDIR\ContextMenu.dll"
Delete /REBOOTOK "$INSTDIR\ContextMenu.dll"

Эта библиотека при деинсталляции требует перезагрузки, что неудобно.
Я вообще за основу взял скрипт от AIMP и его перекраиваю.

kotkovets 22-04-2011 16:11 1663953

wolkow70
Начинайте с с более простого, примеры я Вам привел, а вы сразу за аналог AIMP беретесь!
Цитата:

Цитата wolkow70
Эта библиотека при деинсталляции требует перезагрузки, что неудобно »

можно и без перезагрузки обойтись, перезапуском оболочки.
если не ошибаюсь, проводник должен перезапустится (настройка по умолчанию)
Код:

TASKKILL /F /IM explorer.exe
или плагином NsRestartExplorer plug-in
Иногда он сбоит на WIN 7, но очень редко.
У меня так в установщике 7-zip сделано.

wolkow70 22-04-2011 16:24 1663961

Цитата:

Цитата kotkovets
Начинайте с с более простого, примеры я Вам привел, а вы сразу за аналог AIMP беретесь! »

Вы мне сами посоветовали обратить внимание на скрипт AIMP. А более простые вещи меня уже не интересуют, я уже 30 инсталляторов собрал, и теперь хочу сделать именно такую вещь.
Как я из вашего примера понял, Вы делаете ассоциации напрямую записями в реестре, а я пытаюсь использовать макрос из AIMP. И все работает, кроме открытия файлов двойным щелчком. Может и не в макросе дело? Ассоциации все производятся правильно. Проверял с официальной установкой.

kotkovets 22-04-2011 17:27 1663973

Цитата:

Цитата wolkow70
А более простые вещи меня уже не интересуют »

да говорил про AIMP, при условии, что разберетесь. С простых вещей все сложное состоит.
Цитата:

Цитата wolkow70
все работает, кроме открытия файлов двойным щелчком »

у меня нормально, как положено работает, а что там делает оффициальная - там тоже куча ошибок(полный бардак с ассоциациями), поэтому переделываю себе именно так, как нужно им делать, а то они паканули, а ты разбирайся, че там за порнуха..

wolkow70 23-04-2011 08:26 1664236

kotkovets,

Прописал так в секции удаления:

TASKKILL /F /IM explorer.exe
RMDir /r "$INSTDIR\"
${RefreshShellIcons}
SetAutoClose true
SectionEnd

Пишет, что инвалидная комманда.

С плагином тоже не получается, поместил его в папку с плагинами (Unicod версия)

прописал:

nsRestartExplorer::nsRestartExplorer restart infinite
;nsRestartExplorer::nsRestartExplorer start ignore
;nsRestartExplorer::nsRestartExplorer quit 1000
Pop $1
DetailPrint $1
RMDir /r "$INSTDIR\"
${RefreshShellIcons}
SetAutoClose true
SectionEnd

Тоже не перегружает оболочку...

wolkow70 23-04-2011 11:50 1664314

Цитата:

Цитата wolkow70
Тоже не перегружает оболочку... »

Поменял версию плагина Unicod на Ansi, оболочка стала перезагружаться.

Комманду пробовал прописать так:
ExecWait `taskkill /F /IM explorer.exe`
Работает, но просто вырубает эксплорер...

kotkovets 23-04-2011 13:49 1664352

wolkow70,
Вспомнил, как я делал - это как один из вариантов, для экспериментов тут широкое поле
Код:

Section Uninstall
      nsProcess::_KillProcess "explorer.exe"
      Pop $0
      DetailPrint "KillProcess: [ $0 ]"
      nsProcess::_FindProcess "explorer.exe" ;если не завелся проводник
      Pop $0 ;если не найден explorer, то стека в $0 возвращается 603
      DetailPrint "FindProcess: [ $0 ]"
      StrCmp $0 603 0 +2
      Exec "explorer.exe" ;заводим проводник
      nsProcess::_Unload
      Sleep 500 ;пауза - иногда нужно
      ;здесь команды удаления
SectionEnd

Насчет юникода - половина плагинов просто не работает, или работает с ошибками.
http://nsis.sourceforge.net/NsProcess_plugin

kotkovets 23-04-2011 16:27 1664404

Вот еще попроще "железный вариант" хоть для юникода или анси
Код:

Section Main
      ExecWait 'taskkill /F /IM explorer.exe' $0
      DetailPrint "taskkill exit code: [ $0 ]" ; для иллюстрации код возврата
      Sleep 500 ;пауза - если нужно
      StrCmp $0 0 0 +2
      Exec "explorer.exe"
SectionEnd


wolkow70 24-04-2011 07:58 1664731

kotkovets,

nsProcess::_KillProcess "explorer.exe"
Пишет инвалидная комманда. Плагин Process поставил...

kotkovets 24-04-2011 11:11 1664779

Цитата:

Цитата wolkow70
Плагин Process поставил.. »

а это че такое? а что то говорил про плагин Process ????
http://nsis.sourceforge.net/NsProcess_plugin - что уже не катит и не работает?
Могу скрипт и выложить чисто на вызовах WinAPI....
а само лучше внимательно читать, кругозор расширяет...

wolkow70 24-04-2011 11:39 1664793

Цитата:

Цитата kotkovets
Section Main
ExecWait 'taskkill /F /IM explorer.exe' $0
DetailPrint "taskkill exit: [ $0 ]"
Sleep 500 ;пауза - если нужно
StrCmp $0 0 0 +2
Exec "explorer.exe"
SectionEnd »

Этот вариант железно работает. Я его в отдельную подсекцию выделил. Как альтернативу перезагрузки компа. Интересно получилось.


Function un.onInit
SectionSetText ${sec09} "Удалить Light Alloy"
FunctionEnd

Section Uninstall sec09
SectionIn 1 RO
KillProcDLL::KillProc "LA.exe"
Sleep 700
!insertmacro UninstallLib REGDLL NOTSHARED NOREBOOT_PROTECTED "$INSTDIR\ContextMenu.dll"

бла-бла-бла

Delete /REBOOTOK "$INSTDIR\ContextMenu.dll"
RMDir /r "$INSTDIR\"
${RefreshShellIcons}
SetAutoClose true
SectionEnd

Section /o "Un.Перезагрузка Проводника" sec12
SectionIn 1
ExecWait 'taskkill /F /IM explorer.exe' $0
DetailPrint "taskkill exit: [ $0 ]"
Sleep 500 ;пауза - если нужно
StrCmp $0 0 0 +2
Exec "explorer.exe"
RMDir /r "$INSTDIR\"
SectionEnd

LangString DESC_09 ${LANG_RUSSIAN} "Программа LightAlloy будет удалена с Вашего компьютера"
LangString DESC_10 ${LANG_RUSSIAN} "Внимание, все настройки LightAlloy будут удалены с компьютера"
LangString DESC_11 ${LANG_RUSSIAN} "При удалении LightAlloy будет произведена ассоциация медиафайлов с Windows Media Player"
LangString DESC_12 ${LANG_RUSSIAN} "Перезагрузить Проводник Windows вместо перезагрузки компьютера"

Kelinmiir 25-04-2011 08:33 1665236

Доброго времени суток!

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

Krinkels 25-04-2011 09:38 1665262

А ты запихни БД в архивы(например cab или 7zip). Потом делаешь выбор БД на странице компонентов, и в зависимости от выбора распаковываешь ту или иную базу данных.

yyv 25-04-2011 12:16 1665358

Здравствуйте
Уже мозг сломал, пока ничего не могу придумать, Может вы что подскажете.
Есть такая задача.
Регулярно создается большое количество инсталлеров. Некоторые могут отличаться сильно по секциям и страницам, а в некоторый отличие только в значении переменных.
к примеру отличаються только названием программы и описанием
define PRODUCT_NAME "name test"
переменные задаются при генерации скрипта через ключ /D.
Стал вопрос можно ли на этот тип инсталлеров сделать один типовой а остальные данные брать из вне при установке программы. скажем читать черз ini файл?
пробовал в функции .onInit вызвать другую функцию
и прочитать эти данные
ReadINIStr $R1 "$TEMP\settings.ini" "PRODUCT_NAME" "Text"
!undef PRODUCT_NAME
!define PRODUCT_NAME $R1

но это работает не так как надо
значение переменной вроде заменяться
MessageBox MB_OK|MB_ICONSTOP "${PRODUCT_NAME}"
выводит именно то значение что прописано в settings.ini
но на страницах где должно отображаться PRODUCT_NAME отображается 0.
реально ли выполнить задачу под эти требования?
если да буду раз советам
с ув. Ярослав

Krinkels 25-04-2011 12:48 1665375

yyv
Не думаю что такое возможно, хотя подождем, что скажет на это гуру kotkovets
А вообще, ИМХО, в таких случаях проще все константы которые нужно изменить запихнуть в отдельный файл и там их изменять.

kotkovets 25-04-2011 13:46 1665405

yyv,
Можно сделать примерно так (пример на этапе инсталляции):
1. Команды не в коем случае не перемещать - здесь очень важна последовательность действий!
2. Константы иницилизируем, только в функции OnInit, потом будет поздно и значения констант определяем только после отработки макроса PRODUCTNAME и следовательно, объявляем значения констант после макроса - банальная последовательность действий
3. Это извращение, проще хранить значения в переменных. причем в данном случае в объявленных переменных, может быть покажу, когда именно, в какой момент нужно делать - здесь вся загвоздка.
Код:

!include "MUI2.nsh"
!include "Logiclib.nsh"

OutFile file.exe

!macro PRODUCTNAME
  ReadINIStr $R1 "$EXEDIR\settings.ini" "PRODUCT_NAME" "Text"
  ${IfNot} $R1 == ""
      StrCpy $R1 "$R1"
  ${Else}
      ClearErrors
      StrCpy $R1 "это NSIS ${NSIS_VERSION}" ;если $R1 = "пустому значению", то назначаем по умолчанию значение
  ${EndIf}
!macroend

!define MUI_WELCOMEPAGE_TITLE "$R1"
!define PRODUCT_NAME "$R1"
Caption "$R1"

!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

ShowInstDetails show

Function .OnInit
 !insertmacro PRODUCTNAME
FunctionEnd

Section ""
  MessageBox MB_ICONINFORMATION|MB_OK ${PRODUCT_NAME}$\n$\r$R1
SectionEnd


yyv 26-04-2011 11:43 1665861

спасибо это вроде работает.
надо будет еще тестировать

Цитата:

Цитата kotkovets
Это извращение, проще хранить значения в переменных. причем в данном случае в объявленных переменных, может быть покажу, когда именно, в какой момент нужно делать - здесь вся загвоздка. »

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


Код:

!ifdef AFTERDOWNLOAD          Page custom customPageAfterdownload          !endif
т.е. в зависимости от того есть или нет константа показывать или нет страницу.

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

kotkovets 26-04-2011 13:06 1665892

Цитата:

Цитата yyv
надо будет еще тестировать »

тестируйте. а в самый лучший вариант изменения всех страниц, делать в функциях во время открытия страниц, по различным условиям - будь это запуск с ключом /G и так далее, я так делаю и без проблем!эти функции можно узнать в Справочнике по NSIS (стандартные функции в MUI) или в оригинальной справке. Если не разберетесь - я вам пример приведу.

wolkow70 26-04-2011 17:15 1666028

kotkovets,
Подскажите, плиз, что нужно добавить в данный макрос, что бы в контекстном меню файлов появилось Открыть в FastStone Image Viewer.

!macro RegisterExtension extenstion ContentType PerceivedType ClassName DefaultIcon OpenCommand

WriteRegStr HKCR "${extenstion}" "" "${ClassName}"
WriteRegStr HKCR "${extenstion}" "PerceivedType" "${PerceivedType}"
WriteRegStr HKCR "${extenstion}" "Content Type" "${ContentType}"
WriteRegStr HKCR "${ClassName}\DefaultIcon" "" "${DefaultIcon}"
WriteRegStr HKCR "${ClassName}\shell\open\command" "" "${OpenCommand}"
!macroend


Пробовал сам добавить таким макаром:

var CommandName


!macro RegisterExtension extenstion ContentType PerceivedType ClassName DefaultIcon OpenCommand CommandName

WriteRegStr HKCR "$ClassName\shell\open" "" "CommandName"

StrCpy $CommandName "Открыть в FastStone Image Viewer"

!insertmacro RegisterExtension ".bmp" "image/bmp" "image" "FastStone.bmp" "$OUTDIR\FSIcons.db,0" $OpenCommand $CommandName


Не работает вариант!

kotkovets 26-04-2011 18:17 1666065

wolkow70
Две строчки кода и никаких гвоздей! на примере Reg2Nsis
Код:

Section
  WriteRegStr HKLM "SOFTWARE\Classes\regfile\shell\Reg2Nsis" "" "&Convert to nsis script"
  WriteRegStr HKLM "SOFTWARE\Classes\regfile\shell\Reg2Nsis\command" "" "$\"${NSISDIR}\reg2nsis.exe$\" $\"%1$\" -O"
SectionEnd


wolkow70 26-04-2011 18:27 1666069

Цитата:

Цитата kotkovets
Две строчки кода и никаких гвоздей! на примере Reg2Nsis »

Это придется на каждое расширение делать. Мне именно макрос нужно поправить.

Сейчас попробовал применить другой макрос, сделал так:


!macro RegisterExtension extenstion
StrCpy $ClassName "FastStone.${extenstion}"
WriteRegStr HKCR ".${extenstion}" "" "$ClassName"
WriteRegStr HKCR "$ClassName\shell\open" "" "Открыть в FastStone Image Viewer"
WriteRegStr HKCR "$ClassName\shell\open\command" "" "$OpenCommand"
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "Progid" "$ClassName"

${Switch} ${extenstion}
${Case} "BMP"
StrCpy $IconIndex 0
WriteRegStr HKCR "$ClassName" "" "FastStone BMP File"
${Break}
${Case} "PNG"
StrCpy $IconIndex 7
WriteRegStr HKCR "$ClassName" "" "FastStone PNG File"
${Break}
${Case} "JPG"
StrCpy $IconIndex 4
WriteRegStr HKCR "$ClassName" "" "FastStone JPG File"
${Break}
${EndSwitch}
WriteRegStr HKCR "$ClassName\DefaultIcon" "" "$IconFile,$IconIndex"
EndMacro:
!macroend

Section "!${PRODUCT_NAME}" sec01
бла-бла
StrCpy $OpenCommand "$\"$OUTDIR\FSViewer.exe$\" $\"%1$\""
StrCpy $IconFile "$INSTDIR\FSIcons.db"

SectionGroup "Ассоциация файлов" Sec06
;
Section "BMP" BMP
SectionIn 1 2
!insertmacro RegisterExtension ".bmp"
SectionEnd

Section "JPG" JPG
SectionIn 1 2
!insertmacro RegisterExtension ".jpg"
SectionEnd

Почему то в реестре расширения регистрируются с двумя точками
..bmp
..jpg
и т.д

wolkow70 26-04-2011 19:16 1666105

Цитата:

Цитата wolkow70
Почему то в реестре расширения регистрируются с двумя точками
..bmp
..jpg
и т.д »


Разобрался, все пока получается....!!!!!

punsh 01-05-2011 13:56 1668428

WriteRegStr HKLM "SOFTWARE\BurnAware\Install" "InstallEntry" "?"

как прописать выше этой строчки, чтобы заместь "?" было полное имя компьютера из HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"

kotkovets 01-05-2011 15:34 1668469

punsh
Сначала читаем значение параметра, к примеру AltDefaultDomainName и сохраняем в $R1
Код:

ReadRegStr $R1 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" "AltDefaultDomainName"
а затем
тыц
Код:

  WriteRegStr HKLM "SOFTWARE\BurnAware\Install" "InstallEntry" "$R1"

CyberMaster 01-05-2011 16:49 1668507

Подскажите, как лучше всего делать инсталлятор для игр? Тупо запаковать все в один .exe не вариант, так как такой exe файл, весом в 4 гига например, запускается долго, и требует больших усилий от компьютера.

kotkovets 01-05-2011 17:19 1668513

CyberMaster,
как вариант, запихнуть файлы игры в архивы, скажем по 1ГБ, а установщик будет распаковывать архивы в указанное место и делать другие необходимые действия, ну вот к примеру распаковывать таким плагином
http://forum.oszone.net/post-1552431-891.html

CyberMaster 01-05-2011 17:25 1668517

А этот плагин умеет работать с 7z, cab архивами?

kotkovets 01-05-2011 17:51 1668527

Цитата:

Цитата CyberMaster
А этот плагин умеет работать с 7z, cab архивами? »

Не пробЫвал, но есть для cab, 7z консольные утилиты, и плагины на офф.сайте.
а универсальный вариант, взять консольную утилитку из архиватора 7-zip (7z.dll и 7z.exe) запихнуть в установщик, а затем запускать с нужными ключами - будет распаковывать все, что умеет 7-zip
Код:

nsExec::Exec `"$PLUGINSDIR\7z.exe" x "Путь к архиву" -o"Путь распаковки" -y`
Pop $0 ;код возврата, если $0 = 0 то, успешно

7z.exe и 7z.dll должны лежать в одной директории

SnakeSel 01-05-2011 22:35 1668651

Здравствуйте.
Прошу помочь в решении такой проблемы:
Идет распаковка меню и выбранных портативных программ.
Причем меню распаковывается в INSTDIR, а вот программы в зависимости от того выбрано ли меню для установки.
Если меню устанавливаем, то путь распаковки $INSTDIR\PortableApps.
если нет, то $INSTDIR

Использую следующий код (фрагменты):

читать дальше »
Код:

;=== страницы установки
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_COMPONENTS
!define MUI_PAGE_CUSTOMFUNCTION_PRE instdir
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH

Section "Меню" secMENU
        SetOutPath "$INSTDIR"
        File /r "${pkgdir}\menu\*"
SectionEnd

SectionGroup /e "Интернет" ;/e
        Section "Miranda 0.9.20" secMiranda
                SetOutPath "$AppInstallDir"
                File /r "${pkgdir}\internet\MirandaPortable"
        SectionEnd

SectionGroupEnd

...<тут остальные группы и секции секции>

Function instdir
        ${If} ${SectionIsSelected} secMENU
                StrCpy $AppInstallDir "$INSTDIR\PortableApps"
        ${Else}
                StrCpy $AppInstallDir "$INSTDIR"
        ${EndIf}
FunctionEnd



Проблема в том, что у меня программы всегда распаковываются в $INSTDIR\PortableApps, независимо стоит ли галочка на секции меню. В чем моя ошибка?

kotkovets 02-05-2011 00:01 1668693

Цитата:

Цитата SnakeSel
В чем моя ошибка? »

Не то время выбора, вызова функции, функцию instdir можно вызывать при закрытии странички компонентов.
Причем где и как прописана иницилизация функции очень важна!
тыц
Код:

!include "MUI2.nsh"

OutFile "file.exe"

InstallDir "$PROGRAMFILES\Proga"
ShowInstDetails show

!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_DIRECTORY
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE instdir
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

Section "Меню" secMENU
        SetOutPath "$INSTDIR"
SectionEnd

SectionGroup /e "Интернет" ;/e
  Section "Miranda 0.9.20" secMiranda
        SetOutPath "$INSTDIR"
  SectionEnd
SectionGroupEnd

Function instdir
        ${If} ${SectionIsSelected} ${secMENU}
          StrCpy $INSTDIR "$INSTDIR\PortableApps"
        ${ElseIfNot} ${SectionIsSelected} ${secMENU}
          ;если не выбрана секция
        ${EndIf}
FunctionEnd


SnakeSel 02-05-2011 00:46 1668709

kotkovets, спасибо. Дело оказалось в ${If} ${SectionIsSelected} ${secMENU}.
А разве
Код:

!insertmacro MUI_PAGE_DIRECTORY
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE instdir
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES

и
Код:

!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_COMPONENTS
!define MUI_PAGE_CUSTOMFUNCTION_PRE instdir
!insertmacro MUI_PAGE_INSTFILES

ни одно и тоже?
Ведь в первом случае функция вызывается при закрытии окна выбора компонентов, а во втором перед началом установки файлов. Что по сути одно и тоже место.или нет?

kotkovets 02-05-2011 01:28 1668721

SnakeSel почти одно и тоже, но лучше , при закрытии странички компонентов делать, почему?
Потому, что если по каким либо причинам нам надо вернуться назад, пишем Abort и мы снова на страничке выбора компонентов, а при страничке инсталляции такую фишку невозможно сделать такое - прервем установку.
По этому в силу еще разных причин и для таких задач - вызывать функцию, в вашем случае, лучше при закрытии странички.

punsh 02-05-2011 01:47 1668727

kotkovets,
Цитата:

Цитата kotkovets
SOFTWARE\Microsoft\Windows NT »

- это для всех Windows? кажись только для XP

kotkovets 02-05-2011 02:18 1668735

punsh,
Возьмите плагин IPconfig в переменной $R1 - доменное имя компа
Код:


IpConfig::GetHostName
Pop $R0
Pop $R1
MessageBox MB_OK "$R1" IDOK

или вот так, работает почти на всех платформах Windows
Код:

ReadRegStr $R1 HKLM "SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName" "ComputerName"
источник: http://nsis.sourceforge.net/Your_Computer_Name

punsh 03-05-2011 13:12 1669485

Цитата:

Цитата kotkovets
или вот так, работает почти на всех платформах Windows »

вот это подошло!!!

wolkow70 03-05-2011 15:27 1669549

ТОВАРИЩИ ПОМОГИТЕ!
Делаю скрипт для Opera.

Как удалить профиль по адресу:

Documents and Settings\Administrator\Application Data\Opera\ Opera\profile\

Всяко пробовал, никак не получается.

Какая там переменная?

kotkovets 03-05-2011 16:55 1669600

wolkow70,
Слабо, что ли справку посмотреть, а потом клепать дистры, что ли...
Цитата:

$APPDATA — папка с данными учётной записи пользователя
(c:\Documents and Settings\Ваше имя\Application Data\ или c:\Documents and Settings\All Users\Application Data\).
Для неё справедливо замечание SetShellVarContext, равно как и для:
****************************************************
SetShellVarContext all - для всех пользователей
SetShellVarContext current - для текущего пользователя
****************************************************
"$APPDATA\Opera\Opera\profile"

wolkow70 03-05-2011 17:06 1669608

Цитата:

Цитата kotkovets
Слабо, что ли справку посмотреть, а потом клепать дистры, что ли... »

Нет, не слабо. У меня в деинсталляторе уже прописано :

SetShellVarContext current
RMDir /r "$APPDATA\Opera\"
RMDir /r "$LOCALAPPDATA\Opera\"


Но это удаляет профили в папке текущего пользователя, у меня кэш оказался в папке
E:\Documents and Settings\Администратор\Local Settings\Application Data\Opera

Как попасть в директорию профиля администратора? Вот чего нет в справке.

kotkovets 03-05-2011 17:29 1669622

Цитата:

Цитата wolkow70
Как попасть в директорию профиля администратора? »

Попадаем так:
тыц
Код:

!include "MUI2.nsh"

!include "FileFunc.nsh"
!insertmacro GetParent

OutFile "file.exe"
ShowInstDetails show

var FAdmin

!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

Section TEST
  ${GetParent} $DOCUMENTS $FAdmin
  MessageBox MB_OK "$FAdmin" IDOK
SectionEnd


или так : http://forum.oszone.net/post-1552188-884.html

wolkow70 03-05-2011 18:06 1669648

Цитата:

Цитата kotkovets
Попадаем так:
тыц »

Не понял...

Цитата:

Цитата kotkovets

Получил такую шнягу:
http://s006.radikal.ru/i214/1105/85/13f14094f4af.png

Через

SetShellVarContext all
RMDir /r "$APPDATA\Opera\"
RMDir /r "$LOCALAPPDATA\Opera\"

тоже не получается...

wolkow70 03-05-2011 18:49 1669682

Сделал так:

!include "MUI2.nsh"
!include "FileFunc.nsh"
!insertmacro GetParent


var FAdmin

!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

Section "TEST"
${GetParent} $DOCUMENTS $FAdmin
RMDir /r "$FAdmin\Local Settings\Application Data\Opera"
SectionEnd


В результате снесло папку с профилем в

E:\Documents and Settings\User\Local Settings\Application Data\Opera\Opera

Но в папке администратора все на месте.

Тут надо учитывать, что все папки профилей (Администратор, User и ALL user расположены в одной директории и попадают в один шаг....

wolkow70 03-05-2011 19:22 1669712

kotkovets,

Вот так работает!

Section "01"
ReadEnvStr $R0 "PATH"
StrCpy $R0 "E:\Documents and Settings\Администратор\Local Settings\Application Data\Opera"
System::Call 'Kernel32::SetEnvironmentVariableA(t, t) i("PATH", R0).r0'

ReadEnvStr $R0 "PATH"
StrCpy $R0 "E:\Documents and Settings\Администратор\Local Settings\Application Data\Opera"
SetEnv::SetEnvVar "PATH" $R0
RMDir /r "$R0\"
SectionEnd

kotkovets 03-05-2011 19:26 1669714

wolkow70, хочется сказать, о боже... справка рулит

wolkow70 04-05-2011 16:46 1670195

kotkovets,

Работает даже еще проще, просто:

ReadEnvStr $R0 "PATH"
StrCpy $R0 "E:\Documents and Settings\Администратор\Local Settings\Application Data\Opera"
SetEnv::SetEnvVar "PATH" $R0
RMDir /r "$R0\"
SectionEnd

Я себе так сделал через SysDrive:

Var SysDrive

Function un.onInit
SectionSetText ${sec09} "Удалить Opera"
StrCpy $SysDrive $WINDIR 2
FunctionEnd

ReadEnvStr $R0 "PATH"
StrCpy $R0 "$SysDrive\Documents and Settings\Администратор\Local Settings\Application Data\Opera\"
SetEnv::SetEnvVar "PATH" $R0
RMDir /r "$R0\"
;
ReadEnvStr $R1 "PATH"
StrCpy $R1 "$SysDrive\Documents and Settings\Администратор\Application Data\Opera\"
SetEnv::SetEnvVar "PATH" $R1
RMDir /r "$R1\"
SectionEnd

kotkovets 04-05-2011 17:46 1670225

wolkow70
Скажу прямо, не обижайтесь, у меня сложилось впечатление, что вы не имеете ни малейшего понятия об использовании переменных NSIS, системных переменных и переменных окружения.
Вот на кой черта эти записи, въехать никак не могу...
ReadEnvStr $R0 "PATH" - считывает с реестра в переменную $R0 значениие системной переменной %path%
StrCpy $R0 "$SysDrive\Documents and Settings\Администратор\Local Settings\Application Data\Opera\" - и тут же в переменную $R0 помещаете другое значение... ($SysDrive\Documents and Settings\Администратор\Local Settings\Application Data\Opera\)
тупо... причем по ходу извлекая букву системного диска...а вопрос зачем получили значение из реестра в переменную $R0 и тут же ее переписАли :o

wolkow70 04-05-2011 18:19 1670238

Цитата:

Цитата kotkovets
wolkow70
Скажу прямо, не обижайтесь, у меня сложилось впечатление, что вы не имеете ни малейшего понятия об использовании переменных NSIS, системных переменных и переменных окружения.
Вот на кой черта эти записи, въехать никак не могу...
ReadEnvStr $R0 "PATH" - считывает с реестра в переменную $R0 значениие системной переменной %path%
StrCpy $R0 "$SysDrive\Documents and Settings\Администратор\Local Settings\Application Data\Opera\" - и тут же в переменную $R0 помещаете другое значение... ($SysDrive\Documents and Settings\Администратор\Local Settings\Application Data\Opera\)
тупо... причем по ходу извлекая букву системного диска...а вопрос зачем получили значение из реестра в переменную $R0 и тут же ее переписАли »

Вы меня не поняли...
В скрипте у меня только это:
Var SysDrive

Function un.onInit
SectionSetText ${sec09} "Удалить Opera"
StrCpy $SysDrive $WINDIR 2
FunctionEnd

ReadEnvStr $R0 "PATH"
StrCpy $R0 "$SysDrive\Documents and Settings\Администратор\Local Settings\Application Data\Opera\"
SetEnv::SetEnvVar "PATH" $R0
RMDir /r "$R0\"
;
ReadEnvStr $R1 "PATH"
StrCpy $R1 "$SysDrive\Documents and Settings\Администратор\Application Data\Opera\"
SetEnv::SetEnvVar "PATH" $R1
RMDir /r "$R1\"
SectionEnd

Удаляются две папки в разных диреториях.

А то, что я вначале написано это для примера.

А взято все из справки, чего там не правильно, если все работает, как нужно?...

kotkovets 04-05-2011 18:31 1670242

а что так не катит...
Код:

StrCpy $R0 "$SysDrive\Documents and Settings\Администратор\Local Settings\Application Data\Opera\"
SetEnv::SetEnvVar "PATH" $R0
RMDir /r "$R0\

StrCpy $R1 "$SysDrive\Documents and Settings\Администратор\Application Data\Opera\"
SetEnv::SetEnvVar "PATH" $R1
RMDir /r "$R1\"

"
и вообще это просто так можно
управляя пользователями через SetShellVarContext all или SetShellVarContext current
"$LOCALAPPDATA\Opera\"
"$APPDATA\Opera\"

wolkow70 04-05-2011 18:49 1670248

То есть вы хотите сказать , что строка
ReadEnvStr $R0 "PATH" - лишняя?

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


ReadEnvStr $R0 "PATH"
StrCpy $R0 "$R0;C:\MYAPP"
System::Call 'Kernel32::SetEnvironmentVariableA(t, t) i("PATH", R0).r0'

ReadEnvStr $R0 "PATH"
StrCpy $R0 "$R0;C:\MYAPP"
SetEnv::SetEnvVar "PATH" $R0


Цитата:

Цитата kotkovets
и вообще это просто так можно
управляя пользователями через SetShellVarContext all или SetShellVarContext current
"$LOCALAPPDATA\Opera\"
"$APPDATA\Opera\" »

Мы еще вчера выяснили и эксперементально подтвердилось, что в результате в папку администратора не попадаем!
Сносятся папки в в профилях "User" и "All users". А профиль "Администратор" , да еще в русской транскрипции это вообше другое...

А главное в моем варианте ВСЕ РАБОТАЕТ как надо, почему следует считать это тупостью...

wolkow70 04-05-2011 19:06 1670255

Цитата:

Цитата kotkovets
а что так не катит... »

Цитата:

Цитата kotkovets
StrCpy $R0 "$SysDrive\Documents and Settings\Администратор\Local Settings\Application Data\Opera\"
SetEnv::SetEnvVar "PATH" $R0
RMDir /r "$R0\ »

А что тут должно катить, если значению "PATCH" ничего не присвоено?

kotkovets,

Провел эксперемент - закомментировал строки :

;ReadEnvStr $R0 "PATH".

Все равно работает. Вы оказались правы.

kotkovets 04-05-2011 22:47 1670366

:o :) улыбнулось даже..........................................
достаточно так..и усё
Код:

RMDir /r "$SysDrive\Documents and Settings\Администратор\Local Settings\Application Data\Opera\"
Цитата:

Цитата wolkow70
Но ведь она есть в примере справки, а от нее я не отступал.
Вот что буквально приведено в справке:
ReadEnvStr $R0 "PATH" - считывает с реестра в переменную $R0 значениие системной переменной %path%
StrCpy $R0 "$R0;C:\MYAPP" ; дописываем в $R0 C:\MYAPP
System::Call 'Kernel32::SetEnvironmentVariableA(t, t) i("PATH", R0).r0' ; через WinAPI устанавливаем новое значение системной переменной %PATH%»

ДАЛЬШЕ.... как там у вас...
Цитата:

Цитата wolkow70
ReadEnvStr $R0 "PATH"
StrCpy $R0 "$SysDrive\Documents and Settings\Администратор\Local Settings\Application Data\Opera\" ;тут перезапись $R0
SetEnv::SetEnvVar "PATH" $R0 ;вообще это к чему, не пришей, а прибей...%Path%
RMDir /r "$R0\" »

Вот тока значение $R0 остается неизменной после StrCpy. Разницу чуете... :shocked:

wolkow70 05-05-2011 05:08 1670466

Цитата:

Цитата kotkovets
RMDir /r "$SysDrive\Documents and Settings\Администратор\Local Settings\Application Data\Opera\" »

И что NSIS поймет русское название папки?

Инсталлятор я доделал. Все нормально работает.
Но хочу еще доработать. Возник в связи с этим такой вопрос:
У меня перед самой инсталляцией предусмотрена полная очистка системы от следов предыдущей установки Opera. Реализуется первой секцией, в таком виде:

Section "Удаление предыдущей установки Opera" sec01
DeleteRegKey HKLM "SOFTWARE\Classes\Applications\Opera.exe" ""
DeleteRegKey HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\Opera.exe" ""
DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Classes\.wgt" ""
DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Classes\.xht" ""
DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Classes\.xhtm" ""
DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Classes\.xhtml" ""
DeleteRegKey HKLM "SOFTWARE\Classes\Opera.Widget" ""
DeleteRegKey HKLM "SOFTWARE\Classes\Opera.Protocol" ""
DeleteRegKey HKLM "SOFTWARE\Classes\Opera.Widget" ""
DeleteRegKey HKLM "SOFTWARE\Classes\Opera.Extension" ""
DeleteRegKey HKLM "SOFTWARE\Classes\Opera.HTML" ""
DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Clients\Mail\Opera" ""
DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Clients\News\Opera" ""
DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Clients\StartMenuInternet\Opera.exe" ""
RMDir /r "$PROGRAMFILES\Opera"
;
SetShellVarContext current
RMDir /r "$APPDATA\Opera\"
RMDir /r "$LOCALAPPDATA\Opera\"
;
SetShellVarContext all
RMDir /r "$APPDATA\Opera\"
RMDir /r "$LOCALAPPDATA\Opera\"
;
RMDir /r "$SMPROGRAMS\${PRODUCT_NAME}"
Delete "$Desktop\${PRODUCT_NAME}.lnk"
Delete "$QUICKLAUNCH\${PRODUCT_NAME}.lnk"
;
StrCpy $R0 "$SysDrive\Documents and Settings\Администратор\Local Settings\Application Data\Opera\"
SetEnv::SetEnvVar "PATH" $R0
RMDir /r "$R0\"
;
StrCpy $R1 "$SysDrive\Documents and Settings\Администратор\Application Data\Opera\"
SetEnv::SetEnvVar "PATH" $R1
RMDir /r "$R1\"

Вопрос такой: можно ли при этом средствами NSIS произвести бэкап имеющихся профилей, что бы непотерять закладки, пароли, экспресс-панель, историю посещений и т.д?

То есть механизм:
1. Бэкап (желательно созданием архива в директории, в которой создается новый профиль) .
2. Очиста.
3. Новая установка.

kotkovets 05-05-2011 12:39 1670639

Цитата:

Цитата wolkow70
И что NSIS поймет русское название папки? »

а в значении переменной $R0 зелененькие буквы, что ли ))))))))))))))))))))))))))
Цитата:

Цитата wolkow70
Вопрос такой: можно ли при этом средствами NSIS произвести бэкап имеющихся профилей, что бы непотерять закладки, пароли, экспресс-панель, историю посещений и т.д? »

Можно, себе делал так. Берем из архиватора 7-Zip: 7z.dll и 7z.exe
читать дальше »
Код:

OutFile file.exe
!include "LogicLib.nsh"

Page components
Page instfiles

Function .onInit
  InitPluginsDir
  File "/oname=$PLUGINSDIR\7z.dll" "C:\Program Files\7-Zip\7z.dll"
  File "/oname=$PLUGINSDIR\7z.exe" "C:\Program Files\7-Zip\7z.exe"
FunctionEnd

Section "упаковка"
  nsExec::Exec `"$PLUGINSDIR\7z.exe" a "C:\1.7z" "D:\Новая папка"`
  Pop $0 ;код возврата, если со стека возвратится в переменную $0 - 0 то, успешно
  StrCmp $0 0 +2
  Call Errors
SectionEnd

Section "распаковка"
  nsExec::Exec `"$PLUGINSDIR\7z.exe" x "C:\1.7z" -o"C:\1" -y`
  Pop $0
  StrCmp $0 0 +2
  Call Errors
SectionEnd

Function Errors
  ${Select} $0
    ${Case2} Error 2
      StrCmp $0 Error 0 +2
      MessageBox MB_ICONSTOP|MB_OK "Ошибка запуска! Файл 7z.exe не найден!" IDOK
      StrCmp $0 2 0 +2
      MessageBox MB_ICONSTOP|MB_OK "Фатальная ошибка!" IDOK
      Abort
    ${Case} 1
      MessageBox MB_ICONINFORMATION|MB_OK "О_о... Что то не то...!" IDOK
    ${Case} 7
      MessageBox MB_ICONSTOP|MB_OK "Ошибка командной строки!" IDOK
      Abort
  ${EndSelect}
FunctionEnd


Все дополнительные ключи, параметры из справки 7-Zip - там все расписано.
Просьба не задавать откровенно глупые и ламерские вопросы, лучше лишний раз проверить, сделать отладку, почитать справки.

shanishki 05-05-2011 16:50 1670767

Прошу помощи!
Дело в том что меня задолбал яндекс.бар в различных инсталляторах NSIS (exe).
Можно ли из инсталяшки удалять YandexPackSetup.msi ?

kotkovets 05-05-2011 17:22 1670790

Цитата:

Цитата shanishki
Можно ли из инсталяшки удалять YandexPackSetup.msi ? »

нет, только полной переупаковкой инсталлятора, причем скрипт с нуля придется писать и знать процесс инсталляции "оригинала"

wolkow70 05-05-2011 18:40 1670833

Мне большую помощь оказывает программа RegSnap.
Делаю снимок до инсталляции, после инсталляции (до запуска программы) и снимок после первого запуска программы и смотрю последовательность и состав изменений в реестре и файловой системе.
Дальше уже проще...
Еще полезна утилита RegDllView.exe, можно после устанвоки посмотреть, какие библиотеки зарегистрировались при установке программы.
Конвертор Reg2NSIS оказывает большую помощь, но комманды часто коряво конвертит....
Хороший шаблон нужно себе сделать, что бы не тратить зря время, и дело пойдет.



Я себе в сборке eMule так делал без упаковки:

IfFileExists "$INSTDIR\config\*.ini" 0 +2
IfFileExists "$INSTDIR\config\*.dat" 0 +2
IfFileExists "$INSTDIR\config\*.met" 0 +2
IfFileExists "$INSTDIR\config\*.txt" 0 +2
IfFileExists "$INSTDIR\config\*.tmpl" 0 +2
IfFileExists "$INSTDIR\config\*.bak" 0 +2
IfFileExists "$INSTDIR\config\*.old" 0 +2
MessageBox MB_YESNO|MB_ICONQUESTION "В папке назначения обнаружены файлы настроек предыдущей установки eMule, хотите сохранить файлы ранее сделанных настроек программы? (Вы сможете найти их в папке $INSTDIR\config\BACKUP)" IDNO no_backup
CreateDirectory "$INSTDIR\config\BACKUP\"
CopyFiles "$INSTDIR\config\*.ini" "$INSTDIR\config\BACKUP\"
CopyFiles "$INSTDIR\config\*.dat" "$INSTDIR\config\BACKUP\"
CopyFiles "$INSTDIR\config\*.met" "$INSTDIR\config\BACKUP\"
CopyFiles "$INSTDIR\config\*.txt" "$INSTDIR\config\BACKUP\"
CopyFiles "$INSTDIR\config\*.tmpl" "$INSTDIR\config\BACKUP\"
CopyFiles "$INSTDIR\config\*.bak" "$INSTDIR\config\BACKUP\"
CopyFiles "$INSTDIR\config\*.old" "$INSTDIR\config\BACKUP\"

kotkovets 05-05-2011 22:39 1670950

Цитата:

Цитата wolkow70
CreateDirectory "$INSTDIR\config\BACKUP\"
CopyFiles "$INSTDIR\config\*.ini" "$INSTDIR\config\BACKUP\"
CopyFiles "$INSTDIR\config\*.dat" "$INSTDIR\config\BACKUP\"
CopyFiles "$INSTDIR\config\*.met" "$INSTDIR\config\BACKUP\"
CopyFiles "$INSTDIR\config\*.txt" "$INSTDIR\config\BACKUP\"
CopyFiles "$INSTDIR\config\*.tmpl" "$INSTDIR\config\BACKUP\"
CopyFiles "$INSTDIR\config\*.bak" "$INSTDIR\config\BACKUP\"
CopyFiles "$INSTDIR\config\*.old" "$INSTDIR\config\BACKUP\" »

попроще можно жешь...
Код:

CreateDirectory "$INSTDIR\config\BACKUP\"
CopyFiles /silent "$INSTDIR\config\*" "$INSTDIR\config\BACKUP"


wolkow70 06-05-2011 06:16 1671050

Цитата:

Цитата kotkovets
попроще можно жешь... »

Там было много лишних файлов, поэтому сделал по маске.
В принципе, для Opera попробую сделаю как Вы написали, там трудно понять, что лишнее, а что нет. Надо разобраться какие файлы нужны, и продумать механизм восстановления настроек по выбору.
Например:
секция: "Восстановление закладок"
секция: "Восстановление паролей"
секция: "Восстановление Экспресс-панели"
секция "Восстановление истории посещений"
и т.д.
Сам то инсталлятор Opera я сделал. Теперь наворачивать его надо.

sawe 06-05-2011 22:15 1671536

Хотел бы посоветоваться с Мэтрами NSIS-а!
Windows 7 и Vista имеет ряд ограничений на папку C:\Program Files.
При установке некоторых программ а так же игр (не имеющий профиля), следует выбирать другую папку установки.
То есть при установки в Windows 7 и Vista предлагать по умолчанию другую папку (к примеру Games\XXX), в других Windows предлагать стандартно C:\Program Files\XXX.
Написал простую логику, но при выборе другой папки или диска терялась \XXX , переписал заново вроде всё работает, но я не уверен полностью.
Прошу проверить!

Код:

  LoadLanguageFile "${NSISDIR}\Contrib\Language files\Russian.nlf"
  XPStyle on

!include WinVer.nsh

  Var SysDrive
  Var INSTIPE
  Var SETUPDIR

Function .onInit
  Pop $0
  StrCpy $INSTIPE "$PROGRAMFILES"
 
  ${If} ${IsWinVista}
    StrCpy $SysDrive $WINDIR 2
    StrCpy $INSTIPE "$SysDrive\Games"
  ${ElseIf} ${IsWin7}
  StrCpy $SysDrive $WINDIR 2
    StrCpy $INSTIPE "$SysDrive\Games"
  ${EndIf}
 
  StrCpy $INSTDIR "$INSTIPE\XXX"
  StrCpy $SETUPDIR "$INSTDIR"
FunctionEnd

  OutFile "XXX_setup.exe"     
  InstallDir "$SETUPDIR\XXX"
 
Page directory
 
Section -XXX
SectionEnd


kotkovets 06-05-2011 23:57 1671606

sawe,
Все нормально работает.
В функции .onInit уберите Pop $0 - нехорошо обращаться к пустому стэку.
А я бы сделал, гораздо проще:
Код:

  LoadLanguageFile "${NSISDIR}\Contrib\Language files\Russian.nlf"
  XPStyle on
!include WinVer.nsh
 

Function .onInit
 ${If} ${AtLeastWinVista} ;начиная от WinVista и выше
    Var /global SysDrive ; иницилизируем здесь, в ниже версиях Windows SysDrive - не используется
    StrCpy $SysDrive $WINDIR 2
    StrCpy $INSTDIR "$SysDrive\Games\XXX"
 ${Else}
    StrCpy $INSTDIR "$PROGRAMFILES\XXX"
 ${EndIf}
FunctionEnd

  OutFile "XXX_setup.exe"

Page directory

Section -XXX
SectionEnd


wolkow70 07-05-2011 10:11 1671742

kotkovets,
В справке тоже много не понятного.

Вот сделал так:

IfFileExists "$EXEDIR\pkey.txt" 0 NoThere
MessageBox MB_OK "Файл лицензии есть"
CopyFiles /silent "$EXEDIR\pkey.txt" "$INSTDIR\pkey.txt"
Goto Done
NoThere:
MessageBox MB_OK "Файла лицензии нет"
Done:
SectionEnd
Не понятно, как теперь скрыть MB если запускать с ключом /S через IfSilent...

kotkovets 07-05-2011 11:55 1671794

Цитата:

Цитата wolkow70
Не понятнео, как теперь скрыть MB если запускать с ключом /S через IfSilent. »

Есть 2 способа, через ключ /SD
Код:

MessageBox MB_OK "Файл лицензии есть" /SD IDOK
Через флаг тихого режима.
Код:

IfSilent +2
MessageBox MB_OK "Файл лицензии есть"

Все это есть и многое другое в
Справочнике по NSIS

sawe 07-05-2011 13:32 1671843

Цитата:

Цитата kotkovets
Все нормально работает.
В функции .onInit уберите Pop $0 - нехорошо обращаться к пустому стэку.
А я бы сделал, гораздо проще: »

Спасибо за консультацию, но ты тоже наступил на те же грабли или не прочёл последнюю строку
Цитата:

но при выборе другой папки или диска терялась \XXX , переписал заново вроде всё работает, но я не уверен полностью.
убрать в начале Pop $0 - это у меня ошибка закралась (перед ним был ещё код, который нужно было очистить)

wolkow70 07-05-2011 13:52 1671853

Цитата:

Цитата kotkovets
Все это есть и многое другое в
Справочнике по NSIS »

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

Кто нибудь разъяснил бы на примере скрипта AIMP что там реализовано.

Пока написал так:

StrCpy $WindowCaption "${PRODUCT_NAME} ${PRODUCT_VERSION}"
${WordReplace} "$EXEFILE" ".exe" ".ini" "+" $IniFile
StrCpy $IniFile "$EXEDIR\$IniFile"

;gMode detection
StrCpy $gMode 0
${GetOptions} $CMDLINE "/G" $0
;if not found /G then exit
IfErrors CheckViolation 0
;When Silent setup then ignoring /G
IfSilent +4 0
StrCpy $gMode 1
Delete $IniFile
StrCpy $WindowCaption "Генератор файла ответов ${PRODUCT_NAME}"

Запускается генератор и все, что дальше делать не понятно....

kotkovets 07-05-2011 13:55 1671856

Цитата:

Цитата sawe
но при выборе другой папки или диска терялась \XXX , переписал заново вроде всё работает, но я не уверен полностью. »

Код:

Function .onInit
 ${If} ${AtLeastWinVista} ;начиная от WinVista и выше
    Var /global SysDrive ; иницилизируем здесь, в ниже версиях Windows SysDrive - не используется
    StrCpy $SysDrive $WINDIR 2
    StrCpy $INSTDIR "$SysDrive\Games\XXX"
 ${Else}
    StrCpy $INSTDIR "$PROGRAMFILES\XXX"
 ${EndIf}
FunctionEnd

InstallDir "$INSTDIR\XXX"

Цитата:

Цитата wolkow70
Запускается генератор и все, что дальше делать не понятно.... »

и мне не понятно, что вы дальше хотите сделать

wolkow70 07-05-2011 15:09 1671890

Цитата:

Цитата kotkovets
и мне не понятно, что вы дальше хотите сделать »

Создать INI файл со сценарием установки... И разобраться в процессе его создания.

kotkovets 07-05-2011 20:07 1672058

Цитата:

Цитата wolkow70
Создать INI файл со сценарием установки... И разобраться в процессе его создания »

Вот накидал небольшой примерчик, с описанием на основе фейса MUI2, генератор файла ответов через ключ /G
Читать внимательно комменты в скрипте
Код:

!include "MUI2.nsh"

!include "TextFunc.nsh"
!include "WordFunc.nsh"
!include "LogicLib.nsh"

OutFile "setup.exe"

 !define MUI_PAGE_CUSTOMFUNCTION_SHOW SHOWWELCOME ;функция при открытии стр. приветствия
!insertmacro MUI_PAGE_WELCOME
 !define MUI_PAGE_CUSTOMFUNCTION_SHOW SHOWDIRECTORY ;функция при открытии стр. приветствия
!insertmacro MUI_PAGE_DIRECTORY
 !define MUI_PAGE_CUSTOMFUNCTION_SHOW SHOWCOMPONENTS ;функция при открытии стр. компонентов
!insertmacro MUI_PAGE_COMPONENTS
 !define MUI_PAGE_CUSTOMFUNCTION_PRE PREINSTFILES ;функция перед открытием стр. установки
!insertmacro MUI_PAGE_INSTFILES
 !define MUI_PAGE_CUSTOMFUNCTION_SHOW SHOWFINISH
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "Russian"

Var GMODE
Var CAPTION
Var INIFILE
Var SysDrive
Var SUCCES_SECTION

InstallDir "$PROGRAMFILES\SOFT"

Function .OnInit
  StrCpy $SysDrive $WINDIR 2
  StrCpy $GMODE 0 ;если обычный режим, то $GMODE = 0
  StrCpy $CAPTION "Обычный режим"
  ${WordReplace} "$EXEFILE" ".exe" ".ini" "+" "$INIFILE" ;подменяем расширение на ini c тем же именем, что и установщик
  StrCpy $INIFILE "$EXEDIR\$INIFILE" ;$INIFILE - путь, где будет создан файл конфигурации
  ${GetOptions} $CMDLINE "/G" $0
  ${IfNot} ${Silent} ; условие работы генератора, если не тихий режим
  ${AndIfNot} ${Errors} ; И не установлен флаг ошибки
  ;здесь команды выполняться будут в режиме генератора, до конца конструкции ${EndIf}
    StrCpy $GMODE 1 ;с ключом /G, $GMODE = 1, режим генератора
    StrCpy $CAPTION "Генератор ответов" ;меняем название заголовка
    ;------bla..bla
    ;------bla..bla
    IfFileExists "$INIFILE" 0 +2
    Delete "$INIFILE" ;удаляем предыдущий файл конфигурации
  ${EndIf}
FunctionEnd

Caption "$CAPTION"

;==========================================================================================
Function SHOWWELCOME
  ${If} $GMODE = 1 ;режим генератора
    ${NSD_SetText} $mui.WelcomePage.Title "Добро пожаловать! Это генератор ответов."
    ${NSD_SetText} $mui.WelcomePage.Text "Описание возможностей генератора:$\nbla..bla$\nbla..bla"
  ${EndIf}
FunctionEnd
;==========================================================================================
Function SHOWDIRECTORY
 ${If} $GMODE = 1 ;режим генератора
    ${NSD_SetText} $mui.DirectoryPage.Text \
  "Программа запишет в файл конфигурации путь установки программы.$\r\
    Этот путь подхватится в тихом режиме запуска установщика.$\r\
    Файл конфигурации создатся с таким же именем, как и установщик.$\r\
    Вы можете изменить путь выбора папки установки кнопкой  «Обзор...»"
 ${EndIf}
FunctionEnd
;==========================================================================================
Function SHOWCOMPONENTS
 ${If} $GMODE = 1 ;режим генератора
  ${NSD_SetText} $mui.ComponentsPage.Text \
  "Выберите компоненты которые вы хотите устанавливать в тихом режиме$\n\
  Нажмите кнопку «Создать» , что бы создать файл конфигурации установки"
  GetDlgItem $0 $HWNDPARENT 1
  ${NSD_SetText} $0 "Создать"
 ${EndIf}
FunctionEnd
;=========================================================================================
Function SHOWFINISH
 ${If} $GMODE = 1 ;режим генератора
    ${NSD_SetText} $mui.FinishPage.Title "Завершение работы Мастера создания файла ответов."
    ${NSD_SetText} $mui.FinishPage.Text "Файл ответов готов!"
 ${EndIf}
FunctionEnd
;=========================================================================================
Function PREINSTFILES ;это функция будет выполнена только в режиме генератора
 ${If} $GMODE = 1 ;режим генератора
    WriteINIStr "$INIFILE" "DIRECTORY" "ISTALLDIR" "$INSTDIR" ;создаем файл конфигурации
 ${EndIf}
FunctionEnd

;===========================================================================================
;  УСЛОВИЕ ВЫПОЛНЕНИЯ ВСЕХ КОМАНД В СЕКЦИИ ТОЛЬКО, ЕСЛИ ПЕРЕМЕННАЯ $SUCCES_SECTION = 1    !
;===========================================================================================
/* МАКРОС ЗАПИСИ ОТМЕЧЕННЫХ СЕКЦИЙ В ФАЙЛ КОНФИГУРАЦИИ
 ${GetSecWriteSucces} индетификатор_секции
  пример:
    [Sections]
    Test=1 - секция отмечена
    Test=0 - секция не отмечена
 Если не отмечена секция, то записи в файле конфигурации не будет, т.е равносильно тому,
 что переменная $SUCCES_SECTION = 0
*/
;==========================================================================================
!define GetSecWriteSucces "!insertmacro _WriteSection"
!macro _WriteSection secID
    StrCpy $SUCCES_SECTION 1 ;по умолчанию ставим $SUCCES_SECTION = 1
    StrCmp $GMODE 1 WriteMode ;проверяем режим установки, если $GMODE = 1, режим генератора
    IfSilent 0 EndMarco ;проверяем тихий режим, если не тихий режим - выход из макроса
    IfFileExists "$INIFILE" 0 EndMarco ;проверяем наличие файла конфигурации
    ClearErrors ;очищаем флаг ошибки прунудительно, перед чтением файла конфигурации
    ReadINIStr $SUCCES_SECTION "$INIFILE" "Sections" "${secID}" ;состояние секкций помещаем в $SUCCES_SECTION
    IfErrors 0 +2 ;проверка на ошибки в чтении файла конфигурации
    StrCpy $SUCCES_SECTION 0 ;в случае ошибки $SUCCES_SECTION = 0
    Goto EndMarco
    WriteMode:
    StrCpy $SUCCES_SECTION 0 ; в режиме генератора $SUCCES_SECTION = 0
    WriteINIStr $INIFILE Sections ${secID} 1
    EndMarco:
!macroend
;==========================================================================================
; УСЛОВИЕ ВЫПОЛНЕНИЯ ВСЕХ КОМАНД В СЕКЦИИ ТОЛЬКО, ЕСЛИ ПЕРЕМЕННАЯ $SUCCES_SECTION = 1    !
;==========================================================================================
Section "-Install"
;чтение из файла ответов путь установки и перезапись значения $INSTDIR
;Условие чтения и перезаписи:
;        ТОЛЬКО НЕ В РЕЖИМЕ ГЕНЕРАТОРА И ТОЛЬКО В ТИХОМ РЕЖИМЕ И ПРИ НАЛИЧИИ ФАЙЛА ОТВЕТОВ
  ${If} $GMODE = 0
  ${AndIf} ${Silent}
  ${AndIf} ${FileExists} "$INIFILE"
    ClearErrors
    ReadINIStr "$R0" "$INIFILE" "DIRECTORY" "ISTALLDIR"
    ${WordReplace} $R0 "%programfiles%" "$PROGRAMFILES" "+" $R1
    ${WordReplace} $R1 "%windir%" "$WINDIR" "+" $R0
    ${WordReplace} $R0 "%appdata%" "$APPDATA" "+" $R1
    ${WordReplace} $R1 "%systemdrive%" "$SysDrive" "+" $R0
    StrCpy $INSTDIR $R0
 ${EndIf}
  ${If} $GMODE = 0 ;выполнение всегда, только не в режиме генератора
      ;--------
    /*
        тут ваш код!,  эта секция всегда должна выполняться
        команды пишем до конца конструкции ${EndIf}
    */
    ;--------
  ${EndIf}
SectionEnd

Section "Test" Test ; Test - индетификатор секции
 ${GetSecWriteSucces} Test
 ${If} $SUCCES_SECTION = 1
    ;MessageBox MB_OK "Test = $SUCCES_SECTION" IDOK
    ;--------
    /*
    здесь пишите свои команды
    до конца конструкции ${EndIf}
  */
  ;--------
 ${EndIf}
SectionEnd

Section "Test1" Test1 ; Test1 - индетификатор секции
 ${GetSecWriteSucces} Test1
 ${If} $SUCCES_SECTION = 1
    ;MessageBox MB_OK "Test1 = $SUCCES_SECTION" IDOK
    ;--------
    /*
    здесь пишите свои команды
    до конца конструкции ${EndIf}
  */
  ;--------
 ${EndIf}
SectionEnd
 
Section "Test2" Test2 ; Test2 - индетификатор секции
 ${GetSecWriteSucces} Test2
 ${If} $SUCCES_SECTION = 1
  ;MessageBox MB_OK "Test2 = $SUCCES_SECTION" IDOK
  ;--------
  /*
  здесь пишите свои команды
  до конца конструкции ${EndIf}
  */
  ;--------
 ${EndIf}
SectionEnd


wolkow70 08-05-2011 12:05 1672389

Цитата:

Цитата kotkovets
Спасибо ВСЕМ за то, что тратите свое время, что бы ПОМОЧЬ МНЕ »


Получается, что это нам надо сказать:
Спасибо Вам, за то, что тратите свое время, что бы ПОМОЧЬ НАМ!

wolkow70 11-05-2011 12:30 1674197

kotkovets,

Делаю установщик на программу FlylinkDC++.
В общем на XP она и в Program Files хорошо ставится и работает.
А на Windows 7 рекомендуют ставить папку с программой в корень диска.
Я так понимаю, что вышеприведенный пример:

Function .onInit
${If} ${AtLeastWinVista} ;начиная от WinVista и выше
Var /global SysDrive ; иницилизируем здесь, в ниже версиях Windows SysDrive - не используется
StrCpy $SysDrive $WINDIR 2
StrCpy $INSTDIR "$SysDrive\Games\XXX"
${Else}
StrCpy $INSTDIR "$PROGRAMFILES\XXX"
${EndIf}
FunctionEnd

InstallDir "$INSTDIR\XXX"

можно попробовать????

kotkovets 11-05-2011 13:47 1674251

Цитата:

Цитата wolkow70
можно попробовать???? »

Попробовать можно все, если религия позволяет...
Цитата:

Цитата wolkow70
А на Windows 7 рекомендуют ставить папку с программой в корень диска »

Рекомендуют из-за прав(привелегий) пользователя в Vista/Win7
http://forum.oszone.net/post-1459797-559.html и здесь продолжение http://forum.oszone.net/post-1460492-563.html
К тому же пример определения права пользователя и сколько прав у пользователя (а значит меняем папку распаковки) есть в справочнике по NSIS.

wolkow70 11-05-2011 18:39 1674476

Цитата:

Цитата kotkovets
К тому же пример определения права пользователя и сколько прав у пользователя (а значит меняем папку распаковки) есть в справочнике по NSIS. »

Пробовал я так сделать, на семерке дает добро в Программы.. Почему-то....

kotkovets 11-05-2011 21:49 1674589

Цитата:

Цитата wolkow70
Пробовал я так сделать, на семерке дает добро в Программы.. Почему-то.... »

потому что, пользователь с правами админа, а если пользователь без прав админа(и его наследников), то винда вам не даст установить в папку %PROGRAMFILES% ничего и недаст добро в реестре запись (изменение) на корневую ветку HKEY_LOCAL_MACHINE
Определить какими правами обладает пользователь поможет стандартный плагин в составе NSIS
Код:

UserInfo::GetOriginalAccountType
Pop $0
MessageBox MB_OK "$0"


wolkow70 12-05-2011 08:22 1674725

Товарищи, подскажите, что поправить :

WriteIniStr "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}"
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Веб-сайт ${PRODUCT_NAME}.lnk" "$INSTDIR\${PRODUCT_NAME}.url"

Ярлык интернета создается и работает, но характерная интернет-иконка в меню Пуск отсутствует. Просто никакой значок. Мне надо, чтобы иконку интернета подключить к ссылке.

kotkovets 12-05-2011 10:40 1674777

Цитата:

Цитата wolkow70
Просто никакой значок. Мне надо, чтобы иконку интернета подключить к ссылке »

А чем плох ОБЫЧНЫЙ ярлык?
Код:

CreateShortCut  "$SMPROGRAMS\${PRODUCT_NAME}\Сайт ${PRODUCT_NAME}.lnk" "http://wwww.aimp.ru"  "" "$PROGRAMFILES\Internet Explorer\iexplore.exe" 1

wolkow70 12-05-2011 10:49 1674785

Цитата:

Цитата kotkovets
А чем плох ОБЫЧНЫЙ ярлык? »

1. Полагал, что значок интернета должен сам отражаться на ярлыках url.
2. Браузер по умолчанию Opera.
3. Как обычно все сделал сложнее:

- создал интернет-иконку нейтрального вида, а далее:


!define PRODUCT_WEB_SITE "http://www.xnview.com"

!macro CreateInternetShortcut FILENAME URL ICONFILE ICONINDEX
WriteINIStr "${FILENAME}.url" "InternetShortcut" "URL" "${URL}"
WriteINIStr "${FILENAME}.url" "InternetShortcut" "IconFile" "${ICONFILE}"
WriteINIStr "${FILENAME}.url" "InternetShortcut" "IconIndex" "${ICONINDEX}"
!macroend

!insertmacro CreateInternetShortcut \
"$SMPROGRAMS\${PRODUCT_NAME}\Веб-сайт ${PRODUCT_NAME}" \
"${PRODUCT_WEB_SITE}" \
"$INSTDIR\url.ico" "0"
SectionEnd


Получилось здорово!

wolkow70 12-05-2011 17:37 1675048

kotkovets,

Внедряю функцию сохранения настроек для Opera. Столкнулся с проблемой:

Section "PreInstall" sec01
IfFileExists "$APPDATA\Opera\Opera\*.ini" 0 check_localappdata
MessageBox MB_YESNO|MB_ICONQUESTION "Файлы настроек Opera обнаружены в профиле Пользователя. Выполнить резервное копирование файлов настроек для дальнейшего использования? (Будут находиться в каталоге $DOCUMENTS\Opera Backup)" IDNO no_backup
CreateDirectory "$DOCUMENTS\Opera Backup\"
CopyFiles /silent "$APPDATA\Opera\Opera\*.adr" "$DOCUMENTS\Opera Backup\"
CopyFiles /silent "$APPDATA\Opera\Opera\*.ini" "$DOCUMENTS\Opera Backup\"
CopyFiles /silent "$APPDATA\Opera\Opera\*.xml" "$DOCUMENTS\Opera Backup\"
CopyFiles /silent "$APPDATA\Opera\Opera\*.dat" "$DOCUMENTS\Opera Backup\"
CopyFiles /silent "$APPDATA\Opera\Opera\*.js" "$DOCUMENTS\Opera Backup\"
check_localappdata:
IfFileExists "$LOCALAPPDATA\Opera\Opera\cache" 0 check_programdir
MessageBox MB_YESNO|MB_ICONQUESTION "Кэш браузера, файлы почты и иные данные обнаружены в профиле Пользователя. Выполнить резервное копирование данных для дальнейшего использования? (Будут находиться в каталоге $DOCUMENTS\Opera Backup)" IDNO no_backup
CopyFiles /silent "$LOCALAPPDATA\Opera\Opera\cache\*" "$DOCUMENTS\Opera Backup\"
CopyFiles /silent "$LOCALAPPDATA\Opera\Opera\mail\*" "$DOCUMENTS\Opera Backup\"
CopyFiles /silent "$LOCALAPPDATA\Opera\Opera\application_cache\*" "$DOCUMENTS\Opera Backup\"
CopyFiles /silent "$LOCALAPPDATA\Opera\Opera\icons\*" "$DOCUMENTS\Opera Backup\"
CopyFiles /silent "$LOCALAPPDATA\Opera\Opera\thumbnails\*" "$DOCUMENTS\Opera Backup\"
CopyFiles /silent "$LOCALAPPDATA\Opera\Opera\widgets\*" "$DOCUMENTS\Opera Backup\"
CopyFiles /silent "$LOCALAPPDATA\Opera\Opera\vps\*" "$DOCUMENTS\Opera Backup\"
CopyFiles /silent "$LOCALAPPDATA\Opera\Opera\opcashe\*" "$DOCUMENTS\Opera Backup\"
CopyFiles /silent "$LOCALAPPDATA\Opera\Opera\temporary_downloads\*" "$DOCUMENTS\Opera Backup\"
goto no_backup
check_programdir:
IfFileExists "$INSTDIR\profile\*.ini" 0 no_backup
MessageBox MB_YESNO|MB_ICONQUESTION "Файлы настроек Opera обнаружены в папке назначения. Выполнить резервное копирование файлов настроек для дальнейшего использования? (Будут находиться в каталоге $PROGRAMFILES\Opera Backup)" IDNO no_backup
CreateDirectory "$PROGRAMFILES\Opera Backup\"
CopyFiles "$INSTDIR\Profile\*.xml" "$PROGRAMFILES\Opera Backup\"
CopyFiles "$INSTDIR\Profile\*.ini" "$PROGRAMFILES\Opera Backup\"
CopyFiles "$INSTDIR\Profile\*.adr" "$PROGRAMFILES\Opera Backup\"
CopyFiles "$INSTDIR\Profile\*.dat" "$PROGRAMFILES\Opera Backup\"
CopyFiles "$INSTDIR\Profile\*.js" "$PROGRAMFILES\Opera Backup\"
no_backup:

В общем, резервные копии создаются, но в этом месте:
CopyFiles /silent "$LOCALAPPDATA\Opera\Opera\cache\*" "$DOCUMENTS\Opera Backup\"
CopyFiles /silent "$LOCALAPPDATA\Opera\Opera\mail\*" "$DOCUMENTS\Opera Backup\"
CopyFiles /silent "$LOCALAPPDATA\Opera\Opera\application_cache\*" "$DOCUMENTS\Opera Backup\"
CopyFiles /silent "$LOCALAPPDATA\Opera\Opera\icons\*" "$DOCUMENTS\Opera Backup\"
CopyFiles /silent "$LOCALAPPDATA\Opera\Opera\thumbnails\*" "$DOCUMENTS\Opera Backup\"
CopyFiles /silent "$LOCALAPPDATA\Opera\Opera\widgets\*" "$DOCUMENTS\Opera Backup\"
CopyFiles /silent "$LOCALAPPDATA\Opera\Opera\vps\*" "$DOCUMENTS\Opera Backup\"
CopyFiles /silent "$LOCALAPPDATA\Opera\Opera\opcashe\*" "$DOCUMENTS\Opera Backup\"
CopyFiles /silent "$LOCALAPPDATA\Opera\Opera\temporary_downloads\*" "$DOCUMENTS\Opera Backup\"
копируются как сами папки , так и еще файлы в них содержащиеся отдельно. В результате получается каша...
Хочу посоветоваться в чем может быть дело?

kotkovets 12-05-2011 18:09 1675071

wolkow70, вечно вы все перевернете с головы на ноги в тех местах, где совершенно не нужно..рекурсия знаете ли вы...
ну чего уж проще...
Код:

CopyFiles /silent "C:\Documents and Settings\АТС\Рабочий стол\договор" "C:\"
целиком папка договор (и все, что в ней находится) с рабочего стола окажется на диске С:\

wolkow70 12-05-2011 18:36 1675095

Цитата:

Цитата kotkovets
попроще можно жешь...
Код:
CreateDirectory "$INSTDIR\config\BACKUP\"
CopyFiles /silent "$INSTDIR\config\*" "$INSTDIR\config\BACKUP" »

Не ваша ли рекомендация?

И мне не надо всю папку копировать, а выборочно папки из нее. Поэтому попробовал так.

Убрал \* и нормально стало копироваться.

CopyFiles /silent "$LOCALAPPDATA\Opera\Opera\cache" "$DOCUMENTS\Opera Backup\"
CopyFiles /silent "$LOCALAPPDATA\Opera\Opera\mail" "$DOCUMENTS\Opera Backup\"

kotkovets 12-05-2011 21:58 1675219

wolkow70,
исходя из-за каких задач...
CreateDirectory "$INSTDIR\config\BACKUP"
CopyFiles /silent "$INSTDIR\config\*" "$INSTDIR\config\BACKUP"

одно и тоже но... разницу видете - я думаю, что вы не видете :lol:
CreateDirectory "$INSTDIR\config\BACKUP"
CopyFiles /silent "$INSTDIR\config" "$INSTDIR\config\BACKUP"

wolkow70 13-05-2011 06:31 1675371

Цитата:

Цитата kotkovets
wolkow70,
исходя из-за каких задач...
CreateDirectory "$INSTDIR\config\BACKUP"
CopyFiles /silent "$INSTDIR\config\*" "$INSTDIR\config\BACKUP"
одно и тоже но... разницу видете - я думаю, что вы не видете
CreateDirectory "$INSTDIR\config\BACKUP"
CopyFiles /silent "$INSTDIR\config" "$INSTDIR\config\BACKUP" »

Разница в наличии \*
Вот я и написал, что убрал и все заработало.
А что касается задач, то про эту же задачу и шла речь.
Насколько я помню \* означает, что папка будет копироваться со всем вложенным.
Оно и копировалось, только почему-то дублировалось - копировались папки с файлами, и еще файлы отдельно....

sawe 13-05-2011 15:35 1675690

Прошу прощения за возможный флуд. :help:
Меня интересует реальный пример заказной страницы с использованием MUI2 и nsDialog.
Страница должна содержать две ${NSD_CreateCheckBox} с поддержкой флагов и памятью,
для выбора ярлыков на Рабочий стол и Быстрый запуск и ниже две радио кнопки для выбора текущего или всех пользователей.
И возможно ли это реализовать без дополнительных секций?

Так же, хотелось бы увидеть имитацию страницы директории в nsDialog с нормальной кнопкой Обзор...
За ранее благодарен! :clapping:

kotkovets 13-05-2011 23:28 1675930

Цитата:

Цитата sawe
Так же, хотелось бы увидеть имитацию страницы директории в nsDialog с нормальной кнопкой Обзор... »

Все есть и примеры в папке NSIS\Examples\nsDialogs и читать тут обязательно NSIS\Docs\nsDialogs\Readme.html
В общем пример для всех.
тыц
Код:

!include "MUI2.nsh"
!include "FileFunc.nsh"
!insertmacro MUI_PAGE_WELCOME
Page custom fnCustomShow fnCustomLeave
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"
OutFile "nsdSetup.exe"
ShowInstDetails show
InstallDir "$PROGRAMFILES"
Var Text
Var Dialog
Var Radio1
Var Radio2
Var Check1
Var Check2
Var CheckBox1
Var CheckBox2
Var RadioButton1
Var RadioButton2
Var BrowseButton

Function fnCustomShow
    !insertmacro MUI_HEADER_TEXT "O-па!" \
    "Вот оно чё Михалыч!"
  nsDialogs::Create 1018
      Pop $Dialog
/******************************************************************************/
      ${NSD_CreateCheckBox} 0u 0u 100u 10u "Ярлык на рабочий стол"
      Pop $CheckBox1
      ${NSD_OnClick} $CheckBox1 CheckBox1 ;обработка события на клик
      ${If} $Check1 == 1
        ${NSD_SetState} $CheckBox1 1
      ${ElseIf} $Check1 == 0
        ${NSD_SetState} $CheckBox1 0
      ${Else}
        ${NSD_SetState} $CheckBox1 1
      ${EndIf}
/******************************************************************************/
      ${NSD_CreateCheckBox} 0u 15u 140u 10u "Ярлык на панель быстрого запуска"
      Pop $CheckBox2
      ${NSD_OnClick} $CheckBox2 CheckBox2
      ${If} $Check2 == 1
        ${NSD_SetState} $CheckBox2 1
      ${ElseIf} $Check2 == 0
        ${NSD_SetState} $CheckBox2 0
      ${Else}
        ${NSD_SetState} $CheckBox2 0
      ${EndIf}
/******************************************************************************/
      ${NSD_CreateRadioButton} 192u 0u 120u 10u "Для текущего пользователя"
      Pop $RadioButton1
      ${NSD_OnClick} $RadioButton1 RadioButton1
/******************************************************************************/
      ${NSD_CreateRadioButton} 192u 15u 120u 10u "Для всех пользователей"
      Pop $RadioButton2
      ${NSD_OnClick} $RadioButton2 RadioButton2
/******************************************************************************/
      ${If} $Radio1 == 1
      ${OrIf} $Radio2 == 0
          ${NSD_SetState} $RadioButton1 1
          ${NSD_SetState} $RadioButton2 0
      ${ElseIf} $Radio1 == 0
      ${OrIf} $Radio2 == 1
          ${NSD_SetState} $RadioButton1 0
          ${NSD_SetState} $RadioButton2 1
      ${Else}
          ${NSD_SetState} $RadioButton1 1
          ${NSD_SetState} $RadioButton2 0
      ${EndIf}
      ${NSD_CreateBrowseButton} 250u 70u 50u 13u "Обзор..."
      Pop $BrowseButton
      ${NSD_OnClick} $BrowseButton BrowseButton
/******************************************************************************/
      ${NSD_CreateText} 0u 70u 80% 13u "$INSTDIR"
      Pop $Text
      System::Call `shlwapi::SHAutoComplete(i$Text,i1)`
      ${NSD_OnChange} $Text DirChange
/******************************************************************************/
  nsDialogs::Show
FunctionEnd
/******************************************************************************/
Function CheckBox1
  Pop $CheckBox1
  ${NSD_GetState} $CheckBox1 $Check1
FunctionEnd
Function CheckBox2
  Pop $CheckBox2
  ${NSD_GetState} $CheckBox2 $Check2
FunctionEnd
Function RadioButton1
  Pop $RadioButton1
  ${NSD_GetState} $RadioButton1 $Radio1
  ${NSD_GetState} $RadioButton2 $Radio2
FunctionEnd
Function RadioButton2
  Pop $RadioButton2
  ${NSD_GetState} $RadioButton1 $Radio1
  ${NSD_GetState} $RadioButton2 $Radio2
FunctionEnd
/******************************************************************************/
Function BrowseButton
  Pop $BrowseButton
  nsDialogs::SelectFolderDialog "Выберите папку..." "$INSTDIR"
  Pop $INSTDIR
  ${IfNot} $INSTDIR == "error"
    ${NSD_SetText} $Text "$INSTDIR"
  ${EndIf}
FunctionEnd
/******************************************************************************/
Function DirChange
        Pop $Text
        GetDlgItem $0 $HWNDPARENT 1
        ${NSD_GetText} $Text `$INSTDIR`
        ${GetRoot} $INSTDIR $1
        ${If} $INSTDIR == ""
        ${OrIf} $1 == ""
                EnableWindow $0 0
        ${Else}
                EnableWindow $0 1
        ${EndIf}
FunctionEnd
/******************************************************************************/
Function fnCustomLeave
  ${NSD_GetText} $Text "$INSTDIR"
  ${If} $INSTDIR == ""
    Abort
  ${EndIf}
  ${NSD_GetState} $CheckBox1 $Check1
  ${NSD_GetState} $CheckBox2 $Check2
  ${NSD_GetState} $RadioButton1 $Radio1
  ${NSD_GetState} $RadioButton2 $Radio2
FunctionEnd
/******************************************************************************/
/******************************************************************************/
Section Test
  DetailPrint "$$INSTDIR = $INSTDIR"
  DetailPrint ""
/**********/
  ${If} $Check1 = 1
      DetailPrint '"Ярлык на рабочий стол"'
      DetailPrint ""
  ${EndIf}
/**********/
  ${If} $Check2 = 1
      DetailPrint '"Ярлык на панель быстрого запуска"'
      DetailPrint ""
  ${EndIf}
/**********/
  ${If} $Radio1 = 1
      DetailPrint '"Для текущего пользователя"'
      DetailPrint ""
  ${EndIf}
/**********/
  ${If} $Radio2 = 1
      DetailPrint '"Для всех пользователей"'
      DetailPrint ""
  ${EndIf}
SectionEnd


sawe 14-05-2011 03:31 1676040

Цитата:

В общем пример для всех.
Большое человеческое спасибо!
Но я имел ввиду две разных (отдельных) страницы, но и этого с головой хватит как основа, там разберёмся.
NSIS\Docs\nsDialogs\Readme.html - мне пока плохо даётся освоить его.
Как то я у вас спрашивал на счёт редактора форм для nsDialogs, вы тогда ответили, что такого нет.
За чем обманывать наивных людей, недавно мне попался NSIS Dialog Designer,
но к сожалению он заточен только под Unicode, но это не беда.

kotkovets 14-05-2011 09:51 1676101

Цитата:

Цитата sawe
Как то я у вас спрашивал на счёт редактора форм для nsDialogs, вы тогда ответили, что такого нет. »

хех, а кто обманывал, первичный релиз 18.04.2011, а когда вы спрашивали?
Сначала почитайте, а потом обвиняйте!!!что за народ пошел ни хрена сами не могут ниче сделать, дай все готовое...

sawe 14-05-2011 12:25 1676150

Я вас ни чем не оскорблял, лучше бы высказал своё мнение об этом дизайнере!

kotkovets 14-05-2011 12:39 1676157

Цитата:

Цитата sawe
своё мнение об этом дизайнере! »

до нормального релиза дизайнеру весьма далеко...
И такое впечатление сложилось, что писали люди не очень хорошо знающие NSIS.
Но все равно им огромное спасибо!
Сам подумывал написать подобный GUI - но знаний маловато пока в программировании .

wolkow70 15-05-2011 09:45 1676596

kotkovets,
Доброго времени суток.
Не приходилось ли Вам пользоваться плагином NsisXML plug-in
Скачал , а как пользоваться не разберусь, так как на английском инструкция.
К примеру в файле настроек :

<Sounds>
E:\Program Files\Yandex\Punto Switcher\Sounds\typerus.wav,E:\Program Files\Yandex\Punto Switcher\Sounds\typeeng.wav,E:\Program Files\Yandex\Punto Switcher\Sounds\switch.wav,E:\Program Files\Yandex\Punto Switcher\Sounds\misprint.wav,E:\Program Files\Yandex\Punto Switcher\Sounds\ru.wav,E:\Program Files\Yandex\Punto Switcher\Sounds\en.wav,E:\Program Files\Yandex\Punto Switcher\Sounds\reverse.wav,E:\Program Files\Yandex\Punto Switcher\Sounds\switch.wav,E:\Program Files\Yandex\Punto Switcher\Sounds\switch.wav,E:\Program Files\Yandex\Punto Switcher\Sounds\switch.wav,E:\Program Files\Yandex\Punto Switcher\Sounds\switch.wav,E:\Program Files\Yandex\Punto Switcher\Sounds\switch.wav,E:\Program Files\Yandex\Punto Switcher\Sounds\switch.wav,E:\Program Files\Yandex\Punto Switcher\Sounds\switch.wav,E:\Program Files\Yandex\Punto Switcher\Sounds\switch.wav,E:\Program Files\Yandex\Punto Switcher\Sounds\replace.wav
</Sounds>

То есть, привязка к жесткому диску идет.
Хотелось бы заменить букву диска через $SysDrive
Пока не разобрался можно ли вообще так сделать...

sawe 15-05-2011 23:35 1676995

Цитата:

Цитата wolkow70
NsisXML plug »

Cбой при чтении файла DxDiag. Вот тест для Windows Vista Ultimate:

wolkow70 16-05-2011 11:25 1677178

Цитата:

Цитата sawe
Cбой при чтении файла DxDiag. Вот тест для Windows Vista Ultimate: »

Пока не понял, то или нет..
Мне нужно определенные секции отредактировать в имеющемся xml.
Скорее всего, речь должна идти об удалении значения секции, и замене ее новыми строками...

!macro AdjustConfigValue ConfigFile Key Value

DetailPrint "Config: adding '${Key}'='${Value}' to ${ConfigFile}"

nsisXML::create
nsisXML::load ${ConfigFile}

nsisXML::select "/configuration/appSettings/add[@key='${Key}']"
nsisXML::setAttribute "value" ${Value}

nsisXML::save ${ConfigFile}

!macroend

!insertmacro AdjustConfigValue "$INSTDIR\MyApp.exe.config" "ServiceURL" "http://127.0.0.1"

То есть это позволяет заменить значение секции в настройках ?

Цитата:

Цитата wolkow70
MyApp.exe.config »

здесь наименование xml файла?

Цитата:

Цитата wolkow70
"ServiceURL" »

Название секции?

Цитата:

Цитата wolkow70
"http://127.0.0.1" »

Новое значение?

Kelinmiir 19-05-2011 08:45 1678918

Добрый день!
Есть инсталлер, в нем есть страничка выбора компонентов !insertmacro MUI_PAGE_COMPONENTS сами компоненты добавляются таким образом:
Section "$(^component1)" component1\Section
ExecWait '"$EXEDir\7za.exe" x "$EXEDir\myarchive.zip" -o"$INSTDIR" -y'
SetOverwrite on
SectionEnd
Т.е. сами компоненты это zip архивы которые лежат в одной папке с инсталятором. И все бы хорошо но на странице выбора компонентов не правильно указывается "вес" программы, т.к. архивы не включены в инсталятор то неважно какие галочки я расставил, "вес" программы всегда показывает один, подскажите как можно это исправить.

K.A.V. 19-05-2011 11:01 1678981

Здравствуйте, Kelinmiir
Для этого есть такая команда AddSize, прописывается она внутри секции, указывается размер файлов в Килобайтах, например

Код:

Section "TEST"
AddSize 500
; Для установки данного компонента необходимо 500 Кб свободного метса на диске
; *Данная команда добавляет указанный размер к размеру файлов, которые прописаны внутри секции для распаковки
SectionEnd


sawe 19-05-2011 12:13 1679022

Добрый день!
Упражнялся в написании nsDialog, лучше начинать с чего нибудь простого но полезного.
Вот что получилось...
Прошу проверить и подправить пример или посоветовать в каком направлении двигаться.

kotkovets 19-05-2011 16:05 1679123

sawe,
Ошибок в коде достаточно, зачем в секции обращаться к пустому стеку?
Установщик выкидывает флаг ошибки, а раз так то,часто команды зависимые от флага ошибки НЕ БУДУТ РАБОТАТЬ! Здесь и в других (по подобию конструкциях) - нет ни одной команды помещающие значения в стек, к стеку нужно обращаться тогда, когда там, что то есть!!!
Код:

  ${If} $Check2 = 1
    WriteRegStr HKLM "${CodePage}" "1250" "c_1251.nls"
    ReadRegStr $0 HKLM "${CodePage}" "1250"
    DetailPrint "Код страницы 1250 равен $0"
    Pop $0 ;j ненужная команда здесь! ИМХО!
    Iferrors 0 +2 ;проверка на флаг ошибки
    MessageBox MB_OK "error" IDOK
  ${EndIf}

Цитата:

Цитата sawe
Компиллятор пишет НЕ критическое предупреждение, возможно ли это обойти? »

А на кой вам здесь либа MultiUser.nsh и макрос !insertmacro MULTIUSER_INIT на ней завязан и предполагается наличие деинсталятора - поэтому предупреждение. Вообще эта либа рисует кастомную страничку, добавляет уровень прав и однопользовательский или многопользовательский режим работы установщика. Совершенно не нужный балласт в скрипте, тем более с одной страничкой. достаточно прописать в начале скрипта (тем более работает только в Win7) RequestExecutionLevel admin и все! В инсталляторах NSIS всегда по умолчанию выбран многопользовательский режим работы.

sawe 19-05-2011 19:12 1679197

Спасибо учту!
На счёт очистки стека Pop $0, так это дурная привычка, скорее от паники (лучше пере бдеть, чем не до бдеть).

Вы недавно упоминали ...
Цитата:

Сам подумывал написать подобный GUI
Вы можете попытаться состыковаться с Victor_VG и вместе написать не новую прогу а плагин к NIS Edit.
Это было бы проще для начала и опыта набраться можно по более. И у вас появится возможность опередить
NSIS Dialog Designer, так как его подбивают на глупости (импорт формата INI) а не на доводку.

Valdise 20-05-2011 14:09 1679601

Доброго времени суток!
Соблаговолите помочь советом "любителю".
Познакомился со скриптами довольно давно (на примерах от Авторов NSIS), уже несколько лет иногда собираю то что сам себе и дочкам русифицирую и чем сам постоянно пользуюсь.
Вопрос возник давно, но всё никак не мог нигде найти внятных объяснений.
Сейчас много чего перечитал на Озоне, но пока тоже не нашел то что ищу:

Интересует проверка при установке - не установлена-ли уже старая/более новая версия устанавливаемой программы.

-Например оригинальный установщик NSIS перед установкой идёт в Реестр, проверяет, не стоит-ли более новая, или старая версия NSIS и предлагает переустановиться.
-В оригинале скрипта makensis.nsi (в папке с примерами) всё вроде прописано.
Пробую на той-же NSIS, - например стояла 2.15 , в разделе Uninstall реестра значится 2.15, пробую ставить их сборку 2.45 - она предупреждает, предлагает переустановиться. Проставляю номер версии в скрипте, всё упаковывается, но новый мой инсталлятор ничего не проверяет и молча всё перезаписывает... И корневую папку и Реестр.

-Ткните, пожалуйста носом что делаю не так?

-А если ещё подскажете возможно-ли прописывать в деинсталлятор команду принудительно убивать деинсталлируемую программу (если она запущена) - вообще мне мёд будет :-)

Стараюсь НАНОСИТЬ добро...
и ПРИЧИНЯТЬ пользу...

sawe 20-05-2011 16:13 1679676

Чаще всего следует читать в реестре номер версии
Код:

ReadRegStr $0 HKLM "SOFTWARE\куст_реестра" "имя_параметра"
 ; в $0 - будет инфо о версии!

Или прочесть из INI файла
Код:

ReadINIStr $0 "$INSTDIR\Файл.ini" "Секция" "Имя"
; в $0 - будет инфо о версии!

Если исполняемый или DLL файл содержит номер версии
Код:

;Ваше определения!
!define VERSION 5.5.5.0 # версия. В скрипте будет выглялеть вот так  ${VERSION}
!define APP_NAME "программа" # Имя программы. В скрипте будет выглялеть вот так ${APP_NAME}

;----------------!

  GetDllVersion "$INSTDIR\XXX.exe" $R0 $R1
  IntOp $R2 $R0 / 0x00010000
  IntOp $R3 $R0 & 0x0000FFFF
  IntOp $R4 $R1 / 0x00010000
  IntOp $R5 $R1 & 0x0000FFFF
  StrCpy $R1 "$R2.$R3.$R4.$R5"
 
  ; в $R1 - будет инфо о версии!
  ; дальше можно выполнить код с использованием $R1 , пример ниже
 
  IfFileExists "$INSTDIR\XXX.exe" 0 +3
  MessageBox MB_YESNO|MB_ICONEXCLAMATION "У вас уже установлена программа - ${APP_NAME} ${VERSION} \
  $\nВы хотите удалить предыдущую версию  ${APP_NAME} $R1" IDNO +3
  IfFileExists "$INSTDIR\unins000.exe" 0 +3
  ExecWait '"$INSTDIR\unins000.exe" /S _?=$INSTDIR' # удаление старой версии для InnoSetup инсталлятора!
  GoTo noNext
 
; Ваш дальнейший код! 

 noNext:

Если исполняемый или DLL файл не содержит номера версии, поищите где он в файлах указан и прочтите его.


Чтобы убить файл или процесс, следует подходить творчески, прежде всего надо узнать какая сволочь его держит и потом выбрать решение.
Лучше всего узнать класс и придушить его, но для этого нужен отдельный софт

Пример, как по хамски придушить
Код:

ReserveFile "${NSISDIR}\Plugins\KillProcDLL.dll"

;----------------!

KillProcDLL::KillProc "explorer.exe" ; только в крайнем случае!

Убить запущенный процесс
Код:

;Ваше определения!
 !define Unclose_1 "XXX.exe" ;- имя запущенного процесса!
;----------------!
ReserveFile "${NSISDIR}\Plugins\KillProc.dll"
;----------------!

  return_1:
  StrCpy $0 "${Unclose_1}"
  KillProc::FindProcesses
  StrCmp $1 "-1" wooops_1
  StrCmp $0 "0" completed_1
 Sleep 1500
MessageBox MB_ICONQUESTION|MB_YESNOCANCEL "У Вас в Трее всё ещё запущен ${Unclose_1} $\nЗавершить этот процесс сейчас?" IDYES +4 IDCANCEL +2
MessageBox MB_ICONINFORMATION|MB_OKCANCEL "Для продолжения деинстоляции следует выбрать 'Да'" IDOK +2
  Abort
  Goto return_1
  StrCpy $0 "${Unclose_1}"
  KillProc::KillProcesses
  StrCmp $1 "-1" wooops_1
  Goto completed_1
  wooops_1:
  Abort
  completed_1:


Valdise 21-05-2011 20:30 1680261

sawe

Признателен за ответ
Я не программист, поэтому пока стараюсь переварить и попробую на скрипте NSIS
С Вашего позволения если что не допру письну в ПМ ?

wolkow70 24-05-2011 12:06 1681629

Уважаемый kotkovets,

Воспользовался вашими рекомендациями по созданию генератора ответов. Собрал сборку.
Проблема вот в чем:

Формирую такой файл ответов:

[DIRECTORY]
ISTALLDIR=E:\Program Files\JetAudio
[Sections]
StartMenu=1
Desktop=1
QuickLaunch=1
AU=1
AMS=1
AMF=1
AIF=1
AIFF=1
AAC=1
AC3=1
APE=1
DTS=1
DMF=1
DBM=1
FLAC=1
F4A=1
FAR=1
IT=1
IMS=1
KAR=1
M4A=1
M4B=1
M4R=1
MID=1
MIDI=1
MKA=1
MP+=1
MP2=1
MP3=1
MPC=1
MPP=1
MTM=1
MT2=1
MOD=1
MED=1
MDL=1
M3U=1
M3U8=1
OFR=1
OFS=1
OGA=1
OGG=1
OKT=1
PLS=1
RA=1
PTM=1
RMI=1
SPX=1
SND=1
S3M=1
TAK=1
TTA=1
UMX=1
ULT=1
W64=1
WAV=1
WMA=1
WV=1
XM=1
669=1
Context=1

Программу ставлю в тихом режиме /S
Сама программа ставится нормально.
Секции :
StartMenu=1
Desktop=1
QuickLaunch=1
нормально отрабатывают, а вот файловые ассоциации не производятся. Хотя в ручном режиме проблем нет.

Секции для типов файлов однотипные :

Section "MP3" MP3
SectionIn 2 3 4
${GetSecWriteSucces} MP3
${If} $SUCCES_SECTION = 1
WriteRegStr HKCU "Software\Classes\.MP3" "" "jetAudio.ASSOC.Audio"
${EndIf}
SectionEnd


Для ярлыков примерно также, но работает. В чем дело не пойму...

Section "Ярлык на Рабочем столе" Desktop
SectionIn 1 2 3 4
${GetSecWriteSucces} Desktop
${If} $SUCCES_SECTION = 1
SetOutPath "$INSTDIR"
CreateShortCut "$Desktop\JetAudio.lnk" "$INSTDIR\JetAudio.exe"
${EndIf}
SectionEnd

Может подскажите в чем может быть дело?

kotkovets 24-05-2011 12:53 1681654

Попробуйте так, если сообщение появится, значит секция отрабатывает, либо проблема в
SectionIn 2 3 4 - вероятно получается по умолчанию не отмечена секция, т.е расставьте флаги так, что бы эта секция была по умолчанию отмечена.
Цитата:

Цитата wolkow70
Section "MP3" MP3а
SectionIn 2 3 4
${GetSecWriteSucces} MP3
${If} $SUCCES_SECTION = 1
/*WriteRegStr HKCU "Software\Classes\.MP3" "" "jetAudio.ASSOC.Audio"*/
MessageBox MB_ICONINFORMATION|MB_OK "sec: MP3"
${EndIf}
SectionEnd »


wolkow70 24-05-2011 14:24 1681703

Нет, сообщение не появлялось, зато появлялись сообщения из работающих секций ярлыков. Отсюда вывод: проблема была во флагах.
Попробовал везде выставить 1 2 3 4, и все нормально заработало.
Не понятно почему флаги на это влияют, ведь файл ответов я создаю в ручную, и сам выставляю галочки в чекбоксах?
Можно ли в тихом режиме подавить значение этих флагов, потому, что я хочу по умолчанию, наоборот, без ассоциаций?
И еще проблема, во время создания файла ответов, идет распаковка файлов в директорию. Можно ли сделать только эмуляцию?

kotkovets 24-05-2011 15:46 1681771

Цитата:

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

А че тут не понятного, флаги отметки влияют на выполнение определенных секций(снимают или выставляют отметки на чебоксах), а макрос только в отмеченной секции работает, если секция не выбрана по умолчанию в режиме установки - результат ясен, код в секции не выполняется.
Отсюда вывод: принудительно в тихом режиме, командами устанавливать все
секции в отмеченное состояние - далее читается файл конфигурации и от его ответов зависит, что ставить, а что нет.
Цитата:

Цитата wolkow70
И еще проблема, во время создания файла ответов, идет распаковка файлов в директорию. Можно ли сделать только эмуляцию? »

а это ваша проблема в скрипте, ИМХО

yyv 24-05-2011 15:55 1681780

здраствуйте.
Нужна опять ваша помощь
Интересует страница лицензии.
используеться
!insertmacro MUI_PAGE_LICENSE "nsis/license.txt"
Воопрос собственно в чем.
сейчас дя создания страницы лицензии файл license.txt должен уже существовать локально, до процесса компиляции.
мне же требуется что бы строка была типа такой
!insertmacro MUI_PAGE_LICENSE "$PLUGINSDIR/license.txt"
или
!insertmacro MUI_PAGE_LICENSE "$TEMP/license.txt"
Те что бы файл лицензии подтягивался уже на стороне пользователя.

На сколько это реально осуществить?

PS сам спросил сам отвечу, вдруг кому надо будет.

есть плагин который это позволяет сделать
http://nsis.sourceforge.net/CustomLicense_plug-in
в ветке обсуждения плагина также приводят пример
http://nsis.sourceforge.net/External_License_file
Работают оба варианта.

wolkow70 24-05-2011 17:21 1681833

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

Цитата:

Цитата kotkovets
И еще проблема, во время создания файла ответов, идет распаковка файлов в директорию. Можно ли сделать только эмуляцию? »
а это ваша проблема в скрипте, ИМХО »

А вот тут не разберусь, у меня так:

Section "!${PRODUCT_NAME}" Install
SectionIn 1 2 3 4 RO
${If} $GMODE = 0
${AndIf} ${Silent}
${AndIf} ${FileExists} "$INIFILE"
ClearErrors
ReadINIStr "$R0" "$INIFILE" "DIRECTORY" "ISTALLDIR"
${WordReplace} $R0 "%programfiles%" "$PROGRAMFILES" "+" $R1
${WordReplace} $R1 "%windir%" "$WINDIR" "+" $R0
${WordReplace} $R0 "%appdata%" "$APPDATA" "+" $R1
${WordReplace} $R1 "%systemdrive%" "$SysDrive" "+" $R0
StrCpy $INSTDIR $R0
${EndIf}
SetOutPath "$INSTDIR"
File "${pkgdir}\JetAudio\_fileext.dll"
File "${pkgdir}\JetAudio\_fileext.RUS"
File "${pkgdir}\JetAudio\_fileext2.dll"

и далее как всегда...

wolkow70 24-05-2011 19:44 1681912

kotkovets

В общем, что получается?..
Выполняются все комманды в секции "!${PRODUCT_NAME}" после ${EndIf} и до конца секции, в том числе:
1. Копируются файлы;
2. Регистрируются dll;
3. Вносятся записи в реестр...

Посмотрел в скрипте AIMP, там так:

StrCpy $INSTDIR $R0
NotSilent:
SetOutPath "$INSTDIR\"

то есть у них вместо EndIf используется NotSilent: Но при этом у них макрос несколько иной...

kotkovets 24-05-2011 21:25 1681959

Цитата:

Цитата wolkow70
то есть у них вместо EndIf используется NotSilent: Но при этом у них макрос несколько иной.. »

разница в том, что в скрипте AIMP используются безусловные метки, я же использую логические конструкции, в чем разница в работе - да ни в чем!Но! когда сложный и объемный скрипт в метках легко потеряться и как вывод - ошибки в скриптах. С логическими конструкциями куда лучше читабельность скрипта, и проще правки в скрипте делать. Я писал и огромные скрипты на 7000 и более строк и если использовать безусловные метки - это полный бардак, с логикой проще - я вижу начало конструкции и конец конструкции...т.е логика И, И-ИЛИ, исключающие И и т.д.
Цитата:

Цитата wolkow70
Выполняются все комманды в секции "!${PRODUCT_NAME}" после ${EndIf} и до конца секции, в том числе: »

Это секция всегда выполняется, здесь пишутся только самые необходимые компоненты для нормальной работы программы.
А свою ошибку исправил:
Цитата:

Цитата wolkow70
И еще проблема, во время создания файла ответов, идет распаковка файлов в директорию. Можно ли сделать только эмуляцию? »

моя оказалась однако, извиняюсь...
Код:

Section "-Install"
;чтение из файла ответов путь установки и перезапись значения $INSTDIR
;Условие чтения и перезаписи:
;        ТОЛЬКО НЕ В РЕЖИМЕ ГЕНЕРАТОРА И ТОЛЬКО В ТИХОМ РЕЖИМЕ И ПРИ НАЛИЧИИ ФАЙЛА ОТВЕТОВ
  ${If} $GMODE = 0
  ${AndIf} ${Silent}
  ${AndIf} ${FileExists} "$INIFILE"
    ClearErrors
    ReadINIStr "$R0" "$INIFILE" "DIRECTORY" "ISTALLDIR"
    ${WordReplace} $R0 "%programfiles%" "$PROGRAMFILES" "+" $R1
    ${WordReplace} $R1 "%windir%" "$WINDIR" "+" $R0
    ${WordReplace} $R0 "%appdata%" "$APPDATA" "+" $R1
    ${WordReplace} $R1 "%systemdrive%" "$SysDrive" "+" $R0
    StrCpy $INSTDIR $R0
 ${EndIf}
 ${If} $GMODE = 0 ;выполнение всегда, только не в режиме генератора
        ;--------
      /*
            тут ваш код!,  эта секция всегда должна выполняться
            команды пишем до конца конструкции ${EndIf}
    */
    ;--------
  ${EndIf}
SectionEnd


wolkow70 25-05-2011 10:23 1682204

kotkovets,
Ваша идея насчет логических конструкций показала себя состоятельной. Генератор ответов стал работать как часы.


Читал Справку, где вы приводите пример:

DeleteRegValue [root_key] [subkey] [key_name]

Удаляет параметр key_name из раздела subkey ветки root_key.
Флаг ошибки будет установлен в том случае, если раздел/параметр не найден, или удаление не возможно.
DeleteRegValue HKLM "Software\My Company\My Software" "some value"

Ломаю голову над проблемой удаления определенного значения:

Например, производится регистрация типа файла:

WriteRegStr HKCU "Software\Classes\.MP3" "" "jetAudio.ASSOC.Audio"

В удалении будет комманда:

DeleteRegValue HKCU "Software\Classes\.mp3" ""

Эта комманда удалит любое значение параметра. А если произошла переассоциация назначения файла? Тогда удаление параметра нарушит работу другой программы.

Вот думаю, как удалить определенное значение? Пробовал так:
DeleteRegValue HKCU "Software\Classes\.mp3" "" "jetAudio.ASSOC.Audio"
не получается компиляция скрипта.

То есть, если значение "jetAudio.ASSOC.Audio", то нужно удалить, иначе нет.

K.A.V. 25-05-2011 10:39 1682219

Цитата:

Цитата wolkow70
То есть, если значение "jetAudio.ASSOC.Audio", то нужно удалить, иначе нет. »

Код:

ReadRegStr $0 HKCU "Software\Classes\.mp3" ""
StrCmp $0 "jetAudio.ASSOC.Audio" 0 +2
DeleteRegValue HKCU "Software\Classes\.mp3" ""


DruOleg 26-05-2011 13:26 1682990

Вложений: 1
Привет всем. Прошу помочь в следующем.
Необходимо отредактировать стандартный конфигурационный файл php.ini:
i. Раскоментировать cgi.force_redirect и установить в 0: cgi.force_redirect = 0
ii. safe_mode = Off
iii. установить переменную memory_limit в разумное значение в зависимости от памяти на сервере, но чем больше, тем лучше.
iv. session.save_handler = files
v. magic_quotes_gpc = Off.
vi. magic_quotes_runtime = Off
vii. file_uploads = On
viii. session.auto_start = 0
ix. session.bug_compat_warn = Off
x. session.save_path = "/Sessions"
xi. extension_dir = "ext"
xii. date.timezone установить в таймзону того места где установлен сервер. Список поддерживаемых зон можно найти на http://www.php.net/manual/en/timezones.php
xiii. smtp=<smtp_domain>; smpt_port=<smtp_port> - установить адрес и порт smtp сервера для отсылки почты

Подскажите как это лучше сделать, желательно с примерами.

wolkow70 26-05-2011 14:06 1683020

Почему-то не работает у меня в деинсталляторе такая конструкция:

ReadRegStr $0 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.MP3\UserChoice" "Progid" ""
StrCmp $0 "jetAudio.ASSOC.Audio" 0 +2
DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.MP3\UserChoice" ""

Вроде по справке делал...

При инсталляции вносится:
WriteRegStr HKCU "Software\Classes\.MP3" "" "jetAudio.ASSOC.Audio"
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.MP3\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.MP3\UserChoice" "Progid" "jetAudio.ASSOC.Audio"

K.A.V. 26-05-2011 14:11 1683024

Цитата:

Цитата wolkow70
ReadRegStr $0 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.MP3\UserChoice" "Progid" "" »

"Progid" - лишнее


Цитата:

Цитата DruOleg
Привет всем. Прошу помочь в следующем.
Необходимо отредактировать стандартный конфигурационный файл php.ini: »

Команда на запись следующая (не забудьте заменить ПУТЬ К ФАЙЛУ):

Код:

WriteINISTr "ПУТЬ К ФАЙЛУ\php.ini" "PHP" "ИМЯ ПАРАМЕТРА" "ЗНАЧЕНИЕ"
т.е. получится следующее:
Цитата:

Цитата DruOleg
i. Раскоментировать cgi.force_redirect и установить в 0: cgi.force_redirect = 0

Раскомментировать не будем, сразу установим значение
Код:

WriteINISTR "ПУТЬ К ФАЙЛУ\php.ini" "PHP" "cgi.force_redirect" "0"
WriteINISTR "ПУТЬ К ФАЙЛУ\php.ini" "PHP" "safe_mode" "Off"

Цитата:

Цитата DruOleg
iii. установить переменную memory_limit в разумное значение в зависимости от памяти на сервере, но чем больше, тем лучше.

Сами думаю справитесь?

Код:

; iv. session.save_handler = files
WriteINISTR "ПУТЬ К ФАЙЛУ\php.ini" "PHP" "session.save_handler" "files"
 
; v. magic_quotes_gpc = Off.
WriteINISTR "ПУТЬ К ФАЙЛУ\php.ini" "PHP" "magic_quotes_gpc" "Off"
 
; vi. magic_quotes_runtime = Off
WriteINISTR "ПУТЬ К ФАЙЛУ\php.ini" "PHP" "magic_quotes_runtime" "Off"

; vii. file_uploads = On
WriteINISTR "ПУТЬ К ФАЙЛУ\php.ini" "PHP" "file_uploads" "On"

; viii. session.auto_start = 0
WriteINISTR "ПУТЬ К ФАЙЛУ\php.ini" "PHP" "session.auto_start" "0"
 
; ix. session.bug_compat_warn = Off
WriteINISTR "ПУТЬ К ФАЙЛУ\php.ini" "PHP" "session.bug_compat_warn" "Off"
 
; x. session.save_path = "/Sessions"
WriteINISTR "ПУТЬ К ФАЙЛУ\php.ini" "PHP" "session.save_path" "/Sessions"
 
; xi. extension_dir = "ext"
WriteINISTR "ПУТЬ К ФАЙЛУ\php.ini" "PHP" "extension_dir" "ext"

Цитата:

Цитата DruOleg
xii. date.timezone установить в таймзону того места где установлен сервер. Список поддерживаемых зон можно найти на http://www.php.net/manual/en/timezones.php
xiii. smtp=<smtp_domain>; smpt_port=<smtp_port> - установить адрес и порт smtp сервера для отсылки почты

Справитесь?

wolkow70 26-05-2011 14:28 1683036

K.A.V.,


ReadRegStr $0 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.MP3\UserChoice" "Progid" ""

Компилятор показывает ошибку в строке..

K.A.V. 26-05-2011 14:30 1683040

Цитата:

Цитата wolkow70
ReadRegStr $0 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.MP3\UserChoice" "Progid" ""
Компилятор показывает ошибку в строке.. »

Ну естественно, я же говорю "Progid", у вас за этой записью стоят кавычки удалите "Progid"

Код:

ReadRegStr $0 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.MP3\UserChoice" ""

MKN 26-05-2011 16:45 1683132

Подскажите пожалуйста, как решить такую задачу :

Имеется текстовый файл с кучей строк, одна из которых начинается с :

ProductCode {здесь может быть разное количество цифр}

Необходимо извлечь из этой строки этого текстового файла только : {здесь может быть разное количество цифр}

Извлечь либо в переменную, если это использовать в скрипте, либо в отдельный текстовый файлик.

Также интересен момент - возможно ли записать в переменную имя файла, находящегося рядом со скриптом (либо нет) и имеющего маску *.msi (либо какую другую) ?

kotkovets 26-05-2011 17:14 1683153

MKN
Я так понял тебе нужно циферки получить на момент компиляции скрипта? тогда нужно писать батник - запускать препроцессором NSIS и заинклюдить циферки в скрипт смотри
http://forum.oszone.net/post-1657610-1065.html
вопрос в содержимом батника, т.е как работать в командной строке с текстовыми строками...к спецам по командной строке нужно обратиться
Цитата:

Цитата MKN
Также интересен момент - возможно ли записать в переменную имя файла, находящегося рядом со скриптом (либо нет) и имеющего маску *.msi (либо какую другую) ? »

аналогично.

MKN 26-05-2011 17:39 1683170

kotkovets,
А если упростить задачу - просто "получить циферки" из имеющегося текстового файла и записать их в другой текстовый файл ?

K.A.V. 26-05-2011 18:01 1683183

Цитата:

Цитата MKN
Имеется текстовый файл с кучей строк, одна из которых начинается с :
ProductCode {здесь может быть разное количество цифр}
Необходимо извлечь из этой строки этого текстового файла только : {здесь может быть разное количество цифр}
Извлечь либо в переменную, если это использовать в скрипте, либо в отдельный текстовый файлик. »

В начале кода
Код:

!include "TextFunc.nsh"
!define ${LineFind}

Далее вызываем функцию поиска
Код:

${LineFind} "$DESKTOP\TEST.txt" "/NUL" "1:-1" "LineFindFunction"
; После функции поиска идёт запись значения в файл
FileOpen $0 "$DESKTOP\kav_temp.txt" w
FileWrite $0 "$R1"
FileClose $0

где $DESKTOP\TEST.txt - файл в котором ищем
где $DESKTOP\kav_temp.txt - файл в который записываем циферки


Сама функция поиска в файле
Код:

Function "LineFindFunction"
StrCpy $R0 "$R9" 11
StrCmp $R0 "ProductCode" 0 nofind
StrCpy $R1 "$R9" "" 12
        Push "StopLineFind"
nofind:
        Push $0
FunctionEnd

Циферки будут в переменной $R1

kotkovets 26-05-2011 18:03 1683186

MKN, я могу помочь на этапе инсталляции, т.е все действия обязательно проводим перед проверкой на предмет установленного продукта msi и наличие текстового файлика - будем брать цифры оттуда, в случае не нахождения тектового файлика - установить msi
читать дальше »
Код:

OutFile "TextProduct.exe"
!include "TextFunc.nsh"
!include "Logiclib.nsh"
!include "StrFunc.nsh"
${StrRep}
Var ProductCode
ShowInstDetails show

Section MSIProduct
  ${FileReadFromEnd} "$EXEDIR\text.txt" "FileRead"
  ${IfNot} ${Errors}
  ${AndIfNot} $ProductCode == ``
  ;Здесь команды проверки на предмет установки и команда установки
  ;MessageBox MB_ICONINFORMATION|MB_OK "$ProductCode" IDOK
  ${Else}
    ;Здесь команда установки если нет файла
  ${EndIf}
SectionEnd

Function FileRead
  StrLen $R0 "ProductCode"
  StrCpy $R1 $9 $R0
  ${If} $R1 == "ProductCode"
    ${StrRep} $9 $9 $\r$\n ""
    ${StrRep} $ProductCode $9 "ProductCode " ""
    StrCpy $0 StopFileReadFromEnd
  ${EndIf}
  Push $0
FunctionEnd


Формат искомой строки: ProductCodeпробел!{здесь может быть разное количество цифр}
Прикольно получилось, пока писал ответили...

wolkow70 26-05-2011 19:03 1683219

K.A.V.,

При таком раскладе:

ReadRegStr $0 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.AC3\UserChoice" ""
StrCmp $0 "jetAudio.ASSOC.Audio" 0 +2
DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.AC3\UserChoice" ""
"Progid" никак не хочет удаляться...

http://s58.radikal.ru/i159/1105/ed/695c48466cc4.png

K.A.V. 26-05-2011 19:21 1683226

Цитата:

Цитата wolkow70
"Progid" никак не хочет удаляться... »

Я думал, вам нужно обработать параметр "По умолчанию", тогда в таком случае Progid указываем :)

Код:

ReadRegStr $0 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.AC3\UserChoice" "Progid"
StrCmp $0 "jetAudio.ASSOC.Audio" 0 +2
DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.AC3\UserChoice" "Progid"


DruOleg 27-05-2011 10:10 1683512

Подскажите пожалуйста, как выполнить следующие действия.
Необходимо считать данные который пользователь введет при установке ПО, и вставить эти данные в 2 конфигурационных файла.
Из справочника взял следующий код:
читать дальше »

Код:

!include "MUI.nsh"
!include "nsDialogs.nsh"
SetCompress off

!insertmacro MUI_PAGE_WELCOME
Page custom fnCustomInit fnCustomDestroy
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "Russian"

Name "Winreview.ru"
OutFile "winreview.exe"
ShowInstDetails show

Var Dialog
Var Label
Var Text
Var CheckBox

Function fnCustomInit
nsDialogs::Create 1018
Pop $Dialog

${NSD_CreateLabel} 0 5u 100u 10u "Это надпись"
Pop $Label

${NSD_CreateText} 0 20u 100% 15u "Здесь можно печатать..."
Pop $Text
${NSD_OnChange} $Text fnTextChange

${NSD_CreateCheckBox} 0 45u 100u 10u "Можно отметить флажком"
Pop $CheckBox

nsDialogs::Show
FunctionEnd

Function fnTextChange
Pop $1 
${NSD_GetText} $Text $R0
${NSD_SetText} $Label "Текст в поле ввода: $R0"
FunctionEnd

Function fnCustomDestroy
${NSD_GetText} $Label $R0
StrCpy $R1 "Текст надписи:$R0$\n"
${NSD_GetText} $Text $R0
StrCpy $R1 "$R1Текст в поле ввода:$R0$\n"
${NSD_GetState} $CheckBox $R0
StrCpy $R1 "$R1Состояние флажка:$R0$\n"
MessageBox MB_OK $R1
FunctionEnd

Section
DetailPrint "Hello from winreview.ru"
SetAutoClose false
SectionEnd

Не как не могу понять как взять полученные данные и воспользоваться ими. Например отобразить из тут - DetailPrint "Hello from winreview.ru" .
Прошу помощи.

kotkovets 27-05-2011 10:59 1683555

Цитата:

Цитата DruOleg
Например отобразить из тут »

:) :search:
Код:

Function fnCustomDestroy
    ${NSD_GetText} $Label $R0  ;текст надписи в переменной  $R0
    ${NSD_GetText} $Text $R1  ;текст поля ввода в переменной  $R1
    ${NSD_GetState} $CheckBox $R2 ;состояние чебокса в переменной $R2 : 0 - не отмечен, 1 - отмечен
FunctionEnd

Section
  DetailPrint "Label : $R0"
  DetailPrint "Text : $R1"
  DetailPrint "CheckBox : $R2"
SectionEnd

Посмотрите примеры кастомных страниц на предыдущих страничках темы - я много примеров приводил.
Почитайте про переменные и как пользоваться.

DruOleg 27-05-2011 16:58 1683767

Вложений: 1
Снова я:)
Необходимо отредактировать файл config.php.
А именно установить значения:
Код:

$CFG->dbtype    = 'mssql_n';     
$CFG->dblibrary = 'native';   
$CFG->dbhost    = 'Server'; 
$CFG->dbname    = 'moodle'; 
$CFG->dbuser    = 'Admin';
$CFG->dbpass    = 'somepass';
$CFG->prefix    = 'mdl_';

Прошу помочь.

kotkovets 27-05-2011 18:14 1683810

Цитата:

Цитата DruOleg
А именно установить значения:
Код:
$CFG->dbtype = 'mssql_n';
$CFG->dblibrary = 'native';
$CFG->dbhost = 'Server';
$CFG->dbname = 'moodle';
$CFG->dbuser = 'Admin';
$CFG->dbpass = 'somepass';
$CFG->prefix = 'mdl_'; »

Можно сделать так,
читать дальше »
Код:

!include "MUI2.nsh"
!include "TextFunc.nsh"
!include "WordFunc.nsh"

!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

ShowInstDetails show
OutFile Test.exe
Caption "Replace text"

Section
  ${LineFind} "$EXEDIR\config.php" "" "1:-1" "Replace"
  IfErrors 0 +2
  MessageBox MB_ICONSTOP|MB_OK "Файл не найден!"
SectionEnd

Function Replace
  StrLen $R0 "$$CFG->dbtype    = 'pgsql'" ;вычисляем длину искомой строки
  StrCpy "$R1" "$R9" "$R0" ;обрезаем строку на искомую длину
  ${If} "$R1" == "$$CFG->dbtype    = 'pgsql'" ;сравниваем строку со строкой в файле
    ${WordReplace} '$R9' "'pgsql'" "'nsis'" "+" '$R9' ;заменяем 'pgsql' на 'nsis'
  ${EndIf}
  ;-----------------


  ;-----------------
  Push $0
FunctionEnd


И далее другие значения заменяем по такой схеме, хотя можно и проще сделать, но что то не думается :beta:

wolkow70 28-05-2011 14:03 1684099

kotkovets


Почитал справку, и нашел немного не то, что мне нужно:
Рассматривается пример:

Section /o "Компонент №1" ID_1
SectionEnd

Section "Компонент №2" ID_2
SectionEnd

Section /o "Компонент №3" ID_3
SectionEnd

Section /o "Компонент №4" ID_4
SectionEnd

Section "Компонент №5" ID_5
SectionEnd

Section /o "Компонент №6" ID_6
SectionEnd

Функция проверки отметки, обязательна
Function .onSelChange

; Выбор между компонентам 1, 2, 3
!insertmacro StartRadioButtons $1
!insertmacro RadioButton ${ID_1}
!insertmacro RadioButton ${ID_2}
!insertmacro RadioButton ${ID_3}
!insertmacro EndRadioButtons

; Выбор между компонентам 5 и 6
!insertmacro StartRadioButtons $2
!insertmacro RadioButton ${ID_5}
!insertmacro RadioButton ${ID_6}
!insertmacro EndRadioButtons

FunctionEnd

Назначаем по-умолчанию отмеченные
Function .onInit

StrCpy $1 ${ID_2}
StrCpy $2 ${ID_5}

У меня так:
В инсталлятор встроена секция деинсталляции программы для удобной переустановки.
http://s002.radikal.ru/i198/1105/a5/92496cbcd09b.png
То есть, если ставится галка на секцию 1, то все остальные автоматически отключаются и идет только удаление программы.
И наоборот, если нажать на любую другую, то отключается 1.
Не пойму как это реализовать....

kotkovets 28-05-2011 16:24 1684139

wolkow70 как вариант, если чебокс удаления отмечен, то остальные чебоксы становятся не отмеченными и недоступными для отметки, если чебокс удаления не отмечен, то все чебоксы становятся для отметок доступные.
читать дальше »
Код:

!include "Sections.nsh"
!include "logiclib.nsh"
;--------------------------------

Name "One Section"
OutFile "one-section.exe"
RequestExecutionLevel user

Page components

Section /o "del" d1
SectionEnd

Section "Option 1" o1
SectionEnd

Section "Option 2" o2
SectionEnd

Section "Option 3" o3
SectionEnd

Section "Option 4" o4
SectionEnd

Section "Option 5" o5
SectionEnd
;--------------------------------

Function .onSelChange
 ${If} ${SectionIsSelected} ${d1} ;если отмечена секция del
    !insertmacro UnselectSection ${o1}
    !insertmacro UnselectSection ${o2}
    !insertmacro UnselectSection ${o3}
    !insertmacro UnselectSection ${o4}
    !insertmacro UnselectSection ${o5}
 ${EndIf}
FunctionEnd


ненавижу возиться с отметками в секциях... решаю такие задачи через свои нарисованные странички

wolkow70 28-05-2011 16:42 1684148

Пока сделал так, но для двух секций:

Function .onSelChange
!insertmacro StartRadioButtons $1
!insertmacro RadioButton ${Cleaning}
!insertmacro RadioButton ${Install}
!insertmacro EndRadioButtons
FunctionEnd

Попробую По вашему варианту...

K.A.V. 29-05-2011 15:02 1684549

wolkow70, как такой вариант (только когда отмечена секция "Удаление", другие секции нельзя отметить, нужно снять сперва галку на удаление)

Код:

Function .onSelChange
  SectionGetFlags ${d1} $0
StrCmp $0 "1" 0 noUncheckAll
  SectionSetFlags ${o1} 0
  SectionSetFlags ${o2} 0
  SectionSetFlags ${o3} 0
  SectionSetFlags ${o4} 0
  SectionSetFlags ${o5} 0
noUncheckAll:
  SectionGetFlags ${o1} $0
StrCmp $0 "1" 0 +2
  SectionSetFlags ${d1} 0
  SectionGetFlags ${o2} $0
StrCmp $0 "1" 0 +2
  SectionSetFlags ${d1} 0
  SectionGetFlags ${o3} $0
StrCmp $0 "1" 0 +2
  SectionSetFlags ${d1} 0
  SectionGetFlags ${o4} $0
StrCmp $0 "1" 0 +2
  SectionSetFlags ${d1} 0
  SectionGetFlags ${o5} $0
StrCmp $0 "1" 0 +2
  SectionSetFlags ${d1} 0
FunctionEnd


kotkovets 29-05-2011 19:42 1684697

Вложений: 1
Для участников форума предоставляю плагин для работы с установочными пакетами msi.
Что умеет сей плагин,предназначенный для ANSI версии компилятора NSIS.
и х86/x64 Windows NT системах:
читать дальше »


1.По указанному пути к продукту msi извлекать все значения из таблицы Prorerty
***********************************************************************************
Getmsi::GetProperty "[путь к msi файлу]" "[параметр]"
Pop $var
возвращает в $var:
$var = значение указанного параметра
$var = none - такого параметра нету или параметр задан не верно, либо такое значение параметра
$var = error - ошибка, неверный путь или пакет msi открыт др. программой и т.д
***Параметры пишем - строго соблюдая регистр букв!***
--------------------------------------------------------------------
- Getmsi::GetProperty "[путь к msi файлу]" "ProductCode" -
- Pop $var - извлекает из msi файла в переменную $var код продукта -
--------------------------------------------------------------------
- Getmsi::GetProperty "[путь к msi файлу]" "ProductName" -
- Pop $var - извлекает из msi файла в переменную $var имя продукта -
--------------------------------------------------------------------
***********************************************************************************

2. По коду продукта определять установлен ли продукт в ОС.
***********************************************************************************
Getmsi::GetInstall "[код продукта]"
Pop $var
возвращает в $var:
$var = 0 - этот продукт установлен
$var = 1 - этот продукт не установлен
$var = error - ошибка в коде продукта
***********************************************************************************

3. По коду продукта определять имя продукта.
***********************************************************************************
Getmsi::GetProductName "[код продукта]"
Pop $var
возвращает в $var:
$var = имя продукта
$var = none - имя продукта не определено или не задано имя
$var = error - ошибка в коде продукта, или этот продукт не установлен в ОС
***********************************************************************************

3. По коду продукта определять версию продукта.
***********************************************************************************
Getmsi::GetVersionString "[код продукта]"
Pop $var
возвращает в $var:
$var = версия продукта
$var = none - версия продукта не определено или не задана
$var = error - ошибка в коде продукта, или этот продукт не установлен в ОС
***********************************************************************************

4. По коду продукта определять путь к установленному продукту msi.
***********************************************************************************
Getmsi::GetLocalPackage "[код продукта]"
Pop $var
возвращает в $var:
$var = путь к продукту
$var = none - путь к продукту не определилось и т.д
$var = error - ошибка в коде продукта, или этот продукт не установлен в ОС
***********************************************************************************

5. По коду продукта определять дату установки продукта msi.
***********************************************************************************
Getmsi::GetInstallDate "[код продукта]"
Pop $var
возвращает в $var:
$var = дата - фомат даты ГодМесяцЧисло, т.е к примеру 20110529 = 29.05.2011
$var = none - дата не определилась и т.д
$var = error - ошибка в коде продукта, или этот продукт не установлен в ОС
***********************************************************************************

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

K.A.V. 29-05-2011 19:56 1684706

Цитата:

Цитата kotkovets
Для участников форума предоставляю плагин для работы с установочными пакетами msi. »

kotkovets, для справочника не забудьте сделать приличное описание ;)
И не плохо было бы указать, в каких ОС данный плагин будет работать безотказно, нужно ли для его работы дополнительное ПО типа ".NET Framework", либо библиотеки

hb860, в шапку

kotkovets 29-05-2011 20:03 1684709

Цитата:

Цитата K.A.V.
И не плохо было бы указать, в каких ОС данный плагин будет работать безотказно »

х86/x64 Windows NT системах..
Пока не проверял WIN7 x64, дополнительных файлов типа ".NET Framework" не требует! старался писать на чистом API в студии.

sawe 29-05-2011 20:59 1684737

000

Krinkels 29-05-2011 21:49 1684757

kotkovets
Доброго времени суток.
Цитата:

Цитата kotkovets
Пока не проверял WIN7 x64 »

У меня как раз система WIN7 x64, плагин не захотел работать. Решил попробовать на установщике 7z, так вот, в начале установки выдает "Ошибка в ProductCode!"

kotkovets 29-05-2011 22:08 1684765

Krinkels, скорее всего пакет X64, буду думать, натравите на файл msi для получения кода продукта.
ан нет, все путем, отработало на 100% на WIN XP x64, проверил на 7-Zip v9.21 (x64).msi

Getmsi::GetProperty "7-Zip v9.21 (x64).msi" "ProductCode" - файл 7-Zip v9.21 (x64).msi рядом со скриптом
ProductCode: {23170F69-40C1-2702-0921-000001000000}

Getmsi::GetInstall "{23170F69-40C1-2702-0921-000001000000}"
возвращает 0 - установлен (предварительно установил!)

Проверьте правильность кода продукта, и регистр букв очень важен! - ProductCode
Плагин только для ANSI версии NSIS, для юникода не корректно работает.
И проверьте права на win7 х64

Krinkels 29-05-2011 22:47 1684787

kotkovets
Все работает. Моя ошибка, вернее недочет. Извиняюсь :)

wolkow70 30-05-2011 07:29 1684884

Ребята, опять заблудился.
Делаю сборку Opera.
Такие секции:


Function .onInit
StrCpy $SysDrive $WINDIR 2
StrCpy $1 ${Sec03}
FunctionEnd

Section "Многопользовательская установка" Sec03
SetOutPath "$INSTDIR"
WriteINIStr "$INSTDIR\operaprefs_default.ini" "System" "Multi User" "1"
SectionEnd
;
Section /o "Однопользовательская установка" Sec04
SetOutPath "$INSTDIR"
WriteINIStr "$INSTDIR\operaprefs_default.ini" "System" "Multi User" "0"
SectionEnd

Function .onSelChange
!insertmacro StartRadioButtons $1
!insertmacro RadioButton ${Sec03}
!insertmacro RadioButton ${Sec04}
!insertmacro EndRadioButtons
FunctionEnd


Кнопки 3 и 4 переключаются, но только не с первого раза. В первый клик кнопка 3 не выключается. Получаются обе секции включенными...

kotkovets 30-05-2011 09:48 1684923

wolkow70,
функцию .onInit переместите в скрипте - пропишите после всех секций, для корректного определения индетификаторов секций, вас же компилятор просит же... :)
для NSIS последовательность действий очень важна!

wolkow70 30-05-2011 10:31 1684945

Сия Ваша рекомендация не помогла.

Function .onSelChange
!insertmacro StartRadioButtons $1
!insertmacro RadioButton ${ID_03}
!insertmacro RadioButton ${ID_04}
!insertmacro EndRadioButtons
!insertmacro StartRadioButtons $2
!insertmacro RadioButton ${ID_14}
!insertmacro RadioButton ${ID_15}
!insertmacro EndRadioButtons
FunctionEnd
;(ПОСЛЕ ВСЕ СЕКЦИЙ)
Function .onInit
StrCpy $SysDrive $WINDIR 2
StrCpy $1 ${ID_3}
StrCpy $2 ${ID_14}
FunctionEnd

Кнопки 14,15 вроде работают, а 3,4 как попало.

http://s013.radikal.ru/i323/1105/23/02a52b6d3be4.png

Иеще почему-то первую секцию цепляют, хотя она вообще не при чем...

Разобрался, мой косяк.
Перепутал в идентификаторах секций 03 и 3 , 04 и 4

DruOleg 01-06-2011 15:39 1686462

2 вопроса:
1. необходимо в PHP-файл добавить строки. Нашел следующий способ:
Section
ClearErrors
FileOpen $0 $INSTDIR\config.php a
IfErrors done
FileWrite $0 "$$CFG->dbtype = '$DBtype'"
FileClose $0
done:
SectionEnd
Но в данном случае строки добавляются в начало файла сплошняком. Можно как то заставить его добавлять строки в конец файла, но не за пределами закрытия php-скрипта, т. е. перед "?>" ?

2. как добавить между строками разрыв (Enter)?
Спасибо!

kotkovets 01-06-2011 17:03 1686526

DruOleg, Вам уже не мало примеров приводили на макросе LineFind
В справке по индексу LineFind - читайте и изучайте
Цитата:

Цитата DruOleg
добавлять строки в конец файла, но не за пределами закрытия php-скрипта, т. е. перед "?>" ? »

Пример все тот же на LineFind перед "?>" запишет nsis
Код:

Function Replace
  ${If} $R9 == "?>"
  ${OrIf} $R9 == "?>$\r$\n"
  ${OrIf} $R9 == "?>$\r"
  ${OrIf} $R9 == "?>$\n"
    StrCpy $R9 "nsis$\r$\n?>$\r$\n"
    ;------
    ;------
    ;------
  ${EndIf}
  Push $0
FunctionEnd

Цитата:

Цитата DruOleg
добавлять строки в конец файла »

Код:

;---
FileSeek $0 0 End
FileWrite $0 "$\r$\n$$CFG->dbtype = '$$DBtype'$\n$\r"

Цитата:

Цитата DruOleg
как добавить между строками разрыв (Enter)? »

$\n - переместить каретку на новую строку
$\r - переместить каретку на начало строки
$\n$\r - переместить каретку на начало новой строки
$\t - знак табуляции, клавиша <Tab>

TTTLordLeo 02-06-2011 15:56 1687139

Kotkovets, посоветуй, пожалуйста, по следующим вопросам.

Для страниц инсталлятора я использую .ini файл с настройками элементов на странице.
Я нашел решение типа, где поля создаются напрямую в функции:

${NSD_CreateText} 0 20u 100% 15u "Здесь можно печатать..."
Pop $Text
${NSD_OnChange} $Text fnTextChange

Вопрос 1: как я могу присоединить функцию к событию элемента в моем случае

!insertmacro MUI_INSTALLOPTIONS_WRITE "ProgramPath.ini" "Field 2" "Flag" "DISABLED" - этот код почему то не делает не активным текстовое поле.

Вопрос 2: как изменить активность элемента?

У меня не получается прописать путь по умолчанию в текстовое поле кодом в функции страницы:
!insertmacro MUI_INSTALLOPTIONS_WRITE "ProgramPath.ini" "Field 1" "State" "C:\ProgramFolder"

Вопрос 3: как прописать текст в текстовое поле до отображения страницы?


Код скрипта в скрытом тексте
читать дальше »
!include "Library.nsh"
!include "sections.nsh"
!include "MUI.nsh"
!include "LogicLib.nsh"
!include "OLEDB.NSH"

Name "Declarant TS"
Caption "Установка программы Declarant TS"
OutFile "InstallDeclarantTS.exe"
InstallDir "C:\GTD"
ShowInstDetails show

!define MUI_COMPONENTSPAGE_SMALLDESC
!define MUI_FINISHPAGE_NOAUTOCLOSE

Var IsInstallDB
Var ProgramFolderPath
Var DBFileFolderPath

Var ServerName
Var UserName
Var UserPathword
;Var ServerInstance

;----Страницы шагов--------
PageEx custom
PageCallBacks EnterWelcomePage LeaveWelcomePage
PageExEnd

PageEx custom
PageCallBacks EnterPathPage LeavePathPage
PageExEnd

PageEx custom
PageCallBacks EnterServerAdjustmentsPage LeaveServerAdjustmentsPage
PageExEnd

!insertmacro MUI_PAGE_INSTFILES
;---------------------------------

!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS
!insertmacro MUI_LANGUAGE "Russian"

Function .onInit
InitPluginsDir
!insertmacro MUI_INSTALLOPTIONS_EXTRACT "Welcome.ini"
!insertmacro MUI_INSTALLOPTIONS_EXTRACT "ProgramPath.ini"
!insertmacro MUI_INSTALLOPTIONS_EXTRACT "ServerAdjustments.ini"
FunctionEnd

Function CheckConnection

${OLEDB}::SQL_Logon "$ServerName" "$UserName" "$UserPathword"
Pop $0
${If} $0 == 0
MessageBox MB_OK "Соединение успешно установлено!"
${Else}
MessageBox MB_OK "Попытка соединения завершилась неудачно!"
${EndIf}

FunctionEnd

Section ""

detailprint "Подключение к серверу $ServerName"

${OLEDB}::SQL_Logon "" "" "" ;"$ServerName" "$UserName" "$UserPathword"
Pop $0
;${If} $0 == 1
DetailPrint $0
Pop $0
DetailPrint $0
;${EndIf}

${OLEDB}::SQL_ExecuteScript "test.sql"
Pop $0
;${If} $0 == 1
Pop $0
DetailPrint $0
;${EndIf}

detailprint ""
detailprint "Копирование файлов"
SetOutPath $ProgramFolderPath
File Files\Antlr3.Runtime.dll
File Files\Castle.Core.dll
File Files\Castle.DynamicProxy2.dll
File Files\Castle.DynamicProxy.dll
File Files\Core.dll
File Files\Core.Impl.dll
File Files\DBConnectionParameters.xml
File Files\Declaration.Domain.Impl.dll
File Files\Declaration.Presenters.Impl.dll
File Files\Declaration.Views.dll
File Files\Declaration.Views.Impl.dll
File Files\DeclarationElectronicCopy.dll
File Files\Domain.Impl.dll
File Files\Enums.dll
File Files\Events.dll
File Files\Handbooks.Domain.dll
File Files\Handbooks.Presenters.dll
File Files\Handbooks.Presenters.Impl.dll
File Files\Handbooks.Views.dll
File Files\Handbooks.Views.Impl.dll
File Files\Iesi.Collections.dll
File Files\Injection.dll
File Files\Injection.Impl.dll
File Files\local.hibernate.cfg.xml
File Files\log4net.dll
File Files\Main.Presenters.dll
File Files\Main.Presenters.Impl.dll
File Files\Main.Views.dll
File Files\Main.Views.Impl.dll
File Files\NHibernate.ByteCode.Castle.dll
File Files\NHibernate.dll
File Files\nhibernate-configuration.xsd
File Files\nhibernate-mapping.xsd
File Files\Ninject.dll
File Files\nunit.core.dll
File Files\nunit.framework.dll
File Files\Print.dll
File Files\ProgramAdjustments.xml
File Files\remote.hibernate.cfg.xml
File Files\Repositories.dll
File Files\Repositories.Impl.dll
File Files\Screen.Presenters.dll
File Files\Screen.Presenters.Impl.dll
File Files\Screen.Views.dll
File Files\Screen.Views.Impl.dll
File Files\Services.dll
File Files\sqlceca35.dll
File Files\sqlcecompact35.dll
File Files\sqlceer35EN.dll
File Files\sqlceer35RU.dll
File Files\sqlceme35.dll
File Files\sqlceoledb35.dll
File Files\sqlceqp35.dll
File Files\sqlcese35.dll
File Files\System.Data.SqlServerCe.dll
File Files\System.Data.SqlServerCe.Entity.dll
File Files\DeclarantTS.exe

CreateShortCut "C:\Documents and Settings\All Users\Рабочий стол\DeclarantTS.lnk" "$ProgramFolderPath\DeclarantTS.exe"
SectionEnd

Function EnterWelcomePage
!insertmacro MUI_HEADER_TEXT "Приветствие" "Вас приветствует мастер установки Declarant TS"
!insertmacro MUI_INSTALLOPTIONS_INITDIALOG "Welcome.ini"
!insertmacro MUI_INSTALLOPTIONS_SHOW
FunctionEnd

Function LeaveWelcomePage
!insertmacro MUI_INSTALLOPTIONS_READ $IsInstallDB "Welcome.ini" "Field 1" "State"
FunctionEnd

Function EnterPathPage
!insertmacro MUI_HEADER_TEXT "Выбор путей" "Выберите папки,куда требуется установить программу"
!insertmacro MUI_INSTALLOPTIONS_INITDIALOG "ProgramPath.ini"
!insertmacro MUI_INSTALLOPTIONS_SHOW
!insertmacro MUI_INSTALLOPTIONS_WRITE "ProgramPath.ini" "Field 1" "State" "C:\ProgramFolder"

${if} $IsInstallDB == 0
;!insertmacro MUI_INSTALLOPTIONS_WRITE "ProgramPath.ini" "Field 2" "Flag" "DISABLED"
${endif}
FunctionEnd

Function LeavePathPage
!insertmacro MUI_INSTALLOPTIONS_READ $ProgramFolderPath "ProgramPath.ini" "Field 1" "State"
!insertmacro MUI_INSTALLOPTIONS_READ $DBFileFolderPath "ProgramPath.ini" "Field 2" "State"
FunctionEnd

Function EnterServerAdjustmentsPage
${if} $IsInstallDB == 0
Abort
${endif}
!insertmacro MUI_HEADER_TEXT "Доступ к серверу" "Укажите настройки доступа к серверу MS SQL, к которой будет подсоединена база данных"
!insertmacro MUI_INSTALLOPTIONS_INITDIALOG "ServerAdjustments.ini"
!insertmacro MUI_INSTALLOPTIONS_SHOW
FunctionEnd

Function LeaveServerAdjustmentsPage
Call SaveServerAdjustments
FunctionEnd

Function SaveServerAdjustments
!insertmacro MUI_INSTALLOPTIONS_READ $ServerName "ServerAdjustments.ini" "Field 1" "Text"
!insertmacro MUI_INSTALLOPTIONS_READ $UserName "ServerAdjustments.ini" "Field 2" "Text"
!insertmacro MUI_INSTALLOPTIONS_READ $UserPathword "ServerAdjustments.ini" "Field 3" "Text"
!insertmacro MUI_INSTALLOPTIONS_READ $0 "ServerAdjustments.ini" "Field 4" "Text"
${if} $0 <> ""
StrCpy $ServerName "$ServerName\$0"
${endif}
FunctionEnd

kotkovets 02-06-2011 16:20 1687150

Цитата:

Цитата TTTLordLeo
Я нашел решение типа, где поля создаются напрямую в функции:
${NSD_CreateText} 0 20u 100% 15u "Здесь можно печатать..."
Pop $Text
${NSD_OnChange} $Text fnTextChange »

Этот код для nsDialogs -> MUI2.nsh
Цитата:

Цитата TTTLordLeo
Для страниц инсталлятора я использую .ini файл с настройками элементов на странице. »

Этот код для InstallOptions.dll -> MUI.nsh - почти не использую, так что пишите на MUI2, тогда подскажу... :dont-know

TTTLordLeo 02-06-2011 19:50 1687288

в MUI2 определение элементов и их положение возможно только способом указания кода их создания в функция скрипта?
Или есть способ накидать элементы в визуальном дизайнере? Для MUI я использовал nisedit

kotkovets 02-06-2011 21:42 1687329

Цитата:

Цитата TTTLordLeo
в MUI2 определение элементов и их положение возможно только способом указания кода их создания в функция скрипта? »

конечно! никаких ini - чистый апи, работает все прекрасно - дело в тренировке и изучением толмутов.
Тем более посмотрите предыдущие странички темы этак 20 - 30 страниц - я много приводил примеров создания страничек на MUI2
Цитата:

Цитата TTTLordLeo
есть способ накидать элементы в визуальном дизайнере? »

есть, но для юникодной версии NSIS (ссылка в шапке), но правда далеко от идеала. После 5 минут общения с дизайнером пропала охота пользоваться... :o http://coolsoft.altervista.org/en/nsisdialogdesigner

Flix 06-06-2011 21:32 1689574

Парень из Словакии (под ником Slappy) создал плагин для "HM NIS Edit", позволяющий создавать дизайн окон инсталлятора NSIS как в InnoSetup. Назвал он свое творение "Graphical Installer " и распространяет за деньги. Ориентирование плагина - создание красочных инсталляторов для игрушек. Кто-нибудь уже испытывал это чудо?
Он пишет, что этого результата можно добиться и без его дополнения. Я хотел спросить здесь у опытных NSIS-ишников (я только начал знакомиться с этим установщиком) - это действительно возможно? Просто дайте мне направление, на что обратить внимание (какие плагины или модули использовать), а я уже буду дальше сам разбираться. Как говорится, зачем платить.

Может у кого здесь уже есть наработки в этом направлении, будет приятно с ними познакомиться и разобрать ко косточкам.

sawe 06-06-2011 23:02 1689634

Я сам спрашивал по этой теме, но пока не получил ответ, брал основу с Wansis plug-in.
Или вот этот пример я перевёл, демонстрация NSIS плагина Wansis.dll .
Есть такой SkinCrafter plug-in,
пример его использования описан в Справочнике по NSIS,
плагин красивый но совершенно бесполезен для компактных пакетов.
Можешь попробовать UltraModernUI
или
SkinnedControls plug-in
ButtonEvent plug-in
nsDialogs_setImageOle.nsh

или заполнение картинкой
Image in installer window background
вот я спрашивал по использованию этой картинки
по этой же теме

MaGoth 07-06-2011 05:16 1689721

Flix,
Цитата:

Может у кого здесь уже есть наработки в этом направлении, будет приятно с ними познакомиться и разобрать ко косточкам.
Попробуй это, может подойдет - ЕxperienceUI ?!
Скины в ней тоже можно свои клепать, насколько я помню...

Flix 07-06-2011 11:21 1689818

sawe, MaGoth - спасибо, что отозвались. Теперь буду изучать матчасть.

wolkow70 09-06-2011 15:37 1691467

Уважаемый 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 1691713

Цитата:

Цитата wolkow70
Интуитивно я понял, что это связано с наличием расширения 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 (перепрыгнуть через три команды по скрипту).
Цитата:

Цитата wolkow70
Смущает вот, что »

а че здесь смущаться...xex
$ClassName -> равносильно AIMP.${extenstion} команда явно жежь указана - StrCpy $ClassName "AIMP.${extenstion}" . Просто сделано, чтобы покороче записывать в скрипте.
Надеюсь понятно...если внимательно почитали и применили на практике

wolkow70 10-06-2011 07:32 1691851

Цитата:

Цитата kotkovets
Надеюсь понятно...если внимательно почитали и применили на практике »

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

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 1691887

Цитата:

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

Если не применяете это расширение, то конечно же нет. к тому же две дублирующие записи, не ошибка, но не нужно так делать:
Код:

WriteRegStr HKCR "${extenstion}" "" "$ClassName"
;---
;---
noaudio:
 WriteRegStr HKCR ".${extenstion}" "" "$ClassName"
;---
;---


wolkow70 10-06-2011 13:35 1692060

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 1692093

Комментарии по командам
Цитата:

Цитата wolkow70
ReadRegStr $0 HKCR "AudioCD\shell\play\command" "" »

Читаем из реестра значение по умолчанию, значение записываем в $0.
Здесь очевидно, получаем путь к Winamp.exe
Цитата:

Цитата wolkow70
StrCpy $1 $0 "" 14 »

А вот это лажа полная! Зачем из строки пути отсекать первые 14 символов :o для получения имени модуля...
Пути разнообразные бывают, в итоге кашу получим. Для получения имени модуля делается так:
Код:

!include "FileFunc.nsh"
;--
${GetFileName} "$0" "$1" ; т.е взамен StrCpy $1 $0 "" 14

Цитата:

Цитата wolkow70
${IfThen} $R0 != "" ${|} WriteRegStr HKCR “AudioCD\shell\play\command" "" $R0 ${|} »

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

wolkow70 10-06-2011 15:16 1692122

Цитата:

Цитата kotkovets
а дальше удаляется значение бэкапа реестра. »

Значение бэкапа удалилось, но по умолчанию после деинсталляции остался 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 1692238

Вложений: 1
Просмотрев на офф. сайте плагины которые работают с процессами, для себя посчитал наиболее удачный и даже лучший nsProcess.
Но ни один из них не умеет завершать оболочку системы, с ошибками работают в 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 1692518

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 1692787

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 1692896

Цитата:

Цитата wolkow70
Получилось сделать удаление записи 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 1692966

Цитата:

Цитата 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"

sawe 15-06-2011 20:23 1695055

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

kotkovets 15-06-2011 22:00 1695105

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

sawe 15-06-2011 22:49 1695149

А более упрощённую, в одну линию, где только будет
${NSD_CreateDirRequest} и ${NSD_CreateBrowseButton}

funtykin 16-06-2011 14:47 1695579

Здравствуйте! помогите пожалуйста.

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

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

sawe 16-06-2011 22:43 1695973

Цитата:

Цитата funtykin
необходимо реализовать диалоговое окно в котором нужно указать фаил и скопировать его в дальнейшем в путь установки. »

Не совсем понятен смысл этих действий, если я правильно понял, то попробуй покрути такой вариант.
Код:

  !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


Tankan 17-06-2011 09:59 1696142

Добрый день.
У меня возникло пара вопросов, ответьте пожалуйста:
1) Как предотвратить повторный запуск инсталлятора? (без плагинов и прочего)
2) Как сделать, чтоб файлы после инсталляции, были с атрибутами скрытый и системный?
ps в другом инсталляторе ставил атрибуты, а потом собирал инсталлятор и атрибуты сохранялись. а в этом так не получается.
3) Как можно добиться максимального сжатия? может есть какой то плагин позволяющий очень сильно сжимать?
Или можно как то сжимать файлы несколько раз?
ps winrar сильнее сжимает.
pss в nsis'e ставлю максимальное... но всё равно не сильно жмет

Спасибо!

wolkow70 17-06-2011 10:08 1696147

Копаюсь с функцией InstallFolderInternal из любимого VLC.
И вот, что интересно:

Var UninstallLog
!macro OpenUninstallLog
FileOpen $UninstallLog "$INSTDIR\uninstall.log" a
FileSeek $UninstallLog 0 END
!macroend

!macro CloseUninstallLog
FileClose $UninstallLog
SetFileAttributes "$INSTDIR\uninstall.log" HIDDEN
!macroend

!macro InstallFile FILEREGEX
File "${FILEREGEX}"
!define Index 'Line${__LINE__}'
FindFirst $0 $1 "$INSTDIR\${FILEREGEX}"
StrCmp $0 "" "${Index}-End"
"${Index}-Loop:"
StrCmp $1 "" "${Index}-End"
FileWrite $UninstallLog "$1$\r$\n"
FindNext $0 $1
Goto "${Index}-Loop"
"${Index}-End:"
!undef Index
!macroend
;
!macro InstallFolder FOLDER
File /r "${FOLDER}"
Push "${FOLDER}"
Call InstallFolderInternal
!macroend
;
Function InstallFolderInternal
Pop $9
!define Index 'Line${__LINE__}'
FindFirst $0 $1 "$INSTDIR\$9\*"
StrCmp $0 "" "${Index}-End"
"${Index}-Loop:"
StrCmp $1 "" "${Index}-End"
StrCmp $1 "." "${Index}-Next"
StrCmp $1 ".." "${Index}-Next"
IfFileExists "$9\$1\*" 0 "${Index}-Write"
Push $0
Push $9
Push "$9\$1"
Call InstallFolderInternal
Pop $9
Pop $0
Goto "${Index}-Next"
"${Index}-Write:"
FileWrite $UninstallLog "$9\$1$\r$\n"
"${Index}-Next:"
FindNext $0 $1
Goto "${Index}-Loop"
"${Index}-End:"
!undef Index
FunctionEnd
;
Section "!${PRODUCT_NAME}" Install
SectionIn 1 2 3 RO
SetShellVarContext all
SetOutPath "$INSTDIR"

!insertmacro OpenUninstallLog

ЕСЛИ файл скрипта лежит в одной директории с файлами установки и при этом прописать так:

!insertmacro InstallFile vlc.exe
!insertmacro InstallFile vlc.exe.manifest
!insertmacro InstallFile libvlc.dll
!insertmacro InstallFile libvlc.dll.manifest

То при установке устанавливаемые файлы в логе UninstallLog прописываются .

А, если файл скрипта поместить в другую папку и прописать пути к файлам:

!insertmacro InstallFile "${FILEPATH}\vlc\vlc.exe"
!insertmacro InstallFile "${FILEPATH}\vlc\vlc.exe.manifest"
!insertmacro InstallFile "${FILEPATH}\vlc\libvlc.dll"
!insertmacro InstallFile "${FILEPATH}\vlc\libvlc.dll.manifest"

То инсталляция происходит нормально, но списка файлов в UninstallLog нет

В чем дело не пойму .... Может кто знает в чем заковырка?

Krinkels 17-06-2011 10:30 1696168

Tankan
1. Можно сделать так:
читать дальше »
Код:

System::Call "kernel32::CreateMutexA(i 0, i 0, t '$(^Name)') i .r0 ?e"
 Pop $0
 StrCmp $0 0 launch
  StrLen $0 "$(^Name)"
  IntOp $0 $0 + 1
 loop:
  FindWindow $1 '#32770' '' 0 $1
  IntCmp $1 0 +4
  System::Call "user32::GetWindowText(i r1, t .r2, i r0) i."
  StrCmp $2 "$(^Name)" 0 loop
  System::Call "user32::SetForegroundWindow(i r1) i."
  Abort
 launch:


3. Для NSIS есть плагин для распаковки 7z архивов, используй его. Так же могу скинуть плагин для распаковки FreArc архивов.

funtykin 17-06-2011 11:01 1696185

sawe,

Спасибо! то что нужно!

funtykin 17-06-2011 12:11 1696242

Цитата:

Цитата sawe

Код:

!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


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

Tankan 17-06-2011 15:01 1696404

Krinkels,
1. Как так? конкретный код дай, который мне можно встатвить в свой.

2. По этому вопросу что скажите? Как установить атрибуты на файлы, чтоб извлекались и билы скрытие и системные.

3. А при чем тут распаковка? если мне нужна упаковка с сильным скажитем.
Возможно даже, что сжимать несколько раз, чтоб добиться меньшего размера инсталлятора.

Пожалуйства ответьте, кто хорошо понимает в nsis, как можно сдлать этакое.

sawe 17-06-2011 17:52 1696546

Цитата:

Цитата funtykin
а как тут выцарапать путь указанного файла? »

Объясни подробно, что и как вам нужно и для какой цели, очень часто бывает, что решение намного проще чем вы его себе представляете в начале!

sawe 17-06-2011 19:22 1696585

Цитата:

Цитата Tankan
По этому вопросу что скажите? Как установить атрибуты на файлы, чтоб извлекались и билы скрытие и системные. »

Код:

  NORMAL или FILE_ATTRIBUTE_NORMAL (или просто 0)
  ARCHIVE или FILE_ATTRIBUTE_ARCHIVE
  HIDDEN или FILE_ATTRIBUTE_HIDDEN
  OFFLINE или FILE_ATTRIBUTE_OFFLINE
  READONLY или FILE_ATTRIBUTE_READONLY
  SYSTEM или FILE_ATTRIBUTE_SYSTEM
  TEMPORARY или FILE_ATTRIBUTE_TEMPORARY

Пример применения:
Код:

SetFileAttributes "$INSTDIR\имя_файл.exe" ARCHIVE|HIDDEN|SYSTEM|READONLY
Цитата:

Цитата Tankan
3. А при чем тут распаковка? если мне нужна упаковка с сильным скажитем. »

Штатными средствами NSIS можно увеличить сжатие
Код:

SetCompressor /FINAL /SOLID lzma
Можно так же положи в папку со скриптом файл upx.exe и вставь этот код
Код:

!define HAVE_UPX
!ifdef HAVE_UPX
  !packhdr tmpexe.tmp "UPX --best -q --compress-icons=0 tmpexe.tmp"
!endif

Есть очень хороший плагин для архивов FreeArc - распаковка arc-архивов, несколько страниц назад пролистайте и найдёте его.

Я в таких случаях использую 7-Zip архиватор, попробуй мою сборку этого архиватора Zip 9.22 с последним SFX или с сайта автора SFX.

NSIS имеет ограничение на файл размером более 2GB, и при большом размере файла инсталлятора иконка не видна, поэтому лучше прикреплять большие файлы, и что бы сильно не мудрить, можно использовать такой код:

Код:

Copyfiles /SILENT "$EXEDIR\Имя_файла.exe" "$INSTDIR\Имя_файла.exe" # паравозик!
  ExecWait "$INSTDIR\Имя_файла.exe" # извлечь ожидая завершения!
 Delete "$INSTDIR\Имя_файла.exe" # если более не нужен!

Здесь на форуме в разделе InnoSetup используют Утилиту Precomp, которая разбирает файл на бинарник а потом собирает его в Патч, но уже намного меньшего размера, после инсталляции производит эту операцию в обратном порядке.

--

funtykin 18-06-2011 10:18 1696861

sawe, Спасибо я вчера еще разобрался.. то что вы мне первый раз написали оказалось достаточным чтобы начать понимать как это работает.

sawe 18-06-2011 15:29 1696992

Цитата:

Цитата funtykin
оказалось достаточным чтобы начать понимать как это работает. »

Ну тогда читай \Docs\InstallOptions\Readme.html

kotkovets 18-06-2011 17:53 1697090

Цитата:

Цитата sawe
Можно ли, создать кустомную страницу используя nsDialog для отображения страницы СтартМеню »

Вот пример, сливаем архив Listview.zip отсюда подключаем библиотеку CommCtrl.nsh
читать дальше »
Код:

!include "MUI2.nsh"
!include "CommCtrl.nsh"
!include "FileFunc.nsh"
!insertmacro Locate

Name "ListView"
Caption "ListView DetailPrint"
OutFile StartMenu.exe
ShowInstDetails show

!define PROGRAMS "Test ListView"


Page custom CreatePage LeavePage

!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

Var Dialog
Var ListView
Var Text
Var Item
Var CheckBox
Var STARTMENUFOLDER
Var Check

Function CreatePage
    !insertmacro MUI_HEADER_TEXT `Listview control SMPROGRAMS` \
                                `A ListView control created by nsDialogs plugin`
    nsDialogs::Create 1018
    Pop $Dialog
   
    ${NSD_CreateText} 0 0u 100% 12u `${PROGRAMS}`
    Pop $Text
    ${NSD_SetFocus} $Text
   
    ${NSD_CreateListView} 0 20u 100% 75% ``
    Pop $ListView
    ${NSD_LV_InsertColumn} $ListView 0 425 `« меню Пуск -> Программы »`
   
    ${NSD_CreateCheckBox} 0u 130u 200u 12u "Не создавать ничего в « меню Пуск -> Программы »"
    Pop $CheckBox
    ${NSD_OnClick} $CheckBox fnCheckBox
   
    SetShellVarContext all
    System::Alloc 512
    Pop $R5
    System::Call `comctl32::ImageList_Create(i16,i16,i${ILC_MASK}|${ILC_COLOR32},i0,i0)i.R4` ; создаем массив изображений
    StrCpy $Item "-1"
    ${Locate} "$SMPROGRAMS" "/L=D /G=0" "SMPROGRAMS"
    SendMessage $ListView ${LVM_SETIMAGELIST} ${LVSIL_SMALL} $R4 ;ложим ImageList на ListView
    SendMessage $ListView ${LVM_SETEXTENDEDLISTVIEWSTYLE} ${LVS_EX_LABELTIP} ${LVS_EX_LABELTIP} ;подсказка, если текст за выходит заграницу ListView
    SendMessage $ListView ${LVM_SETEXTENDEDLISTVIEWSTYLE} ${LVS_EX_FULLROWSELECT} ${LVS_EX_FULLROWSELECT} ;полное выделение
    ;SendMessage $ListView ${LVM_SETEXTENDEDLISTVIEWSTYLE} ${LVS_EX_GRIDLINES} ${LVS_EX_GRIDLINES} ;добавляем линии в ListView
    ${NSD_OnNotify} $ListView GetNamePROGRAMS
    nsDialogs::Show
    System::Call `comctl32::ImageList_Destroy(iR4)`
    System::Free $R5
FunctionEnd

Function fnCheckBox
  Pop $CheckBox
  ${NSD_GetState} $CheckBox $Check
  ${If} $Check = 1
    EnableWindow $Text 0
    EnableWindow $ListView 0
  ${ElseIf} $Check = 0
    EnableWindow $Text 1
    EnableWindow $ListView 1
  ${EndIf}
FunctionEnd

Function SMPROGRAMS
  IntOp $Item $Item + 1
  System::Call 'shell32::SHGetFileInfo(tR9,i0,iR5,i352,\
  i${SHGFI_ICON}|${SHGFI_SMALLICON}|${SHGFI_DISPLAYNAME})' ;выдергиваем иконки из папки через кэш проводника
  System::Call "*$R5(i.R3)" ;массив иконок
  System::Call "comctl32::ImageList_AddIcon(iR4,iR3)" ;добавляем иконку в ImageList
  System::Call `user32::DestroyIcon(iR3)`
  System::Call `kernel32::FreeLibrary(iR4)`
  ${NSD_LV_InsertItem} $ListView $Item $R7 ;создаем итемы в ListView
  ${NSD_LV_SetItemImage} $ListView $Item $Item
  Push $0
FunctionEnd
   
Function GetNamePROGRAMS ;обработка события отметки
  System::Store SR1R1R0 ;приватный стек с идентификаторами
  ${Select} $R1
    ${Case} ${LVN_ITEMCHANGED} ; признак, событие отметки итема
        System::Call "*$R0(i,i,i,i.R2,i,i,i,i,i,i)" ; находим индекс отмеченного итема
        ${NSD_LV_GetItemText} $ListView $R2 0 "$STARTMENUFOLDER" ;по найденному индексу считываем текст итема
        ${NSD_SetText} $Text "$STARTMENUFOLDER\${PROGRAMS}" ; кидаем текст в поле ввода
    ${CaseElse}
  ${EndSelect}
  System::Store L
FunctionEnd
   
Function LeavePage
  ${NSD_GetState} $CheckBox $Check
  ${If} $Check = 0
    ${NSD_GetText} $Text "$STARTMENUFOLDER"
  ${EndIf}
FunctionEnd

Section Main
  ${If} $Check = 0
      DetailPrint $SMPROGRAMS\$STARTMENUFOLDER
      CreateDirectory "$SMPROGRAMS\$STARTMENUFOLDER" ;создаем папку в меню Пуск -> Программы
  ${EndIf}
SectionEnd


Цитата:

Цитата funtykin
необходимо реализовать диалоговое окно в котором нужно указать фаил и скопировать его в дальнейшем в путь установки. »

Пример на интерфейсе MUI2
читать дальше »
Код:

OutFile "setup.exe"

ShowInstDetails show
InstallDir "$PROGRAMFILES\TEsT"

!include "MUI2.nsh"
!include "FileFunc.nsh"
!insertmacro GetFileName

Page custom SelectFile
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

Var Dialog
Var Button
Var FILEPATH
Var FILENAME

Function SelectFile
    !insertmacro MUI_HEADER_TEXT `Диалог выбора файла для копирования` `Сontrol created by nsDialogs plugin`
    nsDialogs::Create 1018
    Pop $Dialog
      ${NSD_CreateButton} 0 0 60u 14u "Выбор файла"
      Pop $Button
      ${NSD_OnClick} $Button Button ;обработка события на клик кнопки
    nsDialogs::Show
FunctionEnd

Function Button ;функция обработки события
  Pop $Button
  nsDialogs::SelectFileDialog "" "*.*" ;диалог выбора файла
  Pop $FILEPATH ;в переменной FILEPATH - путь к выбранному файлу
FunctionEnd

Section "CopyFile"
    SetOutPath "$INSTDIR"
    ${If} $FILEPATH != '' ;если не выбран файл, то пропустить копирование
        ${GetFileName} "$FILEPATH" "$FILENAME" ;из пути к файлу вытаскиваем имя файла
        CopyFiles /Silent "$FILEPATH" "$INSTDIR\$FILENAME"
    ${EndIf}
SectionEnd


Цитата:

Цитата Tankan
если мне нужна упаковка с сильным сжатием»

Я всегда пакую файлы таким образом, и чаще всего 7-zip отдыхает:
Код:

SetCompressor /SOLID LZMA
SetCompressorDictSize 64 ;или 128, зависит от оперативки компа, максимум 170
SetDatablockOptimize on


sawe 18-06-2011 19:13 1697136

Цитата:

Цитата kotkovets
Вот пример, сливаем архив Listview.zip отсюда подключаем библиотеку CommCtrl.nsh »

Нуууу - вы просто монстр!
Сначала пропал куда-то, тут резко появился, как дед мороз с подарками, и все довольны.
Я такого подарка, даже не ожидал, спасибо будем доводить по месту.

Вот если бы помог разобраться с 1cd theme. На форуме WinAmp тоже не совсем разобрались с этим, посоветовали две короткие строки добавить, но оно не срабатывает.

kotkovets 18-06-2011 20:25 1697178

sawe,
Я скинами не занимаюсь, но думаю, что проблема в плагине и в ресурсах диалога NSIS - не очень дружат, то они.
К тому же плагин требует отключения стиля - вот это ни в какие ворота не лезет! к разрабу плагина обратитесь...

sawe 19-06-2011 00:47 1697333

Я пытался, но они полностью переключились на ExperienceUI, мне не очень-то нравиться скино-творение, но для классического, как мне кажется просто необходимо. Wansis мне понравился из за самого маленького размера и простой реализации.

sawe 20-06-2011 15:53 1698225

Цитата:

Цитата kotkovets
Можно ли, создать кустомную страницу используя nsDialog для отображения страницы СтартМеню »

Есть проблема, когда ни чего не выбрано всё работает OK, когда выбрана папка, инсталлятор создаёт в выбранной папке ярлыки но предварительно не создаёт папку с именем программы.
При таком изменении начинает работать но не удаляет папку:

читать дальше »
Код:

${If} $Check3 = 0
    CreateDirectory "$SMPROGRAMS\$StartMenuFolder\${AppName}" ;создаем папку в меню Пуск -> Программы
    CreateShortCut "$SMPROGRAMS\$StartMenuFolder\${AppName}\${AppName}.lnk" "$INSTDIR\${ExeName}" "" "$INSTDIR\${ExeName}" 0
    CreateShortCut "$SMPROGRAMS\$StartMenuFolder\${AppName}\Справка.lnk" "$INSTDIR\Languages\russian.chm" "" "$WINDIR\hh.exe" 0
        WriteINIStr "$SMPROGRAMS\$StartMenuFolder\${AppName}\${AppName}.url" "InternetShortcut" "URL" "${Website}"
    CreateShortCut "$SMPROGRAMS\$StartMenuFolder\${AppName}\Удаление.lnk" "$INSTDIR\Uninstall.exe"
 ${EndIf}


---

kotkovets 20-06-2011 17:01 1698269

Цитата:

Цитата sawe
Есть проблема »

Все ярлыки и папки создаются для всех пользователей, если нужно для текущего, то вместо SetShellVarContext all пишем SetShellVarContext current в кастомной страничке
Цитата:

Цитата sawe
предварительно не создаёт папку с именем программы»

эту проблему исправил еще вчера и сейчас подправил подстановку константы.
!define PROGRAMS "Test ListView" - ${PROGRAMS} -> значение меняем на нужное название
---
${NSD_SetText} $Text "$STARTMENUFOLDER\${PROGRAMS}" ; кидаем текст в поле ввода
на выходе получаем: $STARTMENUFOLDER = $STARTMENUFOLDER\${PROGRAMS}
т.е достаточно:
CreateDirectory "$SMPROGRAMS\$StartMenuFolder
CreateShortCut "$SMPROGRAMS\$StartMenuFolder\link.lnk" "$INSTDIR\*.exe" "" "$INSTDIR\*.exe" 0

---
Зачем усложнять самого себя еще больше...
Если чебокс отмечен - ничего не будет создаваться.
Все работает, создаются папки и ярлыки - сделано по аналогии с стандартным плагином

Eneten 21-06-2011 14:28 1698865

NSIS. Установка IIS.
 
Вложений: 1
Друзья, помогите пожалуйста.
Мне необходимо установить IIS инсталятором NSIS.

Я пытаюсь выполнять соответствующую команду при помощи ExecCmd::exec. Соответсвующий плагин установлен.
Одна из секций инстолятора имеет следующий вид

Section "IIS" IISSection
ExecCmd::exec /TIMEOUT=10000 '"start /w pkgmgr /iu:IIS-WebServerRole;IIS-WebServer;IIS-CommonHttpFeatures;IIS-StaticContent;IIS-DefaultDocument;IIS-DirectoryBrowsing;IIS-HttpErrors;IIS-HttpRedirect;IIS-ApplicationDevelopment;IIS-ASPNET;IIS-NetFxExtensibility;IIS-ISAPIExtensions;IIS-ISAPIFilter;"'
SectionEnd

При установки появляется сообщение об ошибке (см. прикрепленный файл)

Windows Package Manager
Operation failed with 0x8007000B
An attemt to make a program with an incorrect format.

Подскажите пожалуйста что я делаю не так!
Через командную строку команда успешно выполняется и все нужные компоненты IIS устанавливаются.

kotkovets 21-06-2011 14:43 1698885

Eneten, покажите содержимое батника

Eneten 21-06-2011 16:20 1698969

kotkovets, батника нет!
Есть одна команда которую я хочу вызвать
start /w pkgmgr /iu:IIS-WebServerRole;IIS-WebServer;IIS-CommonHttpFeatures;IIS-StaticContent;IIS-DefaultDocument;IIS-DirectoryBrowsing;IIS-HttpErrors;IIS-HttpRedirect;IIS-ApplicationDevelopment;IIS-ASPNET;IIS-NetFxExtensibility;IIS-ISAPIExtensions;IIS-ISAPIFilter;

onis 23-06-2011 14:51 1700282

Подскажите пожалуйста, как мне сделать регистрацию таких файлов
читать дальше »
ac3filter.ax
CLLine21.ax
CLDemuxer.ax
CLNAVX.ax
CLVSD.ax
CoreAVCDecoder.ax
CoreVorbis.ax
divxdec.ax
DivX.dll
voxmsdec.ax
vsfilter.dll
xvid.ax

в скрипте.
делаю свой кодек пак

kotkovets 23-06-2011 16:26 1700322

Цитата:

Цитата onis
мне сделать регистрацию »

самый простой вариант:
Код:

RegDll "путь\ac3filter.ax"
или так:
Код:

ExecWait '$SYSDIR\RegSvr32.exe /s "путь\ac3filter.ax"'
Разрегистрация:
Код:

UnRegDll "путь\ac3filter.ax"
или так:
Код:

ExecWait '$SYSDIR\RegSvr32.exe /s /u "путь\ac3filter.ax"'

sk07 28-06-2011 15:03 1703025

начитавшись, я правильно понял, что невозможно "выдрать" скрипт из инсталлятора ?

Hector 28-06-2011 15:11 1703028

sk07, да, правильно

sawe 04-07-2011 21:25 1706905

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

Что то вроде этого, но не могу понять, как взять именно последнюю цифру
читать дальше »

Код:

  IfFileExists "$INSTDIR\lang\Russian_old.xml" 0 noInt
  IfFileExists "$INSTDIR\lang\Russian_old_1.xml" 0 +2
  StrCpy $0 Russian_old_1.xml -1 -5
  IfFileExists "$INSTDIR\lang\Russian_old_2.xml" 0 +2
  StrCpy $0 Russian_old_2.xml -1 -5
  ; и так далее ......
 noInt:
  IntOp $0 $0 + 1
  CopyFiles /silent "$INSTDIR\lang\Russian_old.xml" "$INSTDIR\lang\Russian_old_$0.xml"
  Goto noRuss
  IfFileExists "$INSTDIR\lang\Russian.xml" +2
  Rename "$INSTDIR\lang\Russian.xml" "$INSTDIR\lang\Russian_old.xml"
 noRuss:


--

K.A.V. 04-07-2011 21:50 1706926

Если точно знаете, что число будет с одной цифрой, могу предложить самый быстрый и простой вариант

Код:

StrCpy $0 "Russian_old_2.xml" "" -5
StrCpy $0 "$0" 1


kotkovets 04-07-2011 22:12 1706942

Цитата:

Цитата sawe
как взять именно последнюю цифру »

А че ее брать, отсчитываем с конца 5 символов и берем 1 последующий символ
Код:

StrCpy $0 Russian_old_1.xml 1 -5
Цитата:

Цитата sawe
Не могу разобраться с логикой »

Цитата:

Цитата sawe
IfFileExists "$INSTDIR\lang\Russian_old_1.xml" 0 +2
StrCpy $0 Russian_old_1.xml -1 -5
IfFileExists "$INSTDIR\lang\Russian_old_2.xml" 0 +2
; и так далее ...... »

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

sawe 04-07-2011 22:22 1706952

При каждой последующей установке, что бы последняя (старшая) цифра увеличивалась на +1

IntOp $0 $0 + 1 ;прибавляет 1

Как определить последнюю 1,2,3,4,5.....9 цифру, пускай будет один разряд.

Код:

  = $0 > $0
--

kotkovets 05-07-2011 01:10 1707057

Цитата:

Цитата sawe
Не могу разобраться с логикой.
В случае повторной установки (поверх), нужно что бы один файл не переписывался заново и тем более не удалялся, а сохранялся под новым именем. »

Все достаточно просто, создайте рядом со скриптом Текстовый документ.txt и каждый следующий запуск будет прибавлять единицу к имени файла и так до 1000 - потом "обнулится" до единицы - этого вполне достаточно.
Код:

OutFile "setup.exe"
!include "logiclib.nsh"
ShowInstDetails show

Section
#******************************************************************************************
    StrLen $2 "Текстовый документ_old_"        ;получаем число символов для поиска по маске
    StrLen $6 "Текстовый документ_old_1.txt"  ;получаем число символов до old_9
    StrLen $7 "Текстовый документ_old_100.txt" ;получаем число символов до old_1000
#******************************************************************************************
    ${If} ${FileExists} "$EXEDIR\Текстовый документ.txt"
        Rename "$EXEDIR\Текстовый документ.txt" "$EXEDIR\Текстовый документ_old.txt"
    ${ElseIf} ${FileExists} "$EXEDIR\Текстовый документ_old.txt"
        Rename "$EXEDIR\Текстовый документ_old.txt" "$EXEDIR\Текстовый документ_old_1.txt"
    ${Else}
        FindFirst $0 `$1` "$EXEDIR\*.txt" ;ищем все файлы с расширением txt
        ${DoUntil} `$1` == ``            ;в переменную $1 получаем в цикле имена файлов
            StrCpy `$3` `$1` $2          ;берем $2 символов с получаемых имен файлов и результат в $3
            ${If} `$3` == "Текстовый документ_old_"  ;сравниваем результат по маске
                StrLen $5 `$1`                      ;получаем число символов из файла
                ${IfThen} $5 <= $6 ${|}StrCpy $4 `$1` 1 -5${|} ;если $4 < old_9 берем 1 символ
                ${IfThen} $5 > $6 ${|}StrCpy $4 `$1` 2 -6${|}  ;если $4 > old_9 берем 2 символа
                ${IfThen} $5 >= $7 ${|}StrCpy $4 `$1` 3 -7${|}  ;если $4 > old_99 берем 3 символа
                IntOp $4 $4 + 1
                Rename "$EXEDIR\$1" "$EXEDIR\$3$4.txt"
                DetailPrint "$3$4.txt"
                ${Break} ; выход из цикла
              ${EndIf}
              FindNext $0 $1
        ${Loop}
        FindClose $0
    ${EndIf}
   
SectionEnd


sawe 05-07-2011 01:55 1707072

Спасибо, что откликнулись!

kotkovets
Не совсем то, пример работает только с одним файлом, старые не сохраняет, но мысль понятна, остальное сам доведу.

И ещё один вопрос, используя MUI2 - nsDialog, уже в готовом и отлаженом скрипте, что бы его не уродовать, хотелось бы простым способом заглушить CheckBox. Что бы CheckBox был отмечен, и пользователь не мог выбрать действие.

В InstallOptions это легко реализуется установкой флага, в nsDialog это намного сложнее.

kotkovets 05-07-2011 03:46 1707094

Цитата:

Цитата sawe
И ещё один вопрос, используя MUI2 - nsDialog, уже в готовом и отлаженом скрипте, что бы его не уродовать, хотелось бы простым способом заглушить CheckBox. Что бы CheckBox был отмечен, и пользователь не мог выбрать действие.
В InstallOptions это легко реализуется установкой флага, в nsDialog это намного сложнее. »

ИМХО!!! все очень просто, в переменной $CheckBox - хэндл чебокса, а если есть хэндл делаем все, что хотим....
InstallOptions - устаревшая вещь, nsDialogs намного больше возможностей, а если еще в паре с system.dll, можно делать почти всё - средствами Win API

Код:

OutFile "winreview.exe"
ShowInstDetails show

Var Dialog
Var CheckBox

Function fnCustomInit
    nsDialogs::Create 1018
    Pop $Dialog
     
      ${NSD_CreateCheckBox} 0 45u 120u 10u "Нельзя отметить флажком"
      Pop $CheckBox
      ${NSD_SetState} $CheckBox 1 ;отмеченный чебокс
      EnableWindow $CheckBox 0 ;глушим чебокс
     
  nsDialogs::Show
FunctionEnd

Function fnCustomDestroy
  ${NSD_GetState} $CheckBox $0
   
FunctionEnd

Section
  StrCmp $0 1 0 +2
  MessageBox MB_ICONINFORMATION|MB_OK "чебокс отмеченный" IDOK
SectionEnd


wolkow70 05-07-2011 11:45 1707290

Уважаемый kotkovets, пытаюсь осваивать, что нибудь более сложное, чем скрипт регистрации ассоциаций от AIMP. В справке нашел такие варианты:

1.
!macro APP_ASSOCIATE EXT FILECLASS DESCRIPTION ICON COMMANDTEXT COMMAND
; Backup the previously associated file class
ReadRegStr $R0 HKCR ".${EXT}" ""
WriteRegStr HKCR ".${EXT}" "${FILECLASS}_backup" "$R0"
WriteRegStr HKCR ".${EXT}" "" "${FILECLASS}"
WriteRegStr HKCR "${FILECLASS}" "" `${DESCRIPTION}`
WriteRegStr HKCR "${FILECLASS}\DefaultIcon" "" `${ICON}`
WriteRegStr HKCR "${FILECLASS}\shell" "" "open"
WriteRegStr HKCR "${FILECLASS}\shell\open" "" `${COMMANDTEXT}`
WriteRegStr HKCR "${FILECLASS}\shell\open\command" "" `${COMMAND}`
!macroend

2.
!macro APP_ASSOCIATE_EX EXT FILECLASS DESCRIPTION ICON VERB DEFAULTVERB SHELLNEW COMMANDTEXT COMMAND
; Backup the previously associated file class
ReadRegStr $R0 HKCR ".${EXT}" ""
WriteRegStr HKCR ".${EXT}" "${FILECLASS}_backup" "$R0"
WriteRegStr HKCR ".${EXT}" "" "${FILECLASS}"
StrCmp "${SHELLNEW}" "0" +2
WriteRegStr HKCR ".${EXT}\ShellNew" "NullFile" ""
WriteRegStr HKCR "${FILECLASS}" "" `${DESCRIPTION}`
WriteRegStr HKCR "${FILECLASS}\DefaultIcon" "" `${ICON}`
WriteRegStr HKCR "${FILECLASS}\shell" "" `${DEFAULTVERB}`
WriteRegStr HKCR "${FILECLASS}\shell\${VERB}" "" `${COMMANDTEXT}`
WriteRegStr HKCR "${FILECLASS}\shell\${VERB}\command" "" `${COMMAND}`
!macroend

3.
!macro RegisterExtension_
!verbose push
!verbose ${_FileAssociation_VERBOSE}

Exch $R2 ;exe
Exch
Exch $R1 ;ext
Exch
Exch 2
Exch $R0 ;desc
Exch 2
Push $0
Push $1

ReadRegStr $1 HKCR $R1 "" ; read current file association
StrCmp "$1" "" NoBackup ; is it empty
StrCmp "$1" "$R0" NoBackup ; is it our own
WriteRegStr HKCR $R1 "backup_val" "$1" ; backup current value
NoBackup:
WriteRegStr HKCR $R1 "" "$R0" ; set our file association

ReadRegStr $0 HKCR $R0 ""
StrCmp $0 "" 0 Skip
WriteRegStr HKCR "$R0" "" "$R0"
WriteRegStr HKCR "$R0\shell" "" "open"
WriteRegStr HKCR "$R0\DefaultIcon" "" "$R2,0"
Skip:
WriteRegStr HKCR "$R0\shell\open\command" "" '"$R2" "%1"'
WriteRegStr HKCR "$R0\shell\edit" "" "Edit $R0"
WriteRegStr HKCR "$R0\shell\edit\command" "" '"$R2" "%1"'

Pop $1
Pop $0
Pop $R2
Pop $R1
Pop $R0

!verbose pop
!macroend

Не могу разобраться какой лучше, и как его использовать в контексте работы с секциями. Помогите, плиз.
И почему согласно макросам нужно использовать именно HKCR , а не HKLM?

sawe 05-07-2011 17:42 1707607

Цитата:

Цитата wolkow70
И почему согласно макросам нужно использовать именно HKCR , а не HKLM? »

В поисковике набери REGIST.CHM

На диске Registry хранится не в одном большом, а в нескольких отдельных файлах, называемых «ульями» (hive).
Каждый улей содержит одну древовидную структуру Registry, имеющую свой корневой ключ (т. е. вершину дерева).

HKEY_CLASSES_ROOT Символьная ссылка на ключ HKEY_LOCAL_MACHINE\SOFTWARE\Classes.
HKEY_LOCAL_MACHINE Временный ключ, не имеющий соответствующего физического улья. Объединяет корневые ключи различных ульев

kotkovets 05-07-2011 17:55 1707619

Цитата:

Цитата wolkow70
пытаюсь осваивать, что нибудь более сложное, чем скрипт регистрации ассоциаций от AIMP »

Чета я не видел здесь навороченных ассоциаций, чем в скрипте AIMP`а
Цитата:

Цитата wolkow70
как его использовать в контексте работы с секциями»

Структура макроса такая:
Код:

!macro название [аргумент] [аргумент 1]
  ;команды в макросе
!macroend

Вызов макроса:
Код:

!insertmacro название [аргумент] [аргумент 1]
Навскидку макрос сделал (не проверял):
Код:

#!insertmacro AssocExtension "расширение" "класс расширения" "путь к приложению" "индекс иконки"
#!insertmacro AssocExtension "aac" "AIMP.ACC" "$INSTDIR\AIMP2.exe" "$INSTDIR\AIMP2.exe, 1"

!macro AssocExtension EXT FILECLASS PATH_APP ICON
    ReadRegStr $R0 HKLM "Software\Classes\.${EXT}" ;читаем текущее значение расширения
    StrCmp $R0 "" +2 ;если раширения ${EXT} нету - бэкап не делаем
    WriteRegStr HKLM "Software\Classes\.${EXT}" "${FILECLASS}_backup" "$R0" ;делаем бэкап
    WriteRegStr HKLM "Software\Classes\.${EXT}" "" "${FILECLASS}"
    WriteRegStr HKLM "Software\Classes\${FILECLASS}" "" "${FILECLASS}"
    WriteRegStr HKLM "Software\Classes\${FILECLASS}\shell" "" "Play"
    WriteRegStr HKLM "Software\Classes\${FILECLASS}\shell\Play\command" "" '"${PATH_APP}" "%1"' ;путь к приложению
    WriteRegStr HKLM "Software\Classes\${FILECLASS}\DefaultIcon" "" "${ICON}" ;путь к иконке или к ресурсам содержащие иконки"
!macroend

Цитата:

Цитата wolkow70
И почему согласно макросам нужно использовать именно HKCR , а не HKLM? »

Но я же в макросе использовал HKLM ... читайте внимательно
Создание своего инсталлятора на NSIS. Ассоциации файлов. Макросы

wolkow70, Вы когда научитесь использововать теги, скрипт выделяете и жмете #
Больше такое читать больше не буду, пока тегами не научитесь пользоваться

sawe 05-07-2011 19:03 1707677

Цитата:

Цитата kotkovets
!macro название [аргумент] [аргумент 1]
;команды в макросе
!macroend
»

Для архитектуры x64 в данном примере, следует принудительно переводить в SetRegView 64 или на усмотрение форточки?
--

kotkovets 05-07-2011 22:32 1707821

sawe, редирект тут совершенно не нужен

wolkow70 06-07-2011 07:46 1707997

Цитата:

Цитата kotkovets
Но я же в макросе использовал HKLM ... читайте внимательно »

Я имел в ввиду макросы из справки.
Ps. В скрипте AIMP, который выложен тут на форуме тоже HKCR используется.

Код:

  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"
  DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice"
  WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "Progid" "$ClassName"
  WriteRegStr HKCR "$ClassName\CLSID" "" "{0041494D-5032-4472-6F70-546172676574}"
  WriteRegStr HKCR "$ClassName\shell\open" "" "Открыть в AIMP2"
  WriteRegStr HKCR "$ClassName\shell\open\command" "" "$OpenCommand"
  WriteRegStr HKCR "$ClassName\shell\open\DropTarget" "CLSID" "{0041494D-5032-4472-6F70-546172676574}"
  WriteRegStr HKCR "CLSID\{0041494D-5032-4472-6F70-546172676574}" "" "AIMP"
  WriteRegStr HKCR "CLSID\{0041494D-5032-4472-6F70-546172676574}\LocalServer32" "" "$Exe_Path"
  WriteRegStr HKCR "CLSID\{0041494D-5032-4472-6F70-546172676574}\ProgID" "" "AIMP.TDropTarget"
  WriteRegStr HKCR "AIMP.TDropTarget" "" "AIMP"
  WriteRegStr HKCR "AIMP.TDropTarget\Clsid" "" "{0041494D-5032-4472-6F70-546172676574}"

Оно бы и ладно, но если использовать инсталлятор на T-13 установки XP, то ассоциации, прописанные в HKCR не срабатывают, а в HKLM работают.

wolkow70 06-07-2011 14:02 1708189

Уважаемый, kotkovets, почитал вашу статью про макрос. Вот, что написано:
целесообразно создавать структуру ассоциаций файлов либо в ветке реестра HKEY_LOCAL_MACHINE\Software\Classes, либо в HKEY_CURRENT_USER\Software\Classes, причем последняя имеет приоритет, и при построении представления HKEY_CLASSES_ROOT будет иметь приоритет над HKEY_LOCAL_MACHINE.

При этом, приходилось, читать в литературе, что внесение записей непосредственно в HKEY_CLASSES_ROOT приоритетно над обоими ветками..

В связи с этим возник вопрос : не лишено ли смысла вносить записи одновременно в HKLM и в HKCR, если привести макрос к такому виду (упрощенно) ?

Код:

!macro RegisterExtension extenstion               
StrCpy $ClassName "KMPlayer.${extenstion}"
WriteRegStr HKCR ".${extenstion}" "" "$ClassName"
WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "" "$ClassName"
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "Progid" "$ClassName"
;;
WriteRegStr HKCR "$ClassName\CLSID" "" "{9EB4C4CB-74C2-4BE9-AA5D-8249F16020AD}"
WriteRegStr HKLM "SOFTWARE\Classes\$ClassName\CLSID" "" "{9EB4C4CB-74C2-4BE9-AA5D-8249F16020AD}"
;
WriteRegStr HKCR "$ClassName\shell" "" "play"
WriteRegStr HKCR "$ClassName\shell\play" "" "Воспроизвести в KMP"
WriteRegStr HKCR "$ClassName\shell\play\command" "" "$PlayCommand"
WriteRegStr HKCR "$ClassName\shell\play\DropTarget" "Clsid" "{9EB4C4CB-74C2-4BE9-AA5D-8249F16020AD}"
;
WriteRegStr HKLM "SOFTWARE\Classes\$ClassName\shell" "" "play"
WriteRegStr HKLM "SOFTWARE\Classes\$ClassName\shell\play" "" "Воспроизвести в KMP"
WriteRegStr HKLM "SOFTWARE\Classes\$ClassName\shell\play\command" "" "$PlayCommand"
WriteRegStr HKLM "SOFTWARE\Classes\$ClassName\shell\play\DropTarget" "Clsid" "{9EB4C4CB-74C2-4BE9-AA5D-8249F16020AD}"
!macroend

Я проверил на реальной установке - работает, и ассоциации удаляются макросом де-регистрации через HKCR. Но, вот правильно это или нет, мучают сомнения.

kotkovets 06-07-2011 16:10 1708334

Цитата:

Цитата wolkow70
почитал вашу статью про макрос »

Статья не моя, а hb860
Цитата:

Цитата wolkow70
В связи с этим возник вопрос : не лишено ли смысла вносить записи одновременно в HKLM и в HKCR »

При записи ассоциаций в HKLM автоматически "создаются" записи и в HKCR и наоборот.
Имеет смысл, явно утверждать не буду, создавать одновременно записи в HKLM "Software\Classes"
и в HKСU "Software\Classes", попробуйте...

wolkow70 07-07-2011 09:14 1708715

Товарищи, подскажите пожалуйста , я правильно делаю?
Скачал плагин UAC plug-in
Файл UAC.nsh скопировал в папку Include.
Файл UAC.dll скопировал в папку Plugins

Создал папку Unicode
Файл UAC.nsh еще скопировал в папку Unicode\Include.
Файл UAC.dll (U) скопировал в папку Unicode\Plugins.

В скрипте прописал:

!include UAC.nsh

Код:

Function .OnInit
 
UAC_Elevate:
    UAC::RunElevated
    StrCmp 1223 $0 UAC_ElevationAborted ; UAC dialog aborted by user?
    StrCmp 0 $0 0 UAC_Err ; Error?
    StrCmp 1 $1 0 UAC_Success ;Are we the real deal or just the wrapper?
    Quit
 
UAC_Err:
    MessageBox mb_iconstop "Unable to elevate, error $0"
    Abort
 
UAC_ElevationAborted:
    # elevation was aborted, run as normal?
    MessageBox mb_iconstop "This installer requires admin access, aborting!"
    Abort
 
UAC_Success:
    StrCmp 1 $3 +4 ;Admin?
    StrCmp 3 $1 0 UAC_ElevationAborted ;Try again?
    MessageBox mb_iconstop "This installer requires admin access, try again"
    goto UAC_Elevate
 
FunctionEnd

RequestExecutionLevel user

Этого достаточно, что бы устанавливать программу на Win7 для любого пользователя?

punsh 07-07-2011 10:54 1708772

прописываю строку
Delete "$APPDATA\Photodex\ProShow Producer\def.dat"

но этот файл остается, не удаляется! может еще есть какие-то методы удалить его?..

wolkow70 07-07-2011 11:44 1708796

Прочитал, что еще нужно прописать:

Function .OnInstFailed
UAC::Unload
FunctionEnd

Function .OnInstSuccess
UAC::Unload
FunctionEnd

И сопутствующие функции деинсталляции.

Вот еще проблема, у меня уже есть в скпипте Function .OnInit
Как правильно в этом случае объединить функции?

kotkovets 07-07-2011 14:36 1708935

Цитата:

Цитата wolkow70
RequestExecutionLevel user
Этого достаточно, что бы устанавливать программу на Win7 для любого пользователя? »

RequestExecutionLevel - сколько прав необходимо для установки приложения
user - запрашивает права текущего пользователя без административных привилегий.
highest - требует самый высокий уровень выполнения, доступный для текущего пользователя.
admin - требует привелегии администратора.
В справочнике NSIS все это есть
Цитата:

Цитата wolkow70
Прочитал, что еще нужно прописать:
Function .OnInstFailed
UAC::Unload
FunctionEnd
Function .OnInstSuccess
UAC::Unload
FunctionEnd »

Эти функции прописывают при классическом фейсе, в MUI они завернуты в другую "обертку". Справочник по NSIS > Оформление > Интерфейс Модем > Стандартные функции
UAC::Unload - выгружает библиотеку из памяти. Значит достаточно, прописать в функции .onGUIEnd - выполняется при закрытии инсталлятора и больше нигде. А по сути сама винда умеет выгружать из памяти библиотеки
Код:

Function .onGUIEnd
 UAC::Unload
 FunctionEnd

Цитата:

Цитата wolkow70
Как правильно в этом случае объединить функции? »

это все равно,что объединить пальцы рук с пальцами ног :)
Цитата:

Цитата punsh
но этот файл остается, не удаляется! »

файл занят скорее всего проводником, можно перезагрузить проводник и удалить, можно удалить при следующей перезагрузки системы.
Delete /REBOOTOK "$APPDATA\Photodex\ProShow Producer\def.dat"

wolkow70 07-07-2011 15:09 1708958

kotkovets,
Хорошо, тогда скажите, что отразить в скрипте, что бы программа без запроса со стороны UAC ставилась с правами администратора? RequestExecutionLevel admin?
UAC.nsh вообще имеет смысл применять? Или я не понял смысла этого плагина.

Есть еще старый макрос IsUserAdmin.nsh

Вопрос возник в связи с необходимостью тихой установки некоторого числа программ в автоматическом режиме через WPI.

Цитата:

Цитата kotkovets
это все равно,что объединить пальцы рук с пальцами ног »

Но, ведь, в Function .OnInit часто встречаются комбинации разных функций.. :)

Здесь интересная статейка и полемика на эту тему:
http://sundest.blogspot.com/2007/04/nsis-vista.html

Тут тоже интересно:
http://begemotov.net/creator/sharewa...vistoy-c-nsis/


А во вложении оргинальный скрипт VLC в последней редакции с применением UAC

kotkovets 07-07-2011 16:45 1709006

Цитата:

Есть еще старый макрос IsUserAdmin.nsh
А почему он старый? такие же функции апи использует плагин - определяет сколько прав у пользователя. по этому в применении с плагином UAC в скриптах пишут RequestExecutionLevel user - дабы при инсталяции приложения настройки легли в папку юзера с правами админа, т.е настройки, записи в реестр действовали для текущего пользователя не имеющих админских прав.
RequestExecutionLevel admin без плагина, у юзера будет спрошено - что бы он имел такие админские права на установку, если дать права админа юзеру (если он не имеет админских прав), то настройки программы лягут в профиль админа, а не юзера, а если пользователь имеет права админа - то все нормально. примерно так :)

wolkow70 07-07-2011 17:34 1709042

Спасибо.
Тут мучаюсь с удалением ассоциаций на Windows7.
Прописывается:
HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.asf" "Progid" "KMPlayer.asf"

В макросе де-регистрации пишу:

ReadRegStr $0 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "Progid" ""
StrCmp $0 $ClassName 0 +2
DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "Progid" ""

Ошибка компиляции в результате...

А в UserChoice все нормально удаляется.

ReadRegStr $0 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" ""
StrCmp $0 $ClassName 0 +2
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice"

sawe 07-07-2011 18:18 1709069

Поскольку вы используете только тихий режим Function .OnInstFailed можно не использовать.

Код:

Function .OnInstFailed # сообщение при нажатии кнопки Отмена --!
  UAC::Unload
FunctionEnd

Function un.onUninstFailed # сообщение при нажатии кнопки Отмена!
  UAC::Unload # должен выгрузиться!
FunctionEnd

Но влюбом случае следует обязательно выгружать плагин из памяти UAC::Unload в самом конце, при условии если вы вставили код UAC в начальных функциях:

Function .onInit
и если вставили
Function un.onInit

Если вы его не выгрузите, то в дисптечере задач он останется.

И самое неприятное, существует несколько версий UAC v0.0.11d - v0.2.2d - v0.2.2c и ещё юникоде, которые немного отличаются между собой. Команды и функции те же, но реализация немного другая.
--

wolkow70 07-07-2011 18:29 1709076

Вложений: 1
Цитата:

Цитата sawe
Но влюбом случае следует обязательно выгружать плагин из памяти UAC::Unload в самом конце, при условии если вы вставили код UAC в начальных функциях:
Function .onInit
и если вставили
Function un.onInit
Если вы его не выгрузите, то в дисптечере задач он останется. »

Это я реализовал.
Цитата:

Цитата sawe
И самое неприятное, существует несколько версий UAC v0.0.11d - v0.2.2d - v0.2.2c и ещё юникоде, которые немного отличаются между собой. Команды и функции те же, но реализация немного другая. »

Версии с офсайта UAC_v0.2.2d, чего то вообще не компилируются. Показывает инвалидная комманда.
Я выдернул новые файлы из нового комплекта сборки VLC Player. C ними инсталлятор собрался. В чем дело не понятно. При этом в скрипте ничего не менялось. Во вложении модернизированные файлы, версию не знаю.

sawe 07-07-2011 22:02 1709177

Цитата:

Цитата wolkow70
Версии с офсайта UAC_v0.2.2d, »

Это пример с UAC_v0.2.2d убрал только все меседжи.
Код:

Function .onInit # сообщение в начале установки --!
UAC_Elevate:
    UAC::RunElevated
    StrCmp 1223 $0 UAC_ElevationAborted ; UAC dialog aborted by user?
    StrCmp 0 $0 0 UAC_Err ; Error?
    StrCmp 1 $1 0 UAC_Success ;Are we the real deal or just the wrapper?
    Quit
 
UAC_Err:
    Abort
 
UAC_ElevationAborted:
    Abort
 
UAC_Success:
    StrCmp 1 $3 +4 ;Admin?
    StrCmp 3 $1 0 UAC_ElevationAborted ;Try again?
    goto UAC_Elevate
FunctionEnd

;Запуск приложения с правами пользователя для MUI на финальной!
!insertmacro MUI_PAGE_INSTFILES
        !define MUI_FINISHPAGE_RUN
        !define MUI_FINISHPAGE_RUN_FUNCTION ExecAppFile
 
Function ExecAppFile   
    !insertmacro UAC_AsUser_ExecShell 'open' '$INSTDIR\Aimp.exe' '-firstrun' '$INSTDIR' ''
FunctionEnd

; Где угодно!
    !insertmacro UAC_AsUser_ExecShell 'open' '$INSTDIR\Aimp.exe' '-firstrun' '$INSTDIR' ''


Это пример для UAC v0.0.11d, но нужно заменить UAC.dll и в инклуды данной версии, 100% рабочий для RequestExecutionLevel user

Код:

Function .onInit # сообщение в начале установки --!
  UAC::RunElevated
  StrCmp 1223 $0 UAC_ElevationAborted # диалог прерванный пользователем --?
  StrCmp 0 $0 0 UAC_Err ; ошибка?
  StrCmp 1 $1 0 UAC_Success # реально выполнить или только оболочка --?
  Quit
 UAC_Err:
;  MessageBox MB_ICONSTOP "Невозможно поднять права, ошибка $0"
  Abort
 UAC_ElevationAborted: # повышение было прервано, но все еще выполняется как нормальное --!
 UAC_Success:
;--Конец кода UAC --!

; -- далее ваш код --!

FunctionEnd

Цитата:

Цитата wolkow70
В чем дело не понятно. »

Я сравнил файлы AptDiff . Похоже на то, что у вас это 0,1 версия.

wolkow70 08-07-2011 11:29 1709444

sawe,
Слелал по вашему варианту с UAC_v0.2.2d.
Не компилируется.

Function: ".OnInit"
Invalid command: UAC::RunElevated
Error in script "D:\NSIS\kmplayer-new.nsi" on line 107 -- aborting creation process
Такое впечатление, что он плагина не видит.

Если добавляю :

Function .OnInstFailed
UAC::Unload ;Must call unload!
FunctionEnd
;
Function .OnInstSuccess
UAC::Unload ;Must call unload!
FunctionEnd

то показывает:

Function: ".OnInstFailed"
Invalid command: UAC::Unload
Error in script "D:\NSIS\kmplayer-new.nsi" on line 95 -- aborting creation process

И еще, что бы это значило (из справки):

This plugin has been tested under the following environments:
Windows 7 - UAC On - Administrator
Windows Vista - UAC On - Administrator
Windows Vista - UAC Off - Administrator
Windows Vista - UAC On - Standard User - User supplies administrator info into the UAC dialog
Windows Vista - UAC On - Standard User - User does not supply administrator info into the UAC dialog
Windows Vista - UAC Off - Standard User - User supplies administrator info into the Run As dialog
Windows Vista - UAC Off - Standard User - User does not supply administrator info into the Run As dialog

kotkovets 08-07-2011 14:40 1709590

wolkow70, подключите хедер UAC.nsh к скрипту (он парсит функции, а не компилятор) и используете макросы из этого хедера.
Для юникодной версии NSIS берем плагин из папки U
Для ANSI версии NSIS берем плагин из папки A
Как определить юникод или анси, скомпильте:
Код:

!ifdef NSIS_UNICODE
  MessageBox MB_ICONINFORMATION|MB_OK "NSIS_UNICODE" IDOK
!else
  MessageBox MB_ICONINFORMATION|MB_OK "NSIS_ANSI" IDOK
!endif


wolkow70 08-07-2011 15:51 1709637

kotkovets, У меня же прописано в скрипте:
RequestExecutionLevel user
!include UAC.nsh
А анси или уникод без разницы, я методом перебора пробовал. Все одно и тоже.

wolkow70 08-07-2011 16:06 1709657

Скомпилил так:

OutFile "test.exe"
!include LogicLib.nsh
Section "test"
!ifdef NSIS_UNICODE
MessageBox MB_ICONINFORMATION|MB_OK "NSIS_UNICODE" IDOK
!else
MessageBox MB_ICONINFORMATION|MB_OK "NSIS_ANSI" IDOK
!endif
SectionEnd

Результат NSIS_ANSI

wolkow70 08-07-2011 16:43 1709678

Цитата:

Цитата sawe
Похоже на то, что у вас это 0,1 версия »

Вот с ней все собирается. Но хочется современную версию прикрутить...

Может проблема в том, что у меня функция имеет такой вид:

Код:

Function .OnInit

UAC_Elevate:
    UAC::RunElevated
    StrCmp 1223 $0 UAC_ElevationAborted ; UAC dialog aborted by user?
    StrCmp 0 $0 0 UAC_Err ; Error?
    StrCmp 1 $1 0 UAC_Success ;Are we the real deal or just the wrapper?
    Quit
 
UAC_Err:
  ;  MessageBox mb_iconstop "Unable to elevate, error $0"
    Abort
 
UAC_ElevationAborted:
    # elevation was aborted, run as normal?
  ;  MessageBox mb_iconstop "This installer requires admin access, aborting!"
    Abort
 
UAC_Success:
    StrCmp 1 $3 +4 ;Admin?
    StrCmp 3 $1 0 UAC_ElevationAborted ;Try again?
  ; MessageBox mb_iconstop "This installer requires admin access, try again"
    goto UAC_Elevate
;
;
StrCpy $WindowCaption "${PRODUCT_NAME} ${PRODUCT_VERSION}"
StrCpy $SysDrive $WINDIR 2
StrCpy $GMODE 0
StrCpy $WindowCaption "${PRODUCT_NAME} ${PRODUCT_VERSION}"
${WordReplace} "$EXEFILE" ".exe" ".ini" "+" "$INIFILE"
StrCpy $INIFILE "$EXEDIR\$INIFILE"
${GetOptions} $CMDLINE "/G" $0
${IfNot} ${Silent}
${AndIfNot} ${Errors}
StrCpy $GMODE 1
StrCpy $WindowCaption "Генератор ответов ${PRODUCT_NAME} ${PRODUCT_VERSION}"
IfFileExists "$INIFILE" 0 +2
Delete "$INIFILE"
${EndIf}
FunctionEnd


kotkovets 08-07-2011 17:30 1709710

wolkow70, я же вам писал:
Цитата:

Цитата kotkovets
используете макросы из этого хедера »

Код:

UAC_Elevate:
--
--

Вы же подключили хедер, но не используете его....))))
т.е вместо UAC_Elevate: нужно !insertmacro UAC_RunElevated
Ну в примере же прописано четко и он работает! а у вас нет...))

wolkow70 08-07-2011 19:03 1709770

Цитата:

Цитата wolkow70
Похоже на то, что у вас это 0,1 версия »
Вот с ней все собирается. Но хочется современную версию прикрутить... »

Собраться то собралось, а на практике оказалось не работает. Создал на WinXP SP3 учетную запись без прав админа, и инсталлятор не запустился (показывает ошибку Elevate).

Цитата:

Цитата kotkovets
Вы же подключили хедер, но не используете его....)))) »

Я по справке все делал. А там не написано, что надо макросы использовать, а только прописать функцию Function .OnInit , RequestExecutionLevel user и !include UAC.nsh
Ладно, буду макросы раскуривать, может разберусь...

wolkow70 08-07-2011 19:46 1709785

Цитата:

Цитата kotkovets
т.е вместо UAC_Elevate: нужно !insertmacro UAC_RunElevated »

Ну, заменил я так. Инсталлятор собрался.
Только, пришлось при этом удалить:

Function .OnInstFailed
UAC::Unload ;Must call unload!
FunctionEnd
;
Function .OnInstSuccess
UAC::Unload ;Must call unload!
FunctionEnd

Так как, показало, что недействительные комманды. А макросов таких я не нашел в хедере.

И еще пришлось удалить

Function ExecAppFile
!insertmacro UAC_AsUser_ExecShell 'open' '$INSTDIR\KMPlayer.exe' '-firstrun' '$INSTDIR' ''
FunctionEnd

!insertmacro UAC_AsUser_ExecShell 'open' '$INSTDIR\KMPlayer.exe' '-firstrun' '$INSTDIR' ''

Так как, вылазила ошибка:

!insertmacro: end of _UAC_IncL
Error: command goto not valid outside Section or Function
Error in macro UAC_AsUser_ExecShell on macroline 2
Error in script "D:\NSIS\kmplayer-new.nsi" on line 99 -- aborting creation process

kotkovets 08-07-2011 20:08 1709796

Цитата:

Цитата wolkow70
И еще пришлось удалить
Function ExecAppFile
!insertmacro UAC_AsUser_ExecShell 'open' '$INSTDIR\KMPlayer.exe' '-firstrun' '$INSTDIR' ''
FunctionEnd »

А кто жеж через open открывает исполняемый файл, это для shell-открытия: txt, сайты, линки, ассоцированные файлы с приложениями. Чет вы не с того конца изучаете - вот мучаетесь :closed-to
Код:

!insertmacro UAC_AsUser_ExecShell "" "$INSTDIR\KMPlayer.exe" "-firstrun" "$INSTDIR"
и вообще -firstrun - аргумент командной строки
все расписано, а че вы не видите это загадка...

wolkow70 08-07-2011 20:18 1709799

kotkovets,
Если Вы зайдете на страницу

http://nsis.sourceforge.net/UAC_plug-in

то увидите, что я делал все точно так, как там написано.

; !insertmacro UAC_AsUser_ExecShell <Command> <File> <Parameters> <WorkingDir> <ShowWindow>
!insertmacro UAC_AsUser_ExecShell 'open' '$INSTDIR\${APPFILE}' '-firstrun' '$INSTDIR' ''

Where $INSTDIR\${APPFILE} is the path to the file you want to launch.

If you use the MUI skin and have the installer launch the app for you, you will need to do a little more work.
!define MUI_FINISHPAGE_RUN
!define MUI_FINISHPAGE_RUN_FUNCTION ExecAppFile

Function ExecAppFile
!insertmacro UAC_AsUser_ExecShell 'open' '$INSTDIR\${APPFILE}' '-firstrun' '$INSTDIR' ''
FunctionEnd

И все остальное тоже строго по справке делаю, а оно не работает.. И Saw также приводил свой пример, как бы рабочий...

wolkow70 08-07-2011 20:34 1709808

PS.
Так тоже не пашет.
Function: "ExecAppFile"
!insertmacro: UAC_AsUser_ExecShell
!insertmacro: macro "UAC_AsUser_ExecShell" requires 5 parameter(s), passed 4!
Error in script "D:\NSIS\kmplayer-new.nsi" on line 96 -- aborting creation process

sawe 08-07-2011 21:34 1709825

В блоге, на который вы давали ссылку на чисто русском языке, буквально на пальцах, объяснены нюансы проблемы с user для UAC плагина.

читать дальше »
Код:

RequestExecutionLevel user

Section "MainSection" SEC01

      SetShellVarContext all

    ... весь код главной секции

      GetFunctionAddress $0 RunFromUser
      UAC::ExecCodeSegment $0


 SectionEnd


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

может пригодиться.
читать дальше »

Код:

UAC::Exec "параметр_или_команда_UAC" "$INSTDIR\Имя.exe" "параметр" "место_выполнения_или_нахождения"

или примерно с ожиданием:

UAC::ExecWait "" "$INSTDIR\Имя.exe" "Readme.txt" "$INSTDIR\XXX"

папка $INSTDIR\XXX - где лежит файл  Readme.txt


--

wolkow70 09-07-2011 07:37 1709985

Цитата:

Цитата sawe
В блоге, на который вы давали ссылку на чисто русском языке, буквально на пальцах, объяснены нюансы проблемы с user для UAC плагина. »

Та статья в 2009 году написана для 01 версии плагина.

wolkow70 09-07-2011 08:42 1709993

Если делаю так:

Function ExecAppFile
!insertmacro UAC_AsUser_ExecShell "" "$INSTDIR\KMPlayer.exe" "-firstrun" "$INSTDIR" ""
FunctionEnd
;
!insertmacro UAC_AsUser_ExecShell "" "$INSTDIR\KMPlayer.exe" "-firstrun" "$INSTDIR" ""

то ошибка такая:

!insertmacro: end of _UAC_IncL
Error: command goto not valid outside Section or Function
Error in macro UAC_AsUser_ExecShell on macroline 2
Error in script "D:\NSIS\kmplayer-new.nsi" on line 102 -- aborting creation process

Если делаю так:

Function ExecAppFile
!insertmacro UAC_AsUser_ExecShell "" "$INSTDIR\KMPlayer.exe" "-firstrun" "$INSTDIR"
FunctionEnd
;
!insertmacro UAC_AsUser_ExecShell "" "$INSTDIR\KMPlayer.exe" "-firstrun" "$INSTDIR"

то ошибка такая:

!insertmacro: UAC_AsUser_ExecShell
!insertmacro: macro "UAC_AsUser_ExecShell" requires 5 parameter(s), passed 4!
Error in script "D:\NSIS\kmplayer-new.nsi" on line 96 -- aborting creation process

А что касается примеров, то там так:

!insertmacro UAC_AsUser_ExecShell "" "calc.exe" "" "" ""

И что я из этого примера должен уяснить?

MKN 09-07-2011 12:40 1710070

Подскажите пожалуйста на примере, каким образом запускать (устанавливать) и удалять сервисы (службы) с помощью
NSIS SERVICE LIBRARY — servicelib.nsh http://nsis.sourceforge.net/NSIS_Service_Lib ?

Или, может лучше использовать для этого NSIS Simple Service Plugin http://nsis.sourceforge.net/NSIS_Simple_Service_Plugin ?

kotkovets 09-07-2011 15:10 1710121

Цитата:

Цитата MKN
Подскажите пожалуйста на примере, каким образом запускать (устанавливать) и удалять сервисы (службы) с помощью
NSIS SERVICE LIBRARY — servicelib.nsh »

Судя по описанию автора, я понял так, не проверял:
Код:

; Задаваемые типы параметров:
;  Действие    - создание, удаление, запуск, остановка, пауза
;             
;  Имя          - имя сервиса
;
;  Параметры    - Задаваемые параметры действия; пример: var1=value1;var2=value2;....
;                  (разделять задаваемые параметры ';')

; Действия:
;  create - создает новую службу windows
;              Параметры create:
;                path        - путь для исполняемого файла службы
;                autostart  - автоматически запускать с системой IE.  1|0 (1 - запускать, 0 - нет)
;                interact    - взаимодействие с рабочим столом IE. 1|0 (1 - да, 0 - нет)
;                depend      - зависимости служб
;                user        - имя пользователя запускающий службу
;                password    - пароль пользователя запускающий службу
;                display    - отображаемое имя службы консоли
;                description - Описание службы
;                starttype  - Тип запуска
;                servicetype - Тип сервиса
;
;  delete    - Удаление службы windows
;  start      - запустить службу windows, если остановлена
;  stop      - Остановка запущенного сервиса (службы) windows
;  pause      - Приостановка работающей службы windows
;  continue  - возобновление работы службы если приостановлено
;  installed  - установка службы
;              Параметры installed:
;                action  - Если возвращает истину (true = 1), то вызывает указанное действие
;  running    - выполнить запуск службы
;              Параметры running:
;                action      - Если возвращает истину (true = 1), то вызывает указанное действие
;  status    - проверка статуса службы

; Пример:
                    (создаем службу)
;  метод 1:               
;    Push "Действия"      Push "create" ;помещаем значения в стек
;    Push "Имя"            Push "MKN" 
;    Push "Параметры"      Push "path=$INSTDIR\service.exe;autostart=1;description=MKN Service;"
;    Call Service          Call Service
;    Pop $0                Pop $0 ;возвращается значение со стека в $0 - успешно или нет

;  метод 2:
;  !insertmacro SERVICE "create" "MKN" "path=$INSTDIR\service.exe;autostart=1;description=MKN Service;"
;

MKN глянь этот http://nsis.sourceforge.net/NsSCM_plug-in , что бы понять как пользоваться без плагина...

wolkow70 09-07-2011 17:53 1710181

kotkovets,
В общем бросил я возиться с этим UAC.

Спасибо Вам за то, что научили меня делать генератор ответов. В связи с этим у меня возник вопрос:

[DIRECTORY]
INSTALLDIR=Е:\Program Files\The KMPlayer
[Sections]
StartMenu=1
Desktop=1
QuickLaunch=1

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

У меня две системы на диске :
С:\ Windows7
E:\ Windows XP

Пробовал устанавливать сборку на обеих системах в автоматическом режиме. В обоих случаях распаковка идет в папку Е:\Program Files\The KMPlayer, хотя сама инсталляция производится в первом случае на Windows7.

Сейчас еще раз просмотрел скрипт. Вроде не должно такого быть. Все, что нужно есть...
Код:

!include "WordFunc.nsh"
!include "TextFunc.nsh"

Var GMODE
Var INIFILE
Var SysDrive
Var SUCCES_SECTION
Var WindowCaption

Function PREINSTFILES
 ${If} $GMODE = 1
 WriteINIStr "$INIFILE" "DIRECTORY" "INSTALLDIR" "$INSTDIR"
 ${EndIf}
FunctionEnd

Section "!${PRODUCT_NAME}" Install
SectionIn 1 2 3 RO
${If} $GMODE = 0
${AndIf} ${Silent}
${AndIf} ${FileExists} "$INIFILE"
ClearErrors
ReadINIStr "$R0" "$INIFILE" "DIRECTORY" "INSTALLDIR"
${WordReplace} $R0 "%programfiles%" "$PROGRAMFILES" "+" $R1
${WordReplace} $R1 "%windir%" "$WINDIR" "+" $R0
${WordReplace} $R0 "%appdata%" "$APPDATA" "+" $R1
${WordReplace} $R1 "%systemdrive%" "$SysDrive" "+" $R0
StrCpy $INSTDIR $R0
${EndIf}
${If} $GMODE = 0
SetOutPath "$INSTDIR"

И тем не менее...

kotkovets 09-07-2011 20:09 1710258

Цитата:

Цитата wolkow70
[DIRECTORY]
INSTALLDIR=Е:\Program Files\The KMPlayer
[Sections]
StartMenu=1
Desktop=1
QuickLaunch=1
Путь установки прописывается абсолютный. А буква диска может быть разной. Почему то не срабатывает механизм использования относительного пути в данном случае. »

В файле конфигурациии нужно писать: INSTALLDIR=%programfiles%\The KMPlayer системная окружения подменится при чтении командой: ${WordReplace} $R0 "%programfiles%" "$PROGRAMFILES" "+" $R1 на путь к папке Program Files

wolkow70 09-07-2011 21:58 1710304

Цитата:

Цитата kotkovets
В файле конфигурациии нужно писать: INSTALLDIR=%programfiles%\The KMPlayer системная окружения подменится при чтении командой: ${WordReplace} $R0 "%programfiles%" "$PROGRAMFILES" "+" $R1 на путь к папке Program Files »

Это мне понятно. Чую, что можно как-то сделать, чтобы в ручную не править. А с какой стороны
подобраться не дотягиваю.

Или на этапе записи?
WriteINIStr "$INIFILE" "DIRECTORY" "INSTALLDIR" "$INSTDIR"

или на этапе чтения и интерпретации

ReadINIStr "$R0" "$INIFILE" "DIRECTORY" "INSTALLDIR"
${WordReplace} $R0 "%programfiles%" "$PROGRAMFILES" "+" $R1

kotkovets 09-07-2011 23:39 1710341

Цитата:

Цитата wolkow70
Это мне понятно. Чую, что можно как-то сделать, чтобы в ручную не править. А с какой стороны
подобраться не дотягиваю »

Можно так
Код:

Function PREINSTFILES ;это функция будет выполнена только в режиме генератора
 ${If} $GMODE = 1 ;режим генератора
        StrCpy `$R0` "$INSTDIR"
        ${WordReplace} $R0 ":\Program Files" "%programfiles%" "+1" `$R1`
        StrCmp `$R1` `$R0` +2
        StrCpy `$R1` `$R1` "" 1
        ${WordReplace} `$R1` ":\Windows" "%windir%" "+1" `$R0`
        StrCmp `$R0` `$R1` +2
        StrCpy `$R0` `$R0` "" 1
        ${WordFind} `$R0` "Application Data" "E+2*}" `$R1`
        StrCmp $R1 1 +2
        StrCpy `$R0` "%appdata%$R1"
        WriteINIStr "$INIFILE" "DIRECTORY" "ISTALLDIR" "$R0" ;создаем файл конфигурации
 ${EndIf}
FunctionEnd

Но здесь есть не доработка, если задать путь С:\Application Data\Soft, то подменится на %appdata%\Soft
В зависимости от SetShellVarContext current|all > %appdata% > возвращает путь к профилю текущего пользователя или всех пользователей.
Для других системных переменных подумайте, есть в папке Examples скрипт WordFunc.nsi, где можно потренироваться c строковыми функциями подставляя свои значения строк и настроек парсирования строк.

K.A.V. 10-07-2011 08:42 1710427

Цитата:

Цитата MKN
Подскажите пожалуйста на примере, каким образом запускать (устанавливать) и удалять сервисы (службы) »

Могу посоветовать плагин
Цитата:

Цитата MKN
Или, может лучше использовать для этого NSIS Simple Service Plugin »

Мне он понравился, именно его я использовал в своём твикере (написан на NSIS :)) для управления службами

Ну впринципе, на страничке описания плагина всё расписано подробно...ничего сложного я думаю
"[name_of_service]" указывается системное имя службы, как название раздела службы в реестре (не отображаемое)

wolkow70 11-07-2011 15:01 1711248

kotkovets,
Хочу посоветоваться по поводу известного нам макроса ассоциации файлов.

Как известно Xp не видит HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\${extenstion}\UserChoice"
В тоже время некоторые программы ведут себя не грамотно и пописывают ассоциации
в HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "Progid" "$ClassName" (например KMPlayer), что создает проблемы со сменой ассоциаций при установке других программ.
Немного подумав сделал так в макросе:

Код:

!macro RegisterExtension extenstion
StrCpy $ClassName "VLC.${extenstion}"
WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "" "$ClassName"
GetVersion::WindowsName
Pop $R0
StrCmp $R0 "XP" 0 noxp
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "Progid" "$ClassName"
noxp:
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "Progid" "$ClassName"
;
WriteRegStr HKLM "SOFTWARE\Classes\$ClassName\shell" "" "Open"
WriteRegStr HKLM "SOFTWARE\Classes\$ClassName\shell\Open" "" "Воспроизвести"
WriteRegStr HKLM "SOFTWARE\Classes\$ClassName\shell\Open\command" "" "$OpenCommand"
;
;
!macroend

То есть, если установка идет на XP, то прописывать ассоциацию не в UserChoice, а в
HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "Progid" "$ClassName", что бы затереть запись другой программы.

На Cемерке и Viste такой проблемы нет, так как UserChoice имеет приоритет, а в ХР не присходит смена ассоциаций.
Как Вы считаете разумно ли так поступить, или есть более красивое решение?

kotkovets 11-07-2011 16:53 1711330

wolkow70, да все правильно, че создавать ключ UserChoice в XP?(мое мнение), так как этот ключ предназначен для линейки NT6.x имеют такую функциональность, как "Программы по умолчанию"
А и WinXP - это линейка NT5.x А значит, только XP здесь не обойдешься, а у меня WinXp x64 еще - и по скрипту создаться ключ. Нужно так определять версию NT(без внешних плагинов):
Код:

!include "WinVer.nsh"
--
--
!macro RegisterExtension extenstion
StrCpy $ClassName "VLC.${extenstion}"
WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "" "$ClassName"
${WinVerGetMajor} $R0 ;определяем старшую цифру Windows
IntCmp $R0 5 +4 +4 0
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "Progid" "$ClassName"
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "Progid" "$ClassName"
;
WriteRegStr HKLM "SOFTWARE\Classes\$ClassName\shell" "" "Open"
WriteRegStr HKLM "SOFTWARE\Classes\$ClassName\shell\Open" "" "Воспроизвести"
WriteRegStr HKLM "SOFTWARE\Classes\$ClassName\shell\Open\command" "" "$OpenCommand"
;
;
!macroend


wolkow70 11-07-2011 17:32 1711357

Цитата:

Цитата kotkovets
да все правильно, че создавать ключ UserChoice в XP?(мое мнение), так как этот ключ предназначен для линейки NT6.x имеют такую функциональность, как "Программы по умолчанию" »

Тут, еще вылез такой момент:
Затирая Progid установленной программы, затем удалив новую, мы не восстанавливаем прежних ассоциаций, и придется старую прогу переустанавливать.. или копаться с регистрацией типов из самой проги.
Где нибудь можно почитать по бэкап для таких случаев? Да и в HKLM "SOFTWARE\Classes\.${extenstion}" "" "$ClassName" тоже бэкапить надо, если по уму все делать.

sawe 11-07-2011 21:36 1711485

Цитата:

Цитата wolkow70
Затирая Progid установленной программы, затем удалив новую, мы не восстанавливаем прежних ассоциаций, и придется старую прогу переустанавливать.. или копаться с регистрацией типов из самой проги.
Где нибудь можно почитать по бэкап для таких случаев? Да и в HKLM "SOFTWARE\Classes\.${extenstion}" "" "$ClassName" тоже бэкапить надо, если по уму все делать. »

Это правило хорошего тона!
Прямо в той же ветке следует создавать новый :

WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "" "$ClassName_Bak" или "$ClassName_Undo" или как вам угодно, но понятно.

WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "$ClassName_Bak" или "Progid_Bak"

При деинсталляции прочитает из него, восстановит и удалится.

wolkow70 12-07-2011 11:37 1711720

Цитата:

Цитата sawe
WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "" "$ClassName_Bak" или "$ClassName_Undo" или как вам угодно, но понятно.
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "$ClassName_Bak" или "Progid_Bak"

При деинсталляции прочитает из него, восстановит и удалится. »

Дак надо же еще прочитать, какой класс там прописан, занести в переменную, и ее значение прописать в "$ClassName_Bak" и внести в макрос де-регистрации соответвтующие строки. Или я чего-то не понимаю?

DruOleg 14-07-2011 17:38 1713404

Прошу помочь с IIS 6...
1. Необходимо создать "Виртуальный каталог" в существующем Веб-узле;
(использовал ExecWait 'cscript "$SYSDIR\iisvdir.vbs" /Create "SiteName" moodle C:\moodle\web')
2. В свойствах созданного вирт-каталога установить "Разрешен запуск: Только сценарии";
(по умолчанию этот параметр выбран, но хотелось бы подстраховаться)
3. В свойствах созданного вирт-каталога установить "Задать страницу содержания по умолчанию" - index.php;
4. В свойствах сайта добавить сопоставление расширений:
расширение - php;
путь - "C:\Windows\system32\inetsrv\fcgiext.dll";
команды - "GET,POST,HEAD" (сократитьь до)

Спасибо!

wolkow70 18-07-2011 11:40 1714848

kotkovets,
Цитата:

Цитата kotkovets
${WinVerGetMajor} $R0 ;определяем старшую цифру Windows
IntCmp $R0 5 +4 +4 0
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "Progid" "$ClassName"
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "Progid" "$ClassName" »

На практике оказалось работает все наоборот: при установке на XP,
прописывается:
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "Progid" "$ClassName"

и не прописывается:
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "Progid" "$ClassName"
;
;
Тут еще возникла идейка при установке на XP
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "Progid" "$ClassName"
прописывать по выбору Пользователя.
Пока сделал так:

Section "Особые параметры сопоставления файлов" ProgID
SectionIn 1 2
WriteINIStr "$temp\tmpfile.dat" "tmp" "execute_1" "1"
SectionEnd

В макросе:
ReadINIStr $0 "$temp\tmpfile.dat" "tmp" "execute_1"
StrCmp $0 "1" 0 +2
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "Progid" "$ClassName"

Может можно как то по другому без временного файла привязать комманду к значению определенной секции (более красиво)?

kotkovets 18-07-2011 14:17 1714962

Цитата:

Цитата wolkow70
Section "Особые параметры сопоставления файлов" ProgID
SectionIn 1 2
WriteINIStr "$temp\tmpfile.dat" "tmp" "execute_1" "1"
SectionEnd
В макросе:
ReadINIStr $0 "$temp\tmpfile.dat" "tmp" "execute_1"
StrCmp $0 "1" 0 +2
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "Progid" "$ClassName" »

Вот тока я не понимаю, зачем плодить секции ради одной команды ?
Цитата:

Цитата wolkow70
Может можно как то по другому без временного файла привязать комманду к значению определенной секции (более красиво)?»

А переменные на что в NSIS? почитайте... ага хранить значения
Особенно про StrCpy - оператор присваивания...
Код:

var ProgID

Function .OnInit
        StrCpy $ProgID 0 #на всяк случай иницилизируем переменную, помещаем в 0             
FunctionEnd

Section "Особые параметры сопоставления файлов" ProgID
      SectionIn 1 2
      StrCpy $ProgID 1
SectionEnd

  #StrCmp $ProgID 1 0 +2
  #WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "Progid" "$ClassName"


wolkow70 18-07-2011 15:34 1715013

Цитата:

Цитата kotkovets
Вот тока я не понимаю, зачем плодить секции ради одной команды ? »

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

Для win 7 это не имеет значения. Там это правило. А с приоритетом ставится через UserChoice.

wolkow70 18-07-2011 16:56 1715070

Товарищи, вопрос возник интересный.
Имею в скрипте такие секции:

Код:

Section "Хранить настройки программы в реестре" Registry
SectionIn  1 2 3
WriteRegDWORD HKCU "Software\Daum\PotPlayerMini\Settings" "CheckAutoUpdate" 0x0
;  бла-бла
;  бла-бла
SectionEnd

Section /o "Хранить настройки программы в INI файле" Ini
SectionIn  1 2 3
IfFileExists "$EXEDIR\PotPlayerMini.ini" 0 NoThere
IfSilent +2
MessageBox MB_OK "Файл настроек есть, он будет скопирован в директорию установки"
CopyFiles /silent "$EXEDIR\PotPlayerMini.ini" "$INSTDIR\PotPlayerMini.ini"
Goto Done
NoThere:
IfSilent +2
MessageBox MB_OK "Файла настроек нет, он будет создан в минимальной конфигурации"
SetOutPath "$INSTDIR"
WriteINIStr "$INSTDIR\PotPlayerMini.ini" "Settings" "CheckAutoUpdate" "0"
; бла
; бла
Done:
SectionEnd
;
Function .onSelChange
!insertmacro StartRadioButtons $1
!insertmacro RadioButton ${Registry}
!insertmacro RadioButton ${Ini}
!insertmacro EndRadioButtons
FunctionEnd

При запуске инсталлятора вижу, что полного типа установки уже не получается, так как
Section /o "Хранить настройки программы в INI файле" Ini


Вопрос в связи с с этим возник такой: возможно ли включить секцию /o в полный тип установки, если она входит в функцию .onSelChange ?

kotkovets 18-07-2011 17:12 1715086

wolkow70,
1. А что мешает создать свою страничку с двумя радиобутонами?
2. И флаги выбора типа установки в этих секциях расставлять смысла нет, здесь выбор опциональный - захотел настройки в реестре или в ini файле.

wolkow70 18-07-2011 17:41 1715097

Цитата:

Цитата kotkovets
1. А что мешает создать свою страничку с двумя радиобутонами? »

Я еще не освоил создание своих страничек. Да и не понял, зачем два радиобуттона?

Цитата:

Цитата kotkovets
2. И флаги выбора типа установки в этих секциях расставлять смысла нет, здесь выбор опциональный - захотел настройки в реестре или в ini файле. »

Не знал. Скомпилирую, посмотрю.

Дак, с одной страничкой не получится?

kotkovets 18-07-2011 18:01 1715103

Цитата:

Цитата wolkow70
Я еще не освоил создание своих страничек »

Очень плохо, получаются весьма обалденные установщики
Цитата:

Цитата wolkow70
Дак, с одной страничкой не получится? »

получится, просто убрать SectionIn 1 2 3 в двух секциях выбора хранения настроек, здесь выбор опциональный

wolkow70 18-07-2011 18:26 1715113

Цитата:

Цитата kotkovets
получится, просто убрать SectionIn 1 2 3 в двух секциях выбора хранения настроек, здесь выбор опциональный »

Убрал. Все равно при запуске получается так "По Выбору":

http://s47.radikal.ru/i118/1107/4f/55619653d24f.png

В ручную можно выбрать полный тип установки, но мне надо, что бы при запуске в окне выбора был полный тип установки.

kotkovets 18-07-2011 19:16 1715137

wolkow70, Я же Вам говорил опционально, это радиобутоны - "флаги видят", что секция какая-то не отмечена, в первоначальном состоянии, естественно они не могут расставить галки, макрос RadioButton "мешает" - не надо здесь крутить велосипеды! Здесь лучше рисовать свою страничку однозначно...

sawe 18-07-2011 21:53 1715216

Цитата:

Цитата wolkow70
Я еще не освоил создание своих страничек. Да и не понял, зачем два радиобуттона? »

Создание своих страничек, это очень полезная вещь!
Благодаря помощи kotkovets удалось сделать некую стилизацию под установщик WinHex 16.0 SR-6 со скинами, используя в основном nsDialog.

А этот TokPlayer 1.0.1135 x86 перевёл на русский язык, правда вышло не без казуса по поводу авторства.
Но самое интересное в том, что родной инсталлятор на корейском, вот тут-то пригодились заказные странички.
--

wolkow70 19-07-2011 09:18 1715418

Цитата:

Цитата sawe
Создание своих страничек, это очень полезная вещь!
Благодаря помощи kotkovets удалось сделать некую стилизацию под установщик WinHex 16.0 SR-6 со скинами, используя в основном nsDialog. »

Красиво, но с ключом /S не ставится. Мне бы для WPI....



TokPlayer 1.0.1135 x86 поставил, а удалить не могу , зависает деинсталлятор. Ничего не удаляется, и ассоциации тоже в ручную удаляю.

http://i027.radikal.ru/1107/8e/33a3f8012b10.png

sawe 19-07-2011 15:17 1715689

Цитата:

Цитата wolkow70
Красиво, но с ключом /S не ставится. Мне бы для WPI.... »

Я не использую тихую установку с ключём /S

Если только для WPI, то в большенстве случаев подойдёт 7zsfx

wolkow70 19-07-2011 17:28 1715782

Цитата:

Цитата sawe
Если только для WPI, то в большенстве случаев подойдёт 7zsfx »

1. Не только для WPI, но и для...
2. Я раньше и сидел на 7zsfx, но завязал с этим. В нем многое не реализуемо и убого.
3. Вы мне объясните куда программа прописывает регистрацию, я на NSIS сделаю инсталлятор с поддержкой /S. Чего-то я в реестре вообще не нашел ее записей.

sawe 19-07-2011 21:12 1715911

Цитата:

Цитата wolkow70
TokPlayer 1.0.1135 x86 поставил, а удалить не могу , зависает деинсталлятор »

Прошу прощения, это я немного изменил под разные версии Windows, но не успел проверить, вот глюк и вылез.

Какая программа?
Проще скрипт с потрохами выложить, если интересно.

wolkow70 20-07-2011 10:04 1716165

Цитата:

Цитата sawe
Какая программа? »

WinHex прописывает в реестр регистрацию?

sawe 20-07-2011 14:59 1716394

Цитата:

Цитата wolkow70
WinHex прописывает в реестр регистрацию? »

Для того, что бы делать снимок реестра, и учитывая, что вы любите тихую установку, соберите сами Regshot silent.7z.

Может поможет, ловите WinHex 16 SP6.7z

--

wolkow70 20-07-2011 15:27 1716412

Цитата:

Цитата sawe
Для того, что бы делать снимок реестра, и учитывая, что вы любите тихую установку, соберите сами Regshot silent.7z.
Может поможет, ловите WinHex 16 SP6.7z »

Не могу скачать. На сервере "Ошибка 500"

sawe 20-07-2011 15:48 1716431

Цитата:

Цитата wolkow70
Не могу скачать. На сервере "Ошибка 500" »

Перезалил на другой обменник

Regshot silent.7z

WinHex 16 SP6.7z

Кстати, появилось уже WinHex 16.1 + Rus

--

wolkow70 21-07-2011 13:45 1717131

kotkovets,

Из Вашей справки
Код:

$0  $1  $2  $3  $4  $5  $6  $7  $8  $9  $R0  $R1  $R2  $R3  $R4  $R5  $R6  $R7  $R8  $R9

Эти переменные могут использоваться точно так же как и пользовательские переменные,
но обычно используются в общедоступных функциях или макроопределениях.
Объявлять эти переменные совершенно не нужно, вы не будете получать конфликтов по именам в скрипте. Используя эти переменные в скрипте, рекомендуется использовать стек для сохранения и восстановления их оригинальных значений, во избежании перезаписи другими командами и функциями, что может привести к непредсказуемым результатам.

По поводу использования стека можно краткие пояснения, а то в справке нет. И какое значение имеет буква R? Или можно любую букву использовать?

Еще вопросик:

В макросе регистрации ассоциаций прописал:

Код:

ReadRegStr $1 HKCR ".${extenstion}" ""
StrCmp $1 "" NoBackup
WriteRegStr HKCR ".${extenstion}" "foobar2000.backup" $1
NoBackup:
StrCpy $ClassName "foobar2000.${extenstion}"
WriteRegStr HKCR ".${extenstion}" "" "$ClassName"

Создание бэкапа при этом проходит нормально.

В макросе де-регистрации ассоциаций прописал:

Код:

StrCpy $ClassName "foobar2000.${extenstion}"

ReadRegStr $0 HKCR ".${extenstion}" ""
StrCmp $0        $ClassName 0 +2
DeleteRegKey HKCR "$ClassName"

ReadRegStr $0 HKCR ".${extenstion}" ""
StrCmp $0        $ClassName 0 +2
DeleteRegValue HKCR ".${extenstion}" ""

ReadRegStr $1 HKCR ".${extenstion}" "foobar2000.backup"
WriteRegStr HKCR ".${extenstion}" "" $1
DeleteRegValue HKCR ".${extenstion}" "foobar2000.backup"

Восстановление ассоциаций происходит нормально если нет других значений бэкапа. Но если есть еще другое значение (например Winamp.Backup), то прописывается его значение. Не пойму почему так может происходить? Ведь должно читаться значение именно "foobar2000.backup".

sawe 21-07-2011 14:38 1717161

Цитата:

Цитата wolkow70
И какое значение имеет буква R? »

$R1-$R9 как местные регистры
$0-$9 как глобальные значения.

kotkovets 21-07-2011 14:44 1717167

Цитата:

Цитата wolkow70
По поводу использования стека можно краткие пояснения, а то в справке нет »

Что такое стек?
Цитата:

Цитата wolkow70
можно любую букву использовать?»

Без объявления других переменных можно использовать стандардные 20 переменных - это возможность заложена в компиляторе NSIS
Код:

 
  StrCpy $0 TEST ;помещаем в $0  -> TEST
  MessageBox MB_ICONINFORMATION|MB_OK "$$0 = $0" IDOK

  Push $0 ;помещаем оригинальное значение $0 в стек

  StrCpy $0 wolkow70 ;перезаписываем переменную $0  -> wolkow70
  MessageBox MB_ICONINFORMATION|MB_OK "$$0 = $0" IDOK

  Pop $0 ;вынимаем оригинальное значение из стека в  $0
  MessageBox MB_ICONINFORMATION|MB_OK "$$0 = $0" IDOK

Смысл основной здесь в чем, вот есть некий макрос который использует все 20 стандартных переменных (не важно, хоть одну переменную), при подключении к скрипту макроса, у меня в скрипте было до макроса в $0=некое значение, и макрос использует эту переменную - естественно перезапишется значение, но мне нужно вернуть первоначальное значение $0 ! после отработки макроса, вот тут и стек мне и пригодится, но в основном в сложных макросах - это уже предусмотрено!вообще это правило хорошего тона, что взял - то и отдай.
Цитата:

Цитата sawe
$R1-$R9 как местные регистры
$0-$9 как глобальные значения »

Это кто вам такое сказал то? смысл здесь в чем?
$0 - $R9 -> это стандартные переменные, которые не нужно объявлять, это заложено на программном уровне компилятора NSIS, равно тому что и стек - только в отдельном пуле

wolkow70 21-07-2011 14:44 1717169

Цитата:

Цитата sawe
$0-$9 как глобальные значения. »

То есть, если занести значение в такую переменную, то оно сохранится при интеграции переменной в другой макрос?

kotkovets 21-07-2011 15:10 1717191

Цитата:

Цитата wolkow70
То есть, если занести значение в такую переменную, то оно сохранится при интеграции переменной в другой макрос? »

Передадутся все значения переменных от $0 до $R9
Но! не передадутся из секций инсталлятора в секции деиинсталлятора в скрипте.

Krinkels 21-07-2011 15:22 1717195

Цитата:

Цитата kotkovets
Но! не передадутся из секций инсталлятора в секции деиинсталлятора в скрипте. »

Спасибо за полезную информацию. Не зря я значит в деинсталяторе все заново высчитывал :)

kotkovets 21-07-2011 16:08 1717224

Цитата:

Цитата Krinkels
Спасибо за полезную информацию. Не зря я значит в деинсталяторе все заново высчитывал »

Всегда пожалуйста! Кстати еще полезная информация, предопределенные переменые тоже не передаются, кроме переменных окружения(системных)
К примеру $INSTDIR, это значение определится в деинсталляторе как текущая папка местонахождения деинсталятора, это легко проверить - переместить в другое место деинсталлятор.
Так как деинсталлятор разделяется на 2 процесса, то в переменную $EXEDIR возвратится путь второго процесса (_au.exe - точно не помню название процесса).

sawe 21-07-2011 17:37 1717295

Цитата:

Цитата kotkovets
Это кто вам такое сказал то? смысл здесь в чем? »

Справка от версии 1,68 до 2,10 и обзывается makensis.html

kotkovets 21-07-2011 18:08 1717317

sawe, Я не знаю как в предыдущих версиях, может наследие...
Местные регистры - означает, что эти переменные работают, только в пределах одной секции или функции - потом значение этих переменных уничтожается (как и в компиляторах си, делфи)
глобальные значения - т.е эти переменые, значения можно использовать любой функцией или макросом в пределах установщика.
Однако все значения этих переменных использовать можно любой функцией или любым макросом.

sawe 21-07-2011 22:21 1717415

Цитата:

Цитата kotkovets
Я не знаю как в предыдущих версиях, может наследие... »

До второй версии была даже поддержка Unix-ов, чем выгодно отличалась от других.

wolkow70 23-07-2011 17:49 1718486

Уважаемый kotkovets, не подскажите по какой причине может не компилироваться такой макрос дерегистрации:


Код:

!macro UnRegisterExtension extenstion
Push $1
Push $2
StrCpy $ClassName "FastStone.${extenstion}"
ReadRegStr $1 HKLM "SOFTWARE\Classes\.${extenstion}" ""
StrCmp $1 "$ClassName" 0 RestoreProgid
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" ""
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" "PerceivedType"
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" "Content Type"
DeleteRegKey HKLM "SOFTWARE\Classes\$ClassName"
;
ReadRegStr $1 HKLM "SOFTWARE\Classes\.${extenstion}" "FastStone.bak"
WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "" $1
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" "FastStone.bak"
 ;
RestoreProgid:
;
ReadRegStr $2 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "FastStone.bak"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "Progid" $2
DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "FastStone.bak"
;
Pop $1
Pop $2
!macroend

Ошибка вылазит такая:

StrCpy $ClassName "FastStone.TIFF" () ()
ReadRegStr $1 HKLM\SOFTWARE\Classes\.TIFF\
StrCmp "$1" "$ClassName" equal=0, nonequal=RestoreProgid
DeleteRegValue: HKLM\SOFTWARE\Classes\.TIFF\
DeleteRegValue: HKLM\SOFTWARE\Classes\.TIFF\PerceivedType
DeleteRegValue: HKLM\SOFTWARE\Classes\.TIFF\Content Type
DeleteRegKey: HKLM\SOFTWARE\Classes\$ClassName
ReadRegStr $1 HKLM\SOFTWARE\Classes\.TIFF\FastStone.bak
WriteRegStr: HKLM\SOFTWARE\Classes\.TIFF\=$1
DeleteRegValue: HKLM\SOFTWARE\Classes\.TIFF\FastStone.bak
Error: label "RestoreProgid:" already declared in section
Error in macro UnRegisterExtension on macroline 15
Error in script "D:\NSIS\FastStoneView.nsi" on line 769 -- aborting creation process

kotkovets 23-07-2011 19:12 1718522

Цитата:

Цитата wolkow70
по какой причине может не компилироваться »

вы в одной секции, вызываете макрос несколько раз, получается вставка кода макроса в секцию и в макросе есть безусловный переход по метке - это противоречит синтаксису NSIS: совпадение безусловных переходов по имени не допускается! (Error: label "RestoreProgid:" already declared in section)
Здесь нужно применять условные переходы или логическую конструкцию.
Код:

!include logiclib.nsh
--
--
StrCpy $ClassName "FastStone.${extenstion}"
ReadRegStr $1 HKLM "SOFTWARE\Classes\.${extenstion}" ""
${If} $1 == "$ClassName"
    DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" ""
    DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" "PerceivedType"
    ---
    ---
${Else}
  ReadRegStr $2 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "FastStone.bak"
  WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "Progid" $2
  DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "FastStone.bak"   
${EndIf}
---
---


wolkow70 23-07-2011 19:37 1718538

Спасибо за ответ. Пока я его ждал, еще попробовал сделать так:

Код:

!macro UnRegisterExtension extenstion
Push $1
Push $2
StrCpy $ClassName "FastStone.${extenstion}"
;
ReadRegStr $1 HKLM "SOFTWARE\Classes\.${extenstion}" ""
StrCmp $1 "$ClassName" 0 +2
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" ""
;
StrCmp $1 "$ClassName" 0 +3
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" "PerceivedType"
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" "Content Type"
;
StrCmp $1 "$ClassName" 0 +2
DeleteRegKey HKLM "SOFTWARE\Classes\$ClassName"
;
StrCmp $1 "$ClassName" 0 +4
ReadRegStr $1 HKLM "SOFTWARE\Classes\.${extenstion}" "FastStone.bak"
WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "" $1
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" "FastStone.bak"
;
;;RestoreProgid
;
ReadRegStr $2 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "FastStone.bak"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "Progid" $2
DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "FastStone.bak"
;
Pop $1
Pop $2
!macroend

В таком виде тоже все работает.

И все таки не понятно почему безусловные переходы совпадают?
Ведь дерегистрация каждого расширения вызывается отдельной коммандой:
!insertmacro UnRegisterExtension "WMF"
!insertmacro UnRegisterExtension "TIFF"
!insertmacro UnRegisterExtension "TIF"
!insertmacro UnRegisterExtension "TGA"
Я так понимаю, что макрос каждый раз запускается снова для выполнения комманд, или во что-то не врубился?

kotkovets 23-07-2011 19:45 1718544

Цитата:

Цитата wolkow70
В таком виде тоже все работает »

здесь уже условные переходы, отсчет идет относительно оператора сравнения, но это очень не удобно - при каждом изменении макроса приходится подсчитывать переходы, что бы условия переходов соблюдались
Цитата:

Цитата wolkow70
И все таки не понятно почему безусловные переходы совпадают? »

потому что, компилятор код макроса "вставляет" в секцию, из которой вызывается макрос.
Цитата:

Цитата wolkow70
Я так понимаю, что макрос каждый раз запускается снова для выполнения комманд, или во что-то не врубился? »

конечно!

wolkow70 23-07-2011 20:09 1718550

Цитата:

Цитата kotkovets
потому что, компилятор код макроса "вставляет" в секцию, из которой вызывается макрос. »

Вот это я и не учел. Но, я ориентировался на пример из справки:
http://nsis.sourceforge.net/File_Association

Код:

!macro UnRegisterExtension_
  !verbose push
  !verbose ${_FileAssociation_VERBOSE}
 
  Exch $R1 ;desc
  Exch
  Exch $R0 ;ext
  Exch
  Push $0
  Push $1
 
  ReadRegStr $1 HKCR $R0 ""
  StrCmp $1 $R1 0 NoOwn ; only do this if we own it
  ReadRegStr $1 HKCR $R0 "backup_val"
  StrCmp $1 "" 0 Restore ; if backup="" then delete the whole key
  DeleteRegKey HKCR $R0
  Goto NoOwn
 
Restore:
  WriteRegStr HKCR $R0 "" $1
  DeleteRegValue HKCR $R0 "backup_val"
  DeleteRegKey HKCR $R1 ;Delete key with association name settings
 
NoOwn:
 
  Pop $1
  Pop $0
  Pop $R1
  Pop $R0
 
  !verbose pop
!macroend

Который почему-то работает. Наверное, он вызывается по другому.

kotkovets 23-07-2011 20:38 1718564

Цитата:

Цитата wolkow70
Который почему-то работает. Наверное, он вызывается по другому. »

Вызывается макрос через ${CallArtificialFunction} RegisterExtension_, ${CallArtificialFunction} - описан в хедере Util.nsh. Офигительный хедер, очень помогает, особенно в циклах.
Вот вы попробуйе в FileAssociation.nsh заменить ${CallArtificialFunction} на !insertmacro и вы получите конфликт по именам переходов

wolkow70 24-07-2011 09:21 1718748

Цитата:

Цитата kotkovets
Вызывается макрос через ${CallArtificialFunction} RegisterExtension_, ${CallArtificialFunction} - описан в хедере Util.nsh. Офигительный хедер, очень помогает, особенно в циклах. »

В оригинальном скрипте VLC нет FileAssociation.nsh и нет комманды ${CallArtificialFunction} RegisterExtension_, мне вообще не понятно как он работает, а ведь работает (проверял неоднократно)...

kotkovets 24-07-2011 10:32 1718762

Цитата:

Цитата wolkow70
мне вообще не понятно как он работает, а ведь работает »

через функцию, точно также как делает ${CallArtificialFunction},
Код:

!macro RegisterExtensionSection EXT
  Section ${EXT}
    SectionIn 1 3
    Push $R0
    StrCpy $R0 ${EXT}
    Call RegisterExtension
    Pop $R0
  SectionEnd
!macroend


wolkow70 24-07-2011 11:22 1718791

Цитата:

Цитата kotkovets
через функцию, точно также как делает ${CallArtificialFunction}, »

Мне понятно, что через функцию. Но, ведь, функция вызывается из секции, а как для каждого расширения подставляется новая секция не понятно.

kotkovets 24-07-2011 11:40 1718797

wolkow70,
Call - значит вызов функции на исполнение и не больше!

wolkow70 24-07-2011 11:55 1718802

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

ReadRegStr $2 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\OpenWithList" ""
StrCmp $2 "FSViewer.exe" 0 +2
DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\OpenWithList" ""

kotkovets 24-07-2011 12:32 1718818

wolkow70, Вы сначала выясните, что помещается в $2, а удаляться будет значение ключа по умолчанию, только если $2 = FSViewer.exe, иначе нет!
смотрите значение параметра а
ReadRegStr $2 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\OpenWithList" "a"

wolkow70 24-07-2011 13:01 1718831

Цитата:

Цитата kotkovets
смотрите значение параметра а
ReadRegStr $2 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\OpenWithList" "a" »

У каждого расширения FSViewer.exe имеет разные значения, в большинстве случаев не "a"

kotkovets 24-07-2011 14:31 1718883

wolkow70, только через перечисление значений ключей реестра, в этом здорово поможет мой макрос
http://forum.oszone.net/showpost.php?p=1658900
задаете маску удаления значений FSViewer.exe
Код:

${DelRegValue} HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\OpenWithList" "FSViewer.exe"
Кстати я уже намного расширил возможности своей библиотеки и избавил от применения плагина, полностью переписал на WIN API, готовлю описание к справочнику.

sawe 24-07-2011 16:52 1718977

Цитата:

Цитата kotkovets
полностью переписал на WIN API »

Вещь конечно очень нужная, но недавно читал на форумах для программистов и тестеров, как они мучаются с WIN API для новой Windows 8. Как они объясняют в новой Windows 8 появится много новых API функций и часть прежних не будут поддерживаться. Если их количество перейдёт в новое качество, то тогда закат NSIS гарантирован.

kotkovets 24-07-2011 17:12 1718987

Цитата:

Цитата sawe
Если их количество перейдёт в новое качество, то тогда закат NSIS гарантирован. »

Волков боятся - в лес не ходить. Главное, чтобы на msdn library было подробное описание прототипов функций, оно будет! и переделать дело техники.

wolkow70 25-07-2011 13:38 1719434

Цитата:

Цитата kotkovets
${DelRegValue} HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\OpenWithList" "FSViewer.exe" »

Не работает так.

!include "DelRegKey.nsh"

Ошибка:

Код:

!insertmacro: _DelRegValue
Push: FSViewer.exe
Push: Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.WMF\OpenWithList
Push: HKCU
Exch($7,0)
Exch(st(1),0)
Exch($1,0)
Exch(st(2),0)
Exch($5,0)
StrLen $6 "$5"
Push: $8
Exch($8,0)
StrCpy $8 "0" () ()
!insertmacro: CallArtificialFunction
!define: "CallArtificialFunction_TYPE"="uninst"
Call ":._DeleteRegValueuninst"
Goto: _DeleteRegValueuninst_DONE
!define: "_DeleteRegValueuninst_DEFINED"=""
!insertmacro: _DeleteRegValue
Invalid command: registry::_Open
Error in macro _DeleteRegValue on macroline 1
Error in macro CallArtificialFunction on macroline 11
Error in macro _DelRegValue on macroline 13
Error in macro UnRegisterExtension on macroline 37
Error in script "D:\NSIS\FastStoneView.nsi" on line 734 -- aborting creation process


kotkovets 25-07-2011 14:16 1719473

wolkow70, потому что нужно читать внимательно описание либы:
Для полноценной работы модуля требуется плагин Registry:
http://nsis.sourceforge.net/Registry_plug-in

kotkovets 26-07-2011 23:18 1720587

Добрались руки....
---
Исправил ошибки в библиотеке DelRegKey.nsh
1. В макросе ${DelRegValue} исправил ошибку открытия корневого раздела HKCR и проблему удаления параметров ключей.
2. Оптимизировал поиск значений параметров ключей в ${DelRegValue} - поиск ведется только на строковые параметры: REG_SZ и REG_EXPAND_SZ. Это несколько ускоряет поиск значений параметров
3. Оптимизировал применение библиотеки в пользовательских макросах - был конфликт использования переменных

*****
В окне деталей показываютя удаленные ключи, если в окне деталей ничего нет - значит идет поиск!
Указывайте ветку реестра, насколько возможно точнее, это нужно
для сокращения времени поиска, которое может длиться весьма продолжительное время!
Подробнее

P.S
В общем это последнее изменение в библиотеке, так как для справочника готовлю библиотеку RegistryFunc.nsh - который полностью перекрывает возможности DelRegKey.nsh и избавлен от применения плагина Registry - фактически тот же функционал будет.
Если нужны новые возможности для работы с реестром, которых нет у плагина - пишите на форум, обсудим!

SOLON7 28-07-2011 04:05 1721274

Мужики такой вопрос!!! nsis инсталятор может делать callback установки, что программа которая запускает установщик могла знать скока процентов установки завершенно ????

wolkow70 28-07-2011 10:06 1721386

kotkovets,
Цитата:

Цитата kotkovets

${WinVerGetMajor} $R0 ;определяем старшую цифру Windows
IntCmp $R0 5 +4 +4 0
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "Progid" "$ClassName"
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "Progid" "$ClassName"
;
WriteRegStr HKLM "SOFTWARE\Classes\$ClassName\shell" "" "Open"
WriteRegStr HKLM "SOFTWARE\Classes\$ClassName\shell\Open" "" "Воспроизвести"
WriteRegStr HKLM "SOFTWARE\Classes\$ClassName\shell\Open\command" "" "$OpenCommand"
; »

Мне непонятна интерпретация строки IntCmp $R0 5 +4 +4 0

Почему то наоборот на XP прописывается:
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "Progid" "$ClassName"

и не прописывается:
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "Progid" "$ClassName"

K.A.V. 28-07-2011 10:26 1721402

Цитата:

Цитата wolkow70
Мне непонятна интерпретация строки IntCmp $R0 5 +4 +4 0 »

Код:

IntCmp $0 5 ЕСЛИ_РАВНО ЕСЛИ_МЕНЬШЕ ЕСЛИ_БОЛЬШЕ
ЕСЛИ_РАВНО:
  DetailPrint "$$0 == 5"
  Goto done
ЕСЛИ_МЕНЬШЕ:
  DetailPrint "$$0 < 5"
  Goto done
ЕСЛИ_БОЛЬШЕ:
  DetailPrint "$$0 > 5"
done:


wolkow70 28-07-2011 10:46 1721416

Товарищи, подмогните еще в одном вопросе:
Сделал секцию

Section /o "Un.Перезагрузка Проводника Windows" RestartExplorer
SectionIn 1
ExecWait 'taskkill /F /IM explorer.exe' $0
DetailPrint "taskkill exit: [ $0 ]"
Sleep 500
StrCmp $0 0 0 +2
Exec "explorer.exe"
Delete "$INSTDIR\ShellEx\XnViewShellExt.dll"
RMDir /r "$INSTDIR\ShellEx\"
RMDir /r "$INSTDIR\"
SectionEnd

В секции Uninstall
RMDir /r /REBOOTOK "$INSTDIR\"
SetAutoClose true
SectionEnd

То есть выходит так, что, даже если выбрана секция RestartExplorer, и залоченный файл удаляется, то финиш-окно выводится с предложением произвести перезагрузку. Как бы сделать, что если выбрана секция RestartExplorer, то в секции Uninstall срабатывала комманда просто RMDir /r "$INSTDIR\", а если не выбрана, то RMDir /r /REBOOTOK "$INSTDIR\"

K.A.V. 28-07-2011 10:56 1721423

Код:

Section /o "Un.Перезагрузка Проводника Windows" RestartExplorer
Var /Global RestartExplorerSectionChecked
StrCpy $RestartExplorerSectionChecked 1

 SectionIn 1
 ExecWait 'taskkill /F /IM explorer.exe' $0
 DetailPrint "taskkill exit: [ $0 ]"
 Sleep 500
 StrCmp $0 0 0 +2
 Exec "explorer.exe"
 Delete "$INSTDIR\ShellEx\XnViewShellExt.dll"
 RMDir /r "$INSTDIR\ShellEx\"
 RMDir /r "$INSTDIR\"
 SectionEnd

 В секции Uninstall
StrCmp $RestartExplorerSectionChecked "1" 0 +3
RMDir /r "$INSTDIR"
goto +2
RMDir /r /REBOOTOK "$INSTDIR"

SetAutoClose true
 SectionEnd


wolkow70 28-07-2011 11:57 1721453

K.A.V.,
Сделал по Вашему совету:

Код:

StrCmp $RestartExplorerSectionChecked "1" 0 +3
RMDir /r "$INSTDIR"
goto +2
RMDir /r /REBOOTOK "$INSTDIR"
SetAutoClose true
SectionEnd
;
Section /o "Un.Перезагрузка Проводника Windows"  RestartExplorer
Var /Global RestartExplorerSectionChecked
StrCpy $RestartExplorerSectionChecked 1
SectionIn 1
ExecWait 'taskkill /F /IM explorer.exe' $0
DetailPrint "taskkill exit: [ $0 ]"
Sleep 500
StrCmp $0 0 0 +2
Exec "explorer.exe"
Delete "$INSTDIR\ShellEx\XnViewShellExt.dll"
RMDir /r "$INSTDIR\ShellEx\"
RMDir /r "$INSTDIR\"
SectionEnd

Все равно выводится окно с REBOOTOK. Видимо потому, что секция Uninstall отрабатывает раньше, чем RestartExplorer

K.A.V. 28-07-2011 12:06 1721457

Цитата:

Цитата wolkow70
Все равно выводится окно с REBOOTOK »

Так вам нужно окно убрать (FINISHPAGE?) в конце удаления с чекбоксом или что?

Вы написали:
Цитата:

Цитата wolkow70
если выбрана секция RestartExplorer, то в секции Uninstall срабатывала комманда просто RMDir /r "$INSTDIR\", а если не выбрана, то RMDir /r /REBOOTOK "$INSTDIR\" »

Для этого вопроса код правильный

Цитата:

Цитата wolkow70
Видимо потому, что секция Uninstall отрабатывает раньше, чем RestartExplorer »

Не отрабатывает она раньше

wolkow70 28-07-2011 12:29 1721480

Цитата:

Цитата K.A.V.
Для этого вопроса код правильный »

Да выполнение правильно

Цитата:

Цитата K.A.V.
Так вам нужно окно убрать (FINISHPAGE?) в конце удаления с чекбоксом или что? »

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

А в случае, если секция RestartExplorer не выбрана, удаление идет обычным образом через предложение перезагрузки с применением значения /REBOOTOK.

kotkovets 28-07-2011 13:20 1721527

wolkow70, Если выполнилась команда /REBOOTOK, то устанавливается флаг перезагрузки, на этом можно построить логику на финишной странице, в зависимости от флага - чебокс на финише будет отмечен или не отмечен, либо скрывать контрол (чебокс) на финишной страничке, т.е логику выполнять когда финишная страница открыта.
В справочнике > стандартные функции - почитать.
и команду IfRebootFlag ничего сверхсложного

wolkow70 28-07-2011 13:41 1721549

Цитата:

Цитата kotkovets
wolkow70, Если выполнилась команда /REBOOTOK, то устанавливается флаг перезагрузки, на этом можно построить логику на финишной странице, в зависимости от флага - чебокс на финише будет отмечен или не отмечен, либо скрывать контрол (чебокс) на финишной страничке, т.е логику выполнять когда финишная страница открыта.
В справочнике > стандартные функции - почитать.
и команду IfRebootFlag ничего сверхсложного »


Дак ведь, при такой конструкции команда /REBOOTOK не должна быть выполнена, при отмеченной секции RestartExplorer, и соответтсвенно флагов перезагрузки не должно быть. Вот, что мне не понятно.. А реально, они появляются.


Код:

Section Uninstall  Uninstall
SectionIn 1 RO
---бла-бла----
StrCmp $RestartExplorerSectionChecked "1" 0 +3
RMDir /r "$INSTDIR"
goto +2
RMDir /r /REBOOTOK "$INSTDIR"
SetAutoClose true
SectionEnd
;
Section /o "Un.Перезагрузка Проводника Windows"  RestartExplorer
Var /Global RestartExplorerSectionChecked
StrCpy $RestartExplorerSectionChecked 1
SectionIn 1
ExecWait 'taskkill /F /IM explorer.exe' $0
DetailPrint "taskkill exit: [ $0 ]"
Sleep 500
StrCmp $0 0 0 +2
Exec "explorer.exe"
Delete "$INSTDIR\ShellEx\XnViewShellExt.dll"
RMDir /r "$INSTDIR\ShellEx\"
RMDir /r "$INSTDIR\"
SectionEnd


kotkovets 28-07-2011 13:58 1721561

Цитата:

Цитата wolkow70
А реально, они появляются »

А вот как вы определяете флаг перезагрузки?

K.A.V. 28-07-2011 13:59 1721563

Цитата:

Цитата wolkow70
Да, в случае выбора секции RestartExplorer, что бы FINISHPAGE в конце удаления была без чекбоксов »

Так, собственно...

В секцию Uninstall добавить проверку переменной...
Код:

StrCmp $RestartExplorerSectionChecked "1" 0 reboot
RMDir /r "$INSTDIR"
SetRebootFlag false
goto done
reboot:
RMDir /r /REBOOTOK "$INSTDIR"
SetRebootFlag true
done:


wolkow70 28-07-2011 14:37 1721593

Цитата:

Цитата K.A.V.
Так, собственно...
В секцию Uninstall добавить проверку переменной... »

Не помогло.
Окно выводится:
http://i019.radikal.ru/1107/58/4a74168836a1.png

Хотя в этот момент уже фактически нет ни папки ни залоченного файла в системе.

В компиляторе показывается:
unknown variable/constant "{Uninstall}" detected, ignoring (D:\NSIS\xnview.nsi:1109)
unknown variable/constant "RestartExplorerSectionChecked" detected, ignoring (D:\NSIS\xnview.nsi:1523)


Цитата:

Цитата kotkovets
А вот как вы определяете флаг перезагрузки? »

А если просто удалять коммандой RMDir /r "$INSTDIR", то чебоксов перезагрузки нет. Просто залоченный файл удаляется после перезагрузки вместе с папкой в ручную.

http://s55.radikal.ru/i149/1107/83/d528c92dbfbf.png

kotkovets 28-07-2011 14:53 1721606

Цитата:

Цитата wolkow70
А если просто удалять коммандой RMDir /r "$INSTDIR", то чебоксов перезагрузки нет. Просто залоченный файл удаляется после перезагрузки вместе с папкой. »

я то ведь не с проста задал вопрос, почему отладку не делаете? выявите флаг перезагрузки, через IfRebootFlag , без финишной странички - вы узнаете кто еще ставит флаг, да и дифайны (константы финишной странички посмотрите в своем скрипте). А гадать так не пошло, то не это, да не то - себе же мозг выносить.

wolkow70 28-07-2011 15:45 1721658

; Uninstaller pages
!insertmacro MUI_UNPAGE_WELCOME
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_COMPONENTS
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_UNPAGE_FINISH

;!insertmacro MUI_UNPAGE_FINISH -закомментировал

Прописал в Uninstall:

IfRebootFlag 0 NotReboot
MessageBox MB_ICONQUESTION|MB_YESNO "Перезагрузить компьютер ?" IDNO +2
#Reboot #команда перезагрузки
NotReboot:
MessageBox MB_OK "Перезагрузка отменена!"

Вывело запрос на перезагрузку.


Закомментировал:

;RMDir /r /REBOOTOK "$INSTDIR"
;SetRebootFlag true

Вывело перезагрузка отменена.

То есть это единственный флаг на перезагрузку.
Задается, если StrCmp $RestartExplorerSectionChecked "1" 0 reboot
Значит не прописывается значение:
Var /Global RestartExplorerSectionChecked
StrCpy $RestartExplorerSectionChecked 1


Может в Function un.onInit прописать чего?

kotkovets 28-07-2011 15:56 1721670

Цитата:

Цитата wolkow70
Может в Function un.onInit прописать чего? »

Var /Global RestartExplorerSectionChecked

wolkow70 28-07-2011 16:30 1721692

Цитата:

Цитата kotkovets
Цитата wolkow70:
Может в Function un.onInit прописать чего? »
Var /Global RestartExplorerSectionChecked »

Не помогло. Может в функции /Global не нужно?

Такое еще ощущение, что в этом дело: StrCpy $RestartExplorerSectionChecked 1
Может 1 нужно в кавычки заключить?

K.A.V. 28-07-2011 16:35 1721696

Цитата:

Цитата wolkow70
unknown variable/constant "RestartExplorerSectionChecked" detected, ignoring (D:\NSIS\xnview.nsi:1523) »

Пропишите создание переменной в самое начало скрипта
Код:

Var RestartExplorerSectionChecked
и расскоменитруйте
Код:

!insertmacro MUI_UNPAGE_FINISH
и используйте мой пример, он рабочий, только что у себя проверял!

wolkow70 28-07-2011 16:52 1721710

Прописал создание переменной в самое начало скрипта

Var RestartExplorerSectionChecked

Section Uninstall Uninstall
SectionIn 1 RO
!insertmacro UninstallLib REGDLL NOTSHARED NOREBOOT_PROTECTED "$INSTDIR\ShellEx\XnViewShellExt.dll"
--бла---
Call un.RefreshShellIcons
;
StrCmp $RestartExplorerSectionChecked "1" 0 reboot
RMDir /r "$INSTDIR"
SetRebootFlag false
goto done
reboot:
RMDir /r /REBOOTOK "$INSTDIR"
SetRebootFlag true
done:
SetAutoClose true
SectionEnd
;
Section /o "Un.Перезагрузка Проводника Windows" RestartExplorer
StrCpy $RestartExplorerSectionChecked 1
SectionIn 1
ExecWait 'taskkill /F /IM explorer.exe' $0
DetailPrint "taskkill exit: [ $0 ]"
Sleep 500
StrCmp $0 0 0 +2
Exec "explorer.exe"
Delete "$INSTDIR\ShellEx\XnViewShellExt.dll"
RMDir /r "$INSTDIR\ShellEx\"
RMDir /r "$INSTDIR\"
SectionEnd

И опять при деинсталляции вылазит окно с чебоксами перезагрузки.

K.A.V. 28-07-2011 17:09 1721723

Код:

!insertmacro MUI_UNPAGE_FINISH
Раскомментировали?
Вот смотрите, стандартный код, который создаёт HM NIS Edit, работающий с моим описание
читать дальше »

Код:

; Script generated by the HM NIS Edit Script Wizard.

; HM NIS Edit Wizard helper defines
!define PRODUCT_NAME "Моя программа"
!define PRODUCT_VERSION "1.0"
!define PRODUCT_PUBLISHER "Моя компания, LLC."
!define PRODUCT_WEB_SITE "http://www.mycompany.com"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"

; MUI 1.67 compatible ------
Var RestartExplorerSectionChecked
!include "MUI.nsh"


!define MUI_FINISHPAGE_REBOOTLATER_DEFAULT

; MUI Settings
!define MUI_ABORTWARNING
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"

!define MUI_FINISHPAGE_RUN "$INSTDIR\WinXP_Reg.exe"
!define MUI_FINISHPAGE_RUN_TEXT "Запустить '${PRODUCT_NAME} ${PRODUCT_VERSION}'"
!define MUI_FINISHPAGE_RUN_NOTCHECKED
; Welcome page
!insertmacro MUI_PAGE_WELCOME
; Components page
!insertmacro MUI_PAGE_COMPONENTS
; Directory page
!insertmacro MUI_PAGE_DIRECTORY
; Instfiles page
!insertmacro MUI_PAGE_INSTFILES
; Finish page
!insertmacro MUI_PAGE_FINISH

; Uninstaller pages
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_UNPAGE_FINISH

; Language files
!insertmacro MUI_LANGUAGE "Russian"

; MUI end ------

Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "setup.exe"
InstallDir "$PROGRAMFILES\Моя программа"
ShowInstDetails show
ShowUnInstDetails show


Section "MainSection" SEC01
createdirectory $INSTDIR
SectionEnd

Section -Post
  WriteUninstaller "$INSTDIR\uninst.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"
SectionEnd

; Section descriptions
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
  !insertmacro MUI_DESCRIPTION_TEXT ${SEC01} ""
!insertmacro MUI_FUNCTION_DESCRIPTION_END


Function un.onUninstSuccess
  HideWindow
  MessageBox MB_ICONINFORMATION|MB_OK "Удаление программы $(^Name) было успешно завершено."
FunctionEnd

Function un.onInit
  MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "Вы уверены в том, что желаете удалить $(^Name) и все компоненты программы?" IDYES +2
  Abort
FunctionEnd



Section "un.TEST"
#StrCpy $RestartExplorerSectionChecked 1
SectionEnd



Section Uninstall
MessageBox MB_YESNO|MB_ICONQUESTION "Показать?" idno +3
StrCpy $RestartExplorerSectionChecked 0
goto +2
StrCpy $RestartExplorerSectionChecked 1

StrCmp $RestartExplorerSectionChecked "1" 0 reboot
RMDir /r "$INSTDIR"
 SetRebootFlag false
 goto done
 reboot:
RMDir /r /REBOOTOK "$INSTDIR"
 SetRebootFlag true
 done:
 SetAutoClose true
 
  Delete "$INSTDIR\uninst.exe"
  DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
SectionEnd


wolkow70 28-07-2011 17:40 1721740

Section "un.TEST"
#StrCpy $RestartExplorerSectionChecked 1
SectionEnd


Почему у Вас закоментирована StrCpy $RestartExplorerSectionChecked 1 ?
Впрочем, я пробовал запустить и с раскомментированной строкой. В обоих случаях финиш-страница предлагала перезагрузку.. Почему-то.. А если отказаться от "Показать, тогда без чебоксов.

K.A.V. 28-07-2011 17:47 1721743

Цитата:

Цитата wolkow70
Почему у Вас закоментирована StrCpy $RestartExplorerSectionChecked 1 ? »

Потому что я дал вам пример с вопросом "Да/Нет", эта строка просто не нужна для тестов
Там при деинсталляции задаётся вопрос "Показать?", если ответите "Да" - вам покажется страничка с выбором для перезагрузки, если нажмёте "Нет" - то не покажется

Хотите сказать не работает? :o
Почему тогда вот я сейчас сижу проверяю (и не раз проверял перед тем, как выложить этот пример сюда) и каждый раз у меня срабатывает, в зависимости от ответа?
Или вам выложить готовый EXE файл?

Значит у вас либо что-то в скрипте прописано, либо я не знаю...Выложите ваш скрипт полностью сюда, посмотрим

wolkow70 28-07-2011 17:58 1721752

Цитата:

Цитата K.A.V.
Выложите ваш скрипт полностью сюда, посмотрим »

Скопируете скрипт, дайте знать, его сразу уберу. Он пока не для широкой публики.

K.A.V. 28-07-2011 18:16 1721764

Странно...
Т.к. в вашем скрипте много нестандартного, откомпилировать у себя я не могу, поэтому попробуйте заменить строки

Код:

StrCmp $RestartExplorerSectionChecked "1" 0 reboot
на
Код:

MessageBox MB_OK|MB_ICONINFORMATION "$$RestartExplorerSectionChecked = $RestartExplorerSectionChecked"
StrCmp $RestartExplorerSectionChecked "1" 0 reboot

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

wolkow70 28-07-2011 19:00 1721795

Цитата:

Цитата K.A.V.
В процессе удаления появится сообщение, может быть по какой-то причине переменной не назначается значение? »

Ну, конечно не назначается...

http://s011.radikal.ru/i316/1107/a5/568134eb59fc.png

Выяснил причину.
В Вашем примере назначение значения производилось из секции деинсталляции и в этой же секции читалось.
А у меня назначение значения идет из подсекции, а чтение в секции. В данном случае нарушается последовательность действий.
Попробовал в скрипте поднять подсекцию над секцией и сообщение показало значение "1". Все отработало.
Только выглядит это теперь в окне деинсталлятора неправильно (сначала подсекция, потом основная секция).

kotkovets 28-07-2011 19:21 1721802

wolkow70, проще, проще....
Код:

Section /o "Un.Перезагрузка Проводника Windows"  RestartExplorer
    SectionIn 1
    SetRebootFlag true
    ExecWait 'taskkill /F /IM explorer.exe' $0
    Sleep 500
    StrCmp $0 0 0 +2
    Exec "explorer.exe"
    Delete "$INSTDIR\ShellEx\XnViewShellExt.dll"
    RMDir /r "$INSTDIR\ShellEx\"
    RMDir /r "$INSTDIR\"
SectionEnd

Section Uninstall  Uninstall
SectionIn 1 RO
;
!insertmacro UninstallLib REGDLL NOTSHARED NOREBOOT_PROTECTED    "$INSTDIR\ShellEx\XnViewShellExt.dll"
;
SetShellVarContext all
    IfRebootFlag +2
    RMDir /r "$INSTDIR"
    IfRebootFlag 0 +2
    RMDir /r /REBOOTOK "$INSTDIR"
SectionEnd
;

И не нужно объявлять пользовательскую переменную (которую обязательно сначало нужно иницилизировать в первой функции деинсталла), просто рулим флагами перезагрузки.

kotkovets 28-07-2011 23:09 1721926

и все таки нашел грубую очепятку, да простите уж меня :) ...хвост после отладки скрипта остался,
и куча значений в стеке, довольно слабое место NSIS.
Кто пользуется DelRegKey.nsh огромная просьба заменить, во избежание неприятных последствий..
http://forum.oszone.net/showpost.php?p=1658900

wolkow70 29-07-2011 10:14 1722090

Цитата:

Цитата kotkovets
wolkow70, проще, проще... »

все равно окно вылазит с чебоками. Даже , если подсекцию поднять выше секции..

K.A.V. 29-07-2011 10:52 1722110

wolkow70, сделайте так

Код:

Section "Un.Перезагрузка Проводника Windows" RestartExplorer
...
SectionEnd

Section "-un.HiddenSection"
  SectionGetFlags ${RestartExplorer} $0
StrCmp $0 "1" 0 +2
StrCpy $RestartExplorerSectionChecked 1
SectionEnd


Section Uninstall
...
SectionEnd

Сохраняя порядок секций, это конечно минус в этом способе..

wolkow70 29-07-2011 11:13 1722121

Цитата:

Цитата K.A.V.
Сохраняя порядок секций, это конечно минус в этом способе.. »

Это предложение касается вашего вчерашнего способа? Если, да то дважды объявляется
StrCpy $RestartExplorerSectionChecked 1

Ксати Ваш то вариант работает, если подсекцию поднять над секцией.
Но не хочется этого делать.

Или это предложение к последнему предложению kotkovets?

K.A.V. 29-07-2011 11:27 1722133

Цитата:

Цитата wolkow70
Это предложение касается вашего вчерашнего способа? »

Да

Цитата:

Цитата wolkow70
Если, да то дважды объявляется
StrCpy $RestartExplorerSectionChecked 1 »

Оставьте только в скрытой секции -un.HiddenSection, из секции RestartExplorer удалите

kotkovets 29-07-2011 11:29 1722136

wolkow70, смысл в том, что предложение о перезагрузке будет появляться только, когда флаг перезагрузки будет включен SetRebootFlag true, если выключен флаг, то SetRebootFlag false, то не будет предлагать перезагрузку.
Delete /REBOOTOK файл - включает флаг перезагрузки true. Эти флаги проверяются на финишной страничке. Поэтому здесь имеет смысл добавить функцию, которая будет выполняться после всех секций, но перед финишной страницой или во время выполнения финишной странички. В этой функции можно рулить командами удаления и флагами перезагрузки, состоянием отмеченных секций - таким образом можно не смещать расположение секций и в зависимости от состояния отмеченных секций - выполнять необходимые действия.

wolkow70 29-07-2011 12:07 1722157

K.A.V.,
Работает, но только в такой последовательности секций.
если подсекцию RestartExplorer вернуть на место, то независимо от выбора финиш Page выводится без чебоксов, при значении RestartExplorerSectionChecked 1

Цитата:

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

А разве это возможно? Финишная страница же выполняется в основной секции удаления.. (если я правильно понимаю)...

kotkovets 29-07-2011 12:38 1722175

Цитата:

Цитата wolkow70
А разве это возможно? »

конечно! в моей вариации генератора ответов именно так и сделано! там куча функций которые выполняются перед различными страничками, к примеру
!define MUI_PAGE_CUSTOMFUNCTION_SHOW SHOWFINISH - функция SHOWFINISH которая выполняется при показе финишной странички, в генераторе помещает надпись "Файл ответов готов"
MUI_PAGE_CUSTOMFUNCTION_PRE function - перед любой указанной страничкой
MUI_PAGE_CUSTOMFUNCTION_SHOW function - во время показа странички
Читайте доки про модерн ..\Docs\Modern UI 2
вот такой способ....
Код:

  !include "MUI2.nsh"
 
  Name "Modern UI Test"
  OutFile "UnFinish.exe"
  InstallDir "C:\Modern UI Test"
 
  !insertmacro MUI_PAGE_INSTFILES

  !insertmacro MUI_UNPAGE_CONFIRM
  !insertmacro MUI_UNPAGE_INSTFILES
    UninstPage custom un.FINISH
  !insertmacro MUI_UNPAGE_FINISH
  !insertmacro MUI_LANGUAGE "English"

Section "Dummy Section" SecDummy
  SetOutPath "$INSTDIR"
  WriteUninstaller "$INSTDIR\Uninstall.exe"
SectionEnd

Section "Uninstall"
  MessageBox MB_OK "Секция Uninstall" IDOK
SectionEnd

Function un.FINISH
  MessageBox MB_OK "Это сообщение появится перед страничкой MUI_UNPAGE_FINISH" IDOK
FunctionEnd

В функции un.FINISH проверяйте отмеченными секции или командами удаления или рулите флагами перезагрузки

wolkow70 29-07-2011 13:03 1722193

Скорее всего нужно использовать Function un.onInit, которая перед запуском деинсталляции считывала бы флаги с секций и помещала их в переменные. Ав секциях уже производилась интерпретация.
Как этог сделать сам не знаю...

kotkovets 29-07-2011 13:56 1722230

Цитата:

Цитата wolkow70
Скорее всего нужно использовать Function un.onInit »

Вам ничем не поможет, это самая первая функция

kotkovets 29-07-2011 14:14 1722242

wolkow70, Вот вы объясните на пальцах при каких условиях вам нужно на финише, предложение о перезагрузке?

wolkow70 29-07-2011 14:40 1722257

Предложение о перезагрузке появляется в том случае, если программа удаляется стандартным способом, когда выгрузка из памяти и удаление залоченного файла производится при перезагрузке системы. Таких программ много, поэтому вопрос актуальный.
В тоже время, существует альтернативный способ, когда после деинсталляции собственно программы перезагружается проводник и удаляется залоченный файл без перезагрузки системы. Разумеется, в таком случае предложение о перезагрузке на финишной странице излишне. Сам то я об этом знаю, поэтому просто пропускаю перезагрузку. Но другие пользователи сборки могут не понимать механизма и делать ненужную уже перезагрузку.

kotkovets 29-07-2011 14:48 1722265

wolkow70, А почему бы не сделать, вот так, проверять в функции перед финишем , есть ли залоченный файл, то предложить о перезагрузке, а если нету файла, то не предлагать - это будет корректнее..
Код:

!include "MUI2.nsh"

Name "Modern UI Test"
OutFile "UnFinish.exe"
InstallDir "C:\Test_Modern"

!insertmacro MUI_PAGE_INSTFILES
;----------------------------------
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_COMPONENTS
!insertmacro MUI_UNPAGE_INSTFILES
    UninstPage custom un.INSTFILES_LEAVE
!insertmacro MUI_UNPAGE_FINISH
!insertmacro MUI_LANGUAGE "English"

Section Install
    SetOutPath "$INSTDIR"
    WriteUninstaller "$INSTDIR\Uninstall.exe"
SectionEnd

Section  Uninstall
Sectionin RO
  ;тут стандартное удаление
SectionEnd

Section un.Restart RestartExplorer
  ;тут нестандартное удаление, с перезагрузкой проводника
SectionEnd

Function un.INSTFILES_LEAVE
    ${If} ${FileExists} "путь к залоченному файлу" ;или папка т.е наличие папки
        SetRebootFlag true ;если есть файл, предлагать перезагрузку
    ${Else}
        SetRebootFlag false ;если нету файла, не предлагать перезагрузку
    ${EndIf}
FunctionEnd


wolkow70 29-07-2011 14:55 1722272

Цитата:

Цитата kotkovets
wolkow70, А почему бы не сделать, вот так, проверять в функции перед финишем , есть ли залоченный файл, то предложить о перезагрузке, а если нету файла, то не предлагать - это будет корректнее.. »

А потому, что он в любом случае есть в этой программе. Я же сам пишу скрипт и тестирую программы. Да и какой интерес удалять с перезагрузкой? Неудобно... Мы же с Вами обсуждали уже этот вопрос.

kotkovets 29-07-2011 15:18 1722288

wolkow70, Все это делается в деинсталяторе, цель - удалить чисто, без остатков. При перезагрузке проводника не всегда удаляется залоченный файл - есть и другие причины, не раз с этим сталкивался, в секциях деинсталла команды удаления оставляйте как есть, ведь секции деинсталла выполняются раньше функции! Тем более, с /REBOOTOK - удалится при перезагрузке
"Предпоследняя" функция деисталла только проверит наличие залоченного файла и даст нужное предложение. Вот весь функционал - прост и незатейлив.

wolkow70 29-07-2011 16:20 1722336

kotkovets,
Протестировал несколько раз с установкой самой программы. ВСЕ РАБОТАЕТ ОТЛИЧНО! И на Windows7 тоже. Спасибо.

В конечном виде так:

!insertmacro MUI_UNPAGE_WELCOME
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_COMPONENTS
!insertmacro MUI_UNPAGE_INSTFILES
UninstPage custom un.INSTFILES_LEAVE
!insertmacro MUI_UNPAGE_FINISH

Section Uninstall Uninstall
!insertmacro UninstallLib REGDLL NOTSHARED NOREBOOT_PROTECTED "$INSTDIR\ShellEx\XnViewShellExt.dll"
;
;
RMDir /r /REBOOTOK "$INSTDIR\"
SetAutoClose true
SectionEnd
;
Section /o "Un.Перезагрузка Проводника Windows" RestartExplorer
SectionIn 1
ExecWait 'taskkill /F /IM explorer.exe' $0
DetailPrint "taskkill exit: [ $0 ]"
Sleep 500
StrCmp $0 0 0 +2
Exec "explorer.exe"
Delete "$INSTDIR\ShellEx\XnViewShellExt.dll"
RMDir /r "$INSTDIR\ShellEx\"
RMDir /r "$INSTDIR\"
SectionEnd

Function un.INSTFILES_LEAVE
${If} ${FileExists} "$INSTDIR\ShellEx\XnViewShellExt.dll" ;или папка т.е наличие папки
SetRebootFlag true ;если есть файл, предлагать перезагрузку
${Else}
SetRebootFlag false ;если нету файла, не предлагать перезагрузку
${EndIf}
FunctionEnd

sawe 29-07-2011 16:29 1722343

Случайно вы не знаете, как скрыть от посторонних возможность просмотра содержимого инсталлятора, не прибегая к cript.DLL.
Антивирусники её не любят.

kotkovets 29-07-2011 16:46 1722361

sawe,
Через http://nsis.sourceforge.net/DcryptDll_plug-in "расшифровываем" указанные файлы
Через утилиты в архиве NGenKeys.exe и Ncrypt.exe - во время компиляции проекта криптуем файлы (запуск препроцессором NSIS) - не раз такое делал и антивирусы, не замечал, что визжали...

wolkow70 29-07-2011 16:56 1722370

kotkovets,
Читаю вашу публикацию в справке

DeleteRegKey (/ifempty) [root_key] [subkey]
Удаляет раздел реестра subkey из ветки root_key.
Если вызывается с параметром /ifempty, то удаление происходит только в том случае, если раздел пустой.
Флаг ошибки будет установлен в том случае, если раздел не найден, или удаление невозможно.

DeleteRegKey HKLM "Software\My Company\My Software"
DeleteRegKey /ifempty HKLM "Software\A key that might have subkeys"

Удалится ли ключ реестра, если ему не присвоено значение по умолчанию, но имеются подключи?

Напрмер :
HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.dib" ""
HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.dib\UserChoice" "Progid"
Мне надо, что бы только полностью пустые ключи удалялись..

kotkovets 29-07-2011 17:02 1722374

Цитата:

Цитата wolkow70
DeleteRegKey /ifempty »

Ключ удаляется, только если он пустой: без параметров и подключей (подразделов)
если сравнивать с файловой структурой, то означает удалить пустую папку

wolkow70 30-07-2011 14:12 1722809

Товарищи, вопрос ламерский (извините):

Распаковались файлы в директорию установки.
Предположим в папках 5.1 и 6.1 находятся файлы, которые должны быть скопированы (или перемещены) в Windows\system32
Если XP, то копируется (или перемещается) файл из папки 5.1.
Если Vista или W7, то из папки 6.1.
Там файлы с одинаковыми наименованиями , но разными версиями (под систему)
Подскажите как рациональней реализовать?

kotkovets 30-07-2011 14:30 1722817

wolkow70, подключаем библиотеку для работы с различными версиями Windows
Код:

!include WinVer.nsh
Далее в скрипте
Код:

    ${If} ${AtMostWinXP}
        SetOutPath $SYSDIR
        File /r "5.1\*"
    ${ElseIf} ${AtLeastWinVista}
        SetOutPath $SYSDIR
        File /r "6.1\*"
    ${EndIf}

Что из этого получается? При компиляции проекта в установщике будут 2 версии файлов, в зависимости от версии Windows нужный набор файлов будут скопирован в системную директорию

Painkiller 31-07-2011 14:16 1723258

Господа, подскажите. Почему не работает команды makensis.exe /X"SetCompressor /FINAL lzma" myscript.nsi и makensis.exe myscript.nsi. Пишет makensis.exe не являеться внутренней или внешней командой . Подскажите правильную реализацию ?

Krinkels 31-07-2011 14:32 1723272

Painkiller
У меня такая же бадяга была с gcc, компилировал через батник. Вылечил так: прописал полный путь к exe.
Вот пример:
Код:

@set path=C:\PROGRA~1\gcc\MinGW\bin
%path%\gcc.exe ...


Painkiller 31-07-2011 14:45 1723278

Цитата:

Цитата Krinkels
Painkiller
У меня такая же бадяга была с gcc, компилировал через батник. Вылечил так: прописал полный путь к exe.
Вот пример:
Код:
@set path=C:\PROGRA~1\gcc\MinGW\bin
%path%\gcc.exe ... »

Спасибо! Помогло. Вот как реализовал :
Код:

@set path=C:\PROGRA~1\NSIS
C:\PROGRA~1\NSIS\makensis.exe ...
makensis.exe myscript.nsi


Krinkels 31-07-2011 15:40 1723306

Painkiller
Цитата:

Цитата Painkiller
@set path=C:\PROGRA~1\NSIS C:\PROGRA~1\NSIS\makensis.exe ... makensis.exe myscript.nsi »

Ты немного не понял, "..." это значит что дальше идет текст который не имеет смысла писать :)
Код:

@set path=C:\PROGRA~1\NSIS
%path%\makensis.exe myscript.nsi

Так думаю будет правильнее

Painkiller 31-07-2011 16:42 1723344

Цитата:

Цитата Krinkels
@set path=C:\PROGRA~1\NSIS
%path%\makensis.exe myscript.nsi
Так думаю будет правильнее »

А вот так не работает

kotkovets 31-07-2011 17:04 1723359

Painkiller,
Чем заводится makensis?, батником, внешней прогой или скриптом NSIS?

Painkiller 31-07-2011 17:59 1723396

Цитата:

Цитата kotkovets
Painkiller,
Чем заводится makensis?, батником, внешней прогой или скриптом NSIS? »

Моя программа создаёт временный батник. Его запускает и ждёт пока батник отработает . Батник заводит makensis. А прога удаляет временный батник. Пока только такой рабочий вариант нашёл =(

kotkovets 31-07-2011 18:18 1723407

Цитата:

Цитата Painkiller
Моя программа создаёт временный батник »

Вот это да!
Есть же апи...Вы же пишете на делфи, создаете процесс, передаете параметры, или вам привести пример на дельфи или по гуглите...
CreateProcess - создает процесс (с константой DETACHED_PROCESS - запустит консоль в скрытом режиме)
WaitForSingleObject - заставляет прогу ожидать завершения процесса (константа INFINITE)
GetExitCodeProcess - отслеживает код возврата процесса
http://www.delphisources.ru/pages/faq/base/createprocess_console.html
пишу на с++ иногда

Painkiller 31-07-2011 18:39 1723419

Цитата:

Цитата kotkovets
Цитата Painkiller:
Моя программа создаёт временный батник »
Вот это да!
Есть же апи...Вы же пишете на делфи, создаете процесс, передаете параметры, или вам привести пример на дельфи или по гуглите...
CreateProcess - создает процесс (с константой DETACHED_PROCESS - запустит консоль в скрытом режиме)
WaitForSingleObject - заставляет прогу ожидать завершения процесса (константа INFINITE)
GetExitCodeProcess - отслеживает код возврата процесса »

Апи не люблю. Вы бы мне подсказали как одной строкой запустить makensis?

kotkovets 31-07-2011 18:52 1723432

Цитата:

Цитата Painkiller
Апи не люблю »

апи не надо не любить, а пользоваться, эти функции объявлены в "заголовках" дельфи..
в батниках я не спец, но обязательно нужно опредилить путь к makensis и полный путь к скрипту
${NSISDIR}\makensis.exe "путь к скрипту"
Вам пример привести на делфи или на nsis посредством апи?

Painkiller 31-07-2011 18:55 1723436

Цитата:

Цитата kotkovets
апи не надо не любить, а пользоваться, эти функции объявлены в "заголовках" дельфи..
в батниках я не спец, но обязательно нужно опредилить путь к makensis и полный путь к скрипту
${NSISDIR}\makensis.exe "путь к скрипту"
Вам пример привести на делфи или на nsis посредством апи? »

Приведите , посмотрим

kotkovets 31-07-2011 19:25 1723455

Пример на делфи
читать дальше »
Код:

function Exec(RunApp : string; cmdline : string) : bool;
var
    si : TStartupInfo;
    pi : TProcessInformation;
begin
    try
      ZeroMemory(@si,SizeOf(si));
      si.cb := SizeOf(si);
      si.dwFlags := STARTF_USESHOWWINDOW;
      si.wShowWindow := SW_SHOW; // SW_HIDE - скрытый запуск
      Result := CreateProcess(PChar(RunApp),PChar(' ' + cmdline),nil, nil,False,0,nil,nil,si,pi);
          WaitForSingleObject(pi.hProcess, INFINITE); // ожидаем завершения процесса
      CloseHandle(pi.hThread);
      CloseHandle(pi.hProcess);
    except
      Result := false;
    end;
end;
//запуск функции
//  Exec('путь к makensis', 'путь к скрипту');


Пример на апи, запуск консоли, в скрытом режиме и ожидание завершения. Если все хорошо в $0 возвращается 0
читать дальше »
Код:

!include "MUI2.nsh"
!include "Util.nsh"

OutFile "Tes_Run_MAKE.exe"
ShowInstDetails show

!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

!define INFINITE          -1
!define DETACHED_PROCESS  0x00000008
!define ExecWait  "!insertmacro ExecWaitCall"

!macro ExecWaitCall CmdLine ExitCode
        Push `${CmdLine}`
        ${CallArtificialFunction} _CallExecWait
        Pop ${ExitCode}
!macroend

!macro _CallExecWait
    System::Store S
    Push error
    System::Alloc 72
    Pop $2
    System::Call "*$2(i72)"
    System::Call "*(i,i,i,i)i.r3"
    Exch
    System::Call "kernel32::CreateProcess(i0, ts, i0, i0, i0, i${DETACHED_PROCESS}, i0, i0, ir2, ir3)i.r4"
    ${Unless} $4 = 0
        Pop $6
        System::Call "*$3(i.r4)"
        System::Call "kernel32::WaitForSingleObject(ir4, i${INFINITE})"
        System::Call "kernel32::GetExitCodeProcess(ir4, *i.s)"
        System::Call "kernel32::CloseHandle(ir4)"
    ${EndUnless}
    System::Free $2
    System::Free $3
    System::Store L
!macroend

Section ""
  ${ExecWait} '"${NSISDIR}\makensis.exe" "D:\designer\Debug.nsi"' $0
  DetailPrint "ExitCode: $0"
SectionEnd


Если через диспетчер завершть makensis - код возврата 1

Painkiller 31-07-2011 19:44 1723465

kotkovets, в том то и дело что путь к makensis', 'путь к скрипту не работает. И я использую функцию
Код:

function SwitchToProg(const Path: string): Boolean;
var
  SI: TStartupInfo;
  PI: TProcessInformation;
  ExitCode: Cardinal;
begin
  FillChar(SI, SizeOf(SI), 0);
  SI.cb := SizeOf(SI);

  Result := CreateProcess(nil, PChar(Path), nil, nil, False, 0, nil, nil,
    SI, PI);

  if Result then
  begin

    while GetExitCodeProcess(PI.hProcess, ExitCode) and
      (ExitCode = STILL_ACTIVE) do
      ; // ждем завершения, пустой цикл
  Form1.StatusBar1.SimpleText:='                                      Копиляция выполнена!';
    Form2.show;
  end;
end;

Мне нужно как-то запустить makensis ? Получается запустить только через батник. А ту функцию что вы мне написали я знаю. Ещё куча других подобных примеров есть . Мне лишь нужно знать как запустить makensis ?

kotkovets 31-07-2011 19:55 1723473

А на фига здесь цикл? WaitForSingleObject - и все!
Цитата:

Цитата Painkiller
Мне нужно как-то запустить makensis »

Так укажите полный путь к makensis! если вы правильно указали путь, но не указали командную строку или неправильно - makensis сразу завершается, с кодом возврата 1 . Пропишите полный путь к исполнителю и скрипту... или где то еще у вас косяк, проверьте у себя скрипт который я показал в качестве примера - уверяю вас все отработает как нужно.
или вы просто не вылазите из цикла... :)

Painkiller 31-07-2011 19:59 1723476

Ваш пример не работает. Где тут ошибка? :
Код:

function Exec(RunApp : string; cmdline : string) : bool;
var
    si : TStartupInfo;
    pi : TProcessInformation;
begin
    try
      ZeroMemory(@si,SizeOf(si));
      si.cb := SizeOf(si);
      si.dwFlags := STARTF_USESHOWWINDOW;
      si.wShowWindow := SW_SHOW; // SW_HIDE - ñêðûòûé çàïóñê
      Result := CreateProcess(PChar(RunApp),PChar(' ' + cmdline),nil, nil,False,0,nil,nil,si,pi);
          WaitForSingleObject(pi.hProcess, INFINITE); // îæèäàåì çàâåðøåíèÿ ïðîöåññà
      CloseHandle(pi.hThread);
      CloseHandle(pi.hProcess);
    except
      Result := false;
    end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
 Exec('C:\Program Files\NSIS\makensis.exe','C:\myscript.nsi');
end;
end.

Пример на nsis работает =)

kotkovets 31-07-2011 20:03 1723481

Вы наверно в юникоде работаете... :) это для анси..

Painkiller 31-07-2011 20:18 1723491

Цитата:

Цитата kotkovets
Вы наверно в юникоде работаете... это для анси.. »

Значит нужно перекодировать в анси

Krinkels 31-07-2011 20:23 1723495

Могу привести еще один пример, функция для запуска exe с параметром и ожидание его завершения.
читать дальше »
Код:

function ExecAndWait(const FileName, Params: string; WindowState: Word): Longword;
var { by Pat Ritchey }
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
  CmdLine: string;
begin
  CmdLine := '"' + FileName + '"' + Params;
  FillChar(StartupInfo, SizeOf(StartupInfo), #0);
  StartupInfo.cb          := SizeOf(StartupInfo);
  StartupInfo.dwFlags    := STARTF_USESHOWWINDOW;
  StartupInfo.wShowWindow := WindowState;
  if not CreateProcess(nil,
    PChar(CmdLine), // pointer to command line string
    nil, // pointer to process security attributes
    nil, // pointer to thread security attributes
    False, // handle inheritance flag
    CREATE_NEW_CONSOLE or // creation flags
    NORMAL_PRIORITY_CLASS,
    nil, //pointer to new environment block
    nil, // pointer to current directory name {PChar(ExtractFilePath(FileName)),}
    StartupInfo, // pointer to STARTUPINFO
    ProcessInfo) // pointer to PROCESS_INF
    then Result := WAIT_FAILED
  else
  begin
    while WaitForSingleObject(ProcessInfo.hProcess, 0) = WAIT_TIMEOUT do
    begin
      Application.ProcessMessages;
      Sleep(50);
    end;
    WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
    GetExitCodeProcess(ProcessInfo.hProcess, Result);
    CloseHandle(ProcessInfo.hProcess);
    CloseHandle(ProcessInfo.hThread);
  end;
end;

//Пример использования
procedure TForm1.Button1Click(Sender: TObject);
begin
    ExecAndWait( 'C:\Program Files\NSIS\makensis.exe', 'C:\myscript.nsi', SW_HIDE );
end;


Painkiller 31-07-2011 20:25 1723497

Цитата:

Цитата Krinkels
Могу привести еще один пример, функция для запуска exe с параметром и ожидание его завершения.
« скрыть »

Эту функцию я тоже знаю и тоже использую иногда . И с ней не пашит. Дело тут не в функциях .

yyv 01-08-2011 13:02 1723869

уже мозг кипит, не знаю, может вы чем сможете помочь.
нужно сделать кастомную страницу лицензии.

так исторически сложилось, что делается все на ини файлах.
сделал поле

читать дальше »

Код:

[Field 1]
Type=Bitmap
Text=C:\WINDOWS\TEMP\captura.bmp
Left=0
Right=290
Top=20
Bottom=43

[Field 2]
Type=Text
State=
Left=4
Right=288
Top=44
Bottom=94
Flags=MULTILINE|VSCROLL|NOTABSTOP



но как в него запихнуть текст лицензии?
пробовал читать текст из файла построчно в переменную, а затем вставить его
читать дальше »

Код:

!insertmacro INSTALLOPTIONS_WRITE "pantallatoolbar" "Field 1" "Text" "$TEMP\captura.bmp"
!insertmacro INSTALLOPTIONS_WRITE "pantallatoolbar" "Field 2" "State" "$text_license"



но тут наткнулся на ограничение NSIS "default, variables are limited to 1024 characters. "

нашел плагин " CustomLicense" пробовал на его основе запихнуть текст в свое окно, тоже не вышло...
как можно какой нибудь текст неизвестной за ранее длины из файла запихнуть в требуемое поле?

kotkovets 01-08-2011 13:40 1723897

yyv, парсить текст построчно и отказаться от стандартных страничек,нарисовать текстовое поле - но мелькание строк невозможно избавиться.
Если текст юникодный, то размер уменьшается в 2 раза, из-за того, что в юникоде один символ занимает 2 байта.
Использовать расширенную версию NSIS, где размер хранения значения увеличен до 8192 байта (т.е тект максимум должен быть 8кБ, в юникоде 4кБ).
Large strings - распаковываем архив и заменяем из архива все файлы.

yyv 01-08-2011 14:24 1723927

все таки решил проблему с помощью CustomLicense plug-in
может кому еще нужно будет
работает примерно так

читать дальше »
Код:

!insertmacro MUI_INSTALLOPTIONS_INITDIALOG "ReadmePage.ini"
 Pop $MUI_HWND
 GetDlgItem $0 $MUI_HWND 1201
 CustomLicense::LoadFile "$PLUGINSDIR\readme.txt" "$0"
 !insertmacro MUI_INSTALLOPTIONS_SHOW



если не хочется использовать плагин то можно так

читать дальше »

вместо
Код:

CustomLicense::LoadFile "$PLUGINSDIR\readme.txt" "$0"
Код:

ClearErrors
  FileOpen $0 $PLUGINSDIR\${LICENSEPAGE} r
  IfErrors exit
  System::Call 'kernel32::GetFileSize(i r0, i 0) i .r1'
  IntOp $1 $1 + 1 ; for terminating zero
  System::Alloc $1
  Pop $2
  System::Call 'kernel32::ReadFile(i r0, i r2, i r1, *i .r3, i 0)'
  FileClose $0
 
  Pop $MUI_HWND
        GetDlgItem $0 $MUI_HWND 1201
       
  SendMessage $0 ${EM_SETLIMITTEXT} $1 0
  SendMessage $0 ${WM_SETTEXT} 0 $2
  System::Free $2
exit:



в итоге у меня получилось закинуть текст из нужного мне файла в кастомное окно.

kotkovets 01-08-2011 14:59 1723945

yyv,
Вы проверочку на размер сделаете, а то если текст будет превышать размер хранения переменной - с треском грохнется NSIS. Вы же помещаете текст целиком в переменную... в $1 - размер в байтах...

Код:


  FileOpen $0 text.txt r
  IfErrors Exit
  System::Call 'kernel32::GetFileSize(ir0, i0) i .r1'
  IntOp $1 $1 + 1 ; for terminating zero
  IntCmp $1 ${NSIS_MAX_STRLEN} 0 0 Exit
  System::Alloc $1
  Pop $2
  System::Call 'kernel32::ReadFile(ir0,  ir2,  ir1, *i.r3,  i0)'
  FileClose $0 
  System::Call "*$2(&t$3.r4)" ;из указателя на буфер - вытаскиваем текст
  MessageBox MB_ICONINFORMATION|MB_OK "$4" IDOK    ;в $4 - содержимое всего файла
  System::Free $2
  Exit:


yyv 01-08-2011 16:02 1723977

Цитата:

Цитата kotkovets
Вы проверочку на размер сделаете, а то если текст будет превышать размер хранения переменной - с треском грохнется NSIS. Вы же помещаете текст целиком в переменную... в $1 - размер в байтах. »

размер хранения переменной это вы имеете ввиду это:
"default, variables are limited to 1024 characters. "?
текстовый файл размером 7,1 Кб. проходит без всяких проблем.
на нсис форуме в ветке самого плагина автор аписал
" Max file size 305 666 bytes (298KB)"

а этот код я так понял выполняет практически тоже самое что и плагин.
Вообщем надо будет попробовать разные размеры по подставлять, посмотерть что будет.

kotkovets 01-08-2011 17:04 1724005

Цитата:

Цитата yyv
размер хранения переменной это вы имеете ввиду это:
"default, variables are limited to 1024 characters. "?
текстовый файл размером 7,1 Кб. проходит без всяких проблем »

Это я к тому, если файл будет превышать размер 8192 байта - с треском NSIS свалится, для стандарттного NSIS 1024 байта - кто нибудь скопирует код и будет такие же вопросы задавать.
kernel32::ReadFile старая апишка, позволяет только читать файлы в кодировке ANSI, для юникода, т.е любого файла, есть ReadFileEx , но синтаксис написания этой функции несколько иной.

qwestins 08-08-2011 14:25 1727880

Вложений: 1
Народ, подскажите. Есть прога TightVNC Viewer, которая включает в себя Сервер и Вьювер, а так же установку пароля. Нужно создать энсис файл, в котором будет производится автоматический выбор Сервера, Вьювер лучше даже вырезать и автоматически задаваться пароль.

kotkovets 08-08-2011 15:17 1727932

Цитата:

Цитата qwestins
Народ, подскажите »

Это называется - народ сделайте за меня...
Вы бы сами начали то, что то делать для начала...

SOLON7 10-08-2011 05:01 1728937

Мужики привет, я буду запускать интсталяционный пакет, вопрос в следующем, NSIS передает прогресс установки программы которая запустилла инстлаятор ?? как можно отследить прогресс установки ?? Через внешнее приложение или еще как нибудь ????

kotkovets 10-08-2011 09:14 1729000

Цитата:

Цитата SOLON7
как можно отследить прогресс установки ?? »

можно, в скрипте после каждого файла или после каждой команды помещать значение в процентах установки и вывести в окно деталей значение установки, только придется рассчитывать вручную - сколько прибавлять процентов установки в переменную, либо взять хэндл прогресса, посылать после каждой команды соотвтствующее сообщение PBM_GETPOS получение позиции прогресса и PBM_GetRange (информация о текущих верхних и нижних пределах данного контрола) значение записывать в определенную переменную.
Пример на классическом фейсе
Код:

Name "PROGRESSBAR Example"
OutFile "Example.exe"
ShowInstDetails show

Var PROGBAR
Var GETRANGE
Var HWND

CompletedText "Установка на 100% выполнена!"

Function ProgressBar
    FindWindow $HWND "#32770" "" $HWNDPARENT
    GetDlgItem $HWND $HWND 1004
    SendMessage $HWND 0x0407 0 0 $GETRANGE
    SendMessage $HWND 0x0408 0 0 $PROGBAR
    IntOp $PROGBAR $PROGBAR * 100
    IntOp $PROGBAR $PROGBAR / $GETRANGE
    SetDetailsPrint textonly
    DetailPrint "Установка $PROGBAR%"
    SetDetailsPrint both
FunctionEnd

Section
  Call ProgressBar
    Sleep 300
  Call ProgressBar
    Sleep 300
  Call ProgressBar
    Sleep 300
  Call ProgressBar
    Sleep 300
  Call ProgressBar
    Sleep 300
  Call ProgressBar
    Sleep 300
  Call ProgressBar
    Sleep 300
  Call ProgressBar
    Sleep 300
  Call ProgressBar
    Sleep 300
  Call ProgressBar
SectionEnd


В переменной $PROGBAR - "заполненность" в процентах прогресс бара

SOLON7 11-08-2011 16:03 1729931

kotkovets,
Мне надо что чужая прога отлавливала прогресс установки!! Внешняя!!!

kotkovets 11-08-2011 16:30 1729962

Цитата:

Цитата SOLON7
Мне надо что чужая прога отлавливала прогресс установки!! Внешняя!!! »

А цель сего деяния????
Записывайте переменную(значение переменной $PROGBAR во внешний файл). При запуске инсталера парсите файл внешней прогой...
Или отлавливайте класс окна, получите хэндл прогресс бара инсталлера внешней прогой
GetDlgItem $HWND $HWND 1004 - или запишите значение $HWND (хэндл прогресс бара) в файл, хэндл есть и рулите внешней прогой.

sawe 11-08-2011 19:44 1730076

Наконец добился нормальное отображение одностранчной установки, но ни как не получается использовать память для STARTMENUFOLDER.
Шаг на страницу назад или вперёд, в переменной не сохраняется выбранная папка, тем более не считывается из реестра.
kotkovets - може я что то делаю не так?

kotkovets 11-08-2011 21:08 1730111

sawe,
В функции CreatePage
Код:


    --- 
    ${NSD_CreateText} 0 0u 100% 12u `${PROGRAMS}`
    Pop $Text
    ${NSD_SetFocus} $Text
   
    ${IfNot} $STARTMENUFOLDER == `` ;если $STARTMENUFOLDER не равно пустому значению....
        ${NSD_SetText} $Text "$STARTMENUFOLDER\${PROGRAMS}"
    ${Else} ;здесь наоборот
        ${NSD_SetText} $Text "${PROGRAMS}"
    ${EndIf}
    ---

Я уже вам давал пример по по поводу сохранения значения переменной при переходе страничек.
По такому же принципу можно и запоминать состояние отметки чебокса.

sawe 12-08-2011 02:02 1730238

Нужну, что бы сначала считывало с реестра и если реестр пуст, то тогда подключить этот код.
Но в реальности получается, если реестр пуст, тогда не запоминается папка а подставляется сразу "${PROGRAMS}".

kotkovets 12-08-2011 02:08 1730241

sawe, Ну тогда считывайте значение с реестра прямо в переменную $STARTMENUFOLDER, а затем под операторы даем на съедение, что здесь такого сложного?

SOLON7 12-08-2011 07:59 1730294

Цитата:

Цитата kotkovets
А цель сего деяния????
Записывайте переменную(значение переменной $PROGBAR во внешний файл). При запуске инсталера парсите файл внешней прогой...
Или отлавливайте класс окна, получите хэндл прогресс бара инсталлера внешней прогой
GetDlgItem $HWND $HWND 1004 - или запишите значение $HWND (хэндл прогресс бара) в файл, хэндл есть и рулите внешней прогой. »

То есть по умолчанию нету, Nsis инсталлятор же будет в тихом режиме ставится!!!

kotkovets, мне это нужно для www.ninite.com хочу также замутить!!!

kotkovets 12-08-2011 09:16 1730318

Цитата:

Цитата SOLON7
Nsis инсталлятор же будет в тихом режиме ставится!!! »

Упс!!! приехали, а че сразу нельзя сказать.... в тихом режиме никаких прогрессов нету жежь!
Здесь открываем, к примеру процесс инсталера со свойством SYNCHRON и ждем завершения...
Прогресс бар рассчитывается из вашей проги - сколько прог устанавливать и установилась прога - продвигаем прогресс
Раз вы хотите написать свою прогу, думаю вы меня поняли...

MKN 12-08-2011 11:11 1730377

К слову, о необходимости включения-отключения UAC из инсталлятора, при установке на W7.
Т.к. имеющийся плагин UAC plug-in - очень мутный и громоздкий (что это за плагин такой, код для работы которого занимает десятки строк ?! . Громозда (и повод для его усовершенствования... :) ) )

Так вот, можно ведь воспользоваться известным способом отключения-включения UAC из командной строки и главное - без перезагрузки ОС.
Отключить UAC :
Код:

reg ADD HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v ConsentPromptBehaviorAdmin /t REG_DWORD /d 0 /f
Включить UAC :
Код:

reg ADD HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v ConsentPromptBehaviorAdmin /t REG_DWORD /d 2 /f
Запускать надо от имени админа. Наверное можно реализовать и через непосредственную запись в реестр. Не проверял.
На W7x64 - срабатывает отлично.
ps Проверил - рег файлы также работают.

kotkovets 12-08-2011 12:45 1730461

Цитата:

Цитата MKN
Запускать надо от имени админа »

MKN в том и штука, что плагин UAC позволяет все штучки делать, без запуска от имени админа :drug:

MKN 12-08-2011 12:57 1730470

Цитата:

Цитата kotkovets
UAC позволяет все штучки делать, без запуска от имени админа »

А чем запуск от имени админа плох ? Кстати, запускал рег файл под пользователем - эффект тот же, т.е. положительный. :)
Код:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System]
"ConsentPromptBehaviorAdmin"=dword:00000000

А UAC плагин, всё равно - не удачный...

kotkovets 12-08-2011 13:06 1730477

Цитата:

Цитата MKN
под пользователем - эффект тот же »

Конечно, если пользователь имеет админские права, а если нет прав :)

MKN 12-08-2011 13:08 1730481

Цитата:

Цитата kotkovets
а если нет прав »

А если нет , то в инсталляторе ведь для этого : RequestExecutionLevel admin ?

kotkovets 12-08-2011 14:09 1730536

Цитата:

Цитата MKN
А если нет , то в инсталляторе ведь для этого : RequestExecutionLevel admin ? »

Эта команда предназначена, сколько прав должен иметь, т.е какими правами должен обладать юзер для установки приложения.
Определяет требуемый уровень прав (привелегий) для установки приложения в Windows Vista и в Windows 7 - в справке это четко прописано на русском языке...
В том что, плагин неудачный я согласен.

MKN 12-08-2011 15:20 1730612

kotkovets,
Ну уж, если у пользователя нет прав запуска прог от имени админа, то и нечего ему вообще что либо запускать и устанавливать. :) Явно этот пользователь "курируется" злым админом и тот пресечёт любые попытки установок ПО, хоть с плагином хоть без...
А к домашним пользователям это никак не относится. Будем считать, что предложенный простой способ отключения-включения UAC, для таких нормальных пользователей и предназначен... :)

wolkow70 12-08-2011 16:47 1730665

Товарищи, забыл как сделать, что если система Vista или новее, то ставить программу в корень системного диска , а если XP или старее, то в Программную папку?

sawe 12-08-2011 17:00 1730673

Цитата:

Цитата MKN
А UAC плагин, всё равно - не удачный... »

Скорее Windows не удачная, начиная с DOS постоянно подстраивают под запросы времени при этом её основа, имеет кучу ограничений, плагинописатели вынуждены поступать так же.

kotkovets 12-08-2011 17:15 1730682

Цитата:

Цитата wolkow70
Товарищи, забыл как сделать, что если система Vista или новее, то ставить программу в корень системного диска , а если XP или старее, то в Программную папку? »

Здесь логичнее на права юзера, можно так....
Код:

!include "MUI2.nsh"

InstallDir "$PROGRAMFILES\Программа"

!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

RequestExecutionLevel user

Function .OnInit
  ClearErrors
  UserInfo::GetOriginalAccountType
  Pop $0
  IfErrors Done
  StrCmp $0 "Admin" +2 +1
  ExpandEnvStrings $INSTDIR "%systemdrive%\Программа"
  Done:
FunctionEnd

Section
  MessageBox MB_ICONINFORMATION "$INSTDIR"
SectionEnd


wolkow70 12-08-2011 17:50 1730704

Цитата:

Цитата kotkovets
Здесь логичнее на права юзера, можно так.... »

"Если вы хотите создать однопользовательскую установку, используя ОС Windows Vista или более новую, не рекоммендуется устанавливать StrongDC+ + в папку Program Files, так как это может привести к потере настроек и неработоспособности программы"
Не знаю, как лучше...

sawe 13-08-2011 00:25 1730874

Цитата:

Цитата wolkow70
Не знаю, как лучше... »

57 станица...

116 станица...

sawe 15-08-2011 12:48 1732196

kotkovets - что то полезное для себя нашли или всё это в топку?

MKN 17-08-2011 13:43 1733745

Хотелось бы ясности для ситуаци, когда требуется установить драйверы из NSIS инсталлятора. И не только драйверы оборудования, но и специфические драйверы, не имеющие HWID (во всяком случае, явного...). ( драйверы для видеоприложений, программ записи дисков и пр.)
В частности интересует установка, когда имеются такие сочетания файлов :
К примеру - drv.sys и drv.inf. (ну, это болеее-менее ясно...) , один только drv.sys, drv.sys и "вспомогательная" DLL, вообще какой нибудь странный драйвер типа 001.fcl и т.п.
Ессно для "разноразрядных" ОС всех типов.
Специальных плагинов для установки драйверов, вроде как нет, а "devcon и dpinst" утилиты годятся только для установки драйверов оборудования...

Ну, при иналичии INF файла наверное можно использовать команду (?) :

rundll32.exe setupapi.dll,InstallHinfSection DefaultInstall 0 Путь\drv.inf

А если нет INF ? Как вообще устанавливаются такие драйверы ?

kotkovets 17-08-2011 14:09 1733766

Цитата:

Цитата MKN
А если нет INF ? Как вообще устанавливаются такие драйверы ? »

По такому поводу, как - нужно спрашивать у разраба драйвера, что в реестр писать, регистрировать и т.д :)
А по INF файлу, я иногда ставлю драйвера к тюнеру вот так, проверял тока XP
читать дальше »
Код:

!define ERROR_NO_SUCH_DEVINST      -536870389
!define SPOST_NONE                  0
!define SPOST_PATH                  1
!define SPOST_URL                  2
!define SP_COPY_DELETESOURCE        0x1
!define SP_COPY_REPLACEONLY        0x2
!define SP_COPY_NOOVERWRITE        0x8
!define SP_COPY_OEMINF_CATALOG_ONLY 0x40000
!define CM_LOCATE_DEVNODE_NORMAL    0x00000000
!define CM_REENUMERATE_NORMAL      0
!define InstallDriver              "!insertmacro InstallDriverCall"

!include "logiclib.nsh"


!macro InstallDriverCall HID INFPATH INFDIR
    System::Store S
      Push `${INFDIR}`
      Push `${INFPATH}`
      Push `${HID}`
      DetailPrint "Rescan drivers..."
      System::Call "cfgmgr32::CM_Locate_DevNode(*i.r0, n, i${CM_LOCATE_DEVNODE_NORMAL}) i.r1"
      ${If} $1 <> 0
        StrCpy $1 1
      ${Else}
          System::Call "cfgmgr32::CM_Reenumerate_DevNode (ir0, i${CM_REENUMERATE_NORMAL}) i.r1"
        ${IfThen} $1 <> 0 ${|}StrCpy $1 2${|}
      ${EndIf}
      ${If} $1 = 0
          DetailPrint "Installing the driver..."
          System::Call "newdev::UpdateDriverForPlugAndPlayDevices(i0, ts, tss, i0, *i0)?ei.s"
        Pop $0
        IntCmp $0 ${ERROR_NO_SUCH_DEVINST} 0 +2 +2
        DetailPrint "The device is not plugged in, cannot update the driver."
        ${If} $0 = 0
              System::Call "setupapi::SetupCopyOEMInf(ts, ts, i${SPOST_PATH}, i0, i0, i0, *i0, tn)i.r0"
              IntCmp $0 1 0 +2 +2
              DetailPrint "Istall driver success!"
              IntCmp $0 0 0 +2 +2
              DetailPrint "Istall driver error!"
        ${EndIf}
    ${ElseIf} $1 = 1
          DetailPrint "An error occurred while trying to get the device instance for the machine"
    ${ElseIf} $1 = 2
          DetailPrint "An error occurred while trying to refresh the device list"
    ${EndIf}
    System::Store L
!macroend

OutFile InstDrv.exe
ShowInstDetails show

Section
  # ${InstallDriver} "HWID" "путь к inf файлу" "папка с дровами"
  ${InstallDriver} "PCI\VEN_1131" "$EXEDIR\beholder.inf" "$EXEDIR"
SectionEnd


MKN, вдруг я, напишу драйвер, который будет при установке компилировать еще нужные компоненты для установки...
И будут другие пользователи ломать голову, как...

BARS73 18-08-2011 10:50 1734367

подскажите пожалуйста строчку кода для вывода ярлыка на рабочий стол...

kotkovets 18-08-2011 12:35 1734434

Цитата:

Цитата BARS73
подскажите пожалуйста строчку кода »

Код:

CreateShortCut "$DESKTOP\Мой_ацкий_линк.lnk" "$INSTDIR\my_proga.exe"

K.A.V. 18-08-2011 12:57 1734452

В дополнение к сообщению kotkovets
Страничка справки по команде из будущей версии "Справочника по NSIS" ;)
CreateShortCut: создаём ярлыки
читать дальше »

Команда "CreateShortCut" предназначена для создания ярлыков.

Код:

Расположение_ярлыка.lnk Путь_до_файла.exe [параметры_запуска [Файл_иконки [Индекс_иконки [Тип_окна [Горячая_клавиша [Описание_ярлыка]]]]]]
В параметре "Тип окна" вы можете указать одно из значений:
SW_SHOWNORMAL
SW_SHOWMAXIMIZED
SW_SHOWMINIMIZED


Создаём обычный ярлык:
Код:

CreateShortCut "$DESKTOP\Справочник по NSIS.lnk" "$WINDIR\NSIS_Help.chm"
Ярлык с файлом иконки:
Код:

CreateShortCut "$DESKTOP\Справочник по NSIS.lnk" "$WINDIR\NSIS_Help.chm" "" "$WINDIR\Explorer.exe" "2"
Ярлык с сочетанием клавиш ALT+F5 для запуска и с описанием ярлыка:
Код:

CreateShortCut "$DESKTOP\Справочник по NSIS.lnk" "$WINDIR\NSIS_Help.chm" "" "" "" "" "ALT|F5" "Это единственный русскоязычный справочник по NSIS"

BARS73 18-08-2011 13:12 1734465

а путь к .exe нужно указывать к тому, который распаковался уже?

спасибо!!:) наконец таки разобрался))

BARS73 18-08-2011 13:38 1734481

и еще один вопрос...
как поместить ярлык в пуск->все программы, в отдельной папке естественно?:)

Krinkels 18-08-2011 13:56 1734493

Цитата:

Цитата BARS73
как поместить ярлык в пуск->все программы, в отдельной папке естественно? »

Ну для начала нужно там создать саму папку, а потом туда поместить ярлык.
Вот пример:
Код:

CreateDirectory "$SMPROGRAMS\${APPNAME}\"
CreateShortCut "$SMPROGRAMS\${APPNAME}\Packers Show.lnk" "$INSTDIR\PackersShow.exe"
CreateShortCut "$SMPROGRAMS\${APPNAME}\Help.lnk" "$INSTDIR\Help.chm"
CreateShortCut "$SMPROGRAMS\${APPNAME}\Uninstall.lnk" "$INSTDIR\Uninstall.exe"


kotkovets 18-08-2011 14:14 1734505

Дополненение к сообщению Krinkels :), разместить ярлыки в меню в пуск->все программы
для текушего пользователя, перед созданием ярлыков (по умолчанию NSIS создает ярлыки для текущего пользователя)
Код:

SetShellVarContext current
для всех пользователей:
Код:

SetShellVarContext all
Небольшой пример перенаправления папки пользователя:
Код:

SetShellVarContext current
    MessageBox MB_OK $DESKTOP
SetShellVarContext all
  MessageBox MB_OK $DESKTOP


BARS73 18-08-2011 14:40 1734531

а для того чтобы вставлять в эту папку Uninstall.exe нужно его создать, верно?
тогда вопрос, что может быть не так в строчке
Код:

WriteUninstaller "$OUTDIR\uninst.exe"
, мне выдает ошибку:(

sawe 18-08-2011 16:03 1734603

Цитата:

Цитата BARS73
а для того чтобы вставлять в эту папку Uninstall.exe нужно его создать, верно?
тогда вопрос, что может быть не так в строчке
Код:
WriteUninstaller "$OUTDIR\uninst.exe"
, мне выдает ошибку »

WriteUninstaller "$INSTDIR\uninst.exe"

BARS73 18-08-2011 16:43 1734640

Цитата:

Цитата sawe
WriteUninstaller "$INSTDIR\uninst.exe" »

а в самой папке куда устанавливается программа не нужно что ли создавать uninst.exe?

Код:

Section         
SetOutPath "C:\Program Files\MIDA15TOOL2"         
File  /r D:\Pavel\proba\Release\*.*.       
CreateShortCut "$DESKTOP\PipeDataVisualizer.lnk" "C:\Program Files\MIDA15TOOL2\PipeDataVisualizer.exe"
WriteUninstaller "$OUTDIR\uninst.exe"             
CreateDirectory "$SMPROGRAMS\MIDA15TOOL\"   
CreateShortCut "$SMPROGRAMS\MIDA15TOOL\Packers Show.lnk" "$INSTDIR\PipeDataVisualizer.exe"
CreateShortCut "$SMPROGRAMS\${APPNAME}\Help.lnk" "$INSTDIR\Help.chm"   
CreateShortCut "$SMPROGRAMS\MIDA15TOOL\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
SectionEnd

в чем здесь может быть ошибка???:(

MKN 18-08-2011 16:57 1734653

BARS73,
Наверное в несуразице :
WriteUninstaller "$OUTDIR\uninst.exe" и
CreateShortCut "$SMPROGRAMS\MIDA15TOOL\Uninstall.lnk" "$INSTDIR\Uninstall.exe"

и лишний пробел в 3 строке после File

kotkovets 18-08-2011 18:05 1734709

Цитата:

Цитата BARS73
в чем здесь может быть ошибка??? »

Ошибка в том, что вы лишнюю точку в команде поставили:
Код:

File /r "D:\Pavel\proba\Release\*.*" # включить только файлы
И вы не добавили странички деинсталяции, ну как минимум, для MUI:
Код:

!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES

Цитата:

Цитата MKN
Наверное в несуразице :
WriteUninstaller "$OUTDIR\uninst.exe" »

$OUTDIR - Текущая выходная папка
Устанавливается явно через SetOutPath или не явно с помощью StrCpy, ReadRegStr, ReadINIStr.
А значением $OUTDIR еще принимается рабочая папка ярлыка.

MKN 18-08-2011 18:26 1734723

kotkovets,
Я обратил внимание не на папку , а на uninst.exe и ярлык для Uninstall.exe. Несуразица в этом. :)

kotkovets 18-08-2011 19:01 1734741

MKN, не заметил, домой торопился :)

silione 20-08-2011 12:42 1735718

Дано:
Установленная программа не оставившая в записей в реестре. Дополнительное строннее ПО для программы работающее только с определенной версией программы.
Условие:
Версия программы содержится в ее исполняемом файле.
Необходимо:
Инсталлятор должен не просто устанавливать стороннее ПО в папку программы (это-то просто), а определить версию программы по версии ее исполняемого файла и установить ПО только если версия подходит, иначе вывести сообщение о необходимости сначала обновить версию программы до необходимой.

Возможно ли в NSIS осуществить проверку версии программы по ее *.exe файлу, и если возможно, то как?

---------------------------------------------
Уже понял, что возможно:

GetDllVersion "$INSTDIR\XXX.exe" $R0 $R1
IntOp $R2 $R0 / 0x00010000
IntOp $R3 $R0 & 0x0000FFFF
IntOp $R4 $R1 / 0x00010000
IntOp $R5 $R1 & 0x0000FFFF
StrCpy $R1 "$R2.$R3.$R4.$R5"

После чего в $R1 получаем версию.

Но я не пойму как это использовать, надо ведь задать переменные и провести сравнение, как это будет в коде выглядеть?
И еще допустим версии много, но нужно разрешить установку не на одной конкретной версии, а на нескольких конкретных, т.е. например программа может быть версии от 1.00 до 1.32, а инсталлятор должен разрешать установку только на версии 1.25, 1.27, и 1.31.
Я так понимаю, что тут просто проверка должна проходить несколько раз, как это описать в коде?

K.A.V. 20-08-2011 13:51 1735764

silione, в Справочнике по NSIS есть категория:
Примеры кодов => Работа со строками

В данной категории посмотрите описания команд StrCmp и IntCmp

Мы уже устали разжевывать по несколько раз то, что можно подчерпнуть из справочника и решить свою задачу самостоятельно, просто вы не внимательно прочитали шапку данной темы, ссылка на справочник там есть...

silione 20-08-2011 15:00 1735799

Спасибо, разобрался :) если кому понадобиться на будущее, то выглядеть это будет например так:
читать дальше »
Код:

GetDllVersion "$INSTDIR\xxx.exe" $R0 $R1  # где xxx.exe - имя исполняемого файла программы
        IntOp $R2 $R0 / 0x00010000
        IntOp $R3 $R0 & 0x0000FFFF
        IntOp $R4 $R1 / 0x00010000
        IntOp $R5 $R1 & 0x0000FFFF
StrCpy $R1 "$R2.$R3.$R4.$R5"  # в переменную $R1 записывается версия программы

StrCpy $1 "yyy"  # в переменную $1 записываем версию программы при которой установка возможна
StrCpy $2 "zzz"  # в переменную $2 записываем версию программы при которой установка возможна
StrCpy $3 "kkk"  # в переменную $3 записываем версию программы при которой установка возможна
StrCmp $R1 $1 0 +2
        Goto Next
StrCmp $R1 $2 0 +2
        Goto Next
StrCmp $R1 $3 0 +2
        Goto Next
        MessageBox MB_OK "Версия программы не совместима с этим дополнением! Вам нужна версия yyy, или zzz, или kkk."
        Abort

Next:



Еще появился вопрос.
Собрал я инсталлятор патча для игры, и хочу чтобы он сам находил путь для установки, но как это сделать если у игры нет записи в реестре или разные репаки игры могут эту запись делать в разных ветках?

K.A.V. 20-08-2011 15:18 1735816

Цитата:

Цитата silione
Спасибо, разобрался »

Ну вот и отлично ;)
Кстати представленный вами код можно упростить...учитесь писать более простой код...
читать дальше »

Код:

GetDllVersion "$INSTDIR\xxx.exe" $R0 $R1  # где xxx.exe - имя исполняемого файла программы
        IntOp $R2 $R0 / 0x00010000
        IntOp $R3 $R0 & 0x0000FFFF
        IntOp $R4 $R1 / 0x00010000
        IntOp $R5 $R1 & 0x0000FFFF
StrCpy $R1 "$R2.$R3.$R4.$R5"  # в переменную $R1 записывается версия программы


StrCmp $R1 "yyy" Next 0
StrCmp $R1 "zzz"  Next 0
StrCmp $R1 "kkk"  Next 0
        MessageBox MB_OK "Версия программы не совместима с этим дополнением! Вам нужна версия yyy, или zzz, или kkk."
        Abort
Next:



Цитата:

Цитата silione
как это сделать если у игры нет записи в реестре или разные репаки игры могут эту запись делать в разных ветках? »

Как вариант, проверять наличие какого-либо файла в каталоге, куда устанавливается игра по-умолчанию
Также с помощью ProcMon можно отследить что прописывает установщик игры в реестр, думаю как-никак какой-нибудь да след за собой оставляет, мало вериться в то, что программа установки нигде не прописывает путь для установки игры...

P.S.
В ветке "Uninstall" смотрели?

silione 20-08-2011 15:33 1735828

Проверку по реестру я делать умею.
Я ищу способ автоматического нахождения пути когда записей в реестре вообще нет (например если винда была переустановлена, а игра осталась).
Пример:
Есть 10 человек. трое установили игру с одного репака (запись в реестре по Uninstall одна), 7 с другого (запись по Uninstall другая), при этом двое из них переустановили винду (записи в реестре нет вообще). Каждый устанавливал игру в разные папки. Нужен такой патч, который находил бы правильный путь установки во всех случаях не напрягая пользователя вводом пути вручную.
Я вижу только один способ, поиск по всем локальным дискам исполняемого файла игры, при нахождении - считывание пути к нему и указание этого пути в качестве пути для установки, в случае отсутсвия пути - выбор пути вручную. Но я нигде не нахожу способов поиска пути к произвольному файлу методами NSIS :(

И еще, не понимаю как работает CRCCheck, можете объяснить?

kotkovets 20-08-2011 16:04 1735839

Цитата:

Цитата silione
И еще, не понимаю как работает CRCCheck, можете объяснить? »

CRCCheck on|off|force
Команда записывается вне секции и функции.
если CRCCheck on - будет проверятся целостность инсталлера, т.е уже никто не может изменить инсталлер,
например, вы поменяли иконку инсталлера с помощью редактора ресурсов,
то при запуске инсталлера вы получите крах инсталлера и критическое сообщение.
По умолчанию проверка на целостность инсталлера включена.
если CRCCheck off - целостность инсталлера не будет проверяться.

kotkovets 20-08-2011 18:21 1735920

Цитата:

Цитата silione
Я вижу только один способ, поиск по всем локальным дискам исполняемого файла игры, при нахождении - считывание пути к нему и указание этого пути в качестве пути для установки, в случае отсутсвия пути - выбор пути вручную. Но я нигде не нахожу способов поиска пути к произвольному файлу методами NSIS »

В оригинальной справке введите поиск по указателю: Locate
Задействуйте макрос Lосаte из хидера FileFunc.nsh, не забудьте включить хидер в тело скрипта
Код:

!include "FileFunc.nsh"
Поиск по всем локальным дискам займет наверно много времени... :o
И вам для начала нужно перечислить все локальные диски на компьютере.
С помощью NSIS это решаемо.
тыц
Код:

OutFile Locate.exe
!include "FileFunc.nsh"

Section
${GetDrives} "HDD" "GetDrives" ;перечисляем все HDD диски
  MessageBox MB_OK "$R0" IDOK
SectionEnd

Function GetDrives
  ${Locate} "$9" "/L=F /M=*.exe" "Locate" ;в переменной $9 буква диска, поиск по маске *.exe
  StrCmp `$R1` "файл.exe" 0 +2
  Push "StopGetDrives"
  Push $0
FunctionEnd

Function Locate
  StrCmp `$R7` "файл.exe" 0 +4 ;если $R7 равно "файл.exe", то...
  StrCpy `$R0` `$R9` ;в переменной $R0 - путь к исполняемому файлу игры
  StrCpy `$R1` `$R7`
  Push "StopLocate" ;останавливаем поиск
  Push $0
FunctionEnd


silione 20-08-2011 18:54 1735933

Цитата:

Цитата kotkovets
Поиск по всем локальным дискам займет наверно много времени... »

Нда, действительно много времени занимает, потестил.
Тогда можно попробовать решить проблему так: исключим из задачи людей с отсутствующими записями в реестре.
Можно ли тогда задать $INSTDIR просто указав несколько путей InstallDirRegKey? или тогда как задать поиск нужного ключа по реестру?

kotkovets 20-08-2011 19:05 1735942

Цитата:

Цитата silione
тогда как задать поиск нужного ключа по реестру »

EnumRegKey - по индексу(указателю) в оригинальной справке, перечисление ключей.
А вообще, по всем делам с поиском в реестре ключей будет скоро в новой версии справочника, пока все секреты не буду говорить..:)
Вы потестите скрипт по локали (поиск по маске *.exe - значительно ускоряет поиск), у меня 5 дисков - поиск нужного файла у меня заняло около минуты - засунул тестовый файл поглубже.

K.A.V. 20-08-2011 19:22 1735957

Цитата:

Цитата kotkovets
В оригинальной справке введите поиск по указателю: Locate »

Цитата:

Цитата kotkovets
И вам для начала нужно перечислить все локальные диски на компьютере. »

Я уже было хотел выложить переведённые команды из новой версии справочника :drug:
Но т.к. вариант не подошел, не буду :tongue:
Цитата:

Цитата kotkovets
скоро в новой версии справочника, пока все секреты не буду говорить.. »

И мне пора заканчивать ;)

Ну а по вопросу:
Цитата:

Цитата silione
Можно ли тогда задать $INSTDIR просто указав несколько путей InstallDirRegKey? или тогда как задать поиск нужного ключа по реестру? »

Registry plug-in

Цитата:

Цитата kotkovets
Вы потестите скрипт по локали (поиск по маске *.exe »

Как правило имя EXE файла у игр не меняют, можно впринципе и полное имя указать, "пойдёт" ещё быстрее ;)

silione 20-08-2011 19:25 1735959

Я указывал полное имя, у меня поиск занял минуту, но надо помнить, что у кого-то может быть ноут с одним диском С и установлеными прогами типа фотошопа и т.п., да еще и не очень мощный, тогда поиск может и на 10 минут затянуться. так что не вариант. буду пока с реестром эксперементировать, а те у кого в реестре пусто - не облезут, ручками путь укажут :)

kotkovets 20-08-2011 19:30 1735964

Цитата:

Цитата K.A.V.
Я уже было хотел выложить переведённые команды из новой версии справочника »

K.A.V у меня будет библиотека полностью на API - стандартные команды не блещут универсальностью...
Получилось почти аналог Registry
Могу скинуть либу в PM c описанием...

K.A.V. 20-08-2011 19:38 1735969

Цитата:

Цитата kotkovets
стандартные команды не блещут универсальностью... »

Ну это не повод их хронить, забывать про их существование и не переводить справку ;)
Одна API библиотека это хорошо, но, например мне проще использовать уже знакомые команды, к тому же, мне их вполне хватает даже для написание софта, не говоряю уже про инсталляторы :biggrin:
Ну а некоторые специфические функции, конечно, стоит уже писать на API как специальные плагины, но для инсталляторов это дело редкое...

kotkovets 20-08-2011 19:46 1735972

Цитата:

Цитата K.A.V.
Ну это не повод их хронить, забывать про их существование »

Я имел в виду, что в макросах не эффективно использовать, директивы работы с реестром, дело в том что, эти директивы не принимают корневую ветку, как значение переменной, а как константу - а это сильно усложняет написание библиотеки и скорость работы.

Цитата:

Цитата K.A.V.
хватает даже для написание софта »

я бы не отважился писать серьезный софт на NSIS......уж слишком медленно он работает с переменными,
а стек - самое слабое место, его очень легко повредить.

K.A.V. 20-08-2011 20:05 1735979

Цитата:

Цитата kotkovets
Я имел в виду, что в макросах не эффективно использовать, директивы работы с реестром »

А я подумал про стандартные команды NSIS :lol:
Ну тогда Да, с этим я соглашусь ;)

Цитата:

Цитата kotkovets
я бы не отважился писать серьезный софт на NSIS »

А я отважился :biggrin:
Да не в рекламу будет написано, но функциональность, согласитесь, приличная, если узнать все возможности программ...

kotkovets 20-08-2011 20:18 1735984

Цитата:

Цитата K.A.V.
функциональность, согласитесь, приличная »

Я не спорю :) функциональности, более чем достаточно, я просто подумал чем больше функции добавляешь в софт написанный на NSIS, тем страшнее наверно становится разработчику софта... :)

K.A.V. 20-08-2011 20:45 1735996

Цитата:

Цитата kotkovets
тем страшнее наверно становится разработчику софта... »

ну это зависит от разработчика, у меня в коде порядок и никаких проблем ;)
читать дальше »

Исходник программы "Настройка Windows XP" содержит в себе 79961 строк NSIS кода (только главный файл)...И ниче так, порядок :biggrin:


P.S.
Оффтопим

kotkovets 20-08-2011 20:54 1736000

Цитата:

Цитата K.A.V.
Исходник программы "Настройка Windows XP" содержит в себе 79961 строк »

Боже упаси!!!!! :o

sawe 20-08-2011 23:07 1736082

Цитата:

Цитата K.A.V.
Исходник программы "Настройка Windows XP" содержит в себе 79961 строк NSIS кода (только главный файл)...И ниче так, порядок »

Вы наверно где то в середине 79961 забыли поставить запятую. :closed-to

--

K.A.V. 20-08-2011 23:21 1736097

Цитата:

Цитата sawe
Вы наверно где то в середине 79961 забыли поставить запятую. »

Знаете, я никому ничего доказывать не собираюсь, я уже давно привык к тому, что мне не верят в том, что именно я это делаю и это на самом деле...что говорить о вас, когда даже мои друзья не верят :lol:
Типа не забыл поставить запятую

Если вы скачаете программу, прочитаете справку к ней и полностью ознакомитесь со всеми её возможностями, то я думаю вас не удивит данное количество строк в коде

sawe 21-08-2011 03:33 1736199

Цитата:

Цитата K.A.V.
Знаете, я никому ничего доказывать не собираюсь, я уже давно привык к тому, что мне не верят в том, что именно я это делаю »

Я просто немного пошутил, мне трудно даже было представить, сколько же весит этот скрипт в м-байтах.
Если вы такой ранимый человек, значит вы творческий человек, а это в наше время уже становится редкостью.
Программы ваши я уже давно скачал, мне только не понятна особенность SFX Creator.
Практически каждый приличный архиватор имеет функцию SFX и сжимают многие из них получше NSIS.

K.A.V. 21-08-2011 09:41 1736255

Цитата:

Цитата sawe
сколько же весит этот скрипт в м-байтах »

3,53 МБ

Цитата:

Цитата sawe
Если вы такой ранимый человек, значит вы творческий человек »

Творческий, но не ранимый ;)

Цитата:

Цитата sawe
мне только не понятна особенность SFX Creator »

Цитата:

Цитата sawe
Практически каждый приличный архиватор имеет функцию SFX и сжимают многие из них получше NSIS »

Дело вовсе не в степени сжатия файлов, а что можно сделать из SFX архива, если вы сравните возможности создания SFX архива с помощью WinRAR, 7-ZIP и т.д. с SFX Creator, вы увидите что "те" очень многого не умеют ;)

sawe 21-08-2011 13:22 1736333

Цитата:

Цитата K.A.V.
вы увидите что "те" очень многого не умеют »

Так вкратце опишите, если не трудно!

MKN 21-08-2011 18:59 1736502

Цитата:

Цитата K.A.V.:вы увидите что "те" очень многого не умеют »
sawe, - Так вкратце опишите, если не трудно!
Это же совершенно разные программы - WinRAR, 7-ZIP и т.д. и SFX Creator
SFX Creator создан для "облегчения труда" NSIS пользователям. А вышеназванные архиваторы, они и в Африке архиваторы, никакого отношения к созданию инсталляторов не имеющие (а то, что с их помощью кое что примитивное установочное можно сделать, всерьёз принимать нельзя.)

PS
K.A.V., всё же название программы - SFX Creator, сбивает с толку и не отражает действительной её сути и оригинального назначения...
Может стОит "окрестить" её как то по другому ? NSIS Wizard, NSIS Helper, Easy NSIS Setup Builder и т.п. ?
Без "SFX". Ведь самораспаковкой созданного сценария дистрибутива, дело не ограничится, а "вырастет" в создание полноценного инсталлятора ?

david141 21-08-2011 20:07 1736566

Скажите, пожалуйста, как добавить такой ключ реестра в NSIS?

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace\{EC8030F7-C20A-464F-9B0E-13A3A9E97384}]
@="Firefox"

Или

[HKEY_CLASSES_ROOT\CLSID\{EC8030F7-C20A-464F-9B0E-13A3A9E97384}\DefaultIcon]
@="\"C:\\Program Files\\Firefox\\Firefox.exe\",0"

kotkovets 21-08-2011 20:11 1736568

david141,
Код:

WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace\{EC8030F7-C20A-464F-9B0E-13A3A9E97384}" "" "Firefox"

WriteRegStr HKCR "CLSID\{EC8030F7-C20A-464F-9B0E-13A3A9E97384}\DefaultIcon" "" '"$PROGRAMFILES\Firefox\Firefox.exe",0'


sawe 21-08-2011 20:46 1736587

Цитата:

Цитата MKN
NSIS Wizard, NSIS Helper, Easy NSIS Setup Builder и т.п. ? »

По моемому это будет банально, особенно Wizard, Easy. Лучше схитрить, к примеру NSISer

david141 21-08-2011 20:50 1736591

kotkovets,
А вот такой. Спасибо.
[HKEY_CLASSES_ROOT\CLSID\{EC8030F7-C20A-464F-9B0E-13A3A9E97384}\ShellFolder]
"Attributes"=hex:18,00,00,00

kotkovets 21-08-2011 20:58 1736598

david141, Смотрите шапку темы, там есть ссылка на справочник по NSIS
Можно так:
Код:

WriteRegBin HKCR "CLSID\{EC8030F7-C20A-464F-9B0E-13A3A9E97384}\ShellFolder" "Attributes" 18000000

K.A.V. 21-08-2011 22:48 1736681

Цитата:

Цитата MKN
K.A.V., всё же название программы - SFX Creator, сбивает с толку и не отражает действительной её сути и оригинального назначения...
Может стОит "окрестить" её как то по другому ? »

Даже не хочу забивать этим голову себе...Править очень много придётся, много где эти строки уже прописаны, не говоря уже про отдельные библиотеки для SFX Creator написанные мной, файлы графики так же должны будут подвергнуться исправлению...мне пока совсем не хочется снова менять название программы и править "всё и вся"

BARS73 22-08-2011 08:22 1736797

В чем проблема может быть? заработал Uninstall.exe, но в открывающемся окне только две кнопки закрыть и отмена.
что дописать то надо?:(

BARS73 22-08-2011 08:37 1736804

и что нужно дописать к
Код:

CreateDirectory "$SMPROGRAMS\MIDA15TOOL\"   
CreateShortCut "$SMPROGRAMS\MIDA15TOOL\Packers Show.lnk" "$INSTDIR\PipeDataVisualizer.exe"   
CreateShortCut "$SMPROGRAMS\${APPNAME}\Help.lnk" "$INSTDIR\Help.chm"   
CreateShortCut "$SMPROGRAMS\MIDA15TOOL\Uninstall.lnk" "$INSTDIR\Uninstall.exe"

чтобы создавалась папка в пуске..

kotkovets 22-08-2011 09:09 1736819

BARS73, Может все таки почитаете шапку темы
Документация =>....
Много для себя полезного найдете.

BARS73 22-08-2011 09:21 1736824

да я скачал, изучаю...но как то не совсем понятно...
Цитата:

В NSIS деинсталлятор создается очень просто, всего одной командой:
WriteUninstaller "$OUTDIR\uninst.exe"
почему же у меня не получилось его создать одной командой??

kotkovets 22-08-2011 09:50 1736837

BARS73, скрипт в студию, а то надоело уже догадываться, че вы вы там понаписали.

BARS73 22-08-2011 09:56 1736839

Код:

!define PRODUCT_NAME "MIDA15TOOL"
        !define PRODUCT_VERSION "1.1"
        !define pkgdir "D:\Pavel\proba\Release2"

        !include "MUI.nsh"
        SetCompressor /SOLID lzma

        !define MUI_ABORTWARNING
        !define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"
        !define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"
        !insertmacro MUI_PAGE_WELCOME
        !insertmacro MUI_UNPAGE_CONFIRM
        !insertmacro MUI_PAGE_INSTFILES
        !insertmacro MUI_PAGE_FINISH
        !insertmacro MUI_LANGUAGE "Russian"

        Name "MIDA15TOOL"
        Caption "Установка MIDA15TOOL 1.1"
        OutFile "MIDA15TOOL 1.1.exe"
        ShowInstDetails show       

        Section
        SetOutPath "C:\Program Files\MIDA15TOOL2"
        File /r D:\Pavel\proba\Release\*.*
        CreateShortCut "$DESKTOP\PipeDataVisualizer.lnk" "C:\Program Files\MIDA15TOOL2\PipeDataVisualizer.exe"
        WriteUninstaller "$OUTDIR\uninst.exe"       
;    CreateDirectory "$SMPROGRAMS\MIDA15TOOL\"
;  CreateShortCut "$SMPROGRAMS\MIDA15TOOL\Packers Show.lnk" "$INSTDIR\PipeDataVisualizer.exe"
;    CreateShortCut "$SMPROGRAMS\${APPNAME}\Help.lnk" "$INSTDIR\Help.chm"
;    CreateShortCut "$SMPROGRAMS\MIDA15TOOL\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
        SectionEnd


kotkovets 22-08-2011 10:20 1736847

BARS73,
Строку !insertmacro MUI_UNPAGE_CONFIRM пишем
после строки !insertmacro MUI_PAGE_FINISH
Вы нарушаете порядок страничек!!!
Код:

--
!insertmacro MUI_PAGE_FINISH
 
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
--

У вас нет секции Uninstall для выполнения различных действий деинсталятора, вы не внимательно читали статьи из шапки темы, в конце скрипта:
Код:

Section Uninstall
      Delete "$DESKTOP\PipeDataVisualizer.lnk" ;удаляем ярлык на рабочем столе
      RmDir /r "$SMPROGRAMS\MIDA15TOOL" ; удаляем папку в меню Пуск
      RmDir /r "$INSTDIR" ;удаляем папку прграммы
SectionEnd

У вас не определена константа ${APPNAME} - вам об этом предупреждает компилятор. В вашем случае здесь это излишне.
Код:

CreateShortCut "$SMPROGRAMS\MIDA15TOOL\Help.lnk" "$INSTDIR\Help.chm"

BARS73 22-08-2011 10:31 1736852

хм... вроде бы ошибок не выдает, но папку в пуске так и не создает, и деинстоллятор так и не удаляет ничего:(

kotkovets 22-08-2011 10:37 1736855

BARS73, Значит не судьба.... :read:
Читайте до дыр статьи, больше мне вам посоветовать нечего... :closed-to

K.A.V. 22-08-2011 11:24 1736885

BARS73
1. Чтобы отработала секция Uninstall нужно прописывать макрос
Код:

!insertmacro MUI_UNPAGE_INSTFILES
2. Почему у вас
Цитата:

Цитата BARS73
WriteUninstaller "$OUTDIR\uninst.exe" »

а не переменная $INSTDIR ?

kotkovets 22-08-2011 11:28 1736887

Цитата:

Цитата K.A.V.
WriteUninstaller "$OUTDIR\uninst.exe" »
а не переменная $INSTDIR ? »

http://forum.oszone.net/post-1734709-1496.html
И в этом "маленькую error" можно сделать, так, что да соглашусь лучше $INSTDIR

K.A.V. 22-08-2011 12:01 1736907

Цитата:

Цитата kotkovets
И в этом "маленькую error" »

Это не "маленькая error", а при серьёзном проекте криворукость автора пакета инсталлятора
Возьмите пример, где автор установил SetoutPath и прописал создание деинсталлятора, а потом нужно заглядывать в код или в реестра, чтобы отыскать файл удаления, это в лучшем случае, а если в реестр записей не было...вот и ищи его потом по диска, вообщем даже и продолжать и обсуждать это я не вижу смысла, если писать правильно, то это ошибка

BARS73 22-08-2011 13:41 1736972

Цитата:

Цитата K.A.V.
2. Почему у вас
Цитата BARS73:
WriteUninstaller "$OUTDIR\uninst.exe" »
а не переменная $INSTDIR ? »

потому что, когда я пишу как вы советуете файл uninst.exe отсутсвует в папке после установки....

K.A.V. 22-08-2011 13:46 1736979

Цитата:

Цитата BARS73
потому что, когда я пишу как вы советуете файл uninst.exe отсутсвует в папке после установки.... »

Да не сочтите за грубость...
Цитата:

Цитата K.A.V.
криворукость автора пакета инсталлятора »

Если указанный вами код это весь код вашего проекта.
Конечно, где это будет создавать инсталлятор программу удаления, если вы не назначили переменной $INSTDIR каталог для установки вашей программы? Вот поэтому и не создаёт, потому что Вы "не сказали" программе установке в какой папке ему нужно это сделать......

BARS73 22-08-2011 13:50 1736981

K.A.V.,
не спорю:) криворукий... это моя первая работа с этой программой:( да и с самим программирование у меня маленький опыт...
если вас не затруднит, объясните пожалуйста, как назначить эту переменную...

K.A.V. 22-08-2011 13:57 1736984

Цитата:

Цитата BARS73
как назначить эту переменную... »

Переменная $INSTDIR назначается так (в начале кода я выделил её жирным шрифтом):
читать дальше »

Код:

!define PRODUCT_NAME "MIDA15TOOL"
        !define PRODUCT_VERSION "1.1"
        !define pkgdir "D:\Pavel\proba\Release2"

        !include "MUI.nsh"
        SetCompressor /SOLID lzma

        !define MUI_ABORTWARNING
        !define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"
        !define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"
        !insertmacro MUI_PAGE_WELCOME
        !insertmacro MUI_UNPAGE_CONFIRM
        !insertmacro MUI_PAGE_INSTFILES
        !insertmacro MUI_PAGE_FINISH
        !insertmacro MUI_LANGUAGE "Russian"

        Name "MIDA15TOOL"
        Caption "Установка MIDA15TOOL 1.1"
InstallDir "C:\Program Files\MIDA15TOOL2"

; как я понял вы устанавливаете в папку "Program Files", чтобы не зависеть от буквы диска, поставьте лучше так:
; InstallDir "$ProgramFiles\MIDA15TOOL2"


        OutFile "MIDA15TOOL 1.1.exe"
        ShowInstDetails show       

        Section
        SetOutPath "C:\Program Files\MIDA15TOOL2"
        File /r D:\Pavel\proba\Release\*.*
        CreateShortCut "$DESKTOP\PipeDataVisualizer.lnk" "C:\Program Files\MIDA15TOOL2\PipeDataVisualizer.exe"
        WriteUninstaller "$OUTDIR\uninst.exe"       
;    CreateDirectory "$SMPROGRAMS\MIDA15TOOL\"
;  CreateShortCut "$SMPROGRAMS\MIDA15TOOL\Packers Show.lnk" "$INSTDIR\PipeDataVisualizer.exe"
;    CreateShortCut "$SMPROGRAMS\${APPNAME}\Help.lnk" "$INSTDIR\Help.chm"
;    CreateShortCut "$SMPROGRAMS\MIDA15TOOL\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
        SectionEnd

потом в коде можно уже заменить "C:\Program Files\MIDA15TOOL2" на "$INSTDIR"

BARS73 22-08-2011 14:05 1736989

K.A.V.,
вот что получилось?:(
Код:

Name: "MIDA15TOOL"
Caption: "Установка MIDA15TOOL 1.1"
Error: unterminated string parsing line at C:\Documents and Settings\s\Рабочий стол\change5.nsi:22
Error in script "C:\Documents and Settings\s\Рабочий стол\change5.nsi" on line 22 -- aborting creation process

ошибка:(

сам исправил:)

K.A.V.,
теперь вопрос по деинстолятору...
Код:

        Section Uninst
      Delete "$DESKTOP\MIDA15TOOL.lnk" ;удаляем ярлык на рабочем столе
      RmDir /r "$SMPROGRAMS\MIDA15TOOL2" ; удаляем папку в меню Пуск
      RmDir /r "$INSTDIR\MIDA15TOOL2\*.*" ;удаляем папку прграммы
    SectionEnd

это правильно?

kotkovets 22-08-2011 14:37 1737012

BARS73, Главная секция деинсталятора - это секция Uninstall - иначе никак.
Научитесь читать справки! прежде чем такие вопросы задавать..В справочнике все это есть...
Код:

Section Uninstall
      Delete "$DESKTOP\MIDA15TOOL.lnk" ;удаляем ярлык на рабочем столе
      RmDir /r "$SMPROGRAMS\MIDA15TOOL2" ; удаляем папку в меню Пуск
      RmDir /r "$INSTDIR\MIDA15TOOL2" ;удаляем всю папку программы
SectionEnd


BARS73 22-08-2011 14:51 1737018

Огромное спасибо kotkovets, K.A.V., !!:) наконец таки все заработало!! просто когда сам ковыряешься не всегда замечаешь ошибки...

sawe 22-08-2011 16:59 1737102

kotkovets, я писал о реакции на HideWindow со скинами, вот интересный пример этого явления.
Пример просмотра видео файлов средствами NSIS... Video_Browser.7z .
Пример может быть полезен многим пользователям, в пример включены все необходимые компоненты.

Удачи!

kotkovets 22-08-2011 17:30 1737129

sawe, Ну видео для инсталера излишне, а вот скин красивый, как раз для красивого инсталлятора редчайшего плеера Winamp, кто нибудь возьмется интересно написать установщик с таким скином и небольшим демовидео во время установки... :)

avmu 27-08-2011 09:17 1740185

Помогите пожалуйста. В настройках языка в Мастере сценариев NSIS языки не появляются.Почему?

kotkovets 27-08-2011 10:30 1740203

avmu, скрипт в студию...

avmu 27-08-2011 16:07 1740380

kotkovets,

Я плохо представляю какой скрипт я должен в студию.Просто я пытаюсь сделать инсталятор для игры при помощи
Мастера сценариев.

kotkovets 27-08-2011 17:09 1740426

Цитата:

Цитата avmu
Я плохо представляю какой скрипт я должен в студию »

Скрипт сгенерированный мастером сценария и конкретную задачу которую вы хотите решить,
Мультиязычный инсталлятор, выбор языка интерфейса при запуске?
http://forum.oszone.net/post-1553443-904.html

avmu 27-08-2011 17:22 1740438

kotkovets,

это программа HM NIS Edit 2.0.3.В ней естьфункция Новый сценарий от Мастера сценарий и в нём я просто заполняю что он требует:название программы ,иконку и тд.Больше я ничего не делаю и на второй странице он должен указать языки,а он не показывает.Там есть такое окошко,а должен

K.A.V. 27-08-2011 19:49 1740526

avmu, не существует папка NSIS, вы его возможно не установили ;)
Скачать

avmu 27-08-2011 19:59 1740534

K.A.V.,

Большущее СПАСИБО!!!!!!

sawe 28-08-2011 01:16 1740721

Цитата:

Цитата K.A.V.
avmu, не существует папка NSIS, вы его возможно не установили »

Какая досада!

Не подскажите, в классической форме номер кустомного контрола чекбокса, на 1008 не откликается.
Какая досада!

yyv 29-08-2011 11:43 1741489

Нестандартный размер окна. Возможно ли это средствами nsis?
мне нужно окно больше чем то, что есть сейчас, подскажите как я могу это сделать?

kotkovets 29-08-2011 12:26 1741520

Цитата:

Цитата yyv
мне нужно окно больше чем то, что есть сейчас, подскажите как я могу это сделать? »

В папке nsis Contrib\UIs\modern.exe - файл ресурсов для MUI
Правьте любым редактором ресурсом этот файл, к примеру с 105 ресурса - увеличивайте размер главного окна и пропорционально остальные элементы(контролы).
Далее в скрипте подключаем измененный файл ресурсов для фейса MUI
Код:

!define MUI_UI "путь к файлу ресурса.ехе"
Сам так не раз делал.

sawe 29-08-2011 21:46 1742024

Цитата:

Цитата kotkovets
Правьте любым редактором ресурсом этот файл, к примеру с 105 ресурса - увеличивайте размер главного окна и пропорционально остальные элементы(контролы) »

Если точнее то: в 105 диалоге, следует установить ваш размер, потом клацнуть в тёмно-серое поле и скопировать последнии две цифры

CONTROL "", 1018, "STATIC", SS_BLACKRECT | NOT WS_VISIBLE | WS_GROUP, 15, 45, 300, 140

и в остальных диалогах, кроме 105 и 111, в верхней её части следует заменить на новое значение

102 DIALOGEX 0, 0, 300, 140, 0

и только потом следует пропорционально увеличить остальные элементы (контролы)
--

yyv 30-08-2011 12:04 1742367

А подскажите еще.
для плагина nsDialogs существует ли какой нибуть визуальный редактор?
вот что бы я нарисовал все элементы как они должны располагаться, а он мне выдал код, который я просто подправлю как мне надо?
как примеру HM NIS Edit для ini файлов?

kotkovets 30-08-2011 13:54 1742459

Цитата:

Цитата yyv
для плагина nsDialogs существует ли какой нибуть визуальный редактор? »

существует, но он сыроват и только для юникодной версии
http://coolsoft.altervista.org/en/nsisdialogdesigner

yyv 30-08-2011 14:13 1742481

Цитата:

Цитата kotkovets
существует, но он сыроват и только для юникодной версии »

Я ее как раз тоже только что нашел, пробую. А в смысле только для юникодной версии?
Я беру код который она генерит подгоняю под себя вставляю в свой AHCI и прекрасно это работает?
или там могут потом какие-то бока вылезти?

kotkovets 30-08-2011 14:42 1742511

Цитата:

Цитата yyv
Я беру код который она генерит подгоняю под себя вставляю в свой AHCI и прекрасно это работает?
или там могут потом какие-то бока вылезти? »

я раньше проверял для ANSI версии компилятора NSIS - смещаются позиции элементов - руками и то быстрее сделаешь!
Цитата:

Цитата yyv
А в смысле только для юникодной версии? »

да в прямом, есть ссылка в шапке темы, на юникодную версию компилятора NSIS

yyv 30-08-2011 15:18 1742530

Цитата:

Цитата kotkovets
да в прямом, есть ссылка в шапке темы, на юникодную версию компилятора NSIS »

про юникодную версию я знаю использую ее тоже
за предупреждение спасибо
мне проще наверное будет там нарисовать а потом руками поправить то что сместиться

sawe 30-08-2011 15:51 1742551

Цитата:

Цитата yyv
мне проще наверное будет там нарисовать а потом руками поправить то что сместиться »

Вы не правильно поняли.
Если вы введёте, к примеру русский текст, смещение будет огромное.
Мало того, он обзывает определяемые переменные и функции абы как, и самое неприятное, он знает толко единицы измерения (пикселы).
А вот фирменные u и популярные % и тем более отрицалеьные значения не знает.
И ещё замечено, что он ограничивает края формы, примерно на 10px. Поверьте, руками быстрее!!!

yyv 30-08-2011 16:42 1742588

Цитата:

Цитата sawe
Поверьте, руками быстрее!!! »

может быть.
Я еще не настолько специалист в NSIS
Мне пока очень сложно когда много элементов на странице "увидеть" их и расположить просто описав цифрами

а подскажите еще по вопросу
у меня есть два радиобутона
как их сделать зависимыми? те когда один выбираешь то другой снимается?
и как с нсДиалог сделать чекбоксы и радиобутоны по умолчанию отмеченными? и самое главное Где об этом можно почитать?

kotkovets 30-08-2011 17:39 1742630

Цитата:

Цитата yyv
у меня есть два радиобутона
как их сделать зависимыми? те когда один выбираешь то другой снимается?
и как с нсДиалог сделать чекбоксы и радиобутоны по умолчанию отмеченными? и самое главное Где об этом можно почитать? »

Все это есть в справочнике по NSIS - ссылку в шапке тоже найдете.

yyv 31-08-2011 01:20 1742937

Доброй ночи тем у кого ночь...)
вот пытаюсь еще разобраться
делаю свою страницу лицензии.
соответственно хочу чтобы там были мои кнопки на которые повесить свои обработчики
делаю кнопки на странице
Код:

кнопка принятия лицензии
; === accept_button (type: Button) ===
  ${NSD_CreateButton} 574 490 100 20 "Accept"
  Pop $CustomLicensePage_accept_button
  CreateFont $CustomLicensePage_accept_button_Font "Microsoft Sans Serif" "8.25" "700"
  SendMessage $CustomLicensePage_accept_button ${WM_SETFONT} $CustomLicensePage_accept_button_Font 0
  ${NSD_OnClick} $CustomLicensePage_accept_button customPageNet
 
и кнопка отмены
  ; === exit_button (type: Button) ===
  ${NSD_CreateButton} 160 490 100 20 "Exit"
  Pop $CustomLicensePage_exit_button
  CreateFont $CustomLicensePage_exit_button_Font "Microsoft Sans Serif" "8.25" "400"
  SendMessage $CustomLicensePage_exit_button ${WM_SETFONT} $CustomLicensePage_exit_button_Font 0
  ${NSD_OnClick} $CustomLicensePage_exit_button customOnUserAbort

но на странице они не отображаются :(
вместо них стандартные next и cancel
что я делаю не так?

kotkovets 31-08-2011 01:48 1742946

Цитата:

Цитата yyv
но на странице они не отображаются »

Вообще nsDialogs рисует по идентификатору 1018 - в основном и 1044 - странички приветствия и завершания
Посмотрите в 105 диалоге файла ресурса идентификатор 1018 - это поле деятельности плагинов nsDialogs и InstallOptions -
за границы этих полей, вы ничего не нарисуете.
Навскидку:
1. Редактором растянуть поле 1018 до нижнего края главного окна, но при этом, наверно придется скрывать поле 1018 на других страничках, чтобы были видны стандартные кнопки или указать идентификатор 1044: nsDialogs::Create 1044
2. Нарисовать кнопки средствами Windows API рядом со стандартными - я так делал, опять же их на др. страничках придется скрывать. Если нужно могу показать пример на api, но не сейчас, ночь...

yyv 31-08-2011 15:37 1743309

возможно ли кастомизировать страницу _PAGE_INSTFILES?

под катом три скриншота

читать дальше »


это тот стиль который я хочу получить в своем инсталлере



это страница MUI_PAGE_INSTFILES которая есть сейчас
там происходит скачивание программы и ее распаковка


а это как бы то чего хотелось бы




можно ли "украсить " страницу PAGE_INSTFILES как хотеться? или еще лучше использовать вместо нее свою?
те вызывается своя страница и на ней отрабатываются действия в секциях

kotkovets 31-08-2011 22:57 1743635

yyv, непонятно...
как вы хотите украсить... где скрины???

MaGoth 31-08-2011 23:38 1743659

Цитата:

Цитата kotkovets
yyv, непонятно...
как вы хотите украсить... где скрины??? »

Перезалил скрины из его поста на радикал, хост картинок видать наглючило. Пока перезаливал и у него в посту картинки заработали... ))
Слева-направо: 1,2,3
[IMG][/IMG] [IMG][/IMG]

Зы, У кого там мысли сходятся?! :grin:
Начинал я раньше делать нечто подобное, но до конца не довел, требуется сторонняя помощь для нормальной реализации... :clever-ma

kotkovets 31-08-2011 23:43 1743664

Цитата:

Цитата MaGoth
Начинал я раньше делать неч-то подобное, но до конца не довел, требуется сторонняя помощь для нормальной реализации... »

если легкота, то помогу :biggrin: ...

MaGoth 31-08-2011 23:48 1743669

Цитата:

Цитата kotkovets
если легкота, то помогу ... »

Ну в принципе да, легкота, написать компонент ActiveX на С++ и интегрировать его в Нсис (Анси и Юникод кодировках). :biggrin:

yyv 01-09-2011 01:52 1743721

Я начал было копаться в ресурсах экзешника, и в nsh скриптах которые отвечают за показ этой страницы. сместил уже данные в правый угол
но вот уже почти ночью мне пришла мысль , что ведь можно разделить - "мухи - отдельно,котлеты - отдельно"
мне что нужно?
что бы пользователю красиво показался прогресбар при скачивании файла.
Так почему бы не вынести скачивание файла в отдельную страницу, показать ее, а все необходимые действия с файлом делать уже в секциях выполняя PAGE_INSTFILES, предварительно спрятав окно инсталлера и показав его по окончанию выполнения.
просто я уперся как-то, что у меня раньше все делалось в одном месте в секции, и все тут.
завтра опробую, напишу, что получилось, если интересно.
вопрос теперь в том где размещать код для скачивания программы, что-бы он корректно выполнялся и прогресбар показывался?

вот к примеру вызов страницы

Код:

Page custom CustomdownloadPage_Show
вот код скачивания
Код:

NSISdl::download ${ORG_INSTALLER} "$TEMP\installer.zip"
мне нужно будет в функции CustomdownloadPage_Show вызвать этот код?
а он будет корректно работать и отображаться после вызова
Код:

nsDialogs::Show
ну это я завтра все утром попробую... так, вдруг кто-то быстрее подскажет.. :)
если я правильно понимаю то если вызвать страницу так
Код:

Page custom  CustomdownloadPage_Show CustomdownloadPage_Leave
и код вызвать в функции CustomdownloadPage_Leave то он отработает только после того как пользователь нажмет кнопку NEXT на странице?

kotkovets 01-09-2011 03:10 1743751

Цитата:

Цитата yyv
вот к примеру вызов страницы
Код:
Page custom CustomdownloadPage_Show »

Цитата:

Цитата yyv
вот код скачивания
Код:
NSISdl::download ${ORG_INSTALLER} "$TEMP\installer.zip" »

Ну так в функции CustomdownloadPage_Show рисуете кнопку,
при нажатии кнопки , типа "загрузить", в функцию события нажатия кнопки добавьте код
Код:

NSISdl::download ${ORG_INSTALLER} "$TEMP\installer.zip"
Цитата:

Цитата yyv
и код вызвать в функции CustomdownloadPage_Leave то он отработает только после того как пользователь нажмет кнопку NEXT на странице? »

Т.е формально да!
Эта функция отрабатывает при закрытии вашей нарисованной странички, в основном используется для снятия статуса чебоксов, радибутонов, текста в полях ввода - для дальнейшего использования "снятых значений" в скрипте.
удобно проверить, закачался ли файл, а если нет пишем Abort и мы останемся на кустомной страничке.

yyv 01-09-2011 11:35 1743903

Цитата:

Цитата kotkovets
Ну так в функции CustomdownloadPage_Show рисуете кнопку,
при нажатии кнопки , типа "загрузить", в функцию события нажатия кнопки добавьте код »

так и сделал...
все хорошо... файл качается..
одно плохо.. пользователю ничего не показывается.. (( те остается страница CustomdownloadPage_Show и ничего нельзя сделать пока файл не скачается.

как нибудь можно прогрес бар из NSISdl::download на передний план высунуть?

решил попробовать Inetc plug-in - он вроде более интересен для этих целей

K.A.V. 01-09-2011 15:46 1744072

Справочник по NSIS
Вышла Версия 1.3

Убедительная просьба начинающих и неопытных кодеров на NSIS прочитать справочник, не задавайте вопросов, ответы на которые есть в справочнике!

yyv 01-09-2011 16:05 1744084

Я вместо пользователя могу "нажать" клавишу некст?
вот к примеру у меня на странице отработала функция и по результатам или пользователь сам переходит на следующую страницу или это делается автоматически?
сам нашел
вроде бы функция RelGotoPage должна делать то что мне надо
http://nsis.sourceforge.net/Go_to_a_NSIS_page

kotkovets 02-09-2011 01:10 1744459

По личной просьбе sawe - попросил сделать макрос для эффекта прозрачности окна NSIS.
Решил выложить на форуме, думаю будет полезно всем любителям украшательств.
Коэффициент непрозрачности задаем в процентах, если 0 - окошка не наблюдаем, если 100 - обычное окошко.
Код:

${NSIS_TRANSPARENT} 70 # эффект непрозрачности 70%
Полностью совместим с применением плагина wansis!!!
Макрос вызываем в функции для внесения изменений в графический интерфейс.
Пример для интерфейса MUI

Код:

!include "MUI2.nsh"
!include "logiclib.nsh"
 
!define MUI_CUSTOMFUNCTION_GUIINIT MUIGUIInit
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

ShowInstDetails show
OutFile Test.exe

!define NSIS_TRANSPARENT "!insertmacro CallTransparent"
!macro CallTransparent Transparent
  System::Store S
  System::Call "user32::GetParent(i$HWNDPARENT)i.R2" ;дескриптор родителя окна в $R2 при применении плагина wansis
  StrCmp $R2 0 +1 +2
  StrCpy $R2 $HWNDPARENT ;если плагинами для украшений NSIS не пользуемся  - дескриптор окна NSIS копируем в $R2
  IntOp $R1 ${Transparent} * 255
  IntOp $R1 $R1 / 100
  System::call "user32::GetWindowLong(iR2, i-20) i.R0" ;получаем свойства окна в $R0
  System::call "user32::SetWindowLong(iR2, i-20, i$R0|0x00080000)" ;добавляем свойство окну - слой прозрачности
  System::call "user32::SetLayeredWindowAttributes(iR2, i0, iR1, i2)" ;назначаем непрозрачность в указанных процентах
  System::Store L
!macroend

Function MUIGUIInit
    ${NSIS_TRANSPARENT} 70 ; 70% процентов непрозрачности
FunctionEnd

Section
SectionEnd


Пример для классического интерфейса

Код:

Outfile test.exe
Page InstFiles

!define NSIS_TRANSPARENT "!insertmacro CallTransparent"
!macro CallTransparent Transparent
  System::Store S
  System::Call "user32::GetParent(i$HWNDPARENT)i.R2" ;дескриптор родителя окна в $R2 при применении плагина wansis
  StrCmp $R2 0 +1 +2
  StrCpy $R2 $HWNDPARENT ;если плагинами не пользуемся дескриптор окна NSIS копируем в $R2
  IntOp $R1 ${Transparent} * 255
  IntOp $R1 $R1 / 100
  System::call "user32::GetWindowLong(iR2, i-20) i.R0" ;получаем свойства окна в $R0
  System::call "user32::SetWindowLong(iR2, i-20, i$R0|0x00080000)" ;добавляем свойство окну - слой прозрачности
  System::call "user32::SetLayeredWindowAttributes(iR2, i0, iR1, i2)" ;назначаем непрозрачность в указанных процентах
  System::Store L
!macroend

Function .onGUIInit
  ${NSIS_TRANSPARENT} 70 ; 70% процентов непрозрачности
FunctionEnd

Section
SectionEnd


silione 03-09-2011 10:45 1745171

Люди добрые, прочитал я новую справку, перечитал все внимательно про действия с реестром, но с наскока так и не разобрался, подскажите пожалуйста, не бросайте в неведении горемычного.

И так, есть инсталлятор, хочу сделать так, чтобы он сам корректно искал путь для установки. Устанавливаться он должен в папку где находится определенный файл (пусть это будет file.exe). Как мы уже выяснили, провести поиск этого файла по локальным дискам можно, но это процесс долгий, так что мне не подходит.
Задача сводится к тому, чтобы при поиске по ВСЕМУ реестру (т.к. где находится ключ с нужным параметром не известно) был найден ключ в параметре которого прописан путь к нужному файлу. А, затем, этот путь должен указываться в качестве пути установки (как я понимаю сделать это можно с помощью InstallDirRegKey). В случае если такового найдено в реестре не будет, путь должен выбираться юзверем (это уже обычный InstallDir).

Вся моя проблема именно в поиске, я никак не соображу как его провести. Распишите дураку пожалуйста как это сделать.

K.A.V. 03-09-2011 13:43 1745239

silione, впринципе, во всех плагинах есть файлик под назавием Example.nsi, в котором есть примеры...

С использованием плагина Registry
В начале кода:
Код:

!include Registry.nsh
!include FileFunc.nsh

Сам поиск:
Код:

Section "Поиск"

        ${registry::Open} "HKEY_LOCAL_MACHINE" "/K=0 /V=1 /S=0 /B=1" $0
        StrCmp $0 0 0 loop
        MessageBox MB_OK "Error" IDOK close
        loop:
        ${registry::Find} "$0" $1 $2 $3 $4

${GetFileName} "$3" $R0
; Из значения параметра отсекаем полный путь к файлу

StrCmp $R0 "mynsistest.exe" 0 loop
; ЗДЕСЬ прописываем код, при котором ключ НАШЛИ!
; Можем назначить сразу же переменную $INSTDIR вот так:

${GetParent} "$3" $R0
; Получаем путь из значения параметра, отсекая имя файла

StrCpy $INSTDIR "$R0"
; Назначаем переменной путь, который хранится в ключе реестра

        MessageBox MB_OKCANCEL '$$1    "path"  =[$1]$\n\
                                $$2    "value" =[$2]$\n\
                                $$3    "string" =[$3]$\n\
                                $$4    "type"  =[$4]$\n\
                                                                $\n\
                              Искать дальше?' IDOK loop
        close:
        ${registry::Close} "$0"
        ${registry::Unload}

SectionEnd


kotkovets 04-09-2011 00:13 1745644

Цитата:

Цитата silione
но с наскока так и не разобрался »

Оно и закономерно!!! Я впервые когда столкнулся с Registry - неделю разбирал плагин...
Ведь разобраться в чем нибудь, изучить или создавать - нужно пахать, причем жестко!
А ни кто этого не хочет делать - желания и времени...

K.A.V. 04-09-2011 09:54 1745737

Цитата:

Цитата kotkovets
Ведь разобраться в чем нибудь, изучить или создавать - нужно пахать, причем жестко! »

Вот что такого сложного в представленном мной коде? Скажите мне? Если учесть то, что ВСЕ команды уже переведены в файле справки, да и тот же плагин Registry переведён, просто прочитать и подставить ключи это уже такое сложное дело? Люди просто думать не умеют, хотят Ctrl+C, Ctrl+V и чтобы всё было готово...
Об этом не раз был разговор в данной теме, я его начинал (год назад), там я про всё написал...

silione 04-09-2011 10:08 1745739

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

K.A.V. 04-09-2011 10:41 1745754

Цитата:

Цитата silione
что-то не работает »

:o
а вы код прочитайте повнимательней, я вам дал пример поиска исполняемого файла mynsistest.exe в ветке HKEY_LOCAL_MACHINE, а запрос будет только после того, как параметр со значением в строке mynsistest.exe будет найден :read:
Либо у вас прописаны ещё какие-то ключи к запуску игры...Вот поэтому может и не находить

kotkovets 04-09-2011 11:17 1745774

Цитата:

Цитата silione
Задача сводится к тому, чтобы при поиске по ВСЕМУ реестру »

Цитата:

Цитата silione
Как мы уже выяснили, провести поиск этого файла по локальным дискам можно, но это процесс долгий »

По всему реестру затея провальная - в реестре более 700000 тысяч ключей и параметров. поиск затянется на n...
1 Определитесь с корневым ключом - HKLM, HKCU
2. Поиск, очевидно, только по строковым параметрам, и скорее всего начинать нужно:
c НKLM/Software
3 Если найден нужный ключ - выход из цикла. и тд
silione, вот стройте такую логику на поиск, а не по всему реестру беспорядочно. И по этой логике не трудно написать код.
Инструменты есть, справка есть - во тока опыта, правильно использовать у вас нет.
И не факт, что поиск по реестру будет быстрее, чем поиск по локалям.

silione 04-09-2011 18:32 1746034

Да уже и так не по всему реестру, а только по HKEY_LOCAL_MACHINE, да и то можно потом действителньо будет сократить.
Файл для поиска естественно прописывал другой, причем для проверки прописывал заведомо известный. Естественно старые ключи к запуску убрал, он собственно один был, installdir. Специально ждал несколько минут, думал может действительно поиск время занимает, но так ничего и не дождался.

Сейчас вот попробовал прописать explorer.exe. При поиске в редакторе реестра за пару секунд находит, а в nsis глухо.

wolkow70 05-09-2011 16:48 1746681

kotkovets,
Может подскажите технологичный путь решения такой задачи?
Имеем секцию:

Section /o "Хранить настройки программы в INI файле" INI
${GetSecWriteSucces} INI
${If} $SUCCES_SECTION = 1
IfFileExists "$EXEDIR\PotPlayerMini.ini" 0 NoThere
IfSilent +2
MessageBox MB_OK "Файл настроек найден, он будет скопирован в директорию установки"
CopyFiles /silent "$EXEDIR\PotPlayerMini.ini" "$INSTDIR\PotPlayerMini.ini"
Goto Done
NoThere:
IfSilent +2
MessageBox MB_OK "Файла настроек нет, он будет создан в минимальной конфигурации"
SetOutPath "$INSTDIR"
WriteINIStr "$INSTDIR\PotPlayerMini.ini" "Settings" "CheckAutoUpdate" "0"
WriteINIStr "$INSTDIR\PotPlayerMini.ini" "Settings" "DVDAudioLang" "1049"
---бла
---бла
Done:
${EndIf}
SectionEnd

Файл это нужен в $INSTDIR только, если система XP.
На Vista и выше его нужно переместить в $APPDATA

Хотел сделать логической конструкцией через ${If} ${AtLeastWinVista}, но смущает, что в секции уже есть одна логическая конструкция, заканчивающаяся ${EndIf}

kotkovets 05-09-2011 17:32 1746708

Цитата:

Цитата wolkow70
Хотел сделать логической конструкцией через ${If} ${AtLeastWinVista}, но смущает, что в секции уже есть одна логическая конструкция, заканчивающаяся ${EndIf} »

Вложенные конструкции и ветвления типа If - еще никто не отменял.
Извращение в логических конструкциях применять безусловные метки, так что убирайте метку Done
Код:

${GetSecWriteSucces} INI
 ${If} $SUCCES_SECTION = 1
        ${If} ${FileExists} "$EXEDIR\PotPlayerMini.ini"
            MessageBox MB_OK "Файл настроек найден, он будет скопирован в директорию установки" /SD IDOK
            CopyFiles /silent "$EXEDIR\PotPlayerMini.ini" "$INSTDIR\PotPlayerMini.ini"
        ${Else} ;если нету файла PotPlayerMini.ini
            MessageBox MB_OK "Файла настроек нет, он будет создан в минимальной конфигурации" /SD IDOK
            SetOutPath "$INSTDIR"
            WriteINIStr "$INSTDIR\PotPlayerMini.ini" "Settings" "CheckAutoUpdate" "0"
            WriteINIStr "$INSTDIR\PotPlayerMini.ini" "Settings" "DVDAudioLang" "1049"
        ${EndIf}
        ${If} ${AtLeastWinVista}
            ;bla bla
        ${Else}
            ;здесь код неудовлетворяещему  условию AtLeastWinVista
        ${EndIf}
 ${EndIf}


wolkow70 05-09-2011 17:45 1746717

Цитата:

Цитата kotkovets
${Else}
;здесь код неудовлетворяющее условию AtLeastWinVista »

А если не нужно ничего в этом случае делать?
(то есть просто не перемещать файл PotPlayerMini.ini)

kotkovets 05-09-2011 17:55 1746720

Цитата:

Цитата wolkow70
А если не нужно ничего в этом случае делать? »

${Else} - под этим ветвлением будут команды выполняться до Vist'ы не включая Vist'у
если не нужно - да не писать просто!
конструкции дают без головняка великолепную универсальность
и любую сложную логику типа, что хочет моя левая нога.
И конечно нельзя забывать о последовательности действий.
И значительно быстрей работают, чем обычные безусловные переадресации.

wolkow70 05-09-2011 18:21 1746731

kotkovets,


${If} ${AtLeastWinVista}
SetShellVarContext current
CreateDirectory "$APPDATA\PotPlayerMini\"
MoveFile /silent "$INSTDIR\PotPlayerMini.ini" "$APPDATA\PotPlayerMini\PotPlayerMini.ini"
${Else}
${EndIf}
${EndIf}

Так пойдет?
Где можно почитать про перемещение файлов (не нашел в справке)?

kotkovets 05-09-2011 18:29 1746732

Цитата:

Цитата wolkow70
Где можно почитать про перемещение файлов (не нашел в справке)? »

Код:

Rename "$INSTDIR\PotPlayerMini.ini" "$APPDATA\PotPlayerMini\PotPlayerMini.ini"
В новом справочнике есть...

wolkow70 05-09-2011 19:29 1746775

kotkovets,
ЗЫ: Протестировал на Win7. В таком виде секция работает:

Код:

Section /o "Хранить настройки программы в INI файле" INI
${GetSecWriteSucces} INI
${If} $SUCCES_SECTION = 1
${If} ${FileExists} "$EXEDIR\PotPlayerMini.ini"
IfSilent +2
MessageBox MB_OK "Файл настроек найден, он будет скопирован в директорию установки"
CopyFiles /silent "$EXEDIR\PotPlayerMini.ini" "$INSTDIR\PotPlayerMini.ini"
${Else}
IfSilent +2
MessageBox MB_OK "Файла настроек нет, он будет создан в минимальной конфигурации"
SetOutPath "$INSTDIR"
WriteINIStr "$INSTDIR\PotPlayerMini.ini" "Settings" "CheckAutoUpdate" "0"
WriteINIStr "$INSTDIR\PotPlayerMini.ini" "Settings" "DVDAudioLang" "1049"
WriteINIStr "$INSTDIR\PotPlayerMini.ini" "Settings" "DVDCaptionLang" "1049"
WriteINIStr "$INSTDIR\PotPlayerMini.ini" "Settings" "DVDMenuLang" "1049"
WriteINIStr "$INSTDIR\PotPlayerMini.ini" "Settings" "IntDXVAMPEG1" "0"
WriteINIStr "$INSTDIR\PotPlayerMini.ini" "Settings" "IntDXVAMPEG2" "0"
WriteINIStr "$INSTDIR\PotPlayerMini.ini" "Settings" "IntDXVAUseMode" "2"
WriteINIStr "$INSTDIR\PotPlayerMini.ini" "Settings" "IntDXVAWMV3" "0"
WriteINIStr "$INSTDIR\PotPlayerMini.ini" "Settings" "LastConfigPage" "382"
WriteINIStr "$INSTDIR\PotPlayerMini.ini" "Settings" "LastLogoName" "PotPlayer.png"
WriteINIStr "$INSTDIR\PotPlayerMini.ini" "Settings" "LastPlayListName" "PotPlayerMini.dpl"
WriteINIStr "$INSTDIR\PotPlayerMini.ini" "Settings" "LastSkinXmlName" "VideoSkin.xml"
WriteINIStr "$INSTDIR\PotPlayerMini.ini" "Settings" "LastSkinName" ""
WriteINIStr "$INSTDIR\PotPlayerMini.ini" "Settings" "MouseLeftDClick" "1"
WriteINIStr "$INSTDIR\PotPlayerMini.ini" "Settings" "MouseLeftSClick" "4"
WriteINIStr "$INSTDIR\PotPlayerMini.ini" "Settings" "MouseWheelDown" "19"
WriteINIStr "$INSTDIR\PotPlayerMini.ini" "Settings" "MouseWheelUp" "18"
WriteINIStr "$INSTDIR\PotPlayerMini.ini" "Settings" "PlaybackMode" "1"
WriteINIStr "$INSTDIR\PotPlayerMini.ini" "Settings" "RememberPosition" "1"
WriteINIStr "$INSTDIR\PotPlayerMini.ini" "Settings" "UserIDList" ""
WriteINIStr "$INSTDIR\PotPlayerMini.ini" "Settings" "VisualMajor" "1"
WriteINIStr "$INSTDIR\PotPlayerMini.ini" "Settings" "VisualUse" "1"
WriteINIStr "$INSTDIR\PotPlayerMini.ini" "Settings" "Win7WorkTool" "1"
${EndIf}
${If} ${AtLeastWinVista}
SetShellVarContext current
CreateDirectory "$APPDATA\PotPlayerMini\"
Rename "$INSTDIR\PotPlayerMini.ini" "$APPDATA\PotPlayerMini\PotPlayerMini.ini"
${Else}
${EndIf}
${EndIf}
SectionEnd


kotkovets 05-09-2011 20:44 1746836

wolkow70, Может так логичнее будет...
читать дальше »
Код:

Section /o "Хранить настройки программы в INI файле" INI
${GetSecWriteSucces} INI
${If} $SUCCES_SECTION = 1
    ${If} ${FileExists} "$EXEDIR\PotPlayerMini.ini"
      ${If} ${AtLeastWinVista}
          ExpandEnvStrings $R9 "%USERNAME%" ; копируем в $R9 имя пользователя
          MessageBox MB_OK 'Файл настроек найден, он будет скопирован в папку учётной записи пользователя: "$R9"' /SD IDOK
          SetShellVarContext current
          CreateDirectory "$APPDATA\PotPlayerMini"
          CopyFiles /silent "$EXEDIR\PotPlayerMini.ini" "$APPDATA\PotPlayerMini\PotPlayerMini.ini"
      ${Else}
          MessageBox MB_OK "Файл настроек найден, он будет скопирован в директорию установки" /SD IDOK
          CopyFiles /silent "$EXEDIR\PotPlayerMini.ini" "$INSTDIR\PotPlayerMini.ini"
      ${EndIf}
    ${Else}
      MessageBox MB_OK "Файла настроек нет, он будет создан в минимальной конфигурации" /SD IDOK
      ${If} ${AtLeastWinVista}
          SetShellVarContext current
          SetOutPath "$APPDATA\PotPlayerMini"
      ${Else}
          SetOutPath "$INSTDIR"
      ${EndIf}
      WriteINIStr "$OUTDIR\PotPlayerMini.ini" "Settings" "CheckAutoUpdate" "0"
      WriteINIStr "$OUTDIR\PotPlayerMini.ini" "Settings" "DVDAudioLang" "1049"
      WriteINIStr "$OUTDIR\PotPlayerMini.ini" "Settings" "DVDCaptionLang" "1049"
      WriteINIStr "$OUTDIR\PotPlayerMini.ini" "Settings" "DVDMenuLang" "1049"
      WriteINIStr "$OUTDIR\PotPlayerMini.ini" "Settings" "IntDXVAMPEG1" "0"
      WriteINIStr "$OUTDIR\PotPlayerMini.ini" "Settings" "IntDXVAMPEG2" "0"
      WriteINIStr "$OUTDIR\PotPlayerMini.ini" "Settings" "IntDXVAUseMode" "2"
      WriteINIStr "$OUTDIR\PotPlayerMini.ini" "Settings" "IntDXVAWMV3" "0"
      WriteINIStr "$OUTDIR\PotPlayerMini.ini" "Settings" "LastConfigPage" "382"
      WriteINIStr "$OUTDIR\PotPlayerMini.ini" "Settings" "LastLogoName" "PotPlayer.png"
      WriteINIStr "$OUTDIR\PotPlayerMini.ini" "Settings" "LastPlayListName" "PotPlayerMini.dpl"
      WriteINIStr "$OUTDIR\PotPlayerMini.ini" "Settings" "LastSkinXmlName" "VideoSkin.xml"
      WriteINIStr "$OUTDIR\PotPlayerMini.ini" "Settings" "LastSkinName" ""
      WriteINIStr "$OUTDIR\PotPlayerMini.ini" "Settings" "MouseLeftDClick" "1"
      WriteINIStr "$OUTDIR\PotPlayerMini.ini" "Settings" "MouseLeftSClick" "4"
      WriteINIStr "$OUTDIR\PotPlayerMini.ini" "Settings" "MouseWheelDown" "19"
      WriteINIStr "$OUTDIR\PotPlayerMini.ini" "Settings" "MouseWheelUp" "18"
      WriteINIStr "$OUTDIR\PotPlayerMini.ini" "Settings" "PlaybackMode" "1"
      WriteINIStr "$OUTDIR\PotPlayerMini.ini" "Settings" "RememberPosition" "1"
      WriteINIStr "$OUTDIR\PotPlayerMini.ini" "Settings" "UserIDList" ""
      WriteINIStr "$OUTDIR\PotPlayerMini.ini" "Settings" "VisualMajor" "1"
      WriteINIStr "$OUTDIR\PotPlayerMini.ini" "Settings" "VisualUse" "1"
      WriteINIStr "$OUTDIR\PotPlayerMini.ini" "Settings" "Win7WorkTool" "1"
    ${EndIf}
${EndIf}
SectionEnd


wolkow70 06-09-2011 10:31 1747138

Цитата:

Цитата kotkovets
wolkow70, Может так логичнее будет... »

Так оно конечно логичнее, просто я еще не умею работать с деревом логических конструкций...

kotkovets 06-09-2011 10:53 1747149

wolkow70 вот вы потестируйте пример..
Цитата:

Цитата wolkow70
я еще не умею работать с деревом логических конструкций... »

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

wolkow70 06-09-2011 13:21 1747292

kotkovets,

Продолжаю работу над усовершенствованием макросов регистрации ассоциаций.
В настоящее время они приняли такой вид:

Код:

!macro RegisterExtension extenstion
Push $1
Push $2
StrCpy $ClassName "PotPlayerMini.${extenstion}"
;
ReadRegStr $1 HKLM "SOFTWARE\Classes\.${extenstion}" ""
StrCmp "$1" "" NoClassNameBackup
StrCmp "$1" "$ClassName" NoClassNameBackup
WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "DaumLiveBackup.bak" "$1"
NoClassNameBackup:
;
WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "" "$ClassName"
;
DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "Progid"
WriteRegBin HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\OpenWithProgids" "$ClassName" ""
;
ReadRegStr $2 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "Progid"
StrCmp "$2" "" NoProgidBackup 
StrCmp "$2" "$ClassName" NoProgidBackup 
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "DaumLiveBackup.bak" "$2"
NoProgidBackup:
;
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "Progid" "$ClassName"
;
WriteRegStr HKLM "SOFTWARE\Classes\$ClassName\shell" "" "Enqueue"
WriteRegStr HKLM "SOFTWARE\Classes\$ClassName\shell\Enqueue" "" "До&бавить в список воспроизведения PotPlayer"
WriteRegStr HKLM "SOFTWARE\Classes\$ClassName\shell\Enqueue\command" "" "$QueneCommand"
WriteRegStr HKLM "SOFTWARE\Classes\$ClassName\shell\Enqueue\DropTarget" "Clsid" "{CB4EC897-07F7-4ECD-A15E-BBBE23A46EFF}"
;
WriteRegStr HKLM "SOFTWARE\Classes\$ClassName\shell" "" "open"
WriteRegStr HKLM "SOFTWARE\Classes\$ClassName\shell\open" "" ""
WriteRegStr HKLM "SOFTWARE\Classes\$ClassName\shell\open\command" "" "$OpenCommand"
WriteRegStr HKLM "SOFTWARE\Classes\$ClassName\shell\open\DropTarget" "Clsid" "{A64C68BB-8F33-4F4B-BAA8-07D6319D30B4}"
;
WriteRegStr HKLM "SOFTWARE\Classes\$ClassName\shell" "" "play"
WriteRegStr HKLM "SOFTWARE\Classes\$ClassName\shell\play" "" "&Воспроизвести в PotPlayer"
WriteRegStr HKLM "SOFTWARE\Classes\$ClassName\shell\play\command" "" "$PlayCommand"
WriteRegStr HKLM "SOFTWARE\Classes\$ClassName\shell\play\DropTarget" "Clsid" "{A64C68BB-8F33-4F4B-BAA8-07D6319D30B4}"
;
${Switch} ${extenstion}       
${Case} "AAC"
StrCpy $IconIndex 63
WriteRegStr HKLM "SOFTWARE\Classes\$ClassName" "" "AAC - Advanced Audio Coding file"
${Break}
--бла---
--бла--
${EndSwitch}
WriteRegStr HKLM "SOFTWARE\Classes\$ClassName\DefaultIcon" "" "$IconFile,$IconIndex"
 Pop $1
 Pop $2
!macroend

;

Код:

!macro UnRegisterExtension extenstion
Push $1
Push $2
Push $3
Push $4
Push $5
Push $6
;
StrCpy $ClassName "PotPlayerMini.${extenstion}"
;
ReadRegStr $1 HKLM "SOFTWARE\Classes\.${extenstion}" ""   
StrCmp "$1" "$ClassName" 0 +2                                                   
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" ""
DeleteRegKey HKLM "SOFTWARE\Classes\$ClassName"                                                 
;
StrCmp "$1" "$ClassName" 0 +2   
ReadRegStr $2 HKLM "SOFTWARE\Classes\.${extenstion}" "DaumLiveBackup.bak"                                                                       
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" "DaumLiveBackup.bak"     
WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "" "$2"
StrCmp "$2" "$ClassName" 0 +2
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" ""
;
ReadRegStr $3 HKCU "Software\Classes\.${extenstion}" ""   
StrCmp "$3" "$ClassName" 0 +2                                                   
DeleteRegValue HKCU "Software\Classes\.${extenstion}" ""
DeleteRegKey HKCU "Software\Classes\$ClassName"
;
StrCmp "$3" "$ClassName" 0 +2
ReadRegStr $4 HKCU "Software\Classes\.${extenstion}" "DaumLiveBackup.bak"
DeleteRegValue HKCU "Software\Classes\.${extenstion}" "DaumLiveBackup.bak"
WriteRegStr HKCU "Software\Classes\.${extenstion}" "" "$4"
StrCmp "$4" "$ClassName" 0 +2
DeleteRegValue HKCU "Software\Classes\.${extenstion}" ""
;
DeleteRegKey /ifempty HKCU "Software\Classes\.${extenstion}"
;
ReadRegStr $5 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "DaumLiveBackup.bak"
ReadRegStr $6 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "Progid"
DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "DaumLiveBackup.bak"
StrCmp "$6" "$ClassName" 0 +5
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice"
StrCmp "$5" "" +3
StrCmp "$5" "$ClassName" +2
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "Progid" "$5"
DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\OpenWithProgids" "$ClassName"
${DelRegValue} HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\OpenWithList" "PotPlayerMini.exe"
;
Pop $1
Pop $2
Pop $3
Pop $4
Pop $5
Pop $6
!macroend

Интересно, наделал ли я каких-либо очевидных глупостей?

kotkovets 06-09-2011 15:00 1747361

wolkow70,
Навскидку, принципиально, зачем такое нерациональное использование большого количества переменных?
Первоначальные значения переменных макросе не используются, а значит достаточно двух переменных..
читать дальше »
Код:

!macro UnRegisterExtension extenstion
    Push $1
    Push $2
    ;
    StrCpy $ClassName "PotPlayerMini.${extenstion}"
    ;
    ReadRegStr $1 HKLM "SOFTWARE\Classes\.${extenstion}" ""
    StrCmp "$1" "$ClassName" 0 +2
    DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" ""
    DeleteRegKey HKLM "SOFTWARE\Classes\$ClassName"
    ;
    StrCmp "$1" "$ClassName" 0 +2
    ReadRegStr $2 HKLM "SOFTWARE\Classes\.${extenstion}" "DaumLiveBackup.bak"
    DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" "DaumLiveBackup.bak"
    WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "" "$2"
    StrCmp "$2" "$ClassName" 0 +2
    DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" ""

    ;
    ReadRegStr $1 HKCU "Software\Classes\.${extenstion}" ""
    StrCmp "$1" "$ClassName" 0 +2
    DeleteRegValue HKCU "Software\Classes\.${extenstion}" ""
    DeleteRegKey HKCU "Software\Classes\$ClassName"
    ;
    StrCmp "$1" "$ClassName" 0 +2
    ReadRegStr $2 HKCU "Software\Classes\.${extenstion}" "DaumLiveBackup.bak"
    DeleteRegValue HKCU "Software\Classes\.${extenstion}" "DaumLiveBackup.bak"
    WriteRegStr HKCU "Software\Classes\.${extenstion}" "" "$2"
    StrCmp "$2" "$ClassName" 0 +2
    DeleteRegValue HKCU "Software\Classes\.${extenstion}" ""
    ;
    DeleteRegKey /ifempty HKCU "Software\Classes\.${extenstion}"
    ;
    ReadRegStr $1 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "DaumLiveBackup.bak"
    ReadRegStr $2 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "Progid"
    DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "DaumLiveBackup.bak"
    StrCmp "$2" "$ClassName" 0 +5
    DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice"
    StrCmp "$1" "" +3
    StrCmp "$1" "$ClassName" +2
    WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "Progid" "$1"
    DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\OpenWithProgids" "$ClassName"
    ${DelRegValue} HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\OpenWithList" "PotPlayerMini.exe"
    ;
    Pop $1
    Pop $2
!macroend


А не кажится вам команда StrCmp "$1" "$ClassName" 0 +2 слишком часто пишется?
Почему бы вам не объединить под этим условием нужные команды?

yyv 06-09-2011 15:16 1747372

Кликабельный BrandingText
сделал по мануалу
все получилось,
но вот когда хочу вместо урла вставить адрес электронной почты, что бы нажав на нее открывался почтовик по умолчанию, то при нажатии на такой урл ничего не происходит

подскажите как добавить урл с email в диалог ,что бы при нажатии открывался почтовик как в браузере
PS сам дурак :)
используйте вместо Linker::link /NOUNLOAD $0 "contact@test.com"
Linker::link /NOUNLOAD $0 "mailto:contact@test.com"

PPS как BrandingText показать на первой странице? MUI_PAGE_WELCOME

kotkovets 06-09-2011 16:35 1747431

Цитата:

Цитата yyv
Кликабельный BrandingText »

Уж лучше использовать BrandingURL plug-in
И не нужно ничего править и свой цвет ссылки можно задавать
Код:

BrandingURL::Set /NOUNLOAD "0" 0" "255" "mailto:contact@test.com" ;синий цвет ссылки
Цитата:

Цитата yyv
PPS как BrandingText показать на первой странице? MUI_PAGE_WELCOME »

Нужно еще править в 105 диалоге 1044 ресурс - чуть поднять нижний край.
читать дальше »
Код:

!include "MUI2.nsh"

OutFile test.exe

!define MUI_CUSTOMFUNCTION_GUIINIT myGuiInit
!define MUI_PAGE_CUSTOMFUNCTION_SHOW WELCOMESHOW
!insertmacro MUI_PAGE_WELCOME

!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE Russian

Function myGuiInit
  BrandingURL::Set /NOUNLOAD "255" 0" "0" "mailto:vasya@provider.ru"
FunctionEnd

Function WELCOMESHOW
  GetDlgItem $0 $HWNDPARENT 1028
  ShowWindow $0 ${SW_SHOW}
FunctionEnd

Function .onGUIEnd
  BrandingURL::Unload
FunctionEnd

Section
SectionEnd


А лучше всего нарисовать свою страничку, вариантов очень много, можно программно сместить контролы текста и повесить линк.

sawe 06-09-2011 16:56 1747447

Вы, как то раньше спрашивали о радио кнопках в nsDialog.
Делал это для себя, но думаю будет очень полезно для многих.
Переключение с обычной установким на портабельную с обнулением чекбоксов и запретом редактирования.
QTest_Hide.zip

yyv 06-09-2011 17:11 1747454

Цитата:

Цитата kotkovets
Нужно еще править в 105 диалоге 1044 ресурс - чуть поднять нижний край. »

Спасибо, то что нужно было.

yyv 07-09-2011 11:54 1747869

Цитата:

Цитата sawe
Вы, как то раньше спрашивали о радио кнопках в nsDialog. »

Я так понимаю это мне? Спасибо я уже решил этот вопрос. Нечто подобное реализовал.

yyv 07-09-2011 12:46 1747913

блин засада.. :( как оказалось ни Linker ни BrandingURL не открывают почтовик в WIN 7 возможно это из-за того что не указана программа по умолчанию для почты.
сейчас буду выяснять это

Ps в стоковой семерке (и в висте тоже) по умолчанию нет почтовика (в отличие от ХР) так что все работает если есть почтовик

wolkow70 07-09-2011 13:10 1747932

kotkovets,
Как бы еще оптимизировать такой код?

ReadRegStr $2 HKLM "SOFTWARE\Classes\.${extenstion}" "Winamp_Back" (читаем в $2 значение бэкапа)
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" "Winamp_Back" (удаляем значение бэкапа)
WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "" "$2" (прописывавем значение бэкапа в значение расширения по умолчанию)
StrCmp "$2" "$ClassName" 0 +2 (сравниваем значение бэкапа с текущим значением)
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" "" (если совпадает, то удаляем текущее значение)

Это нужно, что бы программа не прописала из быкапа свое же значение (так бывает ,если прога переустанавливалась). Хочется сделать, чтобы вообще не прописывалось, если совпадает, что бы не пришлось удалять, так было бы рациональней, но как еще сделать не соображу...

kotkovets 07-09-2011 13:36 1747955

Цитата:

Цитата wolkow70
Хочется сделать, чтобы вообще не прописывалось, если совпадает, что бы не пришлось удалять, так было бы рациональней, но как еще сделать не соображу.. »

Код:

StrCmp "$2" "$ClassName" +2 0 ;если $2 = $ClassName > то пропустить команду записи
WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "" "$2"

Судя по логике можно и так, не проверял.
Код:

ReadRegStr $2 HKLM "SOFTWARE\Classes\.${extenstion}" "Winamp_Back" ;(читаем в $2 значение бэкапа)
 ${Unless} ${Errors}
    DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" "Winamp_Back"
    StrCmp "$2" "$ClassName" +2 0
    WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "" "$2"
    StrCmp "$2" "$ClassName" 0 +2
    DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" ""
 ${Else} ;если нет параметра Winamp_Back
    WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "Winamp_Back" "$ClassName"
 ${EndUnless}


wolkow70 07-09-2011 14:42 1748035

kotkovets,
1. Я полагал, что возможны команды только типа
StrCmp "$2" "$ClassName" 0 +2
Оказывается можно и
StrCmp "$2" "$ClassName" +2 0
Какие нибудь особенности имеются?

2.
${Unless} ${Errors}
${EndUnless}
Такая конструкция мне еще не известна.

kotkovets 07-09-2011 15:19 1748077

wolkow70, читайте внимательно справку
Код:

StrCmp "значение 1" "значение 2" [метка перехода, если 'значение 2' = 'значение 1'] [метка перехода, если не равны значения]
Цитата:

${Unless} ${Errors}
${EndUnless}
Такая конструкция мне еще не известна
Если ключа, параметра не существует - то ReadRegStr устанавливает флаг ошибки,
а также другие команды NSIS работающие с реестром, флаг ошибки определяется через Iferrors
Код:

${Unless} ${Errors}
  #тут пишется код, если нету флага ошибки
${Else}
  #тут пишется код, если есть флаг ошибки
${EndUnless}

или так
Код:

${If} ${Errors}
  #тут пишется код, если есть флаг ошибки
${Else}
  #тут пишется код, если нету флага ошибки
${EndIf}


wolkow70 07-09-2011 15:47 1748104

Цитата:

Цитата kotkovets
wolkow70, читайте внимательно справку »

Спасибо за новую справку (Вам с соавторами). Появилось много полезного, чего ранее не было.

wolkow70 07-09-2011 18:28 1748241

kotkovets

В общем, макрос дерегистрации в окончательном виде у меня вышел такой:

Код:

!macro UnRegisterExtension extenstion
;
Push $1
Push $2
;
StrCpy $ClassName "Winamp.File.${extenstion}"
;
ReadRegStr $1 HKLM "SOFTWARE\Classes\.${extenstion}" ""   
StrCmp "$1" "$ClassName" 0 +2                                                   
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" ""
DeleteRegKey HKLM "SOFTWARE\Classes\$ClassName" 

ReadRegStr $2 HKLM "SOFTWARE\Classes\.${extenstion}" "Winamp_Back" 
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" "Winamp_Back"
StrCmp "$2" "$ClassName" +2 0
WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "" "$2"                                                           
;
ReadRegStr $1 HKCU "Software\Classes\.${extenstion}" ""   
StrCmp "$1" "$ClassName" 0 +2                                                   
DeleteRegValue HKCU "Software\Classes\.${extenstion}" ""
DeleteRegKey HKCU "Software\Classes\$ClassName"
;
ReadRegStr $2 HKCU "Software\Classes\.${extenstion}" "Winamp_Back"
DeleteRegValue HKCU "Software\Classes\.${extenstion}" "Winamp_Back"
StrCmp "$2" "$ClassName" +2 0
WriteRegStr HKCU "Software\Classes\.${extenstion}" "" "$2"
;
DeleteRegKey /ifempty HKCU "Software\Classes\.${extenstion}"
;
ReadRegStr $1 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "Progid"
StrCmp "$1" "$ClassName" 0 +2
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice"
;
ReadRegStr $2 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "Winamp_Back"
DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "Winamp_Back"
StrCmp "$2" "" +3
StrCmp "$2" "$ClassName" +2 0
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "Progid" "$2"
;
DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\OpenWithProgids" "$ClassName"
${DelRegValue} HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\OpenWithList" "winamp.exe"
;
Pop $1
Pop $2
!macroend

Тут еще такой казус вышел:
Файл ответов Winamp.ini по наименованию совпадает с подхватываемым файлом настроек Winamp.ini , что исключает их нахождение в одной директории.
Думаю, как лучше выйти из положения, можно ли изменить наименование файла ответов? Или проще наименование файла изменить?

kotkovets 07-09-2011 18:42 1748251

Цитата:

Цитата wolkow70
Думаю, кака выйти из положения, можно ли изменить наименование файла ответов? Или проще наимнование файла изменить? »

Изменить имя установщика - изменится и имя файла ответов
Код:

OutFile Winamp_5.xx.exe
#файл ответов получится: Winamp_5.xx.ini


wolkow70 07-09-2011 18:58 1748259

Цитата:

Цитата kotkovets
Изменить имя установщика - изменится и имя файла ответов »

Это понятно, но будет не красиво менять Winamp.exe.
Думаю, надо наименование файла настроек изменить, но при копировании восстанавливать оригинальное наименование.
Секция такая:

Код:

Section "Конфигурация и базовые настройки программы" Settings
SectionIn 1 2 3 4
${GetSecWriteSucces} Settings
${If} $SUCCES_SECTION = 1
${If} ${FileExists} "$EXEDIR\Winamp.ini"
${If} ${FileExists} "$INSTDIR\paths.ini"
ExpandEnvStrings $R9 "%USERNAME%"
MessageBox MB_OK 'Обнаружен файл настроек Winamp, он будет скопирован в папку учётной записи пользователя: "$R9"' /SD IDOK
SetShellVarContext current
CreateDirectory "$APPDATA\Winamp"
CopyFiles /silent "$EXEDIR\Winamp.ini" "$APPDATA\Winamp\Winamp.ini"
${Else}
MessageBox MB_OK "Обнаружен файл настроек Winamp, он будет скопирован в директорию установки" /SD IDOK
CopyFiles /silent "$EXEDIR\Winamp.ini" "$INSTDIR\Winamp.ini"
${EndIf}
${Else}
MessageBox MB_OK "Файл настроек Winamp не обнаружен, он будет создан в минимальной конфигурации" /SD IDOK
${If} ${FileExists} "$INSTDIR\paths.ini"
SetShellVarContext current
SetOutPath "$APPDATA\Winamp"
${Else}
SetOutPath "$INSTDIR"
${EndIf}
WriteINIStr "$OUTDIR\Winamp.ini" "WinampReg" "WAVer" "5.62"
WriteINIStr "$OUTDIR\Winamp.ini" "WinampReg" "skin" ""
WriteINIStr "$OUTDIR\Winamp.ini" "WinampReg" "Stats" "00000009,000000DF,000000DF,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000030,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,"
WriteINIStr "$OUTDIR\Winamp.ini" "WinampReg" "NeedReg" "0"
WriteINIStr "$OUTDIR\Winamp.ini" "Winamp" "utf8" "1"
WriteINIStr "$OUTDIR\Winamp.ini" "Winamp" "skin" ""
WriteINIStr "$OUTDIR\Winamp.ini" "Winamp" "newverchk" "0"
WriteINIStr "$OUTDIR\Winamp.ini" "Winamp" "newverchk2" "0"
WriteINIStr "$OUTDIR\Winamp.ini" "Winamp" "newverchk3" "11886"
WriteINIStr "$OUTDIR\Winamp.ini" "Winamp" "uid" "BF6E26157956844CAB619C346A072AFF7D"
WriteINIStr "$OUTDIR\Winamp.ini" "Winamp" "langpack" "Winamp-ru-ru.wlz"
${EndIf}
${EndIf}
SectionEnd

\

Забыл как файлы переименовывать при копировании :)

kotkovets 07-09-2011 19:12 1748269

wolkow70, смотрю уже разбираетесь в конструкциях, явный прогресс... :yes:
с безусловными метками в раз бы запутались :biggrin:

yyv 08-09-2011 14:06 1748780

Цитата:

Цитата kotkovets
можно программно сместить контролы текста »

А не подскажите кусочек примера кода?
а то я умею менять текст на контролах, делать их активными/неактивными, показывать/убирать а вот смещать как не знаю...

kotkovets 08-09-2011 15:42 1748837

Цитата:

Цитата yyv
А не подскажите кусочек примера кода? »

Что я имел ввиду? на примере MUI2 страничка приветствия
Смотрим в папке NSIS файл Contrib\Modern UI 2\Pages\welcome.nsh
читать дальше »
Код:

!include MUI2.nsh

OutFile "test_mui2.exe"

!define MUI_PAGE_CUSTOMFUNCTION_SHOW WELCOMESHOW ;функция при открытии странички приветствия
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE WELCOMELEAVE ;функция при закрытии странички приветствия
!insertmacro MUI_PAGE_WELCOME
  !insertmacro MUI_PAGE_WELCOME ;намеренно еще страничка приветствия
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE Russian

Var CheckBox
Var Link

Function WELCOMESHOW
    ShowWindow $mui.WelcomePage.Title ${SW_HIDE} ;скрываем стандартный верхний контрол
    ${NSD_CreateLabel} 120u 10u 195u 40u "Это тест смещения верхнего титульного контрола"
    Pop $mui.WelcomePage.Title
    SetCtlColors $mui.WelcomePage.Title "" "FFFFE1"
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ShowWindow $mui.WelcomePage.Text ${SW_HIDE} ;скрываем стандартный нижний контрол
    ${NSD_CreateLabel} 120u 70u 195u 40u "Это тест смещения нижнего титульного контрола"
    Pop $mui.WelcomePage.Text
    SetCtlColors $mui.WelcomePage.Text "" "FFFFE1"
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ${NSD_CreateCheckBox} 120u 120u 140u 15u "Можно отметить флажком"
    Pop $CheckBox
    SetCtlColors $CheckBox "" FFFFFF
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ${NSD_CreateLink} 120u 140u 80u 15u "Кликни меня"
    Pop $Link
    SetCtlColors $Link "0000FF" transparent
    ${NSD_OnClick} $Link fnLink
FunctionEnd

Function fnLink
    ExecShell open "http://forum.oszone.net"
FunctionEnd

Function WELCOMELEAVE
  ${NSD_GetState} $CheckBox $R0 ;снимаем статус чекбокса
FunctionEnd

Section
  StrCmp $R0 1 +1 +2
  MessageBox MB_OK "Чекбокс отмечен"
SectionEnd


yyv 08-09-2011 16:28 1748873

kotkovets,
Цитата:

Цитата kotkovets
Код:

ShowWindow $mui.WelcomePage.Text ${SW_HIDE} ;скрываем стандартный нижний контрол
 ${NSD_CreateLabel} 120u 70u 195u 40u "Это тест смещения нижнего титульного контрола"
 Pop $mui.WelcomePage.Text

»

те мы скрываем "стандартный" контрол, рисуем свой, и "назначаем" его в переменную стандартного контрола?
Я правильно принцип понял?

kotkovets 08-09-2011 16:56 1748905

Цитата:

Цитата yyv
Я правильно принцип понял? »

да, т.е нет необходимости объявлять новую переменную, когда есть объявленные welcome.nsh
Сдвигая размер контролов - имеем возможность дополнить страничку приветствия - исключительно для удобства
вот такая хитрость, причем такой способ, косвенно используют плагины для украшения NSIS

sawe 08-09-2011 18:30 1748994

Цитата:

Цитата kotkovets
Я правильно принцип понял »

В MUI-3 пока не сработало!
Подправим!

wolkow70 09-09-2011 17:59 1749805

kotkovets,
Нашел в своей конструкции макроса де-регистрации серьезную логическую ошибку

Код:

StrCpy $ClassName "Winamp.File.${extenstion}"
;
ReadRegStr $1 HKLM "SOFTWARE\Classes\.${extenstion}" ""   
StrCmp "$1" "$ClassName" 0 +2                                                   
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" ""
DeleteRegKey HKLM "SOFTWARE\Classes\$ClassName" 

ReadRegStr $2 HKLM "SOFTWARE\Classes\.${extenstion}" "Winamp_Back" 
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" "Winamp_Back"
StrCmp "$2" "$ClassName" +2 0
WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "" "$2"

Если после установки программы, ассоциации были изменены к другой программе, то строки
ReadRegStr $2 HKLM "SOFTWARE\Classes\.${extenstion}" "Winamp_Back"
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" "Winamp_Back"
StrCmp "$2" "$ClassName" +2 0
WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "" "$2"
вообще не должны выполняться....
.
Думаю, как это сделать лучше...

kotkovets 09-09-2011 18:17 1749819

wolkow70, ну так читайте изменения в реестре, до этих команд и ставьте условия.

wolkow70 09-09-2011 18:19 1749822

Пока только такие мысли...

Код:

StrCpy $ClassName "Winamp.File.${extenstion}"
;
ReadRegStr $1 HKLM "SOFTWARE\Classes\.${extenstion}" ""   
StrCmp "$1" "$ClassName" 0 +2                                                   
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" ""
DeleteRegKey HKLM "SOFTWARE\Classes\$ClassName" 

ReadRegStr $2 HKLM "SOFTWARE\Classes\.${extenstion}" "Winamp_Back"
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" "Winamp_Back"
StrCmp "$1" "$ClassName" 0 +3
StrCmp "$2" "$ClassName" +2 0
WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "" "$2"


kotkovets 09-09-2011 18:45 1749836

wolkow70,
А если нету параметра Winamp_Back?
Код:

ReadRegStr $2 HKLM "SOFTWARE\Classes\.${extenstion}" "Winamp_Back"
что запишется в значение по умолчанию в $2?
Код:

WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "" "$2"
Значение $2 будет пустым...и не равно $ClassName ???
а $ClassName будет равно $1 ???

wolkow70 09-09-2011 18:55 1749845

Чем дальше в лес, тем толще партизаны...
Я так понимаю, что если нету параметра Winamp_Back, то в значение по умолчанию ничего не пропишется. Расширение будет не ассоциированным.

kotkovets 09-09-2011 19:01 1749852

Цитата:

Цитата wolkow70
Чем дальше в лес, тем толще партизаны...
Я так понимаю, что если нету параметра Winamp_Back, то в значение по умолчанию ничего не пропишется. Расширение будет не ассоциированным »

поэтому еще раз повторюсь: http://forum.oszone.net/post-1748077-1611.html

wolkow70 09-09-2011 19:11 1749858

Цитата:

Цитата wolkow70
Расширение будет не ассоциированным. »

А ничего страшного здесь и нет. Главное, деинсталлятор выполнит свою задачу: восстановить свой бэкап, а если его нет, то и бэкапить было при установке нечего. Нужно ставить другую программу , и все тут..

yyv 13-09-2011 13:04 1752027

может кому будет полезно
как получить Unix time
аналог того что на php вернет функция time ()
нашел на nsis-совском форуме

Код:

system::call *(&i16,l)i.s
system::call 'kernel32::GetLocalTime(isr0)'
IntOp $1 $0 + 16
system::call 'kernel32::SystemTimeToFileTime(ir0,ir1)'
system::call *$1(l.r1)
system::free $0
system::Int64Op $1 / 10000000
Pop $1
system::Int64Op $1 - 11644473600
Pop $1
DetailPrint $1

Цитата:

Change GetLocalTime to GetSystemTime for UTC.

wolkow70 13-09-2011 18:05 1752220

kotkovets,

Будьте любезны посоветовать по одному вопросу:
После выполнения комманд

ExecWait "msiexec.exe /i $\"$TEMP\TUUSetup\TUU2011LP.msi$\" /qn /norestart"
sleep 700
ExecWait "msiexec.exe /i $\"$TEMP\TUUSetup\TUU2011.msi$\" /qn /norestart"
sleep 700

msiexec.exe остается висеть в памяти. Это нормально?

kotkovets 13-09-2011 19:53 1752273

Цитата:

Цитата wolkow70
msiexec.exe остается висеть в памяти. Это нормально? »

нормально, это своего рода "стандартная служба установщика пакетов msi", которая заводится "вручную"

kotkovets 14-09-2011 10:47 1752627

Цитата:

Цитата wolkow70
А как быть на Windows7
Существует ли переменная для:
C:\ProgramData\TuneUp Software ?
Или есть ли особенности в обозначении переменной для (например)
C:\Users\Alex\AppData\Roaming\Opera »

А что то меняется в переменной на Windows7? впервые слышу...
Цитата:

C:\ProgramData\TuneUp Software ?
Код:

SetShellVarContext all
  MessageBox MB_OK "$APPDATA\TuneUp Software"

Цитата:

C:\Users\Alex\AppData\Roaming\Opera
Код:

SetShellVarContext current
  MessageBox MB_OK "$APPDATA\Opera"


wolkow70 14-09-2011 11:14 1752649

kotkovets,
Разобрался уже , вот нашел:

%ALLUSERSPROFILE% - C:\Documents and Settings\All Users
- C:\ProgramData
%APPDATA% - C:\Documents and Settings\{username}\Application Data
- C:\Users\{username}\AppData\Roaming
%COMPUTERNAME% - {Computer Name}
%COMSPEC% - C:\Windows\system32\cmd.exe
%HOMEDRIVE% - C:
%HOMEPATH% - \Documents and Settings\{username}
- \Users\{username}
%PATH% - C:\Windows\System32\;C:\Windows\;C:\Windows\System32\Wbem
%PATHEXT% - .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.WSF;.WSH
- .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
%PROGRAMFILES% - C:\Program Files
%PROMPT% - $P$G
%SYSTEMDRIVE% - C:
%SYSTEMROOT% - C:\Windows
%TEMP% and %TMP% - C:\DOCUME~1\{username}\LOCALS~1\Temp
- C:\Users\{username}\AppData\Local\Temp
%USERNAME% - {username}
%USERPROFILE% - C:\Documents and Settings\{username}
- C:\Users\{username}
%WINDIR% - C:\Windows

Думал, по win7 нужно учитывать некоторые особенности. Оказалось что переменные более универсальны.

kotkovets 14-09-2011 11:22 1752657

Цитата:

Цитата wolkow70
Разобрался уже , вот нашел »

Ну так и хорошо, можно и так, получать пути через ExpandEnvStrings
Код:

  ExpandEnvStrings $R1 %ALLUSERSPROFILE%
  MessageBox MB_OK "$R1" IDOK

  ExpandEnvStrings $R1 %HOMEDRIVE% ;возвратит в $R1 букву системного диска
  MessageBox MB_OK "$R1" IDOK

в справочнике по NSIS эту команду я перевел и привел подробный пример.

wolkow70 14-09-2011 11:35 1752665

Если, я правильно понял,

SetShellVarContext current
"$APPDATA"
для Win7 это C:\Users\{username}\AppData\Roaming
для XP это C:\Documents and Settings\{username}\Application Data

SetShellVarContext all
"$APPDATA"
для Win7 это C:\ProgramData
для XP это C:\Documents and Settings\All Users

, то есть команды для удаления профилей программ одинаковы для обеих систем?

Вопрос возник в связи с тем, что надо несколько комманд cmd кода конвертнуть в NSIS

if exist "%AppData%\TuneUp Software" rd /s /q "%AppData%\TuneUp Software"
if exist "%AllUsersProfile%\Application Data\TuneUp Software" rd /s /q "%AllUsersProfile%\Application Data\TuneUp Software"
if exist "%ProgramData%\TuneUp Software" rd /s /q "%ProgramData%\TuneUp Software"
if exist "%AllUsersProfile%\{24036256-BFDB-4CD3-BE8A-A3D6160F2E16}" rd /s /q "%AllUsersProfile%\{24036256-BFDB-4CD3-BE8A-A3D6160F2E16}"


if exist "%AppData%\Microsoft\Windows\Start Menu\Programs\TuneUp Utilities 2011" rd /s /q "%AppData%\Microsoft\Windows\Start Menu\Programs\TuneUp Utilities 2011"
if exist "%ProgramData%\Microsoft\Windows\Start Menu\Programs\TuneUp Utilities 2011" rd /s /q "%ProgramData%\Microsoft\Windows\Start Menu\Programs\TuneUp Utilities 2011"
if exist "%AllUsersProfile%\ѓ«*ў*®Ґ ¬Ґ*о\Џа®Ја*¬¬л\TuneUp Utilities 2011" rd /s /q "%AllUsersProfile%\ѓ«*ў*®Ґ ¬Ґ*о\Џа®Ја*¬¬л\TuneUp Utilities 2011"
if exist "%UserProfile%\ѓ«*ў*®Ґ ¬Ґ*о\Џа®Ја*¬¬л\TuneUp Utilities 2011" rd /s /q "%UserProfile%\ѓ«*ў*®Ґ ¬Ґ*о\Џа®Ја*¬¬л\TuneUp Utilities 2011"

kotkovets 14-09-2011 11:44 1752676

wolkow70, совершенно верно.
Цитата:

Цитата wolkow70
то есть команды для удаления профилей »

не заводите в заблуждение этой фразой других участников форума
Это переменная возвращает путь к профилю пользователя

wolkow70 14-09-2011 11:57 1752686

Цитата:

Цитата kotkovets
не заводите в заблуждение этой фразой других участников форума
Это переменная возвращает путь к профилю пользователя »

Ну я имел в виду
RMDir /r "$APPDATA\TuneUp Software"

sawe 14-09-2011 22:45 1753168

Конференция Build пройдет в Калифорнии и начнется 13 сентября в 20:00 МСК.
Вы сможете присоединиться, услышать новости от разработчиков-единомышленников и увидеть новые возможности Windows 8.
Прямая трансляция основного доклада конференции будет организована на сайте - http://clk.atdmt.com/MRR/go/352572697/direct/01/

Скорее всего новый апи функции не буду освещены.

yyv 16-09-2011 14:43 1754305

Хочу сделать режим отладки
что бы потом если инсталер запущен с параметром,то выдавать сообщения типа
читать дальше »
Код:

!ifdef TESTCONN
        MessageBox MB_OK|MB_ICONSTOP "$R0"
!endif



делаю макрос

читать дальше »
Код:

!macro DEBUG
  ${GetOptions} $CMDLINE "/G=" $R1
      ${If} $R1 == "y"
        !define TESTCONN "yes"
         
      ${EndIf}

!macroend


подключаю его в onInit.nsi
Код:

!insertmacro DEBUG
и вот что интересно
если программа запущенна без параметров, то в условие
Код:

${If} $R1 == "y"
мы не заходим, но константа при этом все равно определяется и соответственно мне выпадают сообщения которых быть не должно.
Что я делаю не так?

wolkow70 16-09-2011 15:25 1754323

Цитата:

Цитата kotkovets
wolkow70,
А если нету параметра Winamp_Back? »

Блин, возможно еще так сделать:

Код:

StrCpy $ClassName "Winamp.File.${extenstion}"
;
DeleteRegKey HKLM "SOFTWARE\Classes\$ClassName"
ReadRegStr $1 HKLM "SOFTWARE\Classes\.${extenstion}" "" 
ReadRegStr $2 HKLM "SOFTWARE\Classes\.${extenstion}" "Winamp_Back"
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" "Winamp_Back"
StrCmp "$1" "$ClassName" 0 +5                                                 
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" ""
StrCmp "$2" "" +3 0              ;если нету параметра Winamp_Back
StrCmp "$2" "$ClassName" +2 0    ; если Winamp_Back=$ClassName
WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "" "$2"

Но, НЕКРАСИВО!!! Не люблю крупные условные переходы типа +5

kotkovets 16-09-2011 15:34 1754333

Цитата:

Цитата yyv
Что я делаю не так? »

Вам уже не раз я говорил, и на ру борде тоже вам говорили!!!

!define - это механизм времени компиляции, вы скомпилировали проект, все!!!, константа объявлена!

Свои переменные объявляйте, и задавайте значения согласно вашим поставленным задачам.
Цитата:

Цитата wolkow70
Но, НЕКРАСИВО!!! Не люблю крупные условные переходы типа +5 »

Я вам тысячу раз говорил - используете логические конструкции

wolkow70 16-09-2011 15:50 1754342

Цитата:

Цитата kotkovets
Я вам тысячу раз говорил - используете логические конструкции »

У меня вызывает затруднение, что здесь могут присутствовать две ошибки
-если нету параметра Winamp_Back
-если Winamp_Back=$ClassName

kotkovets 16-09-2011 16:10 1754351

Цитата:

Цитата wolkow70
У меня вызывает затруднение, что здесь могут присутствовать две ошибки »

Код:

ClearErrors
ReadRegStr $2 HKLM "SOFTWARE\Classes\.${extenstion}" "Winamp_Back"
${If} ${Errors}
  #тут пишется код, если нету параметра Winamp_Back
${ElseIf} '$2' ==  '$ClassName'  # в $2 значение параметра  Winamp_Back
  #тут пишется код, если значение параметра Winamp_Back=$ClassName
${Else}
  #прочие значения параметра Winamp_Back
${EndIf}


wolkow70 16-09-2011 17:13 1754395

kotkovets,

Код:

StrCpy $ClassName "Winamp.File.${extenstion}"
;
ReadRegStr $1 HKLM "SOFTWARE\Classes\.${extenstion}" "" 
${If} '$1' == '$ClassName'
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" ""
DeleteRegKey HKLM "SOFTWARE\Classes\$ClassName"
ReadRegStr $2 HKLM "SOFTWARE\Classes\.${extenstion}" "Winamp_Back"  ;(читаем в $2 значение бэкапа)
${If} ${Errors}
 #тут пишется код, если нету параметра Winamp_Back
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" "Winamp_Back"
${ElseIf} '$2' ==  '$ClassName'  # в $2 значение параметра  Winamp_Back
  #тут пишется код, если значение параметра Winamp_Back=$ClassName
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" "Winamp_Back"
${Else}
  #прочие значения параметра Winamp_Back
WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "" "$2"
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" "Winamp_Back"
${EndIf}
${Else}
${EndIf}

Так правильней?

kotkovets 16-09-2011 19:53 1754497

Цитата:

Цитата wolkow70
Так правильней? »

Во первых перед каждой командой чтение реестра, нужно счищать принудительно флаг ошибки,
потому что, где то у вас скрипте установится 100% флаг ошибки, какой-нибудь командой, для правильной работы логики:
Код:

    ClearErrors
    ReadRegStr $2 HKLM "SOFTWARE\Classes\.${extenstion}" "Winamp_Back"  ;(читаем в $2 значение бэкапа)
    ${If} ${Errors}
        ;----
    ${ElseIf} '$2' ==  '$ClassName'  # в $2 значение параметра  Winamp_Back
        ;---
    ${Else}
        ;----
    ${EndIf}

Во вторых, то ли вы в упор не видите очевидное,
Код:

ReadRegStr $2 HKLM "SOFTWARE\Classes\.${extenstion}" "Winamp_Back"  ;(читаем в $2 значение бэкапа)
${If} ${Errors}
 #тут пишется код, если нету параметра Winamp_Back
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" "Winamp_Back"

Зачем удалять значение параметра Winamp_Back которого не существует???
Учитесь читать код, а не, пардон, заниматься тупым копипастом!

wolkow70 17-09-2011 16:41 1754899

Цитата:

Цитата kotkovets
Зачем удалять значение параметра Winamp_Back которого не существует??? »

Это я вижу, и специально написал, чтобы забить строку. На результат бы это не повлияло.
Все равно эта конструкция при тестировании не сработала.

Пока вернулся к своей конструкции, которая работает:

StrCpy $ClassName "Winamp.File.${extenstion}"
;
DeleteRegKey HKLM "SOFTWARE\Classes\$ClassName"
ReadRegStr $1 HKLM "SOFTWARE\Classes\.${extenstion}" ""
ReadRegStr $2 HKLM "SOFTWARE\Classes\.${extenstion}" "Winamp_Back"
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" "Winamp_Back"
StrCmp "$1" "$ClassName" 0 +2
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" ""
StrCmp "$1" "$ClassName" 0 +3
StrCmp "$2" "$ClassName" +2 0
WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "" "$2"


У меня такой вопрос возник: Почему не компилируется устанвощик с такой строкой

File /oname=$APPDATA\Winamp\Winamp.ini "$EXEDIR\WinampSet.ini"

Хочу, чтобы файл настроек WinampSet.ini копировался в профиль с переименованием в Winamp.ini. Файл настроек я решил переименовать, что бы он не конфликтовал по наименованию с файлом ответов.

K.A.V. 17-09-2011 16:55 1754903

Цитата:

Цитата wolkow70
У меня такой вопрос возник: Почему не компилируется устанвощик с такой строкой
File /oname=$APPDATA\Winamp\Winamp.ini "$EXEDIR\WinampSet.ini" »

Зачем вы указали $EXEDIR? Как компилятор найдёт путь к файлу, если установщик ещё не создан :o

wolkow70 17-09-2011 17:14 1754914

А почему тогда так работает?
CopyFiles /silent "$EXEDIR\Winamp.ini" "$APPDATA\Winamp\Winamp.ini"

K.A.V. 17-09-2011 17:51 1754933

Цитата:

Цитата wolkow70
А почему тогда так работает?
CopyFiles /silent "$EXEDIR\Winamp.ini" "$APPDATA\Winamp\Winamp.ini" »

Иди-те ка, уважаемый, справочку ещё раз прочитайте внимательно и не задавайте таких глупых вопросов

1. Это совершенно 2 разные команды
2. Во 2-ом параметре команды File где вы указываете переменную $EXEDIR должен быть путь к файлу, который вы упаковываете в инсталлятор, т.е. с относительным путём к файлу скрипта с проектом, без переменных

wolkow70 17-09-2011 18:14 1754943

Почитал справку...Допустим, сделаю так:

IfFileExists "$EXEDIR\WinampSet.ini" 0 +3
CopyFiles /silent "$EXEDIR\WinampSet.ini" "$APPDATA\Winamp\WinampSet.ini"
Rename "$APPDATA\Winamp\WinampSet.ini" "$APPDATA\Winamp\Winamp.ini"

ЗЫ: СРАБОТАЛО!

kotkovets 17-09-2011 21:19 1755048

Цитата:

Цитата wolkow70
fFileExists "$EXEDIR\WinampSet.ini" 0 +3
CopyFiles /silent "$EXEDIR\WinampSet.ini" "$APPDATA\Winamp\WinampSet.ini"
Rename "$APPDATA\Winamp\WinampSet.ini" "$APPDATA\Winamp\Winamp.ini"
ЗЫ: СРАБОТАЛО! »

Чет вы плохо читали, лишнего накосячили :lol:, почему бы не так сразу, как говорится, через мозг и справку:
Код:

IfFileExists "$EXEDIR\WinampSet.ini" 0 +2
CopyFiles /silent "$EXEDIR\WinampSet.ini" "$APPDATA\Winamp\Winamp.ini"


sawe 18-09-2011 02:01 1755204

Автор программы Ангус Джонсон неоднократно заявлял, что не планирует продолжать Resource Hacker. Однако 16 сентября 2011 года программа вновь была обновлена, на этот раз до release-версии 3.6.0.92. В ней была добавлена поддержка иконок в формате .PNG.

Я тот-же её перевёл для себя Resource Hacker 3.6.0.92 Rus
Перезалил...
---

MaGoth 18-09-2011 21:53 1755657

sawe, Установил вашу версию сборки Resource Hacker'а, установщик малось наглючило от плагина скина. После завершения процесса установки вывело пустое окно инсталляции без какой либо инфы, с еррором скина. Закрывал инсталлер через убиение процесса в диспетчере задач.
Собственно вопрос, чем вам не угодил стандартный скин Нсис?! :dont-know

sawe 18-09-2011 23:02 1755716

Цитата:

Цитата MaGoth
Собственно вопрос, чем вам не угодил стандартный скин Нсис? »

Это прошлый век, серые унылые окна.....

MaGoth 22-09-2011 02:00 1757820

Народ, встрял с одной проблемой, и не могу ее разрешить.
Есть задача: при установке определить существует ли один из определенных файлов (этих файлов может быть много) в каталоге назначения, и если файл например А1. есть, то осуществить определенное дествие, если файла А1. нет, то проверить существует ли файл Б1, и т.д, как и в случае с файлом А1.
Т.е. в зависимости от наличия того или иного файла выполнить определенное действие.
Перепробовал кучу разных решений, ни одно толком не работает. Сейчас нашел одно, но при этом копируется сразу все, а не в зависимости от условия.

Вот пример этого кода:
Код:

[...]
;-------------------------------------------------------------------------------
Section one
[...]
IfFileExists "$G2ChPath\Speech_Wegelagerer_english.vdf" 0 Done
  Call A1
IfFileExists "$G2ChPath\Data\Speech_Wegelagerer_deutsch.vdf" 0 Done
  Call B1
Done:
SectionEnd
;-------------------------------------------------------------------------------
Section -two
  SectionIn RO
  SetOverwrite on
.NextP1:
 файлы для установки
[...]
SectionEnd
;-------------------------------------------------------------------------------
Section -three
  SectionIn RO
  SetOverwrite on
.NextA1:
 файлы для установки
[...]
SectionEnd
;-------------------------------------------------------------------------------
Function A1
  Goto .NextA1
FunctionEnd
;-------------------------------------------------------------------------------
Function P1
  Goto .NextP1
FunctionEnd
;-------------------------------------------------------------------------------
[...]

И так далее...

Кто что об этом думает ?!

kotkovets 22-09-2011 12:07 1758049

MaGoth
Ты забыл о последовательности исполнения команд в NSIS, а это очень важно!
Если, к примеру перейдем по каким-то причинам к глобальной метке .NextP1, то исполнение кода начнется с этой метки,
дальше по скрипту, следовательно будет исполняться весь код начиная с метки .NextP1
Цитата:

Цитата MaGoth
Кто что об этом думает ?! »

А че тут думать, если есть общие файлы, группируем в одной секции
Код:

Section "share"
  ;общие файлы для установки
  ;[...]
SectionEnd

Далее в секции one, делаем определение файлов и в зависимости
нахождения файла: копируем группу файлов - все делается последовательно!
Код:

Section "one"
  IfFileExists "$G2ChPath\Speech_Wegelagerer_english.vdf" 0 NextA1
  ;файлы для установки
  ;[...]
  NextA1:
  IfFileExists "$G2ChPath\Data\Speech_Wegelagerer_deutsch.vdf" 0 NextB1
  ;файлы для установки
  ;[...]
  NextB1:
  ;---
SectionEnd

А вот аналог на логической конструкции, для меня так удобнее...
Код:

Section "one"
  ${If} ${FileExists} "$G2ChPath\Speech_Wegelagerer_english.vdf"
  ;файлы для установки
  ;[...]
  ${ElseIf} ${FileExists} "$G2ChPath\Data\Speech_Wegelagerer_deutsch.vdf"
  ;файлы для установки
  ;[...]
  ${EndIf}
SectionEnd

На примере логической конструкции выше работает принцип: если найден один из указанных файлов - копируем группу файлов, остальные группы будут игнорироваться в любом случае.
Если нужно копировать несколько групп файлов (при нахождении указанных файлов) можно делать так:
Код:

Section "one"
  ${If} ${FileExists} "$G2ChPath\Speech_Wegelagerer_english.vdf"
  ;файлы для установки
  ;[...]
  ${EndIf}
  ${If} ${FileExists} "$G2ChPath\Data\Speech_Wegelagerer_deutsch.vdf"
  ;файлы для установки
  ;[...]
  ${EndIf}
SectionEnd


MaGoth 22-09-2011 14:11 1758120

kotkovets, Нет, это не прокатывает перепробовал разные варианты, вот пример:

Есть файл Ридми.тхт на диске, в зависимости от локализации в нем седьмая строка меняет значения:
1. Системные требования
1. Hardwarevoraussetzungen

Код:

Name "Cls Test"
OutFile "ClsTest.exe"
;-------------------------------------------------------------------------------
!include "TextFunc.nsh"
;-------------------------------------------------------------------------------
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "RUSSIAN" ;Russian
;-------------------------------------------------------------------------------
!insertmacro MUI_RESERVEFILE_LANGDLL
;-------------------------------------------------------------------------------
Var Lokalize
;-------------------------------------------------------------------------------
Section
${LineRead} "C:\ReadMe.txt" "7" $Lokalize
  MessageBox MB_ICONINFORMATION|MB_OK $Lokalize IDOK
  ${If} $Lokalize == "1. Системные требования"
  MessageBox MB_ICONINFORMATION|MB_OK $Lokalize IDOK
  Call LokA
  ${ElseIf} $Lokalize == "1. Hardwarevoraussetzungen"
  MessageBox MB_ICONINFORMATION|MB_OK $Lokalize IDOK
  Call LokB
  ${EndIf}
SectionEnd
;-------------------------------------------------------------------------------
Function LokA
  Goto .NextAk
FunctionEnd
;-------------------------------------------------------------------------------
Function LokB
  Goto .NextPb
FunctionEnd
;-------------------------------------------------------------------------------
Section -"one1"
.NextAk:
  MessageBox MB_ICONINFORMATION|MB_OK "Русификация" IDOK
SectionEnd
;-------------------------------------------------------------------------------
Section -"one2"
.NextPb:
  MessageBox MB_ICONINFORMATION|MB_OK "Немка" IDOK
SectionEnd


Причем, не зависимо от того как реализованы последние две секции, первый пример выше, а второй так:

Код:

Section -"one"
.NextAk:
  MessageBox MB_ICONINFORMATION|MB_OK "Русификация" IDOK
.NextPb:
  MessageBox MB_ICONINFORMATION|MB_OK "Немка" IDOK
SectionEnd

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

kotkovets 22-09-2011 15:41 1758178

Цитата:

Цитата MaGoth
kotkovets, Нет, это не прокатывает перепробовал разные варианты, вот пример: »

Я вообще не пишу скрипты по принципу "прокатывания" и тебе не советую.
Цитата:

Цитата MaGoth
Причем, не зависимо от того как реализованы последние две секции, первый пример выше, а второй так: »

А где последовательность действий, не вижу...Оно будет так работать!
секции всегда будут срабатывать, это очевидно! Во что за извращения с глобальными метками в функции с переходом в секции??????????
Пиши сразу код в вызываемой в функции, или под конструкцией.
И ты забыл очевидное, про непечатываемые символы(мессага их не показывает) - переходы на новую строку и т.д
По этому и логика твоя и не работала, а если бы логика работала и прыжок был
на метку .NextAk:, то секции one1 и one2 выполнялись в любом случае.
Пример на логике И-ИЛИ который прекрасно работает
Код:

Section ""
  ClearErrors
  ${LineRead} "C:\Files.txt" "1" $Lokalize
  ${Unless} ${Errors}
      ${If} `$Lokalize` == "1. Системные требования$\r$\n"
      ${OrIf} `$Lokalize` == "1. Системные требования$\n"
      ${OrIf} `$Lokalize` == "1. Системные требования"
        Call LokA
      ${EndIf}
      ${If} `$Lokalize` == "1. Hardwarevoraussetzungen$\r$\n"
      ${OrIf} `$Lokalize` == "1. Hardwarevoraussetzungen$\n"
      ${OrIf} `$Lokalize` == "1. Hardwarevoraussetzungen"
      Call LokB
      ${EndIf}
  ${Else}
      MessageBox MB_ICONINFORMATION|MB_OK "Файл не найден!" IDOK
  ${EndUnless}
SectionEnd

Function LokA
  MessageBox MB_ICONINFORMATION|MB_OK $Lokalize IDOK
FunctionEnd

Function LokB
  MessageBox MB_ICONINFORMATION|MB_OK $Lokalize IDOK
FunctionEnd


vahe-91 24-09-2011 11:13 1759268

не могу найти плагины для расаковки 7z и arc архивов, можете подсказать или отправить по пм ?

vahe-91 24-09-2011 13:16 1759315

kotkovets, спасибо

kotkovets 24-09-2011 13:20 1759318

Вложений: 1
vahe-91,
для аrc во вложении

sawe 24-09-2011 16:06 1759373

Поигрался с CallGetUserSID и обнаружил интересные положительные свойства этого макроса, ещё раз спасибо!

kotkovets 24-09-2011 16:43 1759394

Цитата:

Цитата sawe
обнаружил интересные положительные свойства этого макроса »

какие? эту "апишку" я знаю хорошо, к тому же в справочнике по NSIS, Примеры кодов->Определение SID пользователя,
в макросе я добавил чуть больше возможностей использовать потенциал этой апи функции.

Oleg48 27-09-2011 19:39 1761282

Дорогие товарищи помогите подчистить (подкорректировать, упростить) код:
Код:

!include "FileFunc.nsh"
!include "nsDialogs.nsh"
!include "winmessages.nsh"
!include "logiclib.nsh"

var dialog
var pass
var rezul

Function .onInit
  ${GetOptions} $CMDLINE "/PAS=" $1
  IfErrors +3  0
  StrCpy $rezul $1
  GoTo .Done
  FunctionEnd

Page custom fnCustomInit fnCustomDestroy

Function fnCustomInit
  nsDialogs::Create 1018
  Pop $dialog
  ${NSD_CreateText} 40% 20% 90u 12u $rezul
  Pop $pass
 ${if} $rezul == ""
 nsDialogs::Show
 ${endif}
 FunctionEnd

Function fnCustomDestroy
  ${NSD_GetText} $pass $rezul
  GoTo .Done
 FunctionEnd


Section "MainSection" SEC01
  .Done:
  ${ifnot}  $rezul == ПАРОЛЬ
      MessageBox MB_ICONSTOP "Неверный пароль !!!"
      Abort ; конец иницилизации
  ${endif}
  ...
SectionEnd

Писать скрипты на NSIS начал недавно, чаще всего использовал мастер, почти незадумывался о коде, вот решил его усовершенствовать.
Вашему вниманию представляю часть кода, принцип его работы такой: Запускаем программу. Если при запуске программы указываем ключ /PAS="пароль" , тогда если пароль правильный программа устанавливается без окна запроса пароля, если пароль неправильный то ничего непроисходит. Если при установке ключ /PAS неуказывается тогда пользователю предлогается ввести пароль в окошке, естественно при правильном пароле программа устанавливается, а при неправильном нет.
Писал этот код почти по наитию, методом проб и ошибок, поэтому строго несудите. Самому неочень нравится переходы на метки, считаю что это неочень правильно но по другому еще пока неумею. Буду рад любой помощи.

kotkovets 28-09-2011 00:55 1761487

Цитата:

Цитата Oleg48
Писать скрипты на NSIS начал недавно, чаще всего использовал мастер, почти незадумывался о коде »

Очень плохо, это очень мощный язык сценария, и сложный довольно для начинающих
Цитата:

Цитата Oleg48
Если при запуске программы указываем ключ /PAS="пароль" , тогда если пароль правильный программа устанавливается без окна запроса пароля, если пароль неправильный то ничего непроисходит »

Здесь вы упустили очень важный момент, при тихом режиме (с ключом /S) всегда будет установка,
поэтому тоже нужна еще проверка на флаг тихого режима.
Цитата:

Цитата Oleg48
неочень нравится переходы на метки, считаю что это неочень правильно »

Дикий код, но пойдет :) , накидал пример на логических конструкциях (на мой взгляд более правильный подход всегда использовать в скриптах, чем голые метки), пример на принципе если пароль неверен
вызываем функцию прерывания установки - просто и эффективно.
читать дальше »
Код:

!include "FileFunc.nsh"
!include "nsDialogs.nsh"
!include "winmessages.nsh"
!include "logiclib.nsh"

outfile test.exe
var dialog
var pass
var rezul

Page custom fnCustomInit fnCustomDestroy
Page InstFiles ;страничка устаноки

Function .onInit
  ClearErrors ;очищаем принудительно флаг ошибки для корректной отработки кода
  ${GetOptions} $CMDLINE "/PAS=" $rezul
  ${If} ${Silent}          ;функцию проверки пароля, запускаем, если тихий режим И
  ${AndIf} $rezul != ПАРОЛЬ ;неверный пароль, т.е логика И
      Call CheckPass
  ${EndIf}
  ClearErrors ;очищаем принудительно флаг ошибки для корректной отработки кода
FunctionEnd

Function fnCustomInit
  ${If} $rezul != ПАРОЛЬ ;если ключ правильный, то не показываем кастомную страничку, если не тихий режим.
      nsDialogs::Create 1018
      Pop $dialog
      ${NSD_CreateText} 83u 40u 90u 12u $rezul
      Pop $pass
      nsDialogs::Show
  ${EndIf}
FunctionEnd

Function fnCustomDestroy
  ${NSD_GetText} $pass $rezul
  ${If} $rezul != ПАРОЛЬ
      Call CheckPass
  ${EndIf}
FunctionEnd

Function CheckPass ;функция прерывания
    MessageBox MB_ICONSTOP "Неверный пароль !!!"
    Abort ; конец иницилизации
FunctionEnd

Section "MainSection" SEC01
    MessageBox MB_ICONINFORMATION|MB_OK "$rezul" IDOK
SectionEnd


Impeck 28-09-2011 08:13 1761554

Возникла необходимость в транслитерации.
Имеем в $0 "По умолчанию"
Нужно получить в $0 "Po umolchaniu"
а лучше в $0 "\x41f\x43e \x443\x43c\x43e\x43b\x447\x430\x43d\x438\x44e"

Такое можно сделать в NSIS?

kotkovets 28-09-2011 10:55 1761635

Цитата:

Цитата Impeck
Нужно получить в $0 "Po umolchaniu"
а лучше в $0 "\x41f\x43e \x443\x43c\x43e\x43b\x447\x430\x43d\x438\x44e"
Такое можно сделать в NSIS? »

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

Impeck 28-09-2011 13:31 1761743

kotkovets, спасибо, посмотрел плагин Registry, конвертирует немного не в то чего бы хотелось.

kotkovets 28-09-2011 14:02 1761756

Цитата:

Цитата Impeck
конвертирует немного не в то чего бы хотелось »

Можно разложить строку на символы в цикле, и заменять каждый символ,
Например с помощью команды поддерживающий 256 символов, пример в цикле, число=символ, матрица:
Код:

Section
  StrCpy $0 0
  Go:
    Intfmt $1 %c $0 ; в $1 символ соответствующий цифре
    DetailPrint "$0 = $1"
    InTop $0 $0 + 1 ;c каждым циклом увеличиваем на 1 $0
    StrCmp $0 256 End
    Goto Go
  End:
SectionEnd


Impeck 29-09-2011 07:34 1762191

Еще вопрос...
большая буква "А"=>"x0410"
маленькая буква "а"=>"x0430"

для
Код:

StrCmp $1 "а" 0 +2
StrCpy $1 "\x430"

регистр букв не важен.
Как-то можно это обойти?

kotkovets 29-09-2011 10:57 1762302

Цитата:

Цитата Impeck
регистр букв не важен.
Как-то можно это обойти? »

что обойти, забор, ограждение???

Impeck 29-09-2011 11:26 1762315

забор :)
Как различить регистр букв?

Код:

StrCmp $1 "а" 0 +2
StrCpy $1 "\x430"
StrCmp $1 "А" 0 +2
StrCpy $1 "\x410"

в $1 маленькая "а" будет.

kotkovets 29-09-2011 13:17 1762394

Цитата:

Цитата Impeck
Как различить регистр букв? »

StrcmpS
Очередное приближение, как вариант а :drug:
Код:

!include "MUI2.nsh"
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"
ShowInstDetails show
outfile testing.exe

Var char
Var conv_char
Var stroka_in
Var stroka_out

Section test
;эти команды препроцессора нужны для ускорения работы цикла
;чтобы в цикле не мельтешил прогресс бар!!!
;////////////////////////////
  Call :.whilefor_Next
  !ifndef whilefor
    !define whilefor
    Goto .whilefor_End
  !endif
  .whilefor_Next:
;/////////////////////////////

  StrCpy $0 0 ;отсчет от нулевого символа, c 192 символа начинается кирилица
 StrCpy $1 206 ;шифрование символа, т.е нулевой символ = \x206, 255символ = \x461
 
  StrCpy `$stroka_in` "абвгд"
  StrLen $2 `$stroka_in` ;вычисляем длину входной строки
  IntOp $2 $2 - 1
  ${DoUntil} $2 == -1 ;цикл если нулевая длина строки, то цикл не начнется!!!
    Intfmt $char "%c" $0 ; в $char символ соответствующий цифре
    Intfmt $conv_char "\x$1" $0 ;конвертируем символ в вид \xYYY
    InTop $1 $1 + 1
    ;-----------------------
    ;DetailPrint "[Номер символа: $0] -> $char = $conv_char" ;$char - символ строки, $conv_char - конвертированный символ строки
    ;-----------------------
    InTop $0 $0 + 1 ;c каждым циклом увеличиваем на 1 $0
    ${For} $R1 0 $2
        StrCpy $5 '$stroka_in' 1 $R1 ;в цикле разбиваем входную строку на один символ
        StrCmps $5 $char 0 +2 ;cравниваем символ учитывая регистр символа, это очень важно!
        StrCpy $stroka_out $stroka_out$conv_char
    ${Next}
  ${LoopUntil} $0 == 256 ;глобальный цикл на 256 символов строки
 
  ;/////////////////////////////
  Return
  .whilefor_End:
  ;/////////////////////////////
 
  DetailPrint "Входная строка: $stroka_in"
  DetailPrint "Закодированная строка: $stroka_out"
SectionEnd


Impeck 29-09-2011 14:32 1762434

То что нужно, спасибо огромное.

kotkovets 29-09-2011 14:46 1762444

Impeck,
Еще маленькая загвоздка, как известно NSIS хранит в переменной максимум 1024 символа
расширенная версия NSIS хранит максимум 8192 символа
(более подробно почитайте в справочнике по NSIS - > Расширенная версия NSIS
Так вот при конвертировании одного символа - конвертированный символ занимает 5 символов, при превышении максимального
хранения символов входной строки - будет обрезаться, т.е выходная строка будет обрезана до максимума хранения. ${NSIS_MAX_STRLEN}
Здесь очень выгодно использовать расширенную версию NSIS.

punsh 29-09-2011 21:38 1762668

как правильно

SetShellVarContext all
CreateDirectory "$APPDATA\Adobe\"
SetShellVarContext all
CopyFiles /SILENT "$EXEDIR\Data\Adobe\*.*" "$APPDATA\Adobe\"

или

SetShellVarContext all
CreateDirectory "$APPDATA\Adobe\"
CopyFiles /SILENT "$EXEDIR\Data\Adobe\*.*" "$APPDATA\Adobe\"

?

kotkovets 29-09-2011 22:19 1762693

Цитата:

Цитата punsh
как правильно »

Достаточно в один раз прописать в скрипте, чет вы не уверены, проверяйте, а потом вопрос задавайте...

wolkow70 02-10-2011 14:58 1764168

Товарищи, есть ли комманда автоматически поместить ярлык программы на панель задач для windows 7?

sawe 02-10-2011 15:32 1764189

Цитата:

Цитата wolkow70
есть ли комманда автоматически поместить ярлык программы на панель задач для windows 7 »

Переведи или объясни в какое место этой панели

wolkow70 02-10-2011 15:35 1764194

Цитата:

Цитата sawe
Переведи или объясни в какое место этой панели »

Куда помещаются ярлыки программ, место можно крайнее справа...


В Inno примерно так пишется (подсмотел в скрипте):

Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\PotPlayer"; Filename: "{app}\PotPlayerMini.exe"; WorkingDir: "{app}"; Check: "MakeQuickLaunchIcon"; BeforeInstall: "PinToTaskband ('{userappdata}\Microsoft\Internet Explorer\Quick Launch\PotPlayer.lnk')"; MinVersion: 0.0,6.01;

kotkovets 02-10-2011 16:09 1764219

Цитата:

Цитата wolkow70
есть ли комманда автоматически поместить ярлык программы на панель задач для windows 7? »

http://forum.oszone.net/post-1307991-2.html
Код:

  #помещаем ярлык к блокноту
  Exec `wscript.exe PinToTasckbar.vbs "$WINDIR\notepad.exe"`
  #если нужно удалить ярлык, запускаем еще раз


wolkow70 02-10-2011 16:18 1764231

kotkovets,
Других вариантов нет, без VBS?

kotkovets 02-10-2011 16:20 1764232

wolkow70, можно наверно через апи, а чем не устраивает "бейсик" ????

wolkow70 02-10-2011 16:28 1764237

Цитата:

Цитата kotkovets
чем не устраивает "бейсик" »

Тем, что я в нем ни --- не понимаю.

SetShellVarContext current
CreateShortCut "$QUICKLAUNCH\User Pinned\TaskBar\Daum PotPlayer.lnk" "$INSTDIR\PotPlayerMini.exe"

Как нибудь так не выйдет?


По такому адресу ярлыки нашел:

C:\Users\User\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar

kotkovets 02-10-2011 17:03 1764264

Цитата:

Цитата wolkow70
Тем, что я в нем ни --- не понимаю »

:) Запуск происходит такой: PinToTasckbar.vbs "Путь к приложению, к которому нужен ярлык"
Ярлык создается для текущего пользователя, кто запустил у того и будет ярлык.
Цитата:

Цитата wolkow70
CreateShortCut "$QUICKLAUNCH\User Pinned\TaskBar\Daum PotPlayer.lnk" "$INSTDIR\PotPlayerMini.exe"
Как нибудь так не выйдет? »

Нет!
1 запуск только от Vista и выше ОС
2. проверьте, где создается ярлык, и если он есть, то в деинсталляторе запускаем скрипт на удаление ярлыка.
папка: C:\Users\UserName\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar
ярлык: Имя заголовка приложение.lnk

wolkow70 02-10-2011 17:14 1764269

kotkovets,

При таком коде:
SetShellVarContext current
CreateShortCut "$QUICKLAUNCH\User Pinned\TaskBar\Daum PotPlayer.lnk" "$INSTDIR\PotPlayerMini.exe"
ярлык создался по адресу C:\Users\User\Application Data\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\Daum PotPlayer.lnk
Но, в панели он визуально не появился. Перезагрузил систему, но, ярлык так и не появился. Хотя, в папке с ярлыками он есть. Видимо, его в реестр надо еще прописать. Программа из этого ярлыка вручную запускается.

wolkow70 02-10-2011 17:55 1764297

Закрепленные ярлыки хранятся в реестре
HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ Taskband в двоичном коде...

MKN 03-10-2011 16:02 1764986

Подскажите пожалуйста, как на собственной кастомной странице реализовать выбор директории установки ?

В доке http://nsis.sourceforge.net/Docs/nsD...ctfolderdialog только одна строчка :
Цитата:

SelectFolderDialog
nsDialogs::SelectFolderDialog title initial_selection
и что с ней дальше делать ?
В примерах NSIS\Examples\nsDialogs\InstallOptions.nsi - нечто подходящеее, но реализованное , как я понял, через INI файл... Тоже не то...

kotkovets 03-10-2011 16:16 1764997

Цитата:

Цитата MKN
Подскажите пожалуйста, как на собственной кастомной странице реализовать выбор директории установки ? »

Все очень просто:
читать дальше »
Код:

!include "MUI2.nsh"

Page custom SelectDirectory Directory
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

Name "Winreview.ru"
OutFile "winreview.exe"
ShowInstDetails show

InstallDir "$PROGRAMFILES\Soft"

Var Dialog
Var Text
Var Button

Function SelectDirectory
    nsDialogs::Create 1018
    Pop $Dialog
    ${NSD_CreateText} 0 50u 240u 12u "$INSTDIR"
    Pop $Text
    ${NSD_CreateButton} 250u 50u 50u 13u "Выбор"
    Pop $Button
    ${NSD_OnClick} $Button Button
    nsDialogs::Show
FunctionEnd

Function Button
  Pop $Button
  nsDialogs::SelectFolderDialog "Выбор директории -=MKN=-" "$WINDIR"
  Pop `$INSTDIR`
  ${If} `$INSTDIR` != error
      ${NSD_SetText} $Text `$INSTDIR`
  ${EndIf}
FunctionEnd

Function Directory
  ${NSD_GetText} $Text `$INSTDIR`
  ${If} `$INSTDIR` == ""
    Abort
  ${EndIf}
FunctionEnd

Section
  MessageBox MB_OK "$INSTDIR" IDOK
SectionEnd


MKN 03-10-2011 16:35 1765012

Ещё такой вопрос : после редактировании ресурса NSIS\Contrib\UIs\modern.exe (размера окна) у меня посреди страницы
застряло начало BRANDING_а "Nuls.... " далеее обрыв. Где это дело находится, в каком ресурсе и как его устранить ?

Также интересует, возможно ли использовать два ресурса MUI для разных страниц - к примеру для кастомной -откорректированный modern.exe, а для прочих, родной modern.exe ?

kotkovets 03-10-2011 17:01 1765037

Цитата:

Цитата MKN
Где это дело находится, в каком ресурсе »

105 диалог, ID=1028
по умолчанию:
Код:

CONTROL "", 1028, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_DISABLED | WS_GROUP, 5, 188, 322, 8

sawe 03-10-2011 18:12 1765093

Цитата:

Цитата MKN
Также интересует, возможно ли использовать два ресурса MUI для разных страниц »

К сожалению нет или пока нет, можно только использовать примерно следующее:

читать дальше »

Код:

  !define MUI_UI "${NSISDIR}\Contrib\UIs\modern.exe" ;или "ваш_путь\modern.exe"
;и ещё
  !define MUI_HEADERIMAGE
  !define MUI_HEADERIMAGE_BITMAP "ваш_путь\Header.bmp"

; ваш изменённый при условии, что вы ранее объявили !define MUI_HEADERIMAGE и !define MUI_HEADERIMAGE_BITMAP
  !define MUI_UI_HEADERIMAGE "ваш_путь\modern_header.exe" ; только один 105 с вашими исправленными ID

; и немного вашей правки в функции для графики
  !define MUI_CUSTOMFUNCTION_GUIINIT myGUIInit ; объявить функцию для графики

Function myGUIInit
    GetDlgItem $0 $HWNDPARENT 1039 ; получить контрол
    System::Call 'User32::DestroyWindow(ir0)' ; придушить контрол

    GetDlgItem $R1 $HWNDPARENT 1037 ; получить контрол заглавия
  SetCtlColors $R1 0xFFFFFF transparent  ; установить цвет и прозрачность фона
    CreateFont $1 "Constantia" 16 700 /ITALIC ; установить свойства шрифта
    SendMessage $R1 ${WM_SETFONT} $1 0 ; отобразить

    GetDlgItem $R0 $HWNDPARENT 1256 ; получить контрол брендинга
  SetCtlColors $R0 0xABBFCE transparent  ; установить цвет и прозрачность фона
    CreateFont $1 "Arial" 8 10 ; установить свойства шрифта
    SendMessage $R0 ${WM_SETFONT} $1 0 ; отобразить

    ShowWindow $0 ${SW_SHOW} ; показать, что у вас там получилось
FunctionEnd


MKN 04-10-2011 08:52 1765429

kotkovets,

Несколько вопросов по кастомной странице :

Поясни пожалуйста назначение Function Directory в твоём примере. (И почему то без неё, выбор директории установки работает, а с ней - ругань при компиляции...)

И где в коде должна быть запись : Page custom SelectDirectory Directory ?
Ведь пользовательская страница уже создана записью типа : Page custom fnCustomInit fnCustomDestroy

Каким образом осуществляется зависимое (ИЛИ-ИЛИ) переключение чекбоксов (двух и более) в коде кастомной страницы ?

Почему при создании GroupBox имеем только надпись над группой, а не сам чекбокс, как при создании на обычной странице,(отключающий\включающий все чекбоксы, входящие в группу) ? Что для этого надо сделать ?

Как реализовать отметку всех имеющихся на странице чекбоксов при помощи одной (или двух ?) кнопки ?
Т.е. имеется несколько десятков чекбоксов (в группах в том числе). Нажал кнопку - все отмечены. Ещё раз нажал (или нажал вторую кнопку ?) - отметки сняты.

kotkovets 04-10-2011 10:39 1765486

Цитата:

Цитата MKN
И где в коде должна быть запись : Page custom SelectDirectory Directory »

В начале кода, где идет объявление страниц..
Page custom pre post
pre - имя функции[Функция которая будет выполнена при выполнении своей странички]
post - имя функции[Функция которая будет выполнена при закрытии странички]
Таким образом можно объявлять множесто своих страничек, эти странички
и команды, функции в страничках - не работают при тихом режиме.
Цитата:

Цитата MKN
Каким образом осуществляется зависимое (ИЛИ-ИЛИ) переключение чекбоксов (двух и более) в коде кастомной страницы ? »

Если ты имеешь в виду чекбоксы - то такое переключение сложно в реализации.
Флажок-точка(радиобутоны) - системные контролы, зависимое переключение получается через системные ресурсы
Если радиобутонов много, можно объединить в свои группы переключений.
http://nsis.sourceforge.net/NsDialogs_FAQ (How to create two groups of RadioButtons)
Цитата:

Цитата MKN
Как реализовать отметку всех имеющихся на странице чекбоксов при помощи одной (или двух ?) кнопки ?
Т.е. имеется несколько десятков чекбоксов (в группах в том числе). Нажал кнопку - все отмечены. Ещё раз нажал (или нажал вторую кнопку ?) - отметки сняты. »

Нужно реализовавать функции обработки событий. В справочнике по NSIS рассказано как это делать.
http://nsis.sourceforge.net/NsDialogs_FAQ
nsDialogs::OnClick [хэндл контрола] [имя функции]
Определять статусы контролов, как первоначальные, так при обработке событий
${NSD_SetState} [хэндл контрола] 1 - статус отмеченный, 0 - наоборот
В функции, которая будет выполнена при закрытии странички удобно снимать статусы чекбоксов, радиобутонов
${NSD_GetState} [хэндл контрола] $var
$var = 0 -> чекбокс, радиобутон не отмечен, 1 -> наоборот

kotkovets 04-10-2011 13:07 1765565

MKN, Пример к всему вышесказанному, будет полезно всем:
читать дальше »
Код:

!include "MUI2.nsh"

Page Custom pre post
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE Russian
OutFile "test.exe"
ShowInstDetails show

var dialog
var RadioButton1
var RadioButton2
var RadioButton3
var RadioButton4

var CheckBox1
var CheckBox2
var CheckBox3
var CheckBox4

var Check1
var Check2
var Check3
var Check4

var rButton1
var rButton2
var rButton3
var rButton4

var Button
var Button1

Function pre
  nsDialogs::Create 1018
  Pop $dialog
        ${NSD_CreateRadioButton} 0 0 40% 6% "Группа_1, Радио_1"
                Pop $RadioButton1
        ${NSD_SetState} $RadioButton1 1 ;Группа_1, радио_1 при показе странички, делаем отмеченным
        ${NSD_CreateRadioButton} 0 12% 40% 6% "Группа_1, Радио_2"
                Pop $RadioButton2
                ${NSD_AddStyle} $RadioButton1 ${WS_GROUP} ;определяем группу переключений 1
        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        ${NSD_CreateRadioButton} 50% 0 40% 6% "Группа_2, Радио_1"
                Pop $RadioButton3
        ${NSD_SetState} $RadioButton3 1 ;Группа_2, радио_1 при показе странички, делаем отмеченным
        ${NSD_CreateRadioButton} 50% 12% 40% 6% "Группа_2, Радио_2"
                Pop $RadioButton4
                ${NSD_AddStyle} $RadioButton3 ${WS_GROUP} ;определяем группу переключений 2
        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        ${NSD_CreateButton} 40u 40u 140u 15u `Кнопка переключений радиобутонов`
                Pop $Button
        ${NSD_OnClick} $Button ButtonClick
        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        ${NSD_CreateCheckBox} 0 65u 56u 12u "Чебокс_1"
              Pop $CheckBox1
        ${NSD_CreateCheckBox} 0 85u 56u 12u "Чебокс_2"
              Pop $CheckBox2
        ${NSD_CreateCheckBox} 150u 65u 56u 12u "Чебокс_3"
              Pop $CheckBox3
        ${NSD_CreateCheckBox} 150u 85u 56u 12u "Чебокс_4"
              Pop $CheckBox4
          ;все чебоксы отмечены
        ${NSD_SetState} $CheckBox1 1
        ${NSD_SetState} $CheckBox2 1
        ${NSD_SetState} $CheckBox3 1
        ${NSD_SetState} $CheckBox4 1
        ${NSD_CreateButton} 40u 105u 140u 15u `Кнопка переключений чекбоксов`
              Pop $Button1
        ${NSD_OnClick} $Button1 ButtonClickCheckBox
    nsDialogs::Show
FunctionEnd

Function ButtonClick ;функция обработки события нажатия кнопки
  Pop $Button
  ${NSD_GetState} $RadioButton1 $rButton1
  ${NSD_GetState} $RadioButton2 $rButton2
  ${NSD_GetState} $RadioButton3 $rButton3
  ${NSD_GetState} $RadioButton4 $rButton4
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;Логика И-ИЛИ для группы 1
  ${If} $rButton1 == 1
  ${AndIf} $rButton2 == 0
      ${NSD_SetState} $RadioButton1 0
      ${NSD_SetState} $RadioButton2 1
  ${Else}
      ${NSD_SetState} $RadioButton1 1
      ${NSD_SetState} $RadioButton2 0
  ${EndIf}
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;Логика И-ИЛИ для группы 2
  ${If} $rButton3 == 1
  ${AndIf} $rButton4 == 0
      ${NSD_SetState} $RadioButton3 0
      ${NSD_SetState} $RadioButton4 1
  ${Else}
      ${NSD_SetState} $RadioButton3 1
      ${NSD_SetState} $RadioButton4 0
  ${EndIf}
FunctionEnd

Function ButtonClickCheckBox
  Pop $Button1
  ;снимаем статусы чекбоксов:
  ${NSD_GetState} $CheckBox1 $Check1
  ${NSD_GetState} $CheckBox2 $Check2
  ${NSD_GetState} $CheckBox3 $Check3
  ${NSD_GetState} $CheckBox4 $Check4
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;Логика ИЛИ-ИЛИ для чекбоксов
  ${If} $Check1 == 1
  ${Orif} $Check2 == 1
  ${Orif} $Check3 == 1
  ${Orif} $Check4 == 1
        ${NSD_SetState} $CheckBox1 0
        ${NSD_SetState} $CheckBox2 0
        ${NSD_SetState} $CheckBox3 0
        ${NSD_SetState} $CheckBox4 0
  ${Else}
        ${NSD_SetState} $CheckBox1 1
        ${NSD_SetState} $CheckBox2 1
        ${NSD_SetState} $CheckBox3 1
        ${NSD_SetState} $CheckBox4 1
  ${EndIf}
FunctionEnd

Function post
  ;снимаем статусы радибутонов:
  ${NSD_GetState} $RadioButton1 $rButton1
  ${NSD_GetState} $RadioButton2 $rButton2
  ${NSD_GetState} $RadioButton3 $rButton3
  ${NSD_GetState} $RadioButton4 $rButton4
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;снимаем статусы чекбоксов:
  ${NSD_GetState} $CheckBox1 $Check1
  ${NSD_GetState} $CheckBox2 $Check2
  ${NSD_GetState} $CheckBox3 $Check3
  ${NSD_GetState} $CheckBox4 $Check4
FunctionEnd

Section ""
  DetailPrint "состояние Чебокс_1 == $Check1"
  DetailPrint "состояние Чебокс_2 == $Check2"
  DetailPrint "состояние Чебокс_3 == $Check3"
  DetailPrint "состояние Чебокс_4 == $Check4"
  DetailPrint "========================================"
  DetailPrint "========================================"
  DetailPrint "состояние Группа_1, Радио_1 == $rButton1"
  DetailPrint "состояние Группа_1, Радио_2 == $rButton2"
  DetailPrint "состояние Группа_2, Радио_1 == $rButton3"
  DetailPrint "состояние Группа_2, Радио_2 == $rButton4"
SectionEnd


MKN 04-10-2011 17:57 1765787

Что то не вышло использовать для $INSTDIR (InstallDir "$SysDrive:\App") переменную системного диска по способу
StrCpy $SysDrive $WINDIR 2 в Function .onInit.
Есть ли какие иные способы для $INSTDIR ?

зы А почему собственно в NSIS нет переменной системного диска ?

kotkovets 04-10-2011 18:21 1765812

Цитата:

Цитата MKN
зы А почему собственно в NSIS нет переменной системного диска ? »

А зачем, если есть системные???
Почитай синтаксис StrCpy - очень полезно для разбора строк, советую!
открываем справку по nsis -> Перевод справки NSIS -> ExpandEnvStrings
В справке почти все есть, для создания среднестатического дистрибутива!
Код:


 Function .OnInit
  ExpandEnvStrings $INSTDIR "%SYSTEMDRIVE%\App"
FunctionEnd

InstallDir "$INSTDIR"

Красиво и со вкусом!

MKN 05-10-2011 09:34 1766232

Подскажите , как решить такую задачу :
Создал прогресс бар на кастомной странице :
Код:

Var ProgressBar1
${NSD_CreateProgressBar} координаты-размеры ""
Pop $ProgressBar1

А как заставить его "действовать", т.е. отображать реальный ход установки, после клика на "Установить" ?
В примерах всюду какой то Timer применяют... Или это для демонстрационной автономной "презентации" ?

ps Хорошо бы дополнить справочник по NSIS, в разделе кастомные страницы, расширенным описанием и конкретными примерами для разных вариантов установок. А то сейчас по этому вопросу, информации обзорна и крайне скупа...

kotkovets 05-10-2011 10:49 1766308

Цитата:

Цитата MKN
А как заставить его "действовать", т.е. отображать реальный ход установки, после клика на "Установить" ? »

После каждой команды изменяем позицию прогресса на 10%
и снимаем позицию бара - помещаем текст позиции над баром.
Код:

SendMessage $PROGBAR ${PBM_SETPOS} 0 10
SendMessage $PROGBAR ${PBM_GETPOS} 0 0 $1
${NSD_SetText} $Text $1%

Код:

!include LogicLib.nsh
!include nsDialogs.nsh

Name "nsDialogs Timer Example"
OutFile "nsDialogs Timer Example.exe"
XPStyle on

Var DIALOG
Var TEXT
Var PROGBAR
Var Button

Page custom nsDialogsPage

Function CreateFile
        Pop $Button
        FileOpen $4 text.txt a
       
          SendMessage $PROGBAR ${PBM_GETPOS} 0 0 $1
        SendMessage $PROGBAR ${PBM_SETPOS} 0 0
        ${NSD_SetText} $Text $1%
        FileWrite $4 "${__FUNCTION__} $1$\r$\n"
       
        Sleep 500 ;пауза для наглядности
        SendMessage $PROGBAR ${PBM_DELTAPOS} 10 0
        SendMessage $PROGBAR ${PBM_GETPOS} 0 0 $1
        ${NSD_SetText} $Text $1%
        FileWrite $4 "${__FUNCTION__} $1$\r$\n"
       
        Sleep 500 ;пауза для наглядности
        SendMessage $PROGBAR ${PBM_DELTAPOS} 10 0
        SendMessage $PROGBAR ${PBM_GETPOS} 0 0 $1
        ${NSD_SetText} $Text $1%
        FileWrite $4 "${__FUNCTION__} $1$\r$\n"
       
        Sleep 500 ;пауза для наглядности
        SendMessage $PROGBAR ${PBM_DELTAPOS} 10 0
        SendMessage $PROGBAR ${PBM_GETPOS} 0 0 $1
        ${NSD_SetText} $Text $1%
        FileWrite $4 "${__FUNCTION__} $1$\r$\n"
       
        Sleep 500 ;пауза для наглядности
        SendMessage $PROGBAR ${PBM_DELTAPOS} 10 0
        SendMessage $PROGBAR ${PBM_GETPOS} 0 0 $1
        ${NSD_SetText} $Text $1%
        FileWrite $4 "${__FUNCTION__} $1$\r$\n"
       
        Sleep 500 ;пауза для наглядности
        SendMessage $PROGBAR ${PBM_DELTAPOS} 10 0
        SendMessage $PROGBAR ${PBM_GETPOS} 0 0 $1
        ${NSD_SetText} $Text $1%
        FileWrite $4 "${__FUNCTION__} $1$\r$\n"
       
        Sleep 500 ;пауза для наглядности
        SendMessage $PROGBAR ${PBM_DELTAPOS} 10 0
        SendMessage $PROGBAR ${PBM_GETPOS} 0 0 $1
        ${NSD_SetText} $Text $1%
        FileWrite $4 "${__FUNCTION__} $1$\r$\n"
       
        Sleep 500 ;пауза для наглядности
        SendMessage $PROGBAR ${PBM_DELTAPOS} 10 0
        SendMessage $PROGBAR ${PBM_GETPOS} 0 0 $1
        ${NSD_SetText} $Text $1%
        FileWrite $4 "${__FUNCTION__} $1$\r$\n"
       
        Sleep 500 ;пауза для наглядности
        SendMessage $PROGBAR ${PBM_DELTAPOS} 10 0
        ${NSD_SetText} $Text $1%
        FileWrite $4 "${__FUNCTION__} $1$\r$\n"
       
        Sleep 500 ;пауза для наглядности
        SendMessage $PROGBAR ${PBM_DELTAPOS} 10 0
        SendMessage $PROGBAR ${PBM_GETPOS} 0 0 $1
        ${NSD_SetText} $Text $1%
        FileWrite $4 "${__FUNCTION__} $1$\r$\n"
       
        Sleep 500 ;пауза для наглядности
        SendMessage $PROGBAR ${PBM_DELTAPOS} 10 0
        SendMessage $PROGBAR ${PBM_GETPOS} 0 0 $1
        ${NSD_SetText} $Text $1%
        FileWrite $4 "${__FUNCTION__} $1$\r$\n"
        FileClose $4
       
        MessageBox MB_OK "Файл успешно создан!" IDOK
FunctionEnd

Function nsDialogsPage
        nsDialogs::Create 1018
        Pop $DIALOG
        ${NSD_CreateLabel} 0u 0u 100% 9u ""
        Pop $TEXT
        ${NSD_CreateProgressBar} 0u 10u 100% 12u "99"
        Pop $PROGBAR
        ${NSD_CreateButton} 90u 70u 70u 12u "Создать файл"
        Pop $Button
        ${NSD_OnClick} $Button CreateFile
        nsDialogs::Show
FunctionEnd

Section
SectionEnd


sawe 05-10-2011 14:46 1766516

То есть, можно сделать и обратное продвижение бара?

MKN 05-10-2011 15:19 1766543

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

А как быть , если на этой странице уже есть куча чекбоксов, с поставленной для них задачей, исходя из их состояния ?
А задача эта будет выполнена так, как уже указано в Function fnCustomDestroy (причём после закрытия страницы, т.е после нажатия стандартной кнопки "Установить")...

А если надо, чтобы задачи связанные с состоянием чекбоксов, были выполнены при нажатии кнопки "Создать файл" (Или всё таки можно при нажатии кнопки "Установить" ?) с индикацией прогресс баром, при открытой странице ?
Получается надо как то перестроить все действия ? Как ?

kotkovets 05-10-2011 15:29 1766547

Цитата:

Цитата sawe
То есть, можно сделать и обратное продвижение бара? »

Все что угодно..
Пример использования таймера - системный цикл, который порождает отдельный поток основной программы, "многопоточное приложение",
на примере таймер обновляет время частотой в 200 миллисекунд
читать дальше »
Код:

!include LogicLib.nsh
!include nsDialogs.nsh

Name "nsDialogs Timer Example"
OutFile "nsDialogs Timer Example.exe"
XPStyle on

Var DIALOG
Var TEXT

Page custom nsDialogsPage

Function Time
      System::Alloc 1024
      Pop $0
      System::Call "kernel32::GetTimeFormat(i0,i0,i0,i0,ir0,i1024)"
      System::Call "*$0(&t1024.r1)"
      System::Free $0
      ${NSD_SetText} $TEXT $1
FunctionEnd

Function nsDialogsPage
        nsDialogs::Create 1018
        Pop $DIALOG
            System::Alloc 1024
            Pop $0
            System::Call "kernel32::GetTimeFormat(i0,i0,i0,i0,ir0,i1024)"
            System::Call "*$0(&t1024.r1)"
            System::Free $0
        ${NSD_CreateLabel} 80u 40u 140u 59u ""
        Pop $TEXT
        CreateFont $1 "Times New Roman" "19" "700"
        SendMessage $TEXT ${WM_SETFONT} $1 1

        ${NSD_SetText} $TEXT $1
        ${NSD_CreateTimer} Time 200
        nsDialogs::Show
FunctionEnd

Section
SectionEnd



Цитата:

Цитата MKN
(Или всё таки можно при нажатии кнопки "Установить" ?) »

А чет ты привязался к кнопке установить? Мы работаем с кастомными страничками, стандартная страничка установки отбой! по логике,работаем с баром своим, подумай по чему!
Создаем еще страничку свою с прогрессом, типа нажали кнопку, неужели так трудно подумать и включить мозг :) и конечная стандартная страничка финиша........

sawe 05-10-2011 16:59 1766631

Цитата:

Цитата kotkovets
Все что угодно..
Пример использования таймера - системный цикл »

Нет, я имел виду продвижение полосы бара, но только справа на лева (задом на перёд)

kotkovets 05-10-2011 17:43 1766663

Цитата:

Цитата sawe
Нет, я имел виду продвижение полосы бара, но только справа на лева (задом на перёд) »

читать дальше »
Код:

!include LogicLib.nsh
!include nsDialogs.nsh

Name "nsDialogs Timer Example"
OutFile "nsDialogs Timer Example.exe"
XPStyle on

Var DIALOG
Var TEXT
Var PROGBAR
Var Button

Page custom nsDialogsPage

Function CreateFile
      Pop $Button
      SendMessage $PROGBAR ${PBM_SETPOS} 0 0
      SendMessage $PROGBAR ${PBM_GETPOS} 0 0 $1
      ${NSD_SetText} $Text $1%
     
      ${ForEach} $1 0 100 + 10
            Sleep 300 ;пауза для наглядности
            SendMessage $PROGBAR ${PBM_DELTAPOS} 10 0
            SendMessage $PROGBAR ${PBM_GETPOS} 0 0 $1
            ${NSD_SetText} $Text $1%
      ${Next}
     
      ${ForEach} $1 100 0 - 10
            Sleep 300 ;пауза для наглядности
            SendMessage $PROGBAR ${PBM_DELTAPOS} -10 0
            SendMessage $PROGBAR ${PBM_GETPOS} 0 0 $1
            ${NSD_SetText} $Text $1%
      ${Next}
FunctionEnd

Function nsDialogsPage
        nsDialogs::Create 1018
        Pop $DIALOG
        ${NSD_CreateLabel} 0u 0u 100% 9u ""
        Pop $TEXT
        ${NSD_CreateProgressBar} 0u 10u 100% 12u "99"
        Pop $PROGBAR
        ${NSD_CreateButton} 90u 70u 70u 12u "Запуск"
        Pop $Button
        ${NSD_OnClick} $Button CreateFile
        nsDialogs::Show
FunctionEnd

Section
SectionEnd


MKN специально для тебя :)
читать дальше »
Код:

!include MUI2.nsh

Name "nsDialogs Timer Example"
OutFile "nsDialogs Timer Example.exe"
XPStyle on

Var DIALOG
Var TEXT
Var PROGBAR
Var Label
Var CheckBox
Var Check


Page custom nsDialogsPage nsDialogsPageDestroy
Page custom nsInstall
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "Russian"

Function nsDialogsPage
    nsDialogs::Create 1018
    ${NSD_CreateLabel} 50u 0u 270u 25u \
                      "$\tДобро Пожаловать!$\nотметьте чекбокс для продолжения!"
    Pop $Label
    CreateFont $1 "Times New Roman" "13" "700"
    SendMessage $Label ${WM_SETFONT} $1 1
    Pop $Label
    ${NSD_CreateCheckBox} 50u 30u 80u 13u "создать файл"
    Pop $CheckBox
    nsDialogs::Show
FunctionEnd

Function nsDialogsPageDestroy
 ${NSD_GetState} $CheckBox $Check
FunctionEnd

Function nsInstall
      ${IfThen} $Check != 1 ${|} Return ${|}
      nsDialogs::Create 1018
      Pop $DIALOG
      ${NSD_CreateLabel} 0u 0u 100% 9u ""
      Pop $TEXT
      ${NSD_CreateProgressBar} 0u 10u 100% 12u "99"
      Pop $PROGBAR
      ${NSD_CreateTimer} CreateFile 1
      nsDialogs::Show
FunctionEnd

Function CreateFile
      ${NSD_KillTimer} CreateFile
        FileOpen $4 text.txt a

          SendMessage $PROGBAR ${PBM_GETPOS} 0 0 $1
        SendMessage $PROGBAR ${PBM_SETPOS} 0 0
        ${NSD_SetText} $Text $1%
        FileWrite $4 "${__FUNCTION__} $1$\r$\n"

        Sleep 500 ;пауза для наглядности
        SendMessage $PROGBAR ${PBM_DELTAPOS} 10 0
        SendMessage $PROGBAR ${PBM_GETPOS} 0 0 $1
        ${NSD_SetText} $Text $1%
        FileWrite $4 "${__FUNCTION__} $1$\r$\n"

        Sleep 500 ;пауза для наглядности
        SendMessage $PROGBAR ${PBM_DELTAPOS} 10 0
        SendMessage $PROGBAR ${PBM_GETPOS} 0 0 $1
        ${NSD_SetText} $Text $1%
        FileWrite $4 "${__FUNCTION__} $1$\r$\n"

        Sleep 500 ;пауза для наглядности
        SendMessage $PROGBAR ${PBM_DELTAPOS} 10 0
        SendMessage $PROGBAR ${PBM_GETPOS} 0 0 $1
        ${NSD_SetText} $Text $1%
        FileWrite $4 "${__FUNCTION__} $1$\r$\n"

        Sleep 500 ;пауза для наглядности
        SendMessage $PROGBAR ${PBM_DELTAPOS} 10 0
        SendMessage $PROGBAR ${PBM_GETPOS} 0 0 $1
        ${NSD_SetText} $Text $1%
        FileWrite $4 "${__FUNCTION__} $1$\r$\n"

        Sleep 500 ;пауза для наглядности
        SendMessage $PROGBAR ${PBM_DELTAPOS} 10 0
        SendMessage $PROGBAR ${PBM_GETPOS} 0 0 $1
        ${NSD_SetText} $Text $1%
        FileWrite $4 "${__FUNCTION__} $1$\r$\n"

        Sleep 500 ;пауза для наглядности
        SendMessage $PROGBAR ${PBM_DELTAPOS} 10 0
        SendMessage $PROGBAR ${PBM_GETPOS} 0 0 $1
        ${NSD_SetText} $Text $1%
        FileWrite $4 "${__FUNCTION__} $1$\r$\n"

        Sleep 500 ;пауза для наглядности
        SendMessage $PROGBAR ${PBM_DELTAPOS} 10 0
        SendMessage $PROGBAR ${PBM_GETPOS} 0 0 $1
        ${NSD_SetText} $Text $1%
        FileWrite $4 "${__FUNCTION__} $1$\r$\n"

        Sleep 500 ;пауза для наглядности
        SendMessage $PROGBAR ${PBM_DELTAPOS} 10 0
        ${NSD_SetText} $Text $1%
        FileWrite $4 "${__FUNCTION__} $1$\r$\n"

        Sleep 500 ;пауза для наглядности
        SendMessage $PROGBAR ${PBM_DELTAPOS} 10 0
        SendMessage $PROGBAR ${PBM_GETPOS} 0 0 $1
        ${NSD_SetText} $Text $1%
        FileWrite $4 "${__FUNCTION__} $1$\r$\n"

        Sleep 500 ;пауза для наглядности
        SendMessage $PROGBAR ${PBM_DELTAPOS} 10 0
        SendMessage $PROGBAR ${PBM_GETPOS} 0 0 $1
        ${NSD_SetText} $Text $1%
        FileWrite $4 "${__FUNCTION__} $1$\r$\n"
        FileClose $4
       
FunctionEnd

Section
SectionEnd


yyv 05-10-2011 19:49 1766754

Добрый день
нужен совет в таком деле.
используем кастомные странички и кастомный UI.exe
хочется на кастомных страничках, рядом со стандартными кнопками.
Я "ресхаком" растянул диалог 1018 на все окно и теперь соответственно стандартных кнопок не видно.
точнее он становятся видимыми, когда в тех местах, где они должны быть, поводить мышкой.
пробовал кнопки "опустить ниже" не знаю как объяснить. Что бы он были как бы на переднем плане.
не помогает.
пробовал в скрипте прописывать, что он видимые
что то типа
ShowWindow .... ${SW_HIDE}
результат тот же
подскажите, можно ли диалог 1018 растянуть на все окно и что-бы стандартные кнопки при этом были видимыми?

sawe 05-10-2011 20:30 1766765

1018 и 1044 имеют похожий размер но используются по разному.
1044 для окна Приветствия и Финального
1018 для всех остальных.
Можете создать свой любой другой контрол, к примеру 1304 и растягивать его как вам угодно,
но учтите, что один контрол может перекрывать другой, здесь последовательность очень важна.
Мало того, вы можете добавить графику
CONTROL "", 1304, STATIC, SS_BITMAP | WS_CHILD | WS_VISIBLE, 0, 0, 332, 222

Чтобы рисунок заполнял всё окно, без просветов, мона даже нуна так
CONTROL "", 1304, STATIC, SS_BITMAP | WS_CHILD | WS_VISIBLE, 65534, 65534, 334, 224

Но всё это можно сделать и по другому не трогая форму а вставить соответствующий макрос в скрипт

--

yyv 05-10-2011 21:30 1766805

Цитата:

Цитата sawe
Можете создать свой любой другой контрол, к примеру 1304 и растягивать его как вам угодно,
но учтите, что один контрол может перекрывать другой, здесь последовательность очень важна. »

так какая разница?
я могу растянуть 1018 использовать его так?
но когда растягиваю то получаю не то что надо.
те кнопки есть но они появляются когда там мышкой проведешь....
при этом, как и писал ранее я кнопки переместил в ресхаке
сначала 1018, потом кнопки
и в ресхаке их видно
вроде все логично
скорее всего я что-то не так делаю...хз...

kotkovets 05-10-2011 22:20 1766834

yyv, А вот чем не устраивает 1044....
читать дальше »
Код:

!include "MUI2.nsh"
Page custom nsDialogsPage
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"
Name "nsDialogs Timer Example"
OutFile "nsDialogs Example.exe"
Var DIALOG

Function HideControls
    LockWindow on
    GetDlgItem $0 $HWNDPARENT 1028
    ShowWindow $0 ${SW_HIDE}
    GetDlgItem $0 $HWNDPARENT 1256
    ShowWindow $0 ${SW_HIDE}
    GetDlgItem $0 $HWNDPARENT 1035
    ShowWindow $0 ${SW_HIDE}
    GetDlgItem $0 $HWNDPARENT 1037
    ShowWindow $0 ${SW_HIDE}
    GetDlgItem $0 $HWNDPARENT 1038
    ShowWindow $0 ${SW_HIDE}
    GetDlgItem $0 $HWNDPARENT 1039
    ShowWindow $0 ${SW_HIDE}
    GetDlgItem $0 $HWNDPARENT 1045
    ShowWindow $0 ${SW_HIDE}
    LockWindow off
FunctionEnd

Function ShowControls
    LockWindow on
    GetDlgItem $0 $HWNDPARENT 1028
    ShowWindow $0 ${SW_NORMAL}
    GetDlgItem $0 $HWNDPARENT 1256
    ShowWindow $0 ${SW_NORMAL}
    GetDlgItem $0 $HWNDPARENT 1035
    ShowWindow $0 ${SW_NORMAL}
    GetDlgItem $0 $HWNDPARENT 1037
    ShowWindow $0 ${SW_NORMAL}
    GetDlgItem $0 $HWNDPARENT 1038
    ShowWindow $0 ${SW_NORMAL}
    GetDlgItem $0 $HWNDPARENT 1039
    ShowWindow $0 ${SW_NORMAL}
    GetDlgItem $0 $HWNDPARENT 1045
    ShowWindow $0 ${SW_NORMAL}
    LockWindow off
FunctionEnd

Function nsDialogsPage
        nsDialogs::Create 1044
        Pop $DIALOG
       
        Call HideControls
        nsDialogs::Show
        Call ShowControls
FunctionEnd

Section
SectionEnd


sawe 05-10-2011 22:28 1766841

Цитата:

Цитата yyv
так какая разница?
я могу растянуть 1018 использовать его так? »

Вы бы лучше объяснили, что вы хотите в конце получить!
Я немного догадываюсь, что вы хотите сделать, вы можете поступить немного иначе.....

Может вам проще будет использовать SpiderBanner плагин, он примерно в стиле MSI.
Он автоматом скрывает окно NSIS на время выполнения, после окно NSIS восстанавливается.

yyv 06-10-2011 14:53 1767336

Я наверное действительно плохо объясняю. попробую еще раз
вот код 105 диалога из ресхака

читать дальше »
Код:

105 DIALOGEX 0, 0, 440, 285
STYLE DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION ""
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
FONT 8, "MS SHELL DLG"
{
  CONTROL "", 1018, STATIC, SS_LEFT | WS_CHILD, 0, 0, 440, 265
  CONTROL "", 1044, STATIC, SS_LEFT | WS_CHILD, 0, 0, 440, 266
  CONTROL "", 1256, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 8, 260, 96, 15
  CONTROL "", 1028, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 8, 260, 97, 15
  CONTROL "", 3, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 281, 258, 67, 18
  CONTROL "", 1, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 362, 258, 67, 18
  CONTROL "", 2, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 116, 258, 67, 18
}



не суть важно, буду я рисовать в 1018 или в 1044 контроле. результат везде один и тот же.
сейчас, к примеру, я использовал контрол 1044
я его растянул не на весь диалог, а на середину кнопок, чтобы было более наглядно.
вот скрины
на этом

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

это состояние кнопки после того как на ней поводить мышкой, она появляться.
мне нужно, что бы контрол был растянут на весь диалог. И что бы стандартные кнопки при этом был видны сразу.

пробовал разные сочетания этих конструкций
Код:


GetDlgItem $R2 $HWNDPARENT 1 
 EnableWindow $R2 1 
ShowWindow $R2 ${SW_SHOW}
 ShowWindow $R2 ${SW_NORMAL}

результат такой же
если что-то еще не понятно, спрашиваете, попытаюсь объяснить.

kotkovets 06-10-2011 16:04 1767431

yyv, Я все прекрасно понял, что вы хотите! поэтому предложил 1044 в своем примере
Вы не добьетесь желаемого результата стандартными средствами NSIS, для этого есть плагины
или написать свой плагин, коль разбираетесь в языках программирования, хотя не факт,
каким то образом можно сделать плагином system -
входящий в комплект стандартной поставки NSIS - вызовами WinAPI.
Я имею ввиду, 1044 растянуть до кнопок, а на поверх кнопок, наложить фоновую картинку
под цвет основного фона, примерно как это сделано в ExperienceUI
и за одно можно наложить текстуру кнопок под цвет фона - есть такой плагин на офф.сайте

yyv 06-10-2011 16:44 1767475

kotkovets, дело в том, что мне нужно не просто растянуть контрлол на весь диалог, а мне нужна возможность рисовать необходимые мне элементы в нижней части.
например добавить чекбокс между кнопками
или возле кнопки добавить лейбл и картинку
и я уже завис совсем и ни чего не понимаю...


вот к примеру
я создаю страницу

читать дальше »
Код:

; dialog create function
Function fnc_CustomLicensePage_Create
 
  ; === CustomLicensePage (type: Dialog) ===
  nsDialogs::Create  1044
  Pop $hCtl_CustomLicensePage
  ${If} $hCtl_CustomLicensePage == error
    Abort
  ${EndIf}
  .....
  ......
  .....
  FunctionEnd
 
; dialog show function
Function fnc_CustomLicensePage_Show
  Call fnc_CustomLicensePage_Create
  nsDialogs::Show $hCtl_CustomLicensePage

FunctionEnd



и в диалоге у меня к примеру контрол Static например 1149
если я добавлю
после Show
nsDialogs::Create 1149 то это же я так понимаю не правильно....

как мне на этом контроле на одной страничке также с помощью nsDialogs (ну или с любой другой помощью) нарисовать нужные мне элементы?
или я все таки не понимаю самой сути процесса?

появилась идея.. попробую вечером...
но вопрос открыт :)

sawe 06-10-2011 17:11 1767502

Цитата:

Цитата yyv
вот код 105 диалога из ресхака »

читать дальше »
Код:

105 DIALOGEX 0, 0, 440, 285
STYLE DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION ""
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
FONT 8, "MS Shell Dlg"
{
  CONTROL "", 1099, STATIC, SS_LEFT | WS_CHILD | WS_GROUP, 0, 0, 440, 253
  CONTROL "", 1055, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE, 0, 253, 440, 32
  CONTROL "", 1018, STATIC, SS_LEFT | WS_CHILD, 0, 0, 440, 252
  CONTROL "", 1044, STATIC, SS_LEFT | WS_CHILD, 0, 0, 440, 252
  CONTROL "", 1256, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 8, 260, 96, 15
  CONTROL "", 1028, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 8, 260, 97, 15
  CONTROL "", 3, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 281, 258, 67, 18
  CONTROL "", 1, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 362, 258, 67, 18
  CONTROL "", 2, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 116, 258, 67, 18
}



Вместо 1018 или 1044, которые могут Вам ещё пригодится, использовал 1099, контрол 1055 используйте для подложки цвета в тон вашего основного.
Также рекомендую использовать плагин SkinnedControls

MKN 06-10-2011 17:12 1767503

kotkovets,
Всё-таки никак не решён вопрос - как произвести все необходимые действия на одной единственной кастомной странице ?
И выбор чекбоксов и выполнение задачи с индикацией прогресса. Не создавая более никаких других страниц !

kotkovets 06-10-2011 17:43 1767522

MKN, а в чем проблема? рисуем страничку со всем необходимым, обрабатываем события, снимаем статусы чекбоксов или радиобутонов, назначаем событию функцию и в этой же назначенной функции изменяем позиции бара
и делаем все необходимые действия, оставаясь на этой же странице.
Код:

Function Install
  ${NSD_GetState} $CheckBox1 $Check1 ;снимаем статус чекбокса
  ${NSD_GetState} $RadioButton1 $rButton1 ;снимаем статус радиобатона
  ;;;
  ${If} $Check1 == 1 ;к примеру если отмечен чебокс_1
      ;пишем нужные команды, если отмечен чекбокс_1
  ${EndIf}
  ;;;
  ${If} $rButton1 == 1 ;к примеру если отмечен чебокс_1
      ;пишем нужные команды, если отмечен радиобатон_1
  ${EndIf}
  ;;
  ;;
FunctionEnd

Я уже привел кучу примеров и разложил все по полочкам, чет тут сложного, банальные действия.
А чтобы не морочиться прогрессом, используем стандартную страничку установки
читать дальше »
Код:

!include "MUI2.nsh"

Page Custom pre post
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE Russian
OutFile "test.exe"
ShowInstDetails show

var dialog
var RadioButton1
var RadioButton2
var RadioButton3
var RadioButton4

var CheckBox1
var CheckBox2
var CheckBox3
var CheckBox4

var Check1
var Check2
var Check3
var Check4

var rButton1
var rButton2
var rButton3
var rButton4

var Button
var Button1

Function pre
  nsDialogs::Create 1018
  Pop $dialog
        ${NSD_CreateRadioButton} 0 0 40% 6% "Группа_1, Радио_1"
                Pop $RadioButton1
        ${NSD_SetState} $RadioButton1 1 ;Группа_1, радио_1 при показе странички, делаем отмеченным
        ${NSD_CreateRadioButton} 0 12% 40% 6% "Группа_1, Радио_2"
                Pop $RadioButton2
                ${NSD_AddStyle} $RadioButton1 ${WS_GROUP} ;определяем группу переключений 1
        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        ${NSD_CreateRadioButton} 50% 0 40% 6% "Группа_2, Радио_1"
                Pop $RadioButton3
        ${NSD_SetState} $RadioButton3 1 ;Группа_2, радио_1 при показе странички, делаем отмеченным
        ${NSD_CreateRadioButton} 50% 12% 40% 6% "Группа_2, Радио_2"
                Pop $RadioButton4
                ${NSD_AddStyle} $RadioButton3 ${WS_GROUP} ;определяем группу переключений 2
        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        ${NSD_CreateButton} 0u 35u 138u 15u `Кнопка переключений радиобутонов`
                Pop $Button
        ${NSD_OnClick} $Button ButtonClick
        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        ${NSD_CreateCheckBox} 0 65u 56u 12u "Чебокс_1"
              Pop $CheckBox1
        ${NSD_CreateCheckBox} 0 85u 56u 12u "Чебокс_2"
              Pop $CheckBox2
        ${NSD_CreateCheckBox} 150u 65u 56u 12u "Чебокс_3"
              Pop $CheckBox3
        ${NSD_CreateCheckBox} 150u 85u 56u 12u "Чебокс_4"
              Pop $CheckBox4
          ;все чебоксы отмечены
        ${NSD_SetState} $CheckBox1 1
        ${NSD_SetState} $CheckBox2 1
        ${NSD_SetState} $CheckBox3 1
        ${NSD_SetState} $CheckBox4 1
        ${NSD_CreateButton} 0u 100u 138u 15u `Кнопка переключений чекбоксов`
              Pop $Button1
        ${NSD_OnClick} $Button1 ButtonClickCheckBox
    nsDialogs::Show
FunctionEnd

Function ButtonClick ;функция обработки события нажатия кнопки
  Pop $Button
  ${NSD_GetState} $RadioButton1 $rButton1
  ${NSD_GetState} $RadioButton2 $rButton2
  ${NSD_GetState} $RadioButton3 $rButton3
  ${NSD_GetState} $RadioButton4 $rButton4
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;Логика И-ИЛИ для группы 1
  ${If} $rButton1 == 1
  ${AndIf} $rButton2 == 0
      ${NSD_SetState} $RadioButton1 0
      ${NSD_SetState} $RadioButton2 1
  ${Else}
      ${NSD_SetState} $RadioButton1 1
      ${NSD_SetState} $RadioButton2 0
  ${EndIf}
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;Логика И-ИЛИ для группы 2
  ${If} $rButton3 == 1
  ${AndIf} $rButton4 == 0
      ${NSD_SetState} $RadioButton3 0
      ${NSD_SetState} $RadioButton4 1
  ${Else}
      ${NSD_SetState} $RadioButton3 1
      ${NSD_SetState} $RadioButton4 0
  ${EndIf}
FunctionEnd

Function ButtonClickCheckBox
  Pop $Button1
  ;снимаем статусы чекбоксов:
  ${NSD_GetState} $CheckBox1 $Check1
  ${NSD_GetState} $CheckBox2 $Check2
  ${NSD_GetState} $CheckBox3 $Check3
  ${NSD_GetState} $CheckBox4 $Check4
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;Логика ИЛИ-ИЛИ для чекбоксов
  ${If} $Check1 == 1
  ${Orif} $Check2 == 1
  ${Orif} $Check3 == 1
  ${Orif} $Check4 == 1
        ${NSD_SetState} $CheckBox1 0
        ${NSD_SetState} $CheckBox2 0
        ${NSD_SetState} $CheckBox3 0
        ${NSD_SetState} $CheckBox4 0
  ${Else}
        ${NSD_SetState} $CheckBox1 1
        ${NSD_SetState} $CheckBox2 1
        ${NSD_SetState} $CheckBox3 1
        ${NSD_SetState} $CheckBox4 1
  ${EndIf}
FunctionEnd

Function post
  ;снимаем статусы радибутонов:
  ${NSD_GetState} $RadioButton1 $rButton1
  ${NSD_GetState} $RadioButton2 $rButton2
  ${NSD_GetState} $RadioButton3 $rButton3
  ${NSD_GetState} $RadioButton4 $rButton4
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;снимаем статусы чекбоксов:
  ${NSD_GetState} $CheckBox1 $Check1
  ${NSD_GetState} $CheckBox2 $Check2
  ${NSD_GetState} $CheckBox3 $Check3
  ${NSD_GetState} $CheckBox4 $Check4
FunctionEnd

Section ""
  ${If} $Check1 == 1
      MessageBox MB_ICONINFORMATION|MB_OK "Отмечен чекбокс_1" IDOK
  ${EndIf}
  ;;;
  ${If} $Check2 == 1
      MessageBox MB_ICONINFORMATION|MB_OK "Отмечен чекбокс_2" IDOK
  ${EndIf}
  ;;;
  ${If} $Check3 == 1
      MessageBox MB_ICONINFORMATION|MB_OK "Отмечен чекбокс_3" IDOK
  ${EndIf}
 
  ;;;
  ${If} $Check4 == 1
        MessageBox MB_ICONINFORMATION|MB_OK "Отмечен чекбокс_4" IDOK
  ${EndIf}
 
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
  ${If} $rButton1 == 1
        MessageBox MB_ICONINFORMATION|MB_OK "Отмечен радибутон_1" IDOK
  ${EndIf}
  ;;;
  ${If} $rButton2 == 1
        MessageBox MB_ICONINFORMATION|MB_OK "Отмечен радибутон_2" IDOK
  ${EndIf}
  ;;;
  ${If} $rButton3 == 1
      MessageBox MB_ICONINFORMATION|MB_OK "Отмечен радибутон_3" IDOK
  ${EndIf}

  ;;;
  ${If} $rButton4 == 1
      MessageBox MB_ICONINFORMATION|MB_OK "Отмечен радибутон_4" IDOK
  ${EndIf}
SectionEnd


MKN 06-10-2011 18:22 1767552

kotkovets,
Вроде разобрался с этим моментом (полтыщи строк, путаюсь очень...). Спасибо. Теперь никак не получается закрыть кастомную страницу (по сути закрыть скрипт, выйти из него) после :
Код:

MessageBox MB_OK "Файл успешно создан!" IDOK
Т.е. по окончании работы.
Почему то вообще не действует :
Код:

Section
SetAutoClose true
SectionEnd


kotkovets 06-10-2011 18:43 1767564

Цитата:

Цитата MKN
Теперь никак не получается закрыть кастомную страницу (по сути закрыть скрипт, выйти из него) после :
Код:
MessageBox MB_OK "Файл успешно создан!" IDOK »

Добавь в конце функции "волшебную" команду
Код:

SendMessage $HWNDPARENT 0x408 1 0
Циферка 1 - означает переместиться на страничку вперед...
Код:

Function CreateFile
    ;---
    MessageBox MB_OK "Файл успешно создан!" IDOK
    SendMessage $HWNDPARENT 0x408 1 0
FunctionEnd


sawe 06-10-2011 22:11 1767682

Было несколько решений реализации страницы Readme, наконец решил переделать по нормальному из страницы лицензии.
PageReadme_NSIS.zip

----

kotkovets 06-10-2011 23:39 1767720

sawe, Все хорошо, но есть серьезные недостатки,
Код:

!include "MUI2.nsh"
!insertmacro MUI_PAGE_README "Читать.txt"
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"
ShowInstDetails show
OutFile test.exe

Section
SectionEnd

Смотрим лог компилятора:
Код:

4 warnings:
  LangString "MUI_INNERTEXT_README_BOTTOM" is not set in language table of language Russian
  LangString "MUI_TEXT_README_TITLE" is not set in language table of language Russian
  LangString "MUI_TEXT_README_SUBTITLE" is not set in language table of language Russian
  LangString "MUI_INNERTEXT_README_TOP" is not set in language table of language Russian

О чем это говорит? У вас не определены настройки по умолчанию, если в скрипте не задать константы.
Например, я в скрипте не указал цвет
Код:

!define  MUI_READMEPAGE_BGCOLOR
то в хидере, делаем проверку на наличие этой константы и если она не указана, объявлем константу и задаем значение константы по умолчанию.
Код:

!ifndef  MUI_READMEPAGE_BGCOLOR
  !define  MUI_READMEPAGE_BGCOLOR 0xFFFFFF
!endif

Дальше не стал смотреть... sawe в топку! :) Дорабатывайте!!!

yyv 07-10-2011 16:13 1768081

sawe, подскажите, как мне подложить картинку в нужный мне контрол к примеру в 1055?
вот я рисую страничку используя nsDialogs::Create
не важно 1018 или 1044 или 1099
нарисовал, отобразил
как в контрол 1055 вставить нужную картинку? это нужно PRE функцию вызывать? или как?
вроде что-то получилось....

sawe 07-10-2011 17:25 1768142

Цитата:

Цитата yyv
подскажите, как мне подложить картинку в нужный мне контрол к примеру в 1055? »

Если к контролу, то он должен иметь следующий вид:
----------
CONTROL "", 1055, STATIC, SS_BITMAP | WS_CHILD | WS_VISIBLE, X, X, X, X
----------
Если я не ошибаюсь, то MUI2 функция PRE занята. Откройте NSIS\Contrib\Modern UI 2\Interface.nsh
и посмотрите, как реализуется следующее
----------
SetBrandingImage /IMGID=1055 /RESIZETOFIT "$PLUGINSDIR\картинка.bmp"
----------
или универсальный макрос
читать дальше »
Код:

!macro BIMAGE IMAGE PARMS
      Push $0
      GetTempFileName $0
      File /oname=$0 "${IMAGE}"
      SetBrandingImage /IMGID=1055 /RESIZETOFIT "картинка.bmp"
      Delete $0
      Pop $0
!macroend

!define SMUI_PAGE_CUSTOMFUNCTION_SHOW BGImage

Function BGImage
  !insertmacro BIMAGE "картинка.bmp" /RESIZETOFIT
FunctionEnd



В nsDialogs, если рисунок не перекрывается ни чем, делается просто

читать дальше »
Код:

Var Dialog
 Var BitmapX
 Var BitmapX_Image

Function CustomShow
      nsDialogs::Create 1018
      Pop $Dialog
     
      ${NSD_CreateBitmap} 10u 6u 30u 30u ""
      Pop $BitmapX
      ${NSD_SetImage} $BitmapX "$PLUGINSDIR\картинка.bmp" $BitmapX_Image
;-----
  nsDialogs::Show
FunctionEnd


----

Цитата:

Цитата kotkovets
Смотрим лог компилятора: »

это связано с тем, что в каждый языковой файл следует добавить скорее всего английский README, или чухай затылок!
По быстрячку не прошло, бум карпеть!

yyv 07-10-2011 17:45 1768158

sawe,
получилось
в этот момент там было очень много мата и слюней радости, ибо уже более трех дней бьюсь с этой проблемой :)
вот мой контрол
Код:

  CONTROL "", 1139, STATIC, SS_BITMAP | WS_CHILD | WS_VISIBLE, 0, 250, 462, 43
а во так я делаю нужый мне фон нижнего края
Код:


GetDlgItem  $back $HWNDPARENT 1139
SetCtlColors $back 0x000000 0xEBEBEB

вопрос теперь в другом
;)
как мне сделать фон в BrandingText нужным мне?
использую BrandingURL plug-in
пробую
Код:


GetDlgItem $0 $HWNDPARENT 1028
SetCtlColors $0  0x000000 0xEBEBEB

и здесь это вариант не проходит :(
фон системный серый...

kotkovets 07-10-2011 17:47 1768160

Цитата:

Цитата sawe
nsDialogs функция PRE занята »

чушь! это параметр макроса, означает объявить пользовательскую функцию,
которая будет выполнена перед открытием странички.

Цитата:

Цитата yyv
использую BrandingURL plug-in »

ну так и задавайте цвет этим же плагином
BrandingURL::Set /NOUNLOAD [R] [G] [b] [link_url]

yyv 07-10-2011 17:59 1768176

Цитата:

Цитата kotkovets
ну так и задавайте цвет этим же плагином »

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

PS Получилось
просто
Код:

GetDlgItem $0 $HWNDPARENT 1028
SetCtlColors $0  0x000000 0xEBEBEB

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

sawe 07-10-2011 18:08 1768184

Цитата:

Цитата yyv
как мне сделать фон в BrandingText нужным мне? »

Опять открываем NSIS\Contrib\Modern UI 2\Interface.nsh
и смотрим
---------
GetDlgItem $mui.Branding.Background $HWNDPARENT 1028
SetCtlColors $mui.Branding.Background /BRANDING
---------
надеюсь понятно
SetCtlColors $mui.Branding.Background ${MUI_BGCOLOR} transparent
тоже самое с 1256, эти контролы 1028 и 1256 работают вместе

--

kotkovets 07-10-2011 18:18 1768195

Цитата:

Цитата sawe
Опять открываем NSIS\Contrib\Modern UI 2\Interface.nsh »

Я иногда делаю так на стандартном, неизмененном ресурсе modern.exe
Код:

!include "MUI2.nsh"
!define MUI_CUSTOMFUNCTION_GUIINIT Gui
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"
outfile ted.exe
Function Gui
  GetDlgItem $0 $HWNDPARENT 1028
  EnableWindow $0 1
  SetCtlColors $0 0x0000FF 0x00FF40
FunctionEnd

Section ""
SectionEnd

плагин брэндинг, так делает, т.е с плагином достаточно команды изменения фона и цвета
только после применения плагина
Код:

;функция плагина
GetDlgItem $0 $HWNDPARENT 1028
SetCtlColors $0 0x0000FF 0x00FF40


yyv 07-10-2011 18:52 1768213

Цитата:

Цитата sawe
SetCtlColors $mui.Branding.Background ${MUI_BGCOLOR} transparent »

а что дает transparent?
не я как бы знаю что это прозрачность?
но что это даст в данном контексте?

sawe 07-10-2011 19:50 1768255

SetCtlColors $mui.Branding.Background ${MUI_BGCOLOR} transparent

это тоже самое как
SetCtlColors $0 0x0000FF transparent

SetCtlColors - команда
$0 - для кого
0x0000FF - цвет объекта
transparent - цвет прозрачности фона

Только одно я не могу понять, а на кой вам этот Branding, придушите его и вместо него используйте простую ссылку, тогда и плагин не нужен.

yyv 07-10-2011 21:50 1768331

sawe, это же была одна из проблем, как ее нарисовать там где Branding? ведь контролы 1044 и 1018 мне пришлось поднять выше кнопок, а Branding должен был быть как раз на уровне с кнопками...
это была одна з причин, почему растягивали контрол, что бы иметь возможность в любом месте нарисовать то, что нужно...
но уже и так работает и то хорошо.... осталось так марафет навести по мелочи :)
вы мне лучше вот что скажите
какие единицы измерения использует Resource Hacker?
это явно не пиксели, ибо когда я ввел нужные мне пиксели для размера окна, то итоговое окно оказалось больше пикселей на 200
вот у меня окно должно быть 665 на 485 px
а введено
105 DIALOGEX 0, 0, 440, 285
линеечкой померил,итог - нужный мне размер
как конвертировать единицы что бы не на глаз вводить?

kotkovets 07-10-2011 22:10 1768345

yyv, ликбез
В NSIS получить базовую единицу:
Код:

System::Call "user32::GetDialogBaseUnits()i.R9"
В $R9 - базовая единица
Это вам Вам надо???? это выходит за рамки темы..

sawe 07-10-2011 22:41 1768372

Цитата:

Цитата yyv
Branding должен был быть как раз на уровне с кнопками... »

я же вам несколько раз советовал использовать свои контролы, что бы не зависеть от базового интерфейса.
Ни чего страшного если они будут дублировать базовые, к примеру Branding.
Цитата:

Цитата yyv
какие единицы измерения использует Resource Hacker »

Вы всё перекрутили, это не Resource Hacker использует странные размеры а NSIS свои, я на глазок юниты NSIS умножаю на 1,5.
Лучше чем kotkovets вам это ни кто не объяснит, если у него хватит терпения.

yyv 08-10-2011 00:47 1768428

kotkovets, спасибо, как раз то что надо было... все искал где про вин апи почитать..)

kotkovets 08-10-2011 01:08 1768431

Цитата:

Цитата yyv
все искал где про вин апи почитать..) »

В справочнике по NSIS читайте: Описание плагинов->System: Вызов функций из внешних библиотек
Там я "вкратце" описал возможности и синтаксис плагина.

yyv 11-10-2011 19:59 1771269

подскажите. может есть другая возможность :)
вот я делаю к примеру лейбл
читать дальше »
Код:

  ; === Desk (type: Label) ===
  ${NSD_CreateLabel} 176 80 442 41 "${NEW_DESK_TITLE}"
  Pop $hCtl_CustomLicensePage_Desk
  CreateFont $hCtl_CustomLicensePage_Desk_Font "Microsoft Sans Serif" "8.25" "400"
  SendMessage $hCtl_CustomLicensePage_Desk ${WM_SETFONT} $hCtl_CustomLicensePage_Desk_Font 0
  SetCtlColors $hCtl_CustomLicensePage_Desk 0x000000 0xFFFFFF



константа ${NEW_DESK_TITLE} содержит предложение. в котором одно слово мне нужно сделать жирным
сейчас я это делаю так
создаю поверх лейбл с одним нужным словом
делаю ему
Код:

CreateFont $hCtl_CustomLicensePage_Desk_Font "Microsoft Sans Serif" "8.25" "700"
и по координатам подгоняю так, что бы он был как раз на месте слова из предложения.
но этот вариант меня не очень устраивает.
может ест возможность делать что-тот типа такого
"текст текст текст текст текст текст <b>этот текст жирный</b>"
что бы не городить лишних конструкций

kotkovets 11-10-2011 22:22 1771387

Цитата:

Цитата yyv
может ест возможность делать что-тот типа такого
"текст текст текст текст текст текст <b>этот текст жирный</b>"
что бы не городить лишних конструкций »

Нет, контрол один, соответственно и дескриптор контрола тоже один, создайте еще один контрол и подгоните
контрол к предыдущему контролу, чтобы получился "монолитный текст"
Можно пойти по сложному пути, нарисовать контрол - "RichEdit20A" там можно текст подгонять специальными тегами,
но это будет слишком сложно для Вас...
http://nsis.sourceforge.net/LoadRTF
http://nsis.sourceforge.net/Componen...rtf_formatting
Проще нарисовать еще один "Label" :drug:

MKN 13-10-2011 18:09 1772615

Требуется найти в $INSTDIR, файл с произвольным именем и расширением .msi
Использую команду FindFirst
Код:

Name "Find"
OutFile "Find.exe"
ShowInstDetails show
InstallDir "C:\Find"

Section
FindFirst $0 $1 $INSTDIR\*.msi
loop:
  StrCmp $1 "" done
  DetailPrint $1
  FindNext $0 $1
  Goto loop
done:
FindClose $0

MessageBox MB_ICONINFORMATION|MB_OK "В $INSTDIR  найден файл $0" IDOK
SectionEnd

По справочнику : в переменную $0 будут помещаться имя файла с расширением

Но в MessageBox вместо внятного имени - набор цифр... Почему ? И что надо сделать ?

kotkovets 13-10-2011 18:29 1772633

Вообще здесь цикл...и значения стремительно меняются
Цитата:

Цитата MKN
в переменную $0 будут помещаться имя файла с расширением »

В $0 - дескриптор поиска, в переменой $1 - имена файлов
K.A.V. попутал переменные, поэтому страдают неискушенные пользователи :)
------
MKN в твоем примере, сообщение покажет только последний найденный файл.

MKN 13-10-2011 18:33 1772638

kotkovets,
Я "искусился", первым делом изменив переменную в
MessageBox MB_ICONINFORMATION|MB_OK "В $INSTDIR найден файл $1" IDOK
Только при этом вообще никакой информации о файле... Файл один, и надо бы узнать его имя и занести в переменную...

kotkovets 13-10-2011 18:41 1772645

MKN немного не то имел ввиду:
StrCmp $1 "" done - выход из цикла, если $1 == пустому значению
Поэтому и будет всегда по окончанию поиска, пустое сообщение.
А имена найденных файлов в $1...
Код:

FindFirst $0 $1 $INSTDIR\*.msi
loop:
  StrCmp $1 "" done
          MessageBox MB_ICONINFORMATION|MB_OK "В $INSTDIR  найден файл $1" IDOK
  FindNext $0 $1
  Goto loop
done:
FindClose $0

Воспользуйся макросом Locate (по индексу в ориг. справке введи)
!include "FileFunc.nsh" - не забудь включить хидер в тело скрипта
Цитата:

Цитата MKN
Файл один, и надо бы узнать его имя и занести в переменную »

Если ТОЛЬКО ФАЙЛ ОДИН:
Код:

FindFirst $0 $1 $INSTDIR\*.msi
          MessageBox MB_ICONINFORMATION|MB_OK "$1" IDOK
FindClose $0


sawe 13-10-2011 22:47 1772801

Есть ли, надёжные способы удаления в Windows 7 системного, защищённого файла

MKN 14-10-2011 09:00 1772985

Цитата:

Цитата kotkovets
Поэтому и будет всегда по окончанию поиска, пустое сообщение. »

А как быть когда надо "зафиксировать" в директории несколько неизвестно-разноимённых файлов с необходимым расширением и далее с ними работать (запускать, копировать и т. д. ) ?

Цитата:

Цитата sawe
Есть ли, надёжные способы удаления в Windows 7 системного, защищённого файла »

А так : с помощью takeown.exe сделать текущего пользователя владельцем файла,
а потом с помощью icacls.exe назначить полный доступ к этому файлу ?
По моему на winreview.ru про это подробно говорилось...

kotkovets 14-10-2011 09:21 1772992

Цитата:

Цитата MKN
А как быть когда надо "зафиксировать" в директории несколько неизвестно-разноимённых файлов с необходимым расширением и далее с ними работать (запускать, копировать и т. д. ) ? »

1. Cтек для этого есть, у меня в хидере RegistryFunc.nsh (DelregKey.nsh) бывает хранится в стеке до 70 000 значений ключей реестра и все они перебираются по заданной маске.
2. Работаем непосредственно в цикле
Код:

FindFirst $0 $1 $INSTDIR\*.msi
loop:
  ;начало цикла
  StrCmp $1 "" done
          ;---
          ;---
          ;всякие нужные команды
  FindNext $0 $1
  Goto loop
  ;конец цикла
done:
FindClose $0

Цитата:

Цитата MKN
А так : с помощью takeown.exe сделать текущего пользователя владельцем файла,
а потом с помощью icacls.exe назначить полный доступ к этому файлу ? »

http://forum.oszone.net/showpost.php?p=1128494
takeown /?
icacls /?

SergioPoverony 14-10-2011 11:18 1773056

Доброго времни суток, вопрос такоей, как можно сконвертить CMD/BAT файл в nSIS
Вот пример файла... просто после миллениумовской версии винды, параметр CHOICE не рабоатет.
В частности не на XP не на более выше не идет +(
Кто сможет помочь? Сразу скажу не нуб в этом деле, делаю портайбл прилоджения на nSIS но вот это привело в тупик!

PHP код:

@echo off
echo Now yo can look short info about your OS Windows:
systeminfo findstr /"Microsoft"
systeminfo findstr /"based"
systeminfo findstr /"64-based" nul

set os
=%errorlevel%
CHOICE /"Do you want to install ZTE driver?"

if errorlevel 2 goto recovery

echo Install driver section

start 
/wait Drivers%os%dpinst.exe

:recovery


adb kill
-server

adb start
-server
echo Please plug in your "ZTE Racer" to back usb hub.
pause
adb wait
-for-device
adb shell cat 
/proc/mtd findstr /"0048" nul
if errorlevel 1 goto gen2
echo Your Phone is Generation1 (gen1)
goto fastboot
:gen2
echo Your Phone is Generation2 (gen2), or unknown Generation.
pause

:fastboot
adb reboot bootloader

:first

echo Select your recovery

echo 1. CWM Gen1

echo 2. CWM Gen2

echo 3. FTM Gen1

echo 4. FTM Gen2

CHOICE 
/C 1234 /"Enter the number of recovery or FTM"

set mode=%errorlevel%

CHOICE /"Are you sure? Your choice is %mode%"

if errorlevel 2 goto first

fastboot flash recovery recovery
%mode%.img

fastboot reboot

adb wait
-for-device

adb reboot recovery

adb kill
-server

echo You did itAll completeEnjoy.

pause

exit 

Заранее благодарю за помошь.

MKN 14-10-2011 11:23 1773060

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

!include "nsDialogs.nsh"
!include "winmessages.nsh"
!include "logiclib.nsh"
OutFile "test.exe"
 
Page Custom pre
 
var dialog
var hwnd
var button
 
Function pre
        nsDialogs::Create 1018
        Pop $dialog
        ${NSD_CreateCheckbox} 0 0 50% 16% "При отметке кнопка станет активной"
                Pop $hwnd
                ${NSD_OnClick} $hwnd EnDisableButton
       
        ${NSD_CreateButton} 25% 45% 50% 50% "Кнопка"
                Pop $button
                EnableWindow $button 0 # start out disabled
 
        nsDialogs::Show
FunctionEnd
 
Function EnDisableButton
        Pop $hwnd
        ${NSD_GetState} $hwnd $0
        ${If} $0 == 1
                EnableWindow $button 1
        ${Else}
                EnableWindow $button 0
        ${EndIf}
FunctionEnd
 
Section ""
SectionEnd

Как откорректировать код для логики поставленной задачи ?

kotkovets 14-10-2011 12:12 1773089

Цитата:

Цитата MKN
Как откорректировать код для логики поставленной задачи ? »

читать дальше »
Код:

!include "nsDialogs.nsh"
!include "winmessages.nsh"
!include "logiclib.nsh"
OutFile "test.exe"

Page Custom pre

var dialog
var Checkbox
var Checkbox1
var Check
var Check1
var button

Function pre
        nsDialogs::Create 1018
        Pop $dialog
        ${NSD_CreateCheckbox} 0 0 50% 20% "При отметке кнопка станет активной"
                Pop $Checkbox
                ${NSD_OnClick} $Checkbox fnCheckbox

        ${NSD_CreateCheckbox} 0 25% 50% 20% "При отметке кнопка станет активной"
                Pop $Checkbox1
                ${NSD_OnClick} $Checkbox1 fnCheckbox1

        ${NSD_CreateButton} 25% 45% 15% 10% "Кнопка"
                Pop $button
                EnableWindow $button 0 # start out disabled

        nsDialogs::Show
FunctionEnd

Function DisableButton
    ${NSD_GetState} $Checkbox $Check
    ${NSD_GetState} $Checkbox1 $Check1
    ;${NSD_GetState} $Checkbox2 $Check2 ;если примеру еще добавить чекбокс нужно
    ;${NSD_GetState} $Checkbox3 $Check3

    ${If} $Check == 1
    ${OrIf} $Check1 == 1 ;логика ИЛИ
    ;${OrIf} $Check2 == 1 ;если примеру еще добавить чекбокс нужно
    ;${OrIf} $Check3 == 1 ;если примеру еще добавить чекбокс нужно
        EnableWindow $button 1
    ${Else}
        EnableWindow $button 0
    ${EndIf}
FunctionEnd

Function fnCheckbox
    Pop $Checkbox
    Call DisableButton
FunctionEnd

Function fnCheckbox1
    Pop $Checkbox1
    Call DisableButton
FunctionEnd

Section ""
SectionEnd


Цитата:

Цитата SergioPoverony
Сразу скажу не нуб в этом деле, делаю портайбл прилоджения на nSIS »

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

SergioPoverony 14-10-2011 13:02 1773136

Цитата:

Цитата kotkovets
Есть плагин на офф. сайте по работе с сервисами, ссылка в шапке. »

Так плагины я скачал а вот как правильно скрипт собрать... недоумеваю... тяжелая неделя сказывается +(
Набросай пожалуйста если есть время...

Тут смысл в том... что снавал определяется версия разрядности винды.. 32 или 64 (плагин GetVersion) потмо запускается установщик дров майкрософтовский из Sdk мелгомягких (не спрашивайте от куда я его открутил, это очень долгая история), но от версии винды меняется имя уставнощика, После того как драва установились... дальше идет работа скрипта, запускается ADB процесс (работает обчно с командной строки) - (приложение для работы с Android смартфонами) оно определяет, какой структуры файловая система смртфона, если Generation 1 - то далее вопрос какой файл устанавливать.. CLW или FTM также если у тея Generatoion2... вот какбы так установка на смартфон идет также через ADB (с командной строки)... вот както так... ну и в конце сообщение - энжой! и перегружается тело...

kotkovets 14-10-2011 13:53 1773162

Цитата:

Тут смысл в том... что снавал определяется версия разрядности винды.. 32 или 64
разрядность опр. так:
Код:

!include "x64.nsh"
;--
${If} ${RunningX64}
      MessageBox MB_OK "running on x64"
${Else}
      MessageBox MB_OK "running on x32"
${EndIf}

Установка дров:
Код:

ExecWait `Путь к \dpinst.exe "Ключи запуска"` $0
в $0 - код возврата
смотрим ключи запуска dpinst.exe /? или как то dpinst.exe /help
Cоответственно dpinst.exe заводим соответствущий разрядности системы.
Далее заводим приложение для смартфона, что оно возвращает без понятия (код возврата)
Код возврата нужен для точного определения структуры файловой системы смартфона
Затем анализируем код возврата, строим логику какой файл устанавливать в зависимости, что
возвращается и ребутимся. План таков - деталей я не знаю, это все, чем я могу помочь...

SergioPoverony 14-10-2011 15:40 1773262

Спасибо да, разобрался +) сделал через ( GetVersion::WindowsPlatformArchitecture) все сделал, остался вопрос на последок.. как в MessageBox кнопкам присовить свои названия, чтобы не оК и Отмена а к примеру Проверка 1 и ПРОверка 2 ?

yyv 14-10-2011 15:41 1773265

вопрос про картинки в nsis
Я знаю что из "коробки" nsis понимает только BMP
для загрузки картинок в контрол используются следующие методы
NSD_SetImage - загрузить картинку как есть
NSD_SetStretchedImage - загрузить подогнав ее под размеры контрола

что бы использовать другие форматы например jpg
можно инклюдить файлns Dialogs_setImageOle
и использовать NSD_SetImageOLE
NSD_SetImageOLE загружает картинку как есть
вопрос в следующем, есть ли аналоги SetStretchedImage но для jpg?
что бы можно было загрузить jpg картинку и подогнать ее под размеры контрола?

sawe 14-10-2011 15:53 1773277

Цитата:

Цитата MKN
с помощью takeown.exe сделать текущего пользователя владельцем файла »

Это я знаю, и часто использовал для этого плагин ExecCmd, но не всегда это проходит для не исполняемых файлов.
Код:

    ExecCmd::exec /TIMEOUT=1000 'takeown.exe /F $SYSDIR\Файл.sss'
    Pop $0
    ExecCmd::exec /TIMEOUT=1000 '%comspec% /c cacls.exe $SYSDIR\Файл.sss /G %username%:F'
    Pop $0
    Delete "$SYSDIR\Файл.sss"

В WinXP есть скрытая папка где хранятся резервные копии, в Win 7 - это более мудрёно и запутано, но не в этом дело.

kotkovets 14-10-2011 16:39 1773318

Цитата:

Цитата SergioPoverony
как в MessageBox кнопкам присовить свои названия, чтобы не оК и Отмена а к примеру Проверка 1 и ПРОверка 2 ? »

Стандартно не получится - ресурсы мессаджбоксов берутся из системной библиотеки user32.dll
Был такой плагин - messagebox v0.98 beta 3, погуглите, под рукой этого плагина нету, если не найдете выложу позже.
Цитата:

Цитата sawe
В WinXP есть скрытая папка где хранятся резервные копии, в Win 7 - это более мудрёно и запутано, но не в этом дело»

В WinXP механизм восстановления срабатывает, в специальной делке хранятся списки защищенных файлов их можно вывести из защиты утилиткой - поищите по форуму.
В Win7 попробуйте для начало командной строкой, через апи очень сложно это делать(многие апишки дают отбой намеренно, нужно эти апи вызывать в привелегированном режиме, это не то, типа запуск от админа, хотя тоже нужен :)).
вирус в итоге получится сделать...это я об антивирусных программах - завизжат, как пить дать!!!

Цитата:

можно инкдюдить файлns Dialogs_setImageOle
А вы вот гляньте содержимое этого хидера,
по названию вызываемой функции - найдете прототип, соответственно описание принимаемых аргументов :)
инкдюдить - наверно нельзя :lol:

yyv 14-10-2011 17:20 1773349

kotkovets,
хм, я следовал этой логике до того как задал вопрос.. но дело в том что я или не понял или не то нашел...
сначала я посмотрел как это делается с SetStretchedImage
там сначала с помощью GetClientRect узнают требуемые координаты, а затем подставляют их в LoadImage

Код:

HANDLE WINAPI LoadImage (
  __in_opt HINSTANCE HINST,
  __in LPCTSTR lpszName,
  __in UINT uType,
  __in Int cxDesired,
  __in Int cyDesired,
  __in UINT fuLoad
 );

те сюда
Код:

  __in Int cxDesired,
  __in Int cyDesired,


Dialogs_setImageOle использует OleLoadPicturePath
Код:

HRESULT OleLoadPicturePath (
  __in LPOLESTR szURLorPath,
  __in LPUNKNOWN punkCaller,
  __in DWORD dwReserved,
  __in OLE_COLOR clrReserved,
  __in REFIID riid,
  __out LPVOID * ppvRet
 );

и здесь я или не нашел подобия этого...
Код:

  __in Int cxDesired,
  __in Int cyDesired,

или чего то недопонимаю...
выходит используя OleLoadPicturePath я не могу сделать то что мне нужно?

kotkovets 14-10-2011 17:56 1773376

Цитата:

Цитата yyv
или чего то недопонимаю...
выходит используя OleLoadPicturePath я не могу сделать то что мне нужно? »

http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
Судя по описанию функции - нельзя
Как узнать, что это:
Код:

System::Call 'oleaut32::OleLoadPicturePath(w"${IMAGE}",  i0,  i0,  i0, g"${IID_IPicture}",  *i .r0)i.r1'
Посчитайте сколько аргументов микрософт пишет и в примере, 6 аргументов
Код:

w"${IMAGE}" -> szURLorPath
 и по порядку


yyv 14-10-2011 18:10 1773386

Цитата:

Цитата kotkovets
Судя по описанию функции - нельзя »

ну я так и догадался в начале.. просто думал может есть еще варианты..)

kotkovets 14-10-2011 18:17 1773391

Цитата:

Цитата yyv
ну я так и догадался в начале »

Привел ссылки, в качестве доказательства, для пользы :)

SergioPoverony 14-10-2011 20:52 1773518

kotkovets :Beer: спасибо за направление на путь вот собрал :)

PHP код:

Name "Recovery Install System"
OutFile "InstallRecovery.exe"
ShowInstDetails hide
!include "LogicLib.nsh"

Function .onInit 
  GetVersion
::WindowsPlatformArchitecture
  pop $R0
   
${If} $R0 == "32"
        
DetailPrint "You have 32 bit"
        
MessageBox MB_ICONQUESTION|MB_YESNO "You have 32 bit system, %\n install drivers?" IDNO "detectgen"
        
ExecWait "$EXEDIR/drivers/1dpinst.exe"
        
Goto detectgen
  
${Else}
    
DetailPrint "You have 64 bit"
        
MessageBox MB_YESNO "You have 64 bit system, install drivers?" IDNO "detectgen"
        
ExecWait "$EXEDIR/drivers/0dpinst.exe"
        
Goto detectgen
  
${EndIf} 
FunctionEnd

Section 
"Detect Phone Generation and install recovery"
detectgen:
  
MessageBox MB_OK|MB_ICONEXCLAMATION "Please plug in your ZTE Racer to back usb hub and press OK button."
ExecWait "$EXEDIR/adb.exe kill-server"
ExecWait "$EXEDIR/adb.exe start-server"
ExecWait "$EXEDIR/adb.exe wait-for-device"
ExecWait "$EXEDIR/adb.exe shell cat /proc/mtd | findstr /R '0048'" $0
   
${If} $== "0048"
        
DetailPrint "You have Generation 1"
        
MessageBox MB_OK|MB_ICONINFORMATION "You phone is Generation 1 press OK button for install Recovery"
        
Goto generation1
        Abort
  
${Else}
        
DetailPrint "You have Generation 2"
        
MessageBox MB_OK|MB_ICONINFORMATION "You phone is Generation 2 press OK button for install Recovery"
        
Goto generation2
        Abort
  
${EndIf} 
  
Generation1 section
generation1
:
        
ExecWait "$EXEDIR/adb.exe reboot bootloader"
        
MessageBox MB_OK|MB_ICONINFORMATION "After reload you phone press OK button"
messagebox::show MB_ICONINFORMATION|MB_DEFBUTTON1 "" "" "Select Generation 1 Recovery for install to you phone!" "Clockworck Mode" "Standart FTM"
  
Pop $0
  StrCmp 
$"1" 0 generation_ftm1 pressed "Standart FTM"
  
StrCmp $"2" 0 generation_clw1 pressed "Clockworck"
  
generation_clw1:
  
ExecWait "$EXEDIR/fastboot.exe erase recovery"
  
ExecWait "$EXEDIR/fastboot.exe flash recovery recovery1.img"
  
ExecWait "$EXEDIR/fastboot.exe reboot"
  
ExecWait "$EXEDIR/adb.exe kill-server"
  
ExecWait "$EXEDIR/adb.exe wait-for-device"
  
ExecWait "$EXEDIR/adb.exe reboot recovery"
  
ExecWait "$EXEDIR/adb.exe kill-server"
  
MessageBox MB_OK|MB_ICONEXCLAMATION "ClockworckMode recovery installed."
  
  
Abort
  generation_ftm1
:
  
ExecWait "$EXEDIR/fastboot.exe erase recovery"
  
ExecWait "$EXEDIR/fastboot.exe flash recovery recovery3.img"
  
ExecWait "$EXEDIR/fastboot.exe reboot"
  
ExecWait "$EXEDIR/adb.exe kill-server"
  
ExecWait "$EXEDIR/adb.exe wait-for-device"
  
ExecWait "$EXEDIR/adb.exe reboot recovery"
  
ExecWait "$EXEDIR/adb.exe kill-server"
  
MessageBox MB_OK|MB_ICONEXCLAMATION "Standart FTM recovery installed"
  
Abort
Generation2 section
generation2
:
        
ExecWait "$EXEDIR/adb.exe reboot bootloader"
        
MessageBox MB_OK|MB_ICONINFORMATION "After reload you phone press OK button"
        
messagebox::show MB_ICONINFORMATION|MB_DEFBUTTON1 "" "" "Select Generation 2 Recovery for install to you phone!" "Clockworck Mode" "Standart FTM"
  
Pop $0
  StrCmp 
$"1" 0 generation_ftm2 pressed "Standart FTM"
  
StrCmp $"2" 0 generation_clw2 pressed "Clockworck"
  
generation_clw2:
  
ExecWait "$EXEDIR/adb.exe kill-server"
  
ExecWait "$EXEDIR/fastboot.exe erase recovery"
  
ExecWait "$EXEDIR/fastboot.exe flash recovery recovery2.img"
    
MessageBox MB_OK|MB_ICONEXCLAMATION "Recovery installed."
  
ExecWait "$EXEDIR/fastboot.exe reboot"
  
ExecWait "$EXEDIR/adb.exe wait-for-device"
  
ExecWait "$EXEDIR/adb.exe reboot recovery"
  
ExecWait "$EXEDIR/adb.exe kill-server"
  
MessageBox MB_OK|MB_ICONEXCLAMATION "ClockworckMode recovery installed."
  
Abort
  generation_ftm2
:
  
ExecWait "$EXEDIR/adb.exe kill-server"
  
ExecWait "$EXEDIR/fastboot.exe erase recovery"
  
ExecWait "$EXEDIR/fastboot.exe flash recovery recovery4.img"
     
MessageBox MB_OK|MB_ICONEXCLAMATION "Recovery installed."
  
ExecWait "$EXEDIR/fastboot.exe reboot"
  
ExecWait "$EXEDIR/adb.exe wait-for-device"
  
ExecWait "$EXEDIR/adb.exe reboot recovery"
  
ExecWait "$EXEDIR/adb.exe kill-server"
  
MessageBox MB_OK|MB_ICONEXCLAMATION "Standart FTM recovery installed"
  
Abort
SectionEnd 


MKN 15-10-2011 12:19 1773791

Возможно ли изменить параметры шрифта в MessageBox ?

kotkovets 15-10-2011 12:37 1773801

MKN,
Нет и также это касается переименованием кнопок,
все ресурсы MessageBox берутся из системной библиотеки user32.dll

MKN 15-10-2011 14:01 1773841

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

kotkovets 15-10-2011 14:26 1773847

MKN, плагин нужен писать, не умеет nsis четко работать "напрямую" через api callback (с функциями обратными вызовами) , я имею ввиду, чтобы все получалась красиво и без глюков :beta:

yol_k 17-10-2011 14:36 1775298

Здравствуйте всем! Скажите пожалуйста, есть ли в NSIS возможность вызова окна диалога не как следующей или предыдущей страница (по кнопкам next/prev), а по нажатию кнопки, например, advanced или browse (для дополнительных настроек в отдельном окне или выбора файла в диалоге openfile).

kotkovets 17-10-2011 14:51 1775305

Цитата:

Цитата yol_k
Здравствуйте всем! Скажите пожалуйста, есть ли в NSIS возможность вызова окна диалога не как следующей или предыдущей страница (по кнопкам next/prev), а по нажатию кнопки, например, advanced или browse (для дополнительных настроек в отдельном окне или выбора файла в диалоге openfile) »

Создавать свои странички, в шапке справочник по NSIS, пролистайте 10 - 15 страничек темы назад - кучу примеров найдете.
#960
или так #956

yol_k 17-10-2011 15:30 1775317

Вопрос в том, чтобы открывать дополнительное окно не закрывая основное окно страницы инсталлятора.

MKN 18-10-2011 13:33 1776060

kotkovets,
Подскажи пожалуйста, а как подкорректировать вышеприведённые примеры, чтобы при нажатии кнопки отметки всех чекбоксов, "кнопка" становиласьь активной ?
Вот так, при нажатии кнопки отметке всех чекбоксов "кнопка" не активна :
Код:

!include "nsDialogs.nsh"
!include "winmessages.nsh"
!include "logiclib.nsh"
OutFile "test.exe"

Page Custom pre

var dialog
var Checkbox1
var Checkbox2
var Check1
var Check2
var button
var button1

Function pre
        nsDialogs::Create 1018
        Pop $dialog
        ${NSD_CreateCheckbox} 0 0 50% 20% "При отметке кнопка станет активной"
                Pop $Checkbox1
                ${NSD_OnClick} $Checkbox1 fnCheckbox1

        ${NSD_CreateCheckbox} 0 25% 50% 20% "При отметке кнопка станет активной"
                Pop $Checkbox2
                ${NSD_OnClick} $Checkbox2 fnCheckbox2

        ${NSD_CreateButton} 25% 45% 15% 10% "Кнопка"
                Pop $button
                EnableWindow $button 0 # start out disabled
               
        ${NSD_CreateButton} 40u 105u 140u 15u `Кнопка отметки всех чекбоксов`
              Pop $Button1
    ${NSD_OnClick} $Button1 ButtonClickCheckBox

        nsDialogs::Show
FunctionEnd

Function fnCheckbox1
    Pop $Checkbox1
    Call DisableButton
FunctionEnd
Function fnCheckbox2
    Pop $Checkbox2
    Call DisableButton
FunctionEnd

Function DisableButton
    ${NSD_GetState} $Checkbox1 $Check1
    ${NSD_GetState} $Checkbox2 $Check2

    ${If} $Check1 == 1
    ${OrIf} $Check2 == 1 ;логика ИЛИ
        EnableWindow $button 1
    ${Else}
        EnableWindow $button 0
    ${EndIf}
FunctionEnd

Function ButtonClickCheckBox
  Pop $Button1

  ${NSD_GetState} $CheckBox1 $Check1
  ${NSD_GetState} $CheckBox2 $Check2

  ${If} $Check1 == 1
  ${Orif} $Check2 == 1
        ${NSD_SetState} $CheckBox1 0
        ${NSD_SetState} $CheckBox2 0
  ${Else}
        ${NSD_SetState} $CheckBox1 1
        ${NSD_SetState} $CheckBox2 1
  ${EndIf}
FunctionEnd

Section
SectionEnd


kotkovets 18-10-2011 14:21 1776097

Цитата:

Цитата MKN
чтобы при нажатии кнопки отметки всех чекбоксов, "кнопка" становиласьь активной ? »

MKN мог бы уже сам догадаться, что делать - событие обрабатывать, а функция которая должна
выполнится при при обработке события - DisableButton
Соответственно:
Код:

Function ButtonClickCheckBox
  Pop $Button1
  ;--
  ;--
  Call DisableButton
FunctionEnd

Правда все очень просто? я знал, что ты спросишь :)

MKN 18-10-2011 15:12 1776139

Цитата:

Цитата kotkovets
Правда все очень просто? »

Действительно... А я полез в обработку состояний для каждого чекбокса...

sawe 18-10-2011 19:14 1776299

Что то я не нашел описания для действий DropList, попробовал через NSIS Dialog Designer, какая дрянь этот Dialog Designer.
Прошу помощи?
читать дальше »
Код:

!include MUI2.nsh 
 !include WinMessages.nsh
  SetCompressor lzma
  XPStyle on
  ShowInstDetails show
  AutoCloseWindow false

  Name "DropList"
  OutFile "DropList_test.exe"
  InstallDir "$TEMP\DropList test"
  RequestExecutionLevel user
 
 Var Dialog
 Var Label
 Var DropList
 Var LngName

  Page custom nsiCustomShow nsiCustomLeave               
  !insertmacro MUI_PAGE_INSTFILES         
  !insertmacro MUI_UNPAGE_INSTFILES
  !insertmacro MUI_LANGUAGE Russian
 
Function nsiCustomShow
 !insertmacro MUI_HEADER_TEXT "Выбор установки" "Выберите способ установки и язык программы"
      nsDialogs::Create 1018
      Pop $Dialog
 
      ${NSD_CreateLabel} 174u 2u 60u 10u "Язык программы:"
      Pop $Label
     
      ${NSD_CreateDropList} 240u 0u 50u 12u  "DropList"
      Pop $DropList

      SendMessage $DropList ${CB_GETCOUNT} 0 0 $0
      IntCmp $0 0 0 0 next
      ${NSD_CB_AddString} $DropList Russian
      ${NSD_CB_AddString} $DropList English
      ${NSD_CB_AddString} $DropList Ukrainian
    next:
      ; Помнить выбранное в выподающем списке!
      ${Unless} $LngName == ""
        SendMessage $DropList ${CB_FINDSTRING} -1 "STR:$LngName" $0
      ${If} $0 = -1
        SendMessage $DropList ${CB_SETCURSEL} 0 0
      ${Else}
        SendMessage $DropList ${CB_SETCURSEL} $0 0
      ${EndIf}
      ${Else}
        SendMessage $DropList ${CB_SETCURSEL} 0 0
      ${EndUnless} 
      ${NSD_OnChange} $DropList GetSelectedLng       
  nsDialogs::Show
FunctionEnd
Function GetSelectedLng
  Pop $DropList
  ${NSD_GetState} $DropList $LngName
; ==========??????
FunctionEnd
Function nsiCustomLeave
  ${NSD_GetState} $DropList $LngName
FunctionEnd

Section Main # секция установки!
  SetOutPath $INSTDIR
  SetDateSave off
  WriteUninstaller "$INSTDIR\unins000.exe" # создание деинстолятора
 
${If} $DropList = $LngName
    WriteINIStr "$INSTDIR\Lng.ini" "Setting" "Language" $LngName
${EndIf}

  DetailPrint "DropList - $DropList"
  DetailPrint "LngName - $LngName"
  Sleep 3000
  ExecShell open "$WINDIR\notepad.exe" "$INSTDIR\Lng.ini"
SectionEnd



PS. примерно такое.
--

kotkovets 18-10-2011 20:09 1776327

Цитата:

Цитата sawe
Что то я не нашел описания для действий DropLis »

Плохо искал!!!
${NSD_GetState} - это метод для чекбоксов и радиобутонов!
---
---
${NSD_GetText} $DropList $LngName - для текстовых контролов, считываем текст контрола

sawe 18-10-2011 22:36 1776447

Спасибо, а то зациклился почему то на listbox, а слона то и не заметил...

${NSD_LB_GetSelection} listbox_HWND output_variable

--

kotkovets 18-10-2011 23:09 1776460

sawe, кстати насчет CommCtrl.nsh - офигительный хидер!
Сейчас на этом хидере отрисовку TreeView налаживаю - подобно как страничка выбора компонентов!
С деревом выбора + иконочка к каждому чекбоксу + сворачивать дерево.
Может и выложу когда нибудь по секрету как это делается...

sawe 19-10-2011 04:03 1776560

Цитата:

Цитата kotkovets
Может и выложу когда нибудь по секрету как это делается... »

Я так понимаю, что суета -> суёт и некогда вам заняться редактором nsDialods....
...

wolkow70 19-10-2011 14:36 1776883

Уважаемый товарищ kotkovets,
Столкнулся с такой проблемой, что при работе с файлом ответов не срабатывают секции из группы радиобутона отмеченные как /o

код секции:

Section /o "Создать однопользовательскую установку" AllUser
${GetSecWriteSucces} AllUser
${If} $SUCCES_SECTION = 1
SetOutPath "$INSTDIR"
File "${pkgdir}\FastStone Image Viewer\FSSettings.db"
File "${pkgdir}\FastStone Image Viewer\Portable.db"
;
SetShellVarContext current
RMDir /r "$APPDATA\FastStone\FSIV\"
${EndIf}
SectionEnd

Я думал, что при установке
${If} $SUCCES_SECTION = 1 имеет приоритет над /o

Получается, что генератор ответов и радиобутоны несовместимы?
В файле ответов AllUser=1

kotkovets 19-10-2011 14:54 1776898

Цитата:

Цитата wolkow70
Получается, что генератор ответов и радиобутоны несовместимы? »

А с чего код в секции должен выполняться? ну указали вы на нее, создался файл ответов
Но при запуске установщика секция по умолчанию не отмечена...
Генератор не влияет на флаги секций, делайте программно расставляйте, указывайте флаги инсталлятора в различных
режимах запуска, для таких дел есть хидер Sections.nsh - там куча макросов воздействия на секции программно.

wolkow70 19-10-2011 17:23 1777077

Цитата:

Цитата kotkovets
А с чего код в секции должен выполняться? ну указали вы на нее, создался файл ответов
Но при запуске установщика секция по умолчанию не отмечена...
Генератор не влияет на флаги секций, делайте программно расставляйте, указывайте флаги инсталлятора в различных
режимах запуска, для таких дел есть хидер Sections.nsh - там куча макросов воздействия на секции программно. »

Радиобутоны оказалось тут ни при чем. Любая секция отключенная по умолчанию /o не отрабатывает через значение файла ответов. Если для меня важна установка именно по файлу ответов, то что в этом случае может дать расстановка флагов? Ну выставил я их для всех типов установки, все то же самое.
Только тип устанвоки получается "по выбору", а без флагов "полный".

kotkovets 19-10-2011 17:54 1777110

wolkow70, я что нибудь говорил про типы установок? коль вы мое предыдущее сообщение не читали,
даже не пытаясь поработать с section.nsh, то очевидно - вам это не нужно, тем более мне.

wolkow70 19-10-2011 17:57 1777113

Цитата:

Цитата kotkovets
даже не пытаясь поработать с section.nsh, то очевидно - вам это не нужно, тем более мне. »

Ознакомился я с этим хедером. Но как его применить к конкретной ситуации не понял. Сказывается недостаток в русскоязычных справочных материалах. И вообще у меня еще не тот квалификационный уровень.

kotkovets 19-10-2011 18:12 1777133

Цитата:

Цитата wolkow70
Сказывается недостаток в русскоязычных справочных материалах »

В справочнике по NSIS -> перевод справки по NSIS:
SectionGetFlags: получаем статус секции
SectionGetText: получаем название секции
SectionSetFlags: устанавливаем статусы секциям
SectionSetText: назначаем название секции
Через section.nsh очень удобно использовать эти команды
пару дней тренировок на разборки и + применить правильно - больше ниче не нужно!

wolkow70 19-10-2011 18:24 1777142

kotkovets,
Мне алгоритм решения задачи до конца не ясен.
То есть, нужно получить имя и статус секции, назначить ей другое название и изменить статус? А как связать это с генератором ответов потом? Просто прописать в файле ответов значение другой секции?

kotkovets 19-10-2011 19:19 1777186

Цитата:

Цитата wolkow70
А как связать это с генератором ответов потом? »

А чет тут думать, бери да пей! Меняем статусы секций в зависимости от нахождения рядом файлика config.ini

Код:

!include "MUI2.nsh"
OutFile "test.exe"

!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_LANGUAGE "Russian"

Section /o "test" test
SectionEnd

Section /o "test_1" test1
SectionEnd

Function .OnInit
  ${If} ${FileExists} "$EXEDIR\config.ini"

    !insertmacro SelectSection ${test}
    !insertmacro SelectSection ${test1}
   
  ${EndIf}
FunctionEnd


wolkow70 19-10-2011 19:20 1777188

Похоже для начала как-то так:

SectionGetFlags ${AllUser} $0
IntOp $0 $0 | ${SF_SELECTED}
SectionSetFlags ${AllUser} $0

Тут сложность в том, что незвестно поведение пользователя.

Исходно, имеем радиобутон на две кнопки:
1. Многопользовательская установка (по умолчанию включено) MultiUser
2. Однопользовательская установка (по умолчанию отключена /o) AllUser
При ручной установке все работает. По файлу ответов AllUser не отрабатывет.

Не известно какой вид установки будет выбран.
Видимо после этих секций вставить функцию
SectionGetFlags ${AllUser} $0
IntOp $0 $0 | ${SF_SELECTED}
SectionSetFlags ${AllUser} $0
Попробовал скомпилировать ничего не получилось.

kotkovets 19-10-2011 19:59 1777223

wolkow70,
Для генератора важно, что бы секция просто была отмечена. Условие работы генератора
Тихий режим и файл конфиг, я вам дал пример программной отметки секции, больше ни тут ниче и не нужно, в огород не ходи.

wolkow70 19-10-2011 20:07 1777230

Цитата:

Цитата kotkovets
wolkow70,
Для генератора важно, что бы секция просто была отмечена. Условие работы генератора
Тихий режим и файл конфиг, я вам дал пример программной отметки секции, больше ни тут ниче и не нужно, в огород не ходи. »

То есть просто добавить в Function .OnInit

${If} ${FileExists} "$EXEDIR\config.ini"
!insertmacro SelectSection ${AllUser}

??
Но там и так эта функция гигантская и в какое место тогда логичнее вставить?

Код:

Function .OnInit
StrCpy $1 ${MultiUser}
StrCpy $WindowCaption "${PRODUCT_NAME} ${PRODUCT_VERSION}"
 StrCpy $SysDrive $WINDIR 2
StrCpy $GMODE 0 ;если обычный режим, то $GMODE = 0
StrCpy $WindowCaption "${PRODUCT_NAME} ${PRODUCT_VERSION}"
  ${WordReplace} "$EXEFILE" ".exe" ".ini" "+" "$INIFILE" ;подменяем расширение на ini c тем же именем, что и установщик
StrCpy $INIFILE "$EXEDIR\$INIFILE" ;$INIFILE - путь, где будет создан файл конфигурации
 ${GetOptions} $CMDLINE "/G" $0
  ${IfNot} ${Silent} ; условие работы генератора, если не тихий режим
  ${AndIfNot} ${Errors} ; И не установлен флаг ошибки
  ;здесь команды выполняться будут в режиме генератора, до конца конструкции ${EndIf}
    StrCpy $GMODE 1 ;с ключом /G, $GMODE = 1, режим генератора
    StrCpy $WindowCaption "Генератор ответов ${PRODUCT_NAME} ${PRODUCT_VERSION}" ;меняем название заголовка
    IfFileExists "$INIFILE" 0 +2
    Delete "$INIFILE" ;удаляем предыдущий файл конфигурации
  ${EndIf}
FunctionEnd


kotkovets 19-10-2011 20:46 1777264

Цитата:

Цитата wolkow70
Но там и так эта функция гигантская и в какое место тогда логичнее вставить? »

Код:

Function .OnInit
;--
;--
    ${If} ${Silent}
          ${If} ${FileExists} "файл конфигурации созданный генератором"
                  !insertmacro SelectSection ${AllUser}
                ;----
          ${EndIf}
    ${EndIf}
FunctionEnd

Еще вам нужно читать файл конфигурации, проверить, а не отметил ли юзер нужную секцию,
если узнаем, что юзер отметил - отмечаем программно нужную секцию.
Это вам задачка будет поучиться...

wolkow70 20-10-2011 09:29 1777549

Цитата:

Цитата kotkovets
Еще вам нужно читать файл конфигурации, проверить, а не отметил ли юзер нужную секцию,
если узнаем, что юзер отметил - отмечаем программно нужную секцию. »

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

Что-то так примерно...

Код:

Function .OnInit
StrCpy $1 ${MultiUser}
StrCpy $WindowCaption "${PRODUCT_NAME} ${PRODUCT_VERSION}"
StrCpy $SysDrive $WINDIR 2
StrCpy $GMODE 0 ;если обычный режим, то $GMODE = 0
StrCpy $WindowCaption "${PRODUCT_NAME} ${PRODUCT_VERSION}"
${WordReplace} "$EXEFILE" ".exe" ".ini" "+" "$INIFILE" ;подменяем расширение на ini c тем же именем, что и установщик
StrCpy $INIFILE "$EXEDIR\$INIFILE" ;$INIFILE - путь, где будет создан файл конфигурации
${GetOptions} $CMDLINE "/G" $0
${IfNot} ${Silent} ; условие работы генератора, если не тихий режим
${AndIfNot} ${Errors} ; И не установлен флаг ошибки
 ;здесь команды выполняться будут в режиме генератора, до конца конструкции ${EndIf}
StrCpy $GMODE 1 ;с ключом /G, $GMODE = 1, режим генератора
StrCpy $WindowCaption "Генератор ответов ${PRODUCT_NAME} ${PRODUCT_VERSION}" ;меняем название заголовка
IfFileExists "$INIFILE" 0 +2
Delete "$INIFILE" ;удаляем предыдущий файл конфигурации
${EndIf}
;==========================================================================================
;${If} ${Silent}
${If} ${FileExists} "$EXEDIR\FSImage.ini"
MessageBox MB_OK "файл конфигурации есть"
ReadINIStr $0 "$EXEDIR\FSImage.ini" "Sections" "AllUser"
MessageBox MB_OK $0
StrCmp $0 "1" 0 +2
!insertmacro SelectSection ${AllUser}
${EndIf}
FunctionEnd

Проверил. Работает. Но кажется, что-то подредактировать еще нужно..

${EndIf}
${EndIf}
FunctionEnd

так не компилируется, пришлось расставить ${EndIf}

${If} ${Silent}
и так не компилируется, пришлось закоментировать.

kotkovets 20-10-2011 11:23 1777623

Цитата:

Цитата wolkow70
так не компилируется, »

А у вас конструкция не была закрыта.
Код:

${If} ${Silent}
    ${If} ${FileExists} "$EXEDIR\FSImage.ini"
        MessageBox MB_OK "файл конфигурации есть"
        ReadINIStr $0 "$EXEDIR\FSImage.ini" "Sections" "AllUser"
        StrCmp $0 "1" 0 +2
        !insertmacro SelectSection ${AllUser}
    ${EndIf}
${EndIf}

Это че за хрень:
Код:

StrCmp $0 "1" 0 +2
!insertmacro SelectSection ${AllUser}

макрос в скрипте - не рассматривается как одна команда!

wolkow70 20-10-2011 11:45 1777639

Цитата:

Цитата kotkovets
А у вас конструкция не была закрыта. »

Дак пробовал так:
${EndIf}
${EndIf}
FunctionEnd
Цитата:

Цитата kotkovets
макрос в скрипте - не рассматривается как одна команда! »

Тогда как увязать выполнение макроса со значением параметра?

И почему-то с ${If} ${Silent} показывает логическую ошибку

kotkovets 20-10-2011 11:57 1777646

wolkow70, на глупые вопросы не буду отвечать, ищите ляпы в своем скрипте,
все компилится и работает.
И функию .OnInit следует прописать в скрипте, после определения всех секций,
это нужно компилятору.

wolkow70 20-10-2011 12:03 1777650

Цитата:

Цитата kotkovets
И функию .OnInit следует прописать в скрипте, после определения всех секций,
это нужно компилятору. »

Так и сделано.

Если конструкцию закрыть так
${EndIf}
${EndIf}
FunctionEnd
, то компилиться, но секция АllUser не отрабатывает.
А если расставить как у меня , то отрабатывает.

wolkow70 20-10-2011 12:35 1777676

${If} ${Silent}
${If} ${FileExists} "$EXEDIR\FSImage.ini"
MessageBox MB_OK "файл конфигурации есть"
ReadINIStr $0 "$EXEDIR\FSImage.ini" "Sections" "AllUser"
MessageBox MB_OK $0
${If} $0 == 1
!insertmacro SelectSection ${AllUser}
${Else}
${EndIf}
${EndIf}
${EndIf}
${EndIf}
FunctionEnd

Вот так компилируется, но секция не отрабатывает все равно...

wolkow70 20-10-2011 12:53 1777684

kotkovets,

${EndIf}
;==========================================================================================
${If} ${Silent}
${If} ${FileExists} "$EXEDIR\FSImage.ini"
MessageBox MB_OK "файл конфигурации есть"
ReadINIStr $0 "$EXEDIR\FSImage.ini" "Sections" "AllUser"
MessageBox MB_OK $0
${If} $0 == 1
!insertmacro SelectSection ${AllUser}
${Else}
${EndIf}
${EndIf}
${EndIf}
FunctionEnd

Вот так работает. Я через логическую конструкцию стал запускать макрос.
Но, если ${EndIf} сверху перетащить вниз, то секция перестает отрабатывать.
То есть, первую логическую конструкцию приходится закрывать перед открытием второй. Видимо конфликтует что-то внутри функции..

kotkovets 20-10-2011 13:30 1777736

wolkow70, Ну слава богу!
Код:

${If} ${Silent}
    ${If} ${FileExists} "$EXEDIR\FSImage.ini"
          ReadINIStr $0 "$EXEDIR\FSImage.ini" "Sections" "AllUser"
          ${If} $0 == 1
                  !insertmacro SelectSection ${AllUser}
          ${EndIf}
    ${EndIf}
${EndIf}
FunctionEnd

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

yyv 20-10-2011 13:50 1777754

у меня есть вопрос
вот я создаю контрол с линком
Код:

${NSD_CreateLink}  235u 220u 40u 15u "${TERMS_LINK}"
идет обработчик клика на линк
Код:

${NSD_OnClick} $Custom_Page_link onClickMyLink
ну и соответственно функция onClickMyLink которая открывает в браузере линк

Код:

Function onClickMyLink
  ExecShell "open"  "http://www."
 FunctionEnd

вопрос такой, если у меня на странице несколько линков, мне для обработки нужно делать для каждого контрола свою функцию?
или можно как то передать параметрами?
что тот типа
Код:

${NSD_OnClick} $Custom_Page_link onClickMyLink (link)
и затем

Код:

Function onClickMyLink (link)
  ExecShell "open"  "link"
 FunctionEnd

можно что-то подобное реализовать?

kotkovets 20-10-2011 14:19 1777768

Цитата:

Цитата yyv
можно что-то подобное реализовать? »

читать дальше »
Код:

!include "MUI2.nsh"
outfile test.exe
ShowInstDetails show

Page custom fnCustomInit
!insertmacro MUI_LANGUAGE "Russian"

var Dialog
var Link
var Link_1

Function fnCustomInit
  nsDialogs::Create 1018
      Pop $Dialog
      ${NSD_CreateLink} 15u 20u 40u 15u "LINK"
      Pop $Link
      nsDialogs::SetUserData $Link link ;назначаем идентификатор link
      ${NSD_CreateLink} 15u 40u 40u 15u "LINK 1"
      Pop $Link_1
      nsDialogs::SetUserData $Link_1 Link_1  ;назначаем идентификатор link_1
      ${NSD_OnClick} $Link onClickMyLink
      ${NSD_OnClick} $Link_1 onClickMyLink
  nsDialogs::Show
FunctionEnd

Function onClickMyLink
  Pop $Link_1
  nsDialogs::GetUserData $Link_1 ;считываем заданный идентификор
  Pop $Link
  ${If} $Link == link
        MessageBox MB_ICONINFORMATION|MB_OK "Вы кликнули: $Link" IDOK
  ${ElseIf} $Link == link_1
        MessageBox MB_ICONINFORMATION|MB_OK "Вы кликнули: $Link" IDOK
  ${EndIf}
FunctionEnd


Section
SectionEnd


wolkow70 20-10-2011 16:06 1777862

Товарищи, нет ли в NSIS комманды обновить все иконки в системе.
${RefreshShellIcons} не катит.
Смысл в том, что при установке подменяется файл с иконками типов файлов и надо его сразу подключить, а то почему-то старые отображаются (видимо сохраняются в системе от старой установки).

sawe 20-10-2011 20:14 1778020

Цитата:

Цитата wolkow70
Товарищи, нет ли в NSIS комманды обновить все иконки в системе. »

Может это вам подойдёт?
Refresh Desktop
или это
Refresh shell icons
или это
RfshDktp plug-in

Кто нибудь пробовал File Association ?
...

wolkow70 21-10-2011 11:57 1778520

Цитата:

Цитата sawe
Кто нибудь пробовал File Association ? »

Да, пробовал. Пишет ассоциации в HKCR, что неправильно, быкап примитивный. Лучше самому макрос сделать. А потом многие программы ведут себя по разному при сопоставлении с типами файлов, универсальных решений почти нет. Для Windows 7 не подходит, так как не пишет в UserChoice.
Можно взять за основу макрос из скрипта от сборки AIMP (тут выложен на форуме) и доработать его.
Цитата:

Цитата sawe
Refresh Desktop
или это
Refresh shell icons
или это
RfshDktp plug-in »

Пробовал, не то. Тут надо кэш иконок очищать.

XXXler 21-10-2011 12:47 1778554

Цитата:

Цитата wolkow70
${RefreshShellIcons} »

под Vista+ достаточно и этого, для XP кэш без перезапуска оболочки сбрасывается только так:
Код:

+ изменение размера иконки в HKCU\Control Panel\Desktop\WindowMetrics\Shell Icon Size
+ рассылка оповещения WM_SETTINGCHANGE
+ восстановление исходного размера иконки в HKCU\Control Panel\Desktop\WindowMetrics\Shell Icon Size
+ рассылка оповещения WM_SETTINGCHANGE


wolkow70 21-10-2011 12:59 1778564

Цитата:

Цитата XXXler
под Vista+ достаточно и этого, для XP кэш без перезапуска оболочки сбрасывается только так:
Код:
+ изменение размера иконки в HKCU\Control Panel\Desktop\WindowMetrics\Shell Icon Size
+ рассылка оповещения WM_SETTINGCHANGE
+ восстановление исходного размера иконки в HKCU\Control Panel\Desktop\WindowMetrics\Shell Icon Size
+ рассылка оповещения WM_SETTINGCHANGE »

Тут речь идет о подмене файла PotIcons.dll. После ${RefreshShellIcons} значки все равно отражаются от старой установки. Перезапуск эксплорера ничего не дает. В самом Pot-е есть кнопка, помогающая обновить иконки.
А мне нужна такая комманда в формате NSIS скрипта.

XXXler 21-10-2011 13:05 1778570

wolkow70, первой-же ссылкой - http://lmgtfy.com/?q=%22Shell+Icon+Size%22+NSIS

wolkow70 21-10-2011 13:56 1778599

Цитата:

Цитата XXXler
wolkow70, первой-же ссылкой - http://lmgtfy.com/?q=%22Shell+Icon+Size%22+NSIS »

Да, так сработало.

ReadRegStr $0 HKCU "Control Panel\Desktop\WindowMetrics" "Shell Icon Size"
IntOp $0 $0 + 1
WriteRegStr HKCU "Control Panel\Desktop\WindowMetrics" "Shell Icon Size" $0
SendMessage 0xffff 0x001A 42 0 /TIMEOUT=100000
IntOp $0 $0 - 1
WriteRegStr HKCU "Control Panel\Desktop\WindowMetrics" "Shell Icon Size" $0
SendMessage 0xffff 0x001A 42 0 /TIMEOUT=100000

PS: Thank You

sawe 22-10-2011 14:39 1779279

Цитата:

Цитата wolkow70
Да, пробовал. Пишет ассоциации в HKCR, что неправильно, быкап примитивный. Лучше самому макрос сделать. А потом многие программы ведут себя по разному при сопоставлении с типами файлов, универсальных решений почти нет. Для Windows 7 не подходит, так как не пишет в UserChoice.
Можно взять за основу макрос из скрипта от сборки AIMP (тут выложен на форуме) и доработать его. »

так переделай и всем будет хорошо!

wolkow70 22-10-2011 18:03 1779375

Дак себе то я сделал :)
Прикрепил скрипт от своей сборки PotPlayer. Посмотрите, как там сделано . У меня все прекрасно работает.

vahe-91 22-10-2011 18:45 1779411

возможно сделать так, чтобы установшик воспроизводил песню как в Inno Setup ? :unsure:

wolkow70 22-10-2011 19:28 1779445

Цитата:

Цитата vahe-91
возможно сделать так, чтобы установшик воспроизводил песню как в Inno Setup ? »

Да мы Вам сами споем.

kotkovets 22-10-2011 19:28 1779446

Цитата:

Цитата vahe-91
возможно сделать так, чтобы установшик воспроизводил песню как в Inno Setup ? »

Посмотри EBanner plug-in
А также с помощью bass.dll (отдельно нужно искать(version 2.0.0.23), где то есть даже пример в сети с кнопками, не помню)
http://forums.winamp.com/showthread.php?t=195814
еще :
http://nsis.sourceforge.net/Play_Sound
Вообщем то давно этим занимался, возможно sawe лучше меня разъяснит. :)

vahe-91 22-10-2011 22:01 1779556

kotkovets, спасибо :)

wolkow70, спасибо :gitara: :up2:

sawe 22-10-2011 22:26 1779565

Цитата:

Цитата wolkow70
Дак себе то я сделал
Прикрепил скрипт от своей сборки PotPlayer. Посмотрите, как там сделано . У меня все прекрасно работает. »

Вы не правильно поняли, я советовал вам подправить File Association.nsh и вам и другим стало бы легче!

Цитата:

Цитата vahe-91
возможно сделать так, чтобы установшик воспроизводил песню как в Inno Setup »

Могу только добавить, что лучше всего он кушает MP3 файлы с любым битрейном и повтором, а mid файлы долго запихивает, по этому привёл пример с банером. Если вместо SW_HIDE использовать SW_SHOW увидите плеер.

читать дальше »
Код:

;Определения пользователя!
  !define SND_NAME "music.mid"  # версия  ${SND_NAME}

;Определяем свою переменную!
Var HMCI
 
ReserveFile "${NSISDIR}\Plugins\system.dll"
ReserveFile "${SND_NAME}"


Function onGuiInit
  InitPluginsDir # обязательно инициировать каталог плагина!
  SetOutPath $PLUGINSDIR # обязательно определить каталог плагина!
  File "Sounds\${SND_NAME}" # от куда брать файл!
 
;Вставляем простой банер на тот случай если вы используете midi файлы, что бы заполнить паузу
Banner::show /set 76 "Пожалуйста подождите." "Идет подготовка к установке..."

    System::Call 'msvfw32.dll::MCIWndCreate(i 0, i 0,i 0x0070, t "$PLUGINSDIR\${SND_NAME}") i .r0'
        StrCpy $HMCI $0 # сохраняет MCI описание окна на WM_CLOSE в секции!
    SendMessage $HMCI 0x0490 0 0 $0 # проверка поддерживаемого формата!
    IntCmp $0 0 nosup
    ShowWindow $HMCI SW_HIDE # если вы хотите, чтобы mci окно было скрыто!
    SendMessage $HMCI 0x0465 0 "STR:play" # Используй "STR:play" или "STR:play repeat", но "repeat" проблемна с файлами midi!
   
Banner::destroy # придушить банер
 nosup:
 
FunctionEnd

Section main  ; секция установки!
SectionEnd
 
Function .onGUIEnd
  ;закрывает плеер!
  SendMessage $hmci ${WM_CLOSE} 0 0
FunctionEnd


--

vahe-91 22-10-2011 22:40 1779573

sawe, большое спасибо, попробую

wolkow70 23-10-2011 10:08 1779731

Цитата:

Цитата sawe
Вы не правильно поняли, я советовал вам подправить File Association.nsh и вам и другим стало бы легче! »

Он по другому вообще функционирует. Хотя может попробую подумать...
Можете еще посмотреть оригинальный скрипт VLC Player. Там тот же макрос , что и в хедере задействован, только через функцию, что на мой взгляд более гибко, чем хедер переделывать.

sawe 23-10-2011 16:49 1779975

Цитата:

Цитата wolkow70
Он по другому вообще функционирует. Хотя может попробую подумать... »

Лёд потихоньку тронулся :clapping:

kotkovets 23-10-2011 16:52 1779977

Цитата:

Цитата sawe
Лёд потихоньку тронулся »

тока неизвестно в какую сторону :lol:

wolkow70 23-10-2011 19:26 1780077

Я же только подумать обещал, а не сделать.
Реально попробовал с этим хедером работать. Намного более ограниченная вещь, чем переделанный макрос от сборки Aimp.

sawe 25-10-2011 02:27 1781025

Часто сталкивался с задачей, когда много DLL-ок, нужно положить в системную папку.
А если такие DLL-ки уже существует и даже кем-то используются, и таких если возникает много.
Вот накалякал простой макрос для подобного случая. Вопрос такой, а стоит овчинка выделки?
читать дальше »
Код:

!define RegApplicate "Software\Thinga\WinMega" # куст приложения!
!define MyPATH "D:\Test\SysDll" # место паковки программы ${MyPATH}
;---------

!macro CheckeInstall SysDll
    IfFileExists "$SYSDIR\${SysDll}.dll" 0 +3
    WriteRegStr HKLM "${RegApplicate}\SysDLL" "${SysDll}" 0 # значение в новом разделе!
  Goto ${SysDll}
    SetOutPath $SYSDIR
    SetDateSave off
    SetOverwrite ifnewer
    File "${MyPATH}\${SysDll}.dll"
    WriteRegStr HKLM "${RegApplicate}\SysDLL" "${SysDll}" 1 # значение в новом разделе!
    WriteRegStr HKLM "${RegApplicate}\SysDLL" "SetFirst" 1 # значение в новом разделе!
  ${SysDll}:
!macroend
!macro unCheckeInstall SysDll
    ReadRegStr $0 HKLM "${RegApplicate}\SysDLL" ${SysDll}
    StrCmp $0 1 0 +2
    Delete "$SYSDIR\${SysDll}.dll"
!macroend

Section # секция установки файлов! 
  ReadRegStr $0 HKLM "${RegApplicate}\SysDLL" "SetFirst"
  Iferrors nonexistent exist # перепрыгнуть!
  nonexistent:
  !insertmacro CheckeInstall "msvca71" # обозвать только имя DLL
  !insertmacro CheckeInstall "msvcb71" # обозвать только имя DLL
  !insertmacro CheckeInstall "msvcc71" # обозвать только имя DLL
  !insertmacro CheckeInstall "msvcd71" # обозвать только имя DLL
  exist:
;---------
SectionEnd

;---------

Section Uninstall # секция удаления!
  !insertmacro unCheckeInstall "msvca71"
  !insertmacro unCheckeInstall "msvcb71"
  !insertmacro unCheckeInstall "msvcc71"
  !insertmacro unCheckeInstall "msvcd71"
  DeleteRegKey HKLM "${RegApplicate}"
  DeleteRegKey /ifempty HKLM "Software\Thinga"
SectionEnd


--

Kumarov 25-10-2011 02:56 1781031

Здравствуйте, возможно ли разбить установочный файл на части?
Например это полезно при очень больших размерах установочного пакета, тогда, если разбить пакет на небольшой исполняемый файл и файлы данных (в формате BIN или PAC), инициализация установки будет происходить быстрее.

kotkovets 25-10-2011 08:42 1781080

Цитата:

Цитата sawe
Вопрос такой, а стоит овчинка выделки? »

Не стоит, многие библиотеки входят состав Visual Studio, распрастраняются в виде продуктов
VC++ 2005 - 2010 и .NET платформ.(фрамеворки)
Cоответственно простая проверочка на установку этих продуктов достаточно.
Цитата:

Цитата Kumarov
Здравствуйте, возможно ли разбить установочный файл на части? »

Очень жаль, НЕТ! Есть решения разбить на части - корявые и не стоит того внимания!
Лучше создать многотомный архив(к примеру каждый том по 100 метров), а установочным файлом распаковывать архивы.

Kumarov 25-10-2011 10:45 1781158

Да, действительно очень жаль, а у вас есть рабочие примеры, предложенной вами схемы?

sawe 26-10-2011 13:14 1782065

На x64 это точно сработает?

ExecWait '$SYSDIR\RegSvr32.exe /s "$SYSDIR\ContextMenu.dll"'

..

kotkovets 26-10-2011 14:47 1782157

Цитата:

Цитата sawe
На x64 это точно сработает? »

работает

dix75 26-10-2011 17:03 1782262

Добрый день!
У меня не работает KillProcDLL::KillProc "iexplore.exe"

Браузер не закрывается

sawe 26-10-2011 17:10 1782264

Цитата:

Цитата dix75
У меня не работает KillProcDLL::KillProc "iexplore.exe" »

Download Master

..

wolkow70 28-10-2011 03:29 1783399

Цитата:

Цитата sawe
Вопрос такой, а стоит овчинка выделки? »

А с зашаренными Dll как ваш макрос справляется? Есть же специальный макрос их удаления через обнуление количества обращений.

sawe 28-10-2011 16:40 1783755

Цитата:

Цитата wolkow70
А с зашаренными Dll как ваш макрос справляется? »

Я только высказал предположение...
..

vahe-91 29-10-2011 15:10 1784322

как скрыто запустить батник, как в 7-zip sfx ?

kotkovets 29-10-2011 15:27 1784336

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 1784374

Цитата:

Цитата kotkovets
nsExec::Exec "file.cmd" »

спасибо, это то что нужно :) но зачем нужен
Код:

Pop $0
?

kotkovets 29-10-2011 16:48 1784377

Цитата:

Цитата vahe-91
спасибо, это то что нужно но зачем нужен »

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

Pop $0
MessageBox MB_OK "$0"

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

vahe-91 29-10-2011 20:53 1784528

kotkovets, еще хотел спросить, из-за чего может создание деинсталятора задержатся примерно на пол минуты ?

kotkovets 29-10-2011 21:34 1784574

Цитата:

Цитата vahe-91
из-за чего может создание деинсталятора задержатся примерно на пол минуты ? »

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

vahe-91 29-10-2011 21:59 1784591

Цитата:

Цитата kotkovets
Трудно судить почему, из-за вопроса только, может какие процессы до создания идут, скрипт в студию, а там видно будет... »

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

kotkovets 29-10-2011 22:03 1784592

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

vahe-91 29-10-2011 22:10 1784598

Цитата:

Цитата kotkovets
удаление плагом аль стандартными командами? циклы есть? »

плагинов нет, есть goto
Код:

setregview 32
deleteregkey hklm "ключь"
setregview 64
deleteregkey hklm "ключь"

примерно тисяча строк под setregview 32 и одно и тоже под setregview 64. В секции деинсталятора только это и несколько rmdir и unregdll.

kotkovets 29-10-2011 22:21 1784602

Ясно, если стока строк - то только оптимизация кода немного может.
Деинсталлятор то компилится на "горячую руку"...поэтому такая задержка.
Цитата:

Цитата vahe-91
есть goto »

:) Вообще не использую безусловные переходы в чистом ввиде, лишь только для выхода
из глубоких логических конструкций и циклов! посему советую использовать логические конструкции
(обертки переходов на уровне компилятора) работает быстрее, ведь код сразу компилится,
а при goto установщик прыгает в процессе установки!т.е установщик еще не знает, что ему подсунут :)

vahe-91 29-10-2011 22:26 1784606

kotkovets, спасибо, попробую избавится от goto :)

kotkovets 29-10-2011 22:45 1784614

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

vahe-91 29-10-2011 22:59 1784622

kotkovets спасибо за советы,если сам не справлюсь, отправлю скрипт по ПМ, если у вас будет время, посмотрите ? :)

kotkovets 29-10-2011 23:10 1784628

да ради бога, сейчас не буду смотреть - позже.

vahe-91 30-10-2011 23:01 1785327

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

kotkovets 31-10-2011 03:58 1785426

Цитата:

Цитата vahe-91
макрос 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 1785438

Чет не врубаюсь, почему 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 1785479

Цитата:

Цитата CyberMaster
Чет не врубаюсь, почему 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" ""
Цитата:

Цитата CyberMaster
100500 раз проверял »

Можно ключ по умолчанию проверить 100501 раз
Код:

ReadRegStr $0 HKLM "SOFTWARE\TeamSpeak 3 Client" ""
MessageBox MB_OK "$0"


CyberMaster 31-10-2011 15:42 1785766

Код:

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 1785799

Цитата:

Цитата CyberMaster
У меня 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

yyv 01-11-2011 14:37 1786479

подскажите как & вставить в лейбл?
в место него просто пробел вставляется
$\& - не помогает...
другие сочетания с '/' '\' также не помогли (

kotkovets 01-11-2011 16:24 1786582

2 раза написать не пробовали: test&&

MKN 01-11-2011 16:28 1786587

А что за версия NSIS 2.46.3 ? Не официальная какая то ?
Наткнулся здесь : http://dl.dropbox.com/u/40510768/NSI...2011-10-25.exe

kotkovets 01-11-2011 16:49 1786603

Цитата:

Цитата MKN
А что за версия NSIS 2.46.3 ? Не официальная какая то ? »

Фиксы, слышал, что хотят перевести проект исходников на VS2010 - очень здорово было бы!

yyv 01-11-2011 17:37 1786633

Цитата:

Цитата kotkovets
2 раза написать не пробовали: test&& »

:pray:
не знал... :)

vahe-91 07-11-2011 18:49 1790502

нужно, чтобы вместо "Извлечение: имя файла" на странице MUI_PAGE_INSTFILES был другой текст
в самом начале секции пишу
Код:

Section "Gago"
SetDetailsPrint textonly
DetailPrint "Установка..."
.......................

но все равно отображается "Извлечение: имя файла". Что не так делаю ? :help:

kotkovets 07-11-2011 21:11 1790580

Цитата:

Цитата vahe-91
но все равно отображается "Извлечение: имя файла". Что не так делаю ? »

#845

vahe-91 07-11-2011 21:41 1790604

kotkovets, спасибо :)
В справочнике нашел, что-то подобное, в Примеры кодов - Интерфейс модерн - Ресурсы интерфейса. Там изменен этот текст на "Установка приложения...", но немного по-другому.

kotkovets 07-11-2011 21:51 1790608

Цитата:

Цитата vahe-91
В справочнике нашел, что-то подобное, в Примеры кодов - Интерфейс модерн - Ресурсы интерфейса. Там изменен этот текст на "Установка приложения...", но немного по-другому. »

Я делал так и текст один был, потому, что не было контента установки - пример пустышка, поэтому надпись не менялась,
как только появляются команды - установщик вносит надписи стандартных команд быстро, отсюда "мелтешь" контента.

dix75 11-11-2011 18:13 1793140

Что-то я не пойму почему файл так не работает
File /oname= ${PATH_OUTPUT}\${PRODUCT_OUTPUT_FILE_NAME} ${pkgdir}\${PRODUCT_FILE_NAME}

Все заработало

dix75 11-11-2011 19:30 1793196

Почему
Exec "firefox.exe"
не работает?

kotkovets 12-11-2011 01:08 1793391

Цитата:

Цитата dix75
не работает? »

Потому, что при таком раскладе путь исполнительному файлу ищется в системных путях:
в папке Windows и Windows\system32
Указывайте явный путь к "firefox.exe"

wolkow70 12-11-2011 14:55 1793588

Уважаемый товарищ kotkovets,
Некоторое время назад, преимущественно Вашими усилиями, мы работали над функцией:

Function un.INSTFILES_LEAVE

В общем виде выглядит так:
UninstPage custom un.INSTFILES_LEAVE

Section Uninstall
UnRegDLL "$INSTDIR\DefragglerShell.dll"
;
;-бла-бла-бла
RMDir /r /REBOOTOK "$INSTDIR\"
SetAutoClose true
SectionEnd

Section "Un.Перезагрузка Проводника Windows" RestartExplorer
SectionIn 1
ExecWait 'taskkill /F /IM explorer.exe' $0
DetailPrint "taskkill exit: [ $0 ]"
Sleep 500
StrCmp $0 0 0 +2
Exec "explorer.exe"
Delete "$INSTDIR\DefragglerShell.dll"
RMDir /r "$INSTDIR\"
SectionEnd
;
Function un.INSTFILES_LEAVE
${If} ${FileExists} "$INSTDIR\DefragglerShell.dll"
SetRebootFlag true
${Else}
SetRebootFlag false
${EndIf}
FunctionEnd

Выявилось следующее:
Если удалить программу с использованием данной функции, и затем переустановить снова, то после перезагрузки компьютера файл DefragglerShell.dll (или аналогичный) все равно удаляется физически, так как оказывается прописанным в ключе реестра
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager "PendingFileRenameOperations"

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

kotkovets 12-11-2011 15:28 1793602

wolkow70,
Код:

RMDir /r /REBOOTOK "$INSTDIR"
не о чем говорит?

wolkow70 12-11-2011 15:30 1793603

Цитата:

Цитата kotkovets
не о чем говорит? »

Цитата:

Цитата kotkovets
RMDir /r /REBOOTOK "$INSTDIR" »

Говорит о том, что если есть флаг перезагрузки, то удаление выполняется с перезагрузкой, если нет флага, то удаляется без перезагрузки. Или я не прав?

kotkovets 12-11-2011 15:58 1793609

wolkow70,
Говорит о том, что если файл по какой либо причине не удалится, то удалится при перезагрузке.

wolkow70 12-11-2011 16:03 1793610

Цитата:

Цитата kotkovets
Говорит о том, что если файл по какой либо причине не удалится, то удалится при перезагрузке. »

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

wolkow70 12-11-2011 16:34 1793628

kotkovets,
Тут еще дело в том, что /REBOOTOK удалять не желательно, так как это относится к стандартной функции удаления, в то время как Function un.INSTFILES_LEAVE - эксперементальная функция. Придется лучше от нее отказаться.

Alexey_KF 12-11-2011 23:09 1793886

Помогите пожалуйста!
есть файл реестра
читать дальше »
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\ESET\ESET Security\CurrentVersion\Info]
"PackageFeatures"=dword:00000001


как мне добавить эту запись в реестр используя NSIS скрипт?

kotkovets 12-11-2011 23:43 1793903

Цитата:

Цитата Alexey_KF
как мне добавить эту запись в реестр используя NSIS скрипт? »

Код:

WriteRegDWORD HKLM "SOFTWARE\ESET\ESET Security\CurrentVersion\Info" "PackageFeatures" 0x1
Читайте Справочник по NSIS

Alexey_KF 13-11-2011 09:38 1794022

Стоит следующая задача:
Есть нейкий инстолятор programma.msi и есть дополнение к ней fix.bat
Нужен скрипт, чтоб на выходе получился инстолятор progfix.exe , учитывая что при запуске progfix.exe сначала устанавливается programma.msi затем, после окончаельной установки запускался fix.bat
Буду благодарен за помощь

kotkovets 13-11-2011 12:23 1794077

Цитата:

Цитата Alexey_KF
Буду благодарен за помощь »

Это называется: напишите скрипт за меня, а то я не умею!
Вы то хоть сами то, что сделали шаг к поставленной задаче?

Alexey_KF 13-11-2011 12:39 1794081

Еслиб это было так просто я бы сам смог. Я прошу помощи.

kotkovets 13-11-2011 12:58 1794091

Цитата:

Цитата Alexey_KF
Еслиб это было так просто »

Так, это очень просто, макет таков:
Код:

ExecWait 'msiexec /i "Путь к\programma.msi" /qb'
ExecWait "Путь к fix.bat"
ExecWait "Путь к progfix.exe"


Alexey_KF 13-11-2011 18:24 1794271

Вот скрипт антивируса:
Код:

!include "$%WinDir%\Temp\ESETSIM\defines.txt"
!define /date date "%H:%M %d %b, %Y"
!define version "5.0.94.8"
VIAddVersionKey /LANG=1049 "ProductName" "ESET Antivirus"
VIAddVersionKey /LANG=1049 "Comments" "Built on ${date}"
VIAddVersionKey /LANG=1049 "CompanyName" "Alexey_KF"
VIAddVersionKey /LANG=1049 "LegalCopyright" "Copyright (c) Eset 1992-2011"
VIAddVersionKey /LANG=1049 "FileDescription" "Alexey_KF & Antivirus"
VIAddVersionKey /LANG=1049 "FileVersion" "${version}"
VIAddVersionKey /LANG=1049 "OriginalFilename" "EsetClient.exe"
VIProductVersion "${version}"
SetCompressor /SOLID lzma
SetCompressorDictSize 32
SilentInstall silent
Name "ESET Antivirus"
XPStyle on
Icon install.ico
ChangeUI IDD_VERIFY progress.exe
OutFile "${Path}\Eset_5_garant.exe"
SubCaption 3 " "
ShowInstDetails nevershow
!include FileFunc.nsh
!include x64.nsh
!insertmacro GetRoot
!insertmacro DriveSpace
!insertmacro GetOptions
!insertmacro GetParameters
var bit
var product
var setup
var silent
Function .onInit
System::Call 'kernel32::CreateMutexA(i 0, i 0, t "EsetSIM") i .r1 ?e'
Pop $R0
StrCmp $R0 0 +2
Quit
${GetRoot} "$WINDIR" $R0
${DriveSpace} "$R0" "/D=F /S=M" $R1
IntCmp $R1 300 +3 0 +3
MessageBox MB_OK|MB_ICONSTOP|MB_TOPMOST "На системном диске должно быть более$\n300 мегабайт свободного места.$\nУстановка антивируса отменена!"
Quit
ReadEnvStr $0 OS
StrCmp $0 "Windows_NT" 0 begin
ClearErrors
UserInfo::GetAccountType
IfErrors +3
Pop $0
StrCmp $0 "Admin" begin
MessageBox MB_OK|MB_ICONSTOP|MB_TOPMOST "Для установки программы у пользователя$\nдолжны быть права администратора.$\nУстановка антивируса отменена!"
Quit
begin:
ReadRegStr $0 HKLM "SOFTWARE\ESET\ESET Security\CurrentVersion\Info" "InstallDir"
IfErrors run
StrCpy $1 $0 "" -1
StrCmp $1 "\" 0 +2
StrCpy $0 $0 -1
IfFileExists "$0" 0 run
SetOutPath "$0\Updates"
Delete "$OutDir\*"
File /nonfatal /x em011_*.nup /x *_r*.nup "$%WinDir%\Temp\EsetSIM\Distrib\Updfiles\*.nup" "$%WinDir%\Temp\EsetSIM\Distrib\Updfiles\update.ver"
IfFileExists "$OutDir\update.ver" 0 run
WriteRegStr HKLM "SOFTWARE\ESET\ESET Security\CurrentVersion\Plugins\01000400\Profiles\@My profile" "SelectedServer" "$OutDir"
IfSilent +2
MessageBox MB_OK|MB_ICONINFORMATION|MB_TOPMOST "Антивирусные базы скопированы.$\nНажмите $\"Обновить$\" в главном окне."
Quit
run:
ClearErrors
StrCpy $R0 "G DATA Software"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\AVKWCtl"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "AVAST Antivirus"
StrCpy $0 "Software\ALWIL Software\Avast\4.0"
EnumRegKey $R1 HKLM $0 0
IfErrors +4
ReadRegStr $R1 HKLM $0 Avast4ProgramFolder
IfFileExists $R1\aswRunDll.exe conflicts
DeleteRegKey HKLM $0
ClearErrors
StrCpy $1 "Software\Wow6432Node\ALWIL Software\Avast\4.0"
EnumRegKey $R2 HKLM $1 0
IfErrors +4
ReadRegStr $R1 HKLM $0 Avast4ProgramFolder
IfFileExists $R1\aswRunDll.exe conflicts
DeleteRegKey HKLM $0
ClearErrors
StrCpy $R0 "AVG Antivirus or Internet Security"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\AvgCoreSvc"
StrCpy $1 "SYSTEM\CurrentControlSet\Services\avg8wd"
EnumRegKey $R1 HKLM $0 0
EnumRegKey $R2 HKLM $1 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "Kaspersky Antivirus or Internet Security"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\AVP"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "Symantec Software"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\ccEvtMgr"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "Panda Software"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\PAVSRV"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "Avira Antivirus or Security Suite"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\AntiVirService"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "BitDefender Software"
StrCpy $0 "SOFTWARE\BitDefender"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "CA Software"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\CAISafe"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "F-Secure Software"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\Eventlog\System\F-Secure Gatekeeper"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "McAfee Software"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\McShield"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "Windows Live OneCare"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\OneCareMP"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "TrendMicro Software"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\SfCtlCom"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "TrustPort Antivirus or PC Security"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\avas_service"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "Norman Antivirus or Security Suite"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\nsesvc"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "Rising Antivirus"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\RsRavMon"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "Bullguard Internet Security"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\BsFileScan"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "Sunbelt VIPRE Antivirus"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\SBAMSvc"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
Goto +3
conflicts:
MessageBox MB_OK|MB_ICONSTOP|MB_TOPMOST "Внимание! На вашем компьютере уже установлен $R0$\nУдалите его из Панели управления и запустите установку снова"
Quit
${GetParameters} $R0
StrCpy $silent qb
${GetOptions} "$R0" "/eav" $product
IfErrors +4
StrCpy $product "eav"
StrCpy $silent qn
Goto bit
ClearErrors
messagebox::show MB_DEFBUTTON3|MB_TOPMOST "Production by Alexey_KF" "0,103" "Сборка собрана на инсталляторах$\n$\nESET NOD32 Antivirus Business Edition 5.0.94.8 32-bit Final$\n$\nESETNOD32 Antivirus Business Edition 5.0.94.8 Final 64-bit.3$\n$\nУстанавливается на Windows NT ОС х86 и х64 (Авто выбор)$\n$\nСпециально для soft.4local.ru"  "Установка"  "Отмена"
Pop $product
StrCmp $product "1" 0 +3
StrCpy $product "eav"
Goto bit
Quit
bit:
${If} ${RunningX64}
StrCpy $bit 64
${Else}
StrCpy $bit 32
${EndIf}
FunctionEnd
Section Install
File cfg.xml
SetOutPath "$WINDIR\Temp\EsetSIM"
File /nonfatal "/oname=$WINDIR\Temp\EsetSIM\cfg.xml" "eset.xml"
StrCmp $product "eav" 0
StrCmp $bit "32" 0 eav64
File /r "Distrib\eavbe_nt32_rus\*.*"
File /nonfatal "/oname=$WINDIR\Temp\EsetSIM\cfg.xml" "eav.xml"
StrCpy $setup eavbe_nt32_rus
Goto install
eav64:
StrCmp $bit "64" 0 exit
File /r "Distrib\eavbe_nt64_rus\*.*"
File /nonfatal "/oname=$WINDIR\Temp\EsetSIM\cfg.xml" "eav.xml"
StrCpy $setup eavbe_nt64_rus
Goto install
install:
SetOutPath "$WINDIR\Temp\EsetSIM\APPDATADIR\Updfiles"
File /nonfatal /x em011_*.nup /x *_r*.nup "$%WinDir%\Temp\EsetSIM\Distrib\Updfiles\*.nup"
IfFileExists "$EXEDIR\Updates\update.ver" 0 start
IfFileExists "$EXEDIR\Updates\em000_32_l0.nup" 0 start
IfFileExists "$EXEDIR\Updates\em005_32_l0.nup" 0 start
CopyFiles /silent /filesonly "$EXEDIR\Updates\*.nup" "$WINDIR\Temp\EsetSIM\APPDATADIR\Updfiles"
start:
ExecWait '"$SYSDIR\msiexec.exe" /i "$WINDIR\Temp\EsetSIM\$setup.msi" /$silent'
WriteRegDWORD HKCU "Software\ESET\ESET Security\CurrentVersion\Client" "ShowSplash" 0x00000000
ClearErrors
ReadRegStr $0 HKLM "SOFTWARE\ESET\ESET Security\CurrentVersion\Info" "InstallDir"
IfErrors exit
StrCpy $1 $0 "" -1
StrCmp $1 "\" 0 +2
StrCpy $0 $0 -1
IfFileExists "$0" 0 exit
File /nonfatal "/oname=$0\License\eset.lic" "eset.lic"
exit:
SetOutPath "$WINDIR\Temp"
RMDir /r /rebootok "$WINDIR\Temp\EsetSIM"
Quit
SectionEnd

Нужно, чтоб этот скрипт дополнительно подхватывал файл "fix.bat" Потом после команды запуска (ExecWait '"$SYSDIR\msiexec.exe" /i "$WINDIR\Temp\EsetSIM\$setup.msi" /$silent') копировал "fix.bat" в папку Temp. Затем, после установки антивируса в последнюю очередь происходил запуск "fix.bat"

kotkovets 13-11-2011 18:57 1794294

М-дя, давно такого "кодынга" не видел....все таки логические операторы рулят однозначно(логичекие конструкции)
Не запутались прыгать и скакать по меткам? :o О_о :)
Код:

ExecWait 'msiexec.exe /i "$TEMP\EsetSIM\$setup.msi" /$silent'
IfFileExists "путь к fix.bat" 0 +3
CopyFiles /silent "путь к fix.bat" "$TEMP\fix.bat"
ExecWait "$TEMP\fix.bat"

SetOutPath "$WINDIR\Temp" - это че такое? у многих вр. папка далеко не здесь!
системная временная папка определяется так: $TEMP

Alexey_KF 13-11-2011 18:59 1794297

целый день мучаюсь. сча попробую еще раз

Цитата:

Цитата kotkovets
IfFileExists "путь к fix.bat" 0 +3 »

надо чтоб подхватывал файл в текущей папке

kotkovets 13-11-2011 19:09 1794301

Цитата:

Цитата Alexey_KF
надо чтоб подхватывал файл в текущей папке »

Читайте в справочнике по NSIS -> Переменные NSIS (Variables)
Там все разжевано!
$EXEDIR — папка, откуда запущен инсталятор

Alexey_KF 13-11-2011 19:23 1794308

вот что вышло:
Код:

!include "$%WinDir%\Temp\ESETSIM\defines.txt"
!define /date date "%H:%M %d %b, %Y"
!define version "5.0.94.8"
VIAddVersionKey /LANG=1049 "ProductName" "ESET Antivirus"
VIAddVersionKey /LANG=1049 "Comments" "Built on ${date}"
VIAddVersionKey /LANG=1049 "CompanyName" "Alexey_KF"
VIAddVersionKey /LANG=1049 "LegalCopyright" "Copyright (c) Eset 1992-2011"
VIAddVersionKey /LANG=1049 "FileDescription" "Alexey_KF & Antivirus"
VIAddVersionKey /LANG=1049 "FileVersion" "${version}"
VIAddVersionKey /LANG=1049 "OriginalFilename" "EsetClient.exe"
VIProductVersion "${version}"
SetCompressor /SOLID lzma
SetCompressorDictSize 32
SilentInstall silent
Name "ESET Antivirus"
XPStyle on
Icon install.ico
ChangeUI IDD_VERIFY progress.exe
OutFile "${Path}\Eset_5_garant.exe"
SubCaption 3 " "
ShowInstDetails nevershow
!include FileFunc.nsh
!include x64.nsh
!insertmacro GetRoot
!insertmacro DriveSpace
!insertmacro GetOptions
!insertmacro GetParameters
var bit
var product
var setup
var silent
Function .onInit
System::Call 'kernel32::CreateMutexA(i 0, i 0, t "EsetSIM") i .r1 ?e'
Pop $R0
StrCmp $R0 0 +2
Quit
${GetRoot} "$WINDIR" $R0
${DriveSpace} "$R0" "/D=F /S=M" $R1
IntCmp $R1 300 +3 0 +3
MessageBox MB_OK|MB_ICONSTOP|MB_TOPMOST "На системном диске должно быть более$\n300 мегабайт свободного места.$\nУстановка антивируса отменена!"
Quit
ReadEnvStr $0 OS
StrCmp $0 "Windows_NT" 0 begin
ClearErrors
UserInfo::GetAccountType
IfErrors +3
Pop $0
StrCmp $0 "Admin" begin
MessageBox MB_OK|MB_ICONSTOP|MB_TOPMOST "Для установки программы у пользователя$\nдолжны быть права администратора.$\nУстановка антивируса отменена!"
Quit
begin:
ReadRegStr $0 HKLM "SOFTWARE\ESET\ESET Security\CurrentVersion\Info" "InstallDir"
IfErrors run
StrCpy $1 $0 "" -1
StrCmp $1 "\" 0 +2
StrCpy $0 $0 -1
IfFileExists "$0" 0 run
SetOutPath "$0\Updates"
Delete "$OutDir\*"
File /nonfatal /x em011_*.nup /x *_r*.nup "$%WinDir%\Temp\EsetSIM\Distrib\Updfiles\*.nup" "$%WinDir%\Temp\EsetSIM\Distrib\Updfiles\update.ver"
IfFileExists "$OutDir\update.ver" 0 run
WriteRegStr HKLM "SOFTWARE\ESET\ESET Security\CurrentVersion\Plugins\01000400\Profiles\@My profile" "SelectedServer" "$OutDir"
IfSilent +2
MessageBox MB_OK|MB_ICONINFORMATION|MB_TOPMOST "Антивирусные базы скопированы.$\nНажмите $\"Обновить$\" в главном окне."
Quit
run:
ClearErrors
StrCpy $R0 "G DATA Software"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\AVKWCtl"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "AVAST Antivirus"
StrCpy $0 "Software\ALWIL Software\Avast\4.0"
EnumRegKey $R1 HKLM $0 0
IfErrors +4
ReadRegStr $R1 HKLM $0 Avast4ProgramFolder
IfFileExists $R1\aswRunDll.exe conflicts
DeleteRegKey HKLM $0
ClearErrors
StrCpy $1 "Software\Wow6432Node\ALWIL Software\Avast\4.0"
EnumRegKey $R2 HKLM $1 0
IfErrors +4
ReadRegStr $R1 HKLM $0 Avast4ProgramFolder
IfFileExists $R1\aswRunDll.exe conflicts
DeleteRegKey HKLM $0
ClearErrors
StrCpy $R0 "AVG Antivirus or Internet Security"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\AvgCoreSvc"
StrCpy $1 "SYSTEM\CurrentControlSet\Services\avg8wd"
EnumRegKey $R1 HKLM $0 0
EnumRegKey $R2 HKLM $1 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "Kaspersky Antivirus or Internet Security"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\AVP"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "Symantec Software"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\ccEvtMgr"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "Panda Software"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\PAVSRV"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "Avira Antivirus or Security Suite"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\AntiVirService"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "BitDefender Software"
StrCpy $0 "SOFTWARE\BitDefender"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "CA Software"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\CAISafe"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "F-Secure Software"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\Eventlog\System\F-Secure Gatekeeper"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "McAfee Software"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\McShield"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "Windows Live OneCare"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\OneCareMP"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "TrendMicro Software"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\SfCtlCom"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "TrustPort Antivirus or PC Security"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\avas_service"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "Norman Antivirus or Security Suite"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\nsesvc"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "Rising Antivirus"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\RsRavMon"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "Bullguard Internet Security"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\BsFileScan"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "Sunbelt VIPRE Antivirus"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\SBAMSvc"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
Goto +3
conflicts:
MessageBox MB_OK|MB_ICONSTOP|MB_TOPMOST "Внимание! На вашем компьютере уже установлен $R0$\nУдалите его из Панели управления и запустите установку снова"
Quit
${GetParameters} $R0
StrCpy $silent qb
${GetOptions} "$R0" "/eav" $product
IfErrors +4
StrCpy $product "eav"
StrCpy $silent qn
Goto bit
ClearErrors
messagebox::show MB_DEFBUTTON3|MB_TOPMOST "Production by Alexey_KF" "0,103" "Сборка собрана на инсталляторах$\n$\nESET NOD32 Antivirus Business Edition 5.0.94.8 32-bit Final$\n$\nESETNOD32 Antivirus Business Edition 5.0.94.8 Final 64-bit.3$\n$\nУстанавливается на Windows NT ОС х86 и х64 (Авто выбор)$\n$\nСпециально для soft.4local.ru"  "Установка"  "Отмена"
Pop $product
StrCmp $product "1" 0 +3
StrCpy $product "eav"
Goto bit
Quit
bit:
${If} ${RunningX64}
StrCpy $bit 64
${Else}
StrCpy $bit 32
${EndIf}
FunctionEnd
Section Install
File cfg.xml
SetOutPath "$WINDIR\Temp\EsetSIM"
File /nonfatal "/oname=$WINDIR\Temp\EsetSIM\cfg.xml" "eset.xml"
StrCmp $product "eav" 0
StrCmp $bit "32" 0 eav64
File /r "Distrib\eavbe_nt32_rus\*.*"
File /nonfatal "/oname=$WINDIR\Temp\EsetSIM\cfg.xml" "eav.xml"
StrCpy $setup eavbe_nt32_rus
Goto install
eav64:
StrCmp $bit "64" 0 exit
File /r "Distrib\eavbe_nt64_rus\*.*"
File /nonfatal "/oname=$WINDIR\Temp\EsetSIM\cfg.xml" "eav.xml"
StrCpy $setup eavbe_nt64_rus
Goto install
install:
SetOutPath "$WINDIR\Temp\EsetSIM\APPDATADIR\Updfiles"
File /nonfatal /x em011_*.nup /x *_r*.nup "$%WinDir%\Temp\EsetSIM\Distrib\Updfiles\*.nup"
IfFileExists "$EXEDIR\Updates\update.ver" 0 start
IfFileExists "$EXEDIR\Updates\em000_32_l0.nup" 0 start
IfFileExists "$EXEDIR\Updates\em005_32_l0.nup" 0 start
CopyFiles /silent /filesonly "$EXEDIR\Updates\*.nup" "$WINDIR\Temp\EsetSIM\APPDATADIR\Updfiles"
start:
ExecWait '"$SYSDIR\msiexec.exe" /i "$WINDIR\Temp\EsetSIM\$setup.msi" /$silent'
IfFileExists "$EXEDIR\eset_server_fix.bat" 0 +3
CopyFiles /silent "$EXEDIR\eset_server_fix.bat" "$WINDIR\Temp\eset_server_fix.bat"
ExecWait "$WINDIR\Temp\eset_server_fix.bat"
WriteRegDWORD HKCU "Software\ESET\ESET Security\CurrentVersion\Client" "ShowSplash" 0x00000000
ClearErrors
ReadRegStr $0 HKLM "SOFTWARE\ESET\ESET Security\CurrentVersion\Info" "InstallDir"
IfErrors exit
StrCpy $1 $0 "" -1
StrCmp $1 "\" 0 +2
StrCpy $0 $0 -1
IfFileExists "$0" 0 exit
File /nonfatal "/oname=$0\License\eset.lic" "eset.lic"
exit:
SetOutPath "$WINDIR\Temp"
RMDir /r /rebootok "$WINDIR\Temp\EsetSIM"
Quit
SectionEnd

если запускаю батник вручную после установки то все нормально фиксит, а если с синстолятором то не фиксится... что не так?

Alexey_KF 13-11-2011 19:42 1794315

Заметил странность! Если запускать готовый конечный инстолятор и положить рядом фикс - то работает! А если запускать истолятор с пустой папки то фикса нет!

Alexey_KF 13-11-2011 20:14 1794339

kotkovets, если не применять фикс, а в место этого добавить ветки реестра в скрипт (которые применились после инстоляции setup.msi) то что и как мне надо прописать?
вот ветки реестра:
Код:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\ESET\ESET Security\CurrentVersion\Info]
"PackageFeatures"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\ESET\ESET Security\CurrentVersion\Plugins\01000400\UI_Settings\Servers]
"Server_0"="http://4local.ru:2221"
[HKEY_LOCAL_MACHINE\SOFTWARE\ESET\ESET Security\CurrentVersion\Plugins\01000400\Profiles\@My profile]
"SelectedServer"="http://4local.ru:2221"


kotkovets 13-11-2011 20:56 1794365

У вас в батнике прописаны импорт кустов реестра, то это однозначно в 1000 раз лучше.
Код:

ExecWait "msiexec bla bla"
WriteRegStr HKLM "SOFTWARE\ESET\ESET Security\CurrentVersion\Plugins\01000400\UI_Settings\Servers" "Server_0" "http://4local.ru:2221"
;---

"

dix75 14-11-2011 10:42 1794698

kotkovets,
Цитата:

Цитата kotkovets
Потому, что при таком раскладе путь исполнительному файлу ищется в системных путях:
в папке Windows и Windows\system32
Указывайте явный путь к "firefox.exe" »

так выходит его сначала получить надо.

vahe-91 14-11-2011 11:51 1794729

почему возникают проблемы во время установки, если переменная темп не находится в папке по умолчанию ? :unsure: файлы распаковываются в нужное место, а команда запуска ехе-шника из папки темп идет в другое место :dont-know

kotkovets 14-11-2011 12:03 1794735

vahe-91, Подробней, переменная никуда не девается
$TEMP- возвращает путь к системной временной папке.

vahe-91 14-11-2011 12:34 1794743

kotkovets, дело в том что у меня всегда папка темп находится в папке по умолчанию и никогда ошибок не было. Но у тех, где она не в этой папке, иногда, возникают проблемы во время утановки. Мой скрипт делает распаковку файлов в $temp\folder , потом идет команда запуска $temp\folder\setup.exe , потом удаление папки folder. В некоторых системах, где путь к темп изменен, сначала идет распаковка и потом сразу удаление папки, без запуска Setup.exe :o

lokoham 14-11-2011 12:42 1794746

товарищи,а существует ли функция для удаления файлов?

Alexey_KF 14-11-2011 12:43 1794752

наверное немного не в тему но... Батник, который запускает инсталлятор, написанный на nsis не выполняет нужных изменений в реестре. А если тот же самый батник запустить в ручную то все срабатывает. Почему?

Krinkels 14-11-2011 13:21 1794764

lokoham
Да, существует. Читай справку.

Alexey_KF
Ты бы хоть писал понятнее, со всеми запятыми.
Как батник запускаешь? Хоть кусок кода выложи

kotkovets 14-11-2011 13:49 1794773

Цитата:

Цитата vahe-91
потом идет команда запуска $temp\folder\setup.exe »

Возьми в кавычки путь - "$temp\folder\setup.exe"
И что, возвращает:
Код:

ExecWait "$temp\folder\setup.exe" $0
MessageBox MB_OK "$0" IDOK
;или
nsExec::Exec "$temp\folder\setup.exe"
Pop $0
MessageBox MB_OK "$0" IDOK

И еще проверь, что возвращает, если временная папка по умолчанию в винде(т.е в папке пользователя)
Код:

SetShellVarContext All
      MessageBox MB_ICONINFORMATION|MB_OK "$TEMP" IDOK
      SetShellVarContext current
    MessageBox MB_ICONINFORMATION|MB_OK "$TEMP" IDOK

Цитата:

Цитата Alexey_KF
Батник, который запускает инсталлятор, написанный на nsis »

Это че за батник, да еще написанный на nsis? :o

Krinkels 14-11-2011 13:58 1794777

Цитата:

Цитата kotkovets
Это че за батник, да еще написанный на nsis? »

Я тоже сначала так прочитал, но подумал что это бред. Видимо имеется ввиду инсталятор написанный на нсис, а не батник :)

kotkovets 14-11-2011 14:23 1794797

Да....Мало того, что NSIS не так уж прост, дык еще вешают себе же гемор в одно место,
в виде батника, который запускает пресловутый NSIS :jester:
Цитата:

Цитата lokoham
товарищи,а существует ли функция для удаления файлов? »

Представляете я тожь не нашел, ну долго искал, пока справку не открыл! :jester:

Krinkels 14-11-2011 14:46 1794816

Цитата:

Цитата kotkovets
Да....Мало того, что NSIS не так уж прост, дык еще вешают себе же гемор в одно место,
в виде батника, который запускает пресловутый NSIS »

А то. Батник для запуска батника, который в свою очередь запускает еще один батник. И после такой цепочки запускается инсталятор на нсис :)

Уважаемые пользователи!
На глупый вопрос вы рискуете получить глупый ответ.
Пишите правильно, дабы можно было понять ваш вопрос. Помните, экстрасенсы в отпуске, телепаты на больничном, а шаманам нет дела до ваших проблем

Alexey_KF 14-11-2011 18:55 1795022

Если б вы прочитали предыдущие посты то было бы вам понятно.
Я вылаживал сложный скрипт с командами (nsis) который запускал .bat файл.
вот его часть:
Код:

start:
ExecWait '"$SYSDIR\msiexec.exe" /i "$WINDIR\Temp\EsetSIM\$setup.msi" /$silent'
IfFileExists "$EXEDIR\eset_server_fix.bat" 0 +3
CopyFiles /silent "$EXEDIR\eset_server_fix.bat" "$WINDIR\Temp\eset_server_fix.bat"
ExecWait "$WINDIR\Temp\eset_server_fix.bat"

Почему вручную запуская батник реестр изменяется, а таким образом нет?
Чтоб еще раз убедиться, что батник срабатывает только вручную-создал sfx архив с командой запуска батника. Батник запустился, а изменений в реестре нет.
Собственно для чего этот батник:
-в антивирусе nod 32 (5 версии) по умолчанию в настройках не доступен выбор сервера обновлений антивирусных баз. Этот батник разблокирывает эту функцию и устанавливает путь для обновлений.
Код батника:
Код:

@echo off
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\ESET\ESET Security\CurrentVersion\Info" /v PackageFeatures /t REG_DWORD /D "1" /f
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\ESET\ESET Security\CurrentVersion\Plugins\01000400\UI_Settings\Servers" /v Server_0 /t REG_SZ /D "http://4local.ru:2221" /f
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\ESET\ESET Security\CurrentVersion\Plugins\01000400\Profiles\@My profile" /v SelectedServer /t REG_SZ /D "http://4local.ru:2221" /f

P.S. Иногда приходится отвечать с телефона. Извините за орфографию.

kotkovets 14-11-2011 20:54 1795129

Alexey_KF
какие нафиг батники еще надо, ради внесения пару строк реестра, гемор на одно место... :cool:
Код:

WriteRegStr HKLM "SOFTWARE\ESET\ESET Security\CurrentVersion\Plugins\01000400\Profiles\@My profile" "SelectedServer" "http://4local.ru:2221"
;--

Цитата:

Цитата Alexey_KF
Если б вы прочитали предыдущие посты то было бы вам понятно »

А не читаете Вы, что я Вам пишу, ИМХО!
Есть утилитка:
Reg2NSIS конвертер reg файлов в скрипт NSIS
Это не панацея от всех проблем, но прежде всего думайте своей головой, а не головой утилитки.

Alexey_KF 14-11-2011 21:45 1795155

kotkovets, спасибо за оперативную помощ но:
Код:

!include "$%WinDir%\Temp\ESETSIM\defines.txt"
!define /date date "%H:%M %d %b, %Y"
!define version "5.0.94.8"
VIAddVersionKey /LANG=1049 "ProductName" "ESET Antivirus"
VIAddVersionKey /LANG=1049 "Comments" "Built on ${date}"
VIAddVersionKey /LANG=1049 "CompanyName" "Alexey_KF"
VIAddVersionKey /LANG=1049 "LegalCopyright" "Copyright (c) Eset 1992-2011"
VIAddVersionKey /LANG=1049 "FileDescription" "Alexey_KF & Antivirus"
VIAddVersionKey /LANG=1049 "FileVersion" "${version}"
VIAddVersionKey /LANG=1049 "OriginalFilename" "EsetClient.exe"
VIProductVersion "${version}"
SetCompressor /SOLID lzma
SetCompressorDictSize 32
SilentInstall silent
Name "ESET Antivirus"
XPStyle on
Icon install.ico
ChangeUI IDD_VERIFY progress.exe
OutFile "${Path}\Eset_5_garant.exe"
SubCaption 3 " "
ShowInstDetails nevershow
!include FileFunc.nsh
!include x64.nsh
!insertmacro GetRoot
!insertmacro DriveSpace
!insertmacro GetOptions
!insertmacro GetParameters
var bit
var product
var setup
var silent
Function .onInit
System::Call 'kernel32::CreateMutexA(i 0, i 0, t "EsetSIM") i .r1 ?e'
Pop $R0
StrCmp $R0 0 +2
Quit
${GetRoot} "$WINDIR" $R0
${DriveSpace} "$R0" "/D=F /S=M" $R1
IntCmp $R1 300 +3 0 +3
MessageBox MB_OK|MB_ICONSTOP|MB_TOPMOST "На системном диске должно быть более$\n300 мегабайт свободного места.$\nУстановка антивируса отменена!"
Quit
ReadEnvStr $0 OS
StrCmp $0 "Windows_NT" 0 begin
ClearErrors
UserInfo::GetAccountType
IfErrors +3
Pop $0
StrCmp $0 "Admin" begin
MessageBox MB_OK|MB_ICONSTOP|MB_TOPMOST "Для установки программы у пользователя$\nдолжны быть права администратора.$\nУстановка антивируса отменена!"
Quit
begin:
ReadRegStr $0 HKLM "SOFTWARE\ESET\ESET Security\CurrentVersion\Info" "InstallDir"
IfErrors run
StrCpy $1 $0 "" -1
StrCmp $1 "\" 0 +2
StrCpy $0 $0 -1
IfFileExists "$0" 0 run
SetOutPath "$0\Updates"
Delete "$OutDir\*"
File /nonfatal /x em011_*.nup /x *_r*.nup "$%WinDir%\Temp\EsetSIM\Distrib\Updfiles\*.nup" "$%WinDir%\Temp\EsetSIM\Distrib\Updfiles\update.ver"
IfFileExists "$OutDir\update.ver" 0 run
WriteRegStr HKLM "SOFTWARE\ESET\ESET Security\CurrentVersion\Plugins\01000400\Profiles\@My profile" "SelectedServer" "$OutDir"
IfSilent +2
MessageBox MB_OK|MB_ICONINFORMATION|MB_TOPMOST "Антивирусные базы скопированы.$\nНажмите $\"Обновить$\" в главном окне."
Quit
run:
ClearErrors
StrCpy $R0 "G DATA Software"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\AVKWCtl"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "AVAST Antivirus"
StrCpy $0 "Software\ALWIL Software\Avast\4.0"
EnumRegKey $R1 HKLM $0 0
IfErrors +4
ReadRegStr $R1 HKLM $0 Avast4ProgramFolder
IfFileExists $R1\aswRunDll.exe conflicts
DeleteRegKey HKLM $0
ClearErrors
StrCpy $1 "Software\Wow6432Node\ALWIL Software\Avast\4.0"
EnumRegKey $R2 HKLM $1 0
IfErrors +4
ReadRegStr $R1 HKLM $0 Avast4ProgramFolder
IfFileExists $R1\aswRunDll.exe conflicts
DeleteRegKey HKLM $0
ClearErrors
StrCpy $R0 "AVG Antivirus or Internet Security"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\AvgCoreSvc"
StrCpy $1 "SYSTEM\CurrentControlSet\Services\avg8wd"
EnumRegKey $R1 HKLM $0 0
EnumRegKey $R2 HKLM $1 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "Kaspersky Antivirus or Internet Security"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\AVP"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "Symantec Software"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\ccEvtMgr"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "Panda Software"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\PAVSRV"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "Avira Antivirus or Security Suite"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\AntiVirService"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "BitDefender Software"
StrCpy $0 "SOFTWARE\BitDefender"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "CA Software"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\CAISafe"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "F-Secure Software"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\Eventlog\System\F-Secure Gatekeeper"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "McAfee Software"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\McShield"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "Windows Live OneCare"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\OneCareMP"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "TrendMicro Software"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\SfCtlCom"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "TrustPort Antivirus or PC Security"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\avas_service"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "Norman Antivirus or Security Suite"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\nsesvc"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "Rising Antivirus"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\RsRavMon"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "Bullguard Internet Security"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\BsFileScan"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "Sunbelt VIPRE Antivirus"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\SBAMSvc"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
Goto +3
conflicts:
MessageBox MB_OK|MB_ICONSTOP|MB_TOPMOST "Внимание! На вашем компьютере уже установлен $R0$\nУдалите его из Панели управления и запустите установку снова"
Quit
${GetParameters} $R0
StrCpy $silent qb
${GetOptions} "$R0" "/eav" $product
IfErrors +4
StrCpy $product "eav"
StrCpy $silent qn
Goto bit
ClearErrors
messagebox::show MB_DEFBUTTON3|MB_TOPMOST "Production by Alexey_KF" "0,103" "Сборка собрана на инсталляторах:$\n$\nESET NOD32 Antivirus Business Edition 5.0.94.8 32-bit Final$\n$\nESETNOD32 Antivirus Business Edition 5.0.94.8 Final 64-bit$\n$\nУстанавливается на Windows NT ОС х86 и х64 (Авто выбор)$\n$\nСпециально для soft.4local.ru"  "Установка"  "Отмена"
Pop $product
StrCmp $product "1" 0 +3
StrCpy $product "eav"
Goto bit
Quit
bit:
${If} ${RunningX64}
StrCpy $bit 64
${Else}
StrCpy $bit 32
${EndIf}
FunctionEnd
Section Install
File cfg.xml
SetOutPath "$WINDIR\Temp\EsetSIM"
File /nonfatal "/oname=$WINDIR\Temp\EsetSIM\cfg.xml" "eset.xml"
StrCmp $product "eav" 0
StrCmp $bit "32" 0 eav64
File /r "Distrib\eavbe_nt32_rus\*.*"
File /nonfatal "/oname=$WINDIR\Temp\EsetSIM\cfg.xml" "eav.xml"
StrCpy $setup eavbe_nt32_rus
Goto install
eav64:
StrCmp $bit "64" 0 exit
File /r "Distrib\eavbe_nt64_rus\*.*"
File /nonfatal "/oname=$WINDIR\Temp\EsetSIM\cfg.xml" "eav.xml"
StrCpy $setup eavbe_nt64_rus
Goto install
install:
SetOutPath "$WINDIR\Temp\EsetSIM\APPDATADIR\Updfiles"
File /nonfatal /x em011_*.nup /x *_r*.nup "$%WinDir%\Temp\EsetSIM\Distrib\Updfiles\*.nup"
IfFileExists "$EXEDIR\Updates\update.ver" 0 start
IfFileExists "$EXEDIR\Updates\em000_32_l0.nup" 0 start
IfFileExists "$EXEDIR\Updates\em005_32_l0.nup" 0 start
CopyFiles /silent /filesonly "$EXEDIR\Updates\*.nup" "$WINDIR\Temp\EsetSIM\APPDATADIR\Updfiles"
start:
ReadRegStr $0 HKLM "SOFTWARE\ESET\ESET Security\CurrentVersion\Info" "InstallDir"
ExecWait '"$SYSDIR\msiexec.exe" /i "$WINDIR\Temp\EsetSIM\$setup.msi" /$silent'
WriteRegDWORD HKCU "Software\ESET\ESET Security\CurrentVersion\Client" "ShowSplash" 0x00000000
WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\ESET\ESET Security\CurrentVersion\Info" "PackageFeatures" 0x1
WriteRegStr HKLM "SOFTWARE\ESET\ESET Security\CurrentVersion\Plugins\01000400\UI_Settings\Servers"Server_0" "http://4local.ru:2221"
WriteRegStr HKLM "SOFTWARE\ESET\ESET Security\CurrentVersion\Plugins\01000400\Profiles\@My profile" "SelectedServer" "http://4local.ru:2221"
ClearErrors
IfErrors exit
StrCpy $1 $0 "" -1
StrCmp $1 "\" 0 +2
StrCpy $0 $0 -1
IfFileExists "$0" 0 exit
File /nonfatal "/oname=$0\License\eset.lic" "eset.lic"
exit:
SetOutPath "$WINDIR\Temp"
RMDir /r /rebootok "$WINDIR\Temp\EsetSIM"
Quit
SectionEnd

что не так? почему после установки антивируса не изменяется реестр???

Все таки сработала одна строка из 3-ех:
Код:

WriteRegStr HKLM "SOFTWARE\ESET\ESET Security\CurrentVersion\Plugins\01000400\UI_Settings\Servers"Server_0" "http://4local.ru:2221"
а почему 2 остальные не стработали?

kotkovets 14-11-2011 22:28 1795191

Цитата:

Цитата Alexey_KF
что не так? »

попробуйте просто добавить в реестр записи в отладочном скрипте, ради проверки, без всякой установки антивируса
Цитата:

Цитата Alexey_KF
а почему 2 остальные не стработали? »

потому что, эти ветки перезаписывает антивирус однозначно!
---
А вот это бред полный, на кой черт счищать флаг ошибки,
а затем проверять флаг ошибки?? однозначно флага ошибки НИКОГДА не будет!
Cледовательно весь код ниже будет выполняться всегда, независимо от метки exit
Код:

ClearErrors
IfErrors exit
StrCpy $1 $0 "" -1
;--
;--
exit:
;--


Alexey_KF 14-11-2011 22:48 1795200

Цитата:

Цитата kotkovets
потому что, эти ветки перезаписывает антивирус однозначно! »

помогите добавить эти ветки после установки антивируса

kotkovets 14-11-2011 23:20 1795221

Цитата:

Цитата Alexey_KF
помогите добавить эти ветки после установки антивируса »

Это не та тема обсуждения, а особенности установки этого продукта я не знаю.

vahe-91 14-11-2011 23:25 1795225

Цитата:

Цитата Alexey_KF
помогите добавить эти ветки после установки антивируса »

Нужно убить процессы антивируса или сделать так, чтобы антивирус запускался после перезагрузки компьютера, а не сразу после установки.

Krinkels 14-11-2011 23:34 1795235

Цитата:

Цитата vahe-91
Нужно убить процессы антивируса »

99% что антивирь просто так не даст убить свой процесс.
Цитата:

Цитата vahe-91
чтобы антивирус запускался после перезагрузки компьютера, а не сразу после установки. »

А смысл? Как только антивирь запуститься он тут же их перезапишет

kotkovets 14-11-2011 23:34 1795236

Цитата:

Цитата vahe-91
Нужно убить процессы антивируса или сделать так, чтобы антивирус запускался после перезагрузки компьютера »

Ну это слишком сложно, лучше всего нужные ветки добавлять после установки антивиря и перезагрузки ,
прописыванием в реестр запуск инсталла специальным назначенным ключом, чтобы после занесения в реестр данных инсталлятор закрывался сразу же, т.е такие действия лучше всего прописать
в функции .OnInit - дабы не было видно окошка запуска инсталла.

Krinkels 14-11-2011 23:40 1795243

Смею предложить в этом случае использовать именно батник. ИМХО проще, меньше строк + самоудаление

vahe-91 14-11-2011 23:42 1795245

:off: я бы вместо Alexey_KF все изменения сделал бы на самой msi, а не через NSIS

kotkovets 14-11-2011 23:43 1795246

Krinkels, не люблю я эти батники, все делаю через NSIS раз NSIS,
а это не сложно - 5,6 строк кода, без записей команд с реестром
Цитата:

Цитата vahe-91
все изменения сделал бы на самой msi »

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

Krinkels 14-11-2011 23:47 1795250

На вкус и цвет товарища нет. А вообще я считаю что некоторые вещи все таки можно себе позволить.
Цитата:

Цитата kotkovets
Врятли изменения таблиц в пакете msi изменит ситуацию, если антивирь сразу заводится. »

Про msi еще нужно читать, а тут за тебя половину сделают :)

vahe-91 14-11-2011 23:50 1795252

Цитата:

Цитата kotkovets
Врятли изменения таблиц в пакете msi изменит ситуацию, если антивирь сразу заводится »

ради интереса попробую, если будет время :)

kotkovets 15-11-2011 00:17 1795270

Цитата:

Цитата kotkovets
Ну это слишком сложно, лучше всего нужные ветки добавлять после установки антивиря и перезагрузки ,
прописыванием в реестр запуск инсталла специальным назначенным ключом, чтобы после занесения в реестр данных инсталлятор закрывался сразу же, т.е такие действия лучше всего прописать
в функции .OnInit - дабы не было видно окошка запуска инсталла. »

Можно так попробывать, после установки софта записываем автозапуск инсталла с ключом /regdat
Код:

WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce" "Setup" '"$EXEPATH" /regdat'
А функции прописать следующие (после рег. данных инсталл закрывается)
Код:

!include "FileFunc.nsh"
!include "LogicLib.nsh"

Function .onInit
    ClearErrors
    ${GetOptions} `$CMDLINE` `/regdat` `$0`
    ${IfNot} ${Errors}
        ;сюда пишем рег. данные
        Quit
    ${EndIf}
    ClearErrors
FunctionEnd


Alexey_KF 15-11-2011 20:04 1795870

Цитата:

Цитата Krinkels
А смысл? Как только антивирь запуститься он тут же их перезапишет »

Если я вручную запускаю батник то реестр изменяется. Если батник запускает инстолятор то изменений нет.
P.S. Перезагузка не обязательна. Изменения вручную срабатывают.

vahe-91 15-11-2011 23:30 1795987

Alexey_KF, уже 1000 раз говорили избався ты от этого батника и пропиши ключи добавляемие батником в установщик :biggrin:

wolkow70 17-11-2011 18:02 1797356

kotkovets,

Пришлось некоторым образом изменить функцию, но вроде все работает...

Код:

UninstPage custom un.INSTFILES_LEAVE
;
Section Uninstall  Uninstall
SectionIn 1 RO
;
RMDir /r "$INSTDIR"
SetAutoClose true
SectionEnd
;
Section /o "Un.Перезагрузка Проводника Windows"  RestartExplorer
SectionIn 1
ExecWait 'taskkill /F /IM explorer.exe' $0
DetailPrint "taskkill exit: [ $0 ]"
Sleep 500
StrCmp $0 0 0 +2
Exec "explorer.exe"
Delete "$INSTDIR\DefragglerShell.dll"
RMDir /r "$INSTDIR"
SectionEnd
;
Function un.INSTFILES_LEAVE
${If} ${FileExists} "$INSTDIR\DefragglerShell.dll"
RMDir /r /REBOOTOK "$INSTDIR"
SetRebootFlag true
${Else}
SetRebootFlag false
${EndIf}
FunctionEnd

То есть, перенес комманду RMDir /r /REBOOTOK "$INSTDIR" из Uninstall в саму функцию un.INSTFILES_LEAVE. Таким образом, если Пользователь не выбрал секцию RestartExplorer, то залоченный файл остается на месте и не прописывается на удаление. Зато, затем он все равно удаляется с перезагрузкой через комманду функции. Получается как бы вариант стандартного удаления.
Но если, пользователь выбрал секцию RestartExplorer, то залоченный файл удаляется без перезагрузки. А флаг REBOOTOK в этом случае не срабатывает, в результате файл не прописывается на удаление после перезагрузки.
Только вот не знаю имеет ли смысл в функции рядом ставить комманды
RMDir /r /REBOOTOK "$INSTDIR"
SetRebootFlag true
Может SetRebootFlag true можно тогда и не использовать?

kotkovets 17-11-2011 19:20 1797406

wolkow70, функция un.INSTFILES_LEAVE выполняется ВСЕГДА!
Проверяет наличие файлика DefragglerShell.dll и на основе проверки "решает" показывать стр. перезагрузки сейчас или нет!
И принудительно устанавливает флаги перезагрузки - банальная перестраховка.
Код:

${If} ${FileExists} "$INSTDIR\DefragglerShell.dll"
      Delete /REBOOTOK "$INSTDIR\DefragglerShell.dll"
      SetRebootFlag true
${Else}
      SetRebootFlag false
${EndIf}

И еще один момент, если удаление задано с флагом /REBOOTOK, но файлы или файл удалились удачно,
установщик устанавливает флаг перезагрузки - false,
если неудачное удаление(по каким то причинам) установщик устанавливает флаг перезагрузки - true
Это легко проверить инсценировкой ситуации, например создать архив и держать архив открытым программой архиватором, то вы не сможете удалить архив, файл занят:
Код:

  Delete /REBOOTOK "$EXEDIR\Linker.zip"
  Ifrebootflag 0 +2
      MessageBox MB_OK "true" IDOK
  Ifrebootflag +2
    MessageBox MB_OK "false" IDOK

---
А уже на страничке финиша, если true - установщик предложит перезагрузку.
если false - установщик не предложит перезагрузку.
---
И еще важный аспект, если вы ловите в скрипте флаг пререзагрузки, не забудьте снова установить
предыдущий флаг перезагрузки при необходимости, потому что команда Ifrebootflag
определяет состояние флага и после определения сбрасывает в false или в неопределенное состояние.
Код:

  Delete /REBOOTOK "$EXEDIR\Linker.zip"
  Ifrebootflag 0 +3
      MessageBox MB_OK "true" IDOK
      SetRebootFlag true
  Ifrebootflag +3
      MessageBox MB_OK "false" IDOK
      SetRebootFlag false

Что вам нужно, решаете сами, поэтому поводу я вам разжевал все и повторяться не буду.

wolkow70 18-11-2011 10:17 1797792

Цитата:

Цитата kotkovets
функция un.INSTFILES_LEAVE выполняется ВСЕГДА! »

Это и замечательно! Это и позволило перенести в нее флаг /REBOOTOK.
Проблема заключалась в том, что при наличии флага /REBOOTOK в самой секции инсталляции после удаления программы с применением RestartExplorer файлик прописывался в реестре на удаление. И в с случае переустановки программы (без перезагрузки) удалялся после перезагрузки уже из папки новой установки. Удаление же этого ключа приводило к тому, что при удалении без применения RestartExplorer папка с залоченным файлом оставалась на месте после перезагрузки.
Перенос флага /REBOOTOK в функцию позволил применять RestartExplorer для удаления файла вообще без флага /REBOOTOK (так как при уже при фактическом отсутствии файлика срабатывает второе условие (Else). В результате файл на удаление в реестре не прописывается и можно сразу переустанавливать программу без опасения удаления файлика после перезагрузки.
Вот в чем заключалась проблема, которую пришлось решать.

Delete /REBOOTOK "$INSTDIR\DefragglerShell.dll"
SetRebootFlag true
Перестраховки здесь, на мой взгляд, нет. Так как SetRebootFlag true ставит флаг перезагрузки для финишной страницы, но не прописывает в реестр запись на удаление файла после перезагрузки. Как я понял это делает только флаг /REBOOTOK. поэтому он нужен, но пришлось перенести его в другое место для сохранения возможности двух вариантов деинсталляции.

wolkow70 20-11-2011 18:42 1799381

Товарищи, подскажите как вылезти из засады:

Function .onInit
;
MessageBox MB_YESNO|MB_ICONQUESTION "ВНИМАНИЕ!$\n\
$\nЕсли у вас открыты окна браузеров Internet Explorer, Mozilla Firefox, Opera, Chrome закройте их перед продолжением установки. \
$\nВ противном случае, они будут закрыты принудительно! \
$\nЭто избавит от конфликтов интеграции программы. \
$\n$\nПРОДОЛЖИТЬ ?" /SD IDYES IDNO Note
;
KillProcDLL::KillProc "opera.exe"
Sleep 700
KillProcDLL::KillProc "firefox.exe"
Sleep 700
KillProcDLL::KillProc "chrome.exe"
Sleep 700
KillProcDLL::KillProc "IEXPLORE.EXE"
Sleep 700
Note:
Abort # выйти из программы.
FunctionEnd

По любому происходит аборт. Без /SD еще получается перевести стрелки. А с ним фиг. Справка не помогла.

kotkovets 20-11-2011 21:29 1799480

Цитата:

Цитата wolkow70
А с ним фиг. Справка не помогла »

Хреново Вы ее читаете:
Цитата:

Если в команде не указан ни один из идентификаторов, установщик возвращает их в 0 (по умолчанию).
Максимум возможно задать два идентификатора кнопок, не указанный индетификатор кнопки возвратится в 0.

Цитата:

Цитата wolkow70
По любому происходит аборт »

А вы всегда на эту команду выйдете однозначно, подумайте почему!?
Такое впечатление, что вы не понимаете, че и пишите то :o
---
При тихом режиме нажмется кнопка "нет" :
Код:

  IfSilent NOTE
  MessageBox MB_YESNO 'Какую кнопку нажать?' IDNO NOTE
      MessageBox MB_OK 'Вы нажали кнопку "да"'
      Goto END
  NOTE:
      MessageBox MB_OK 'Вы нажали кнопку "нет"'
      Abort
  END:

или так аналогично:
Код:

MessageBox MB_YESNO 'Какую кнопку нажать?' /SD IDNO IDYES YES
    MessageBox MB_OK 'Вы нажали кнопку "нет"'
    Quit
YES:
    MessageBox MB_OK 'Вы нажали кнопку "да"'

Цитата:

Цитата wolkow70
Если у вас открыты окна браузеров Internet Explorer, Mozilla Firefox, Opera, Chrome»

Так вы их проверяйте, что они открыты(открыт один из них), а то тупо просто мочится - вообще жесть!
Такой кодинг неприемлем ИМХО :shocked:
Такое мочилово неприятно грубыми последствиями, достаточно предупреждать юзера, если у вас открыты окна браузеров Internet Explorer, Mozilla Firefox, Opera, Chrome, и все! иначе выход! Юзер сам закроет, что ему нужно и когда!

wolkow70 21-11-2011 09:21 1799672

Цитата:

Цитата kotkovets
А вы всегда на эту команду выйдете однозначно, подумайте почему!? »

Abort # выйти из программы.
FunctionEnd

Это мне понятно. Мне не понятно как обойти abort в данном случае.

Цитата:

Цитата kotkovets
Так вы их проверяйте, что они открыты (открыт один из них), а то тупо просто мочится - вообще жесть!
За такой кодинг я бы я**а натянул на одно место
Такое мочилово неприятно грубыми последствиями, достаточно предупреждать юзера, если у вас открыты окна браузеров Internet Explorer, Mozilla Firefox, Opera, Chrome, и все! иначе выход! Юзер сам закроет, что ему нужно и когда! »

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

kotkovets 21-11-2011 11:07 1799711

Цитата:

Цитата wolkow70
Кроме того, Вы следите за своей фразеологией, »

Если я столь грубо выразился, то приношу извинения...
выражаюсь вполне чотко и ясно :)
Цитата:

Цитата wolkow70
Юзеры бывают разные »

Это ясно, не нужно думать головой установщика и навязывать это юзеру.
Цитата:

Цитата wolkow70
Мне не понятно как обойти abort в данном случае »

последовательность, уважаемый забыли и прыжок,
если не нужно прерывание, примеры выше

Aster 21-11-2011 14:22 1799847

Добрый день. Есть вопрос по программе NSIS.
Возникла следующая проблемка с функцией проверки файла.
Только, пожалуйста, не отправляйте меня читать справку, т.к я с ней ознакомился, там действительно есть описание функции проверки файла, но мне это не помогло. И я хотел бы попросить вас, если такое возможно, написать мне чёткий пример кода, который решил бы мою проблему. Заранее благодарю!

А суть вопроса следующая:
Необходимо внедрить в установщик функцию проверки на наличие конкретного файла (а лучше двух или нескольких конкретных файлов) в той папке, которую пользователь указал в окне "выбор папки для установки". Т.е пользователь выбирает папку, заметьте именно ВЫБИРАЕТ папку, т.е инсталлятор должен ему позволить выбрать папку и нажать ОК. Итак папка выбрана. Теперь пользователь нажимает кнопку "Далее" (заметьте кнопка "Далее" должна быть АКТИВНА в любом случае (ранее у меня почему-то получалось так, что если в выбранной папке нет файла, то кнопка "Далее" неактивна, т.е нажать её нельзя). И вот именно в этом месте, после того как пользователь выбрал папку и нажал кнопку "Далее" и должна срабатывать функция проверки файлов. Если файлы в указанной папке найдены, то установка продолжится и перейдёт на след.страницу инсталлера, если же файлов в папке не обнаружено, то необходимо чтобы появлялось уведомляющее окно с сообщением вида "В указанном Вами каталоге отстуствуют компоненты игры YYY. Пожалуйста, укажите правильный каталог". Уведомление должно быть только с кнопкой ОK, после нажатия которой пользователь мог бы изменить каталог для установки и вновь нажать "Далее". Такая проверка мне нужна для того, чтобы пользователь не смог распаковать мой дистрибутив ни в какой другой каталог, кроме как в каталог с игрой YYY.

Это ещё не всё, так как помимо указанной проверки, мне ещё нужна другая проверка - проверка на какую версию игры пользователь собирается установить мой дистрибутив. Необходимо чтобы проверка выявляла наличие у пользователя чистой (неперепатченной) версии игры, т.е чтобы пользователь мог установить мой дистрибутив только на чистую версию игры. Принцип должен быть такой. Необходимо, чтобы проверка срабатывала в тот же момент, что и предыдущая, т.е после выбора папки для установки и нажатия кнопки "Далее". Принцип: проверка должна выявить наличие в выбранной папке конкретных файлов (других файлов, никак не связанных с предыдущей проверкой) и если файлы обнаружены - должно всплывать уведомление вида "Компоненты игры YYY были ранее изменены. Установка приложение возможна только поверх оригинального дистрибутива. Пожалуйста, переустановите игру".

И последнее, наверное, самое простое.
Необходимо, чтобы при запуске инсталлятора, совершалась ориентация на ключ реестра.
Т.е если ключ реестра обнаружен - инсталлятор запускается. Если нет - появлялось бы всплывающее окно с кнопками ДА и НЕТ, вида: "На вашем компьютере не обнаружено установленной игры YYY. Убедитесь, что устанавливали дистрибутив игры. Продолжить установку?" Суть: инсталлятор выявляет есть ли у пользователя вообще установленная игра. Однако, ключ реесстра может и отсуствовать, если юзер качал игру с винта на винт, поэтому даже если ключ не обнаружен, должна быть возможность продолжить установку.

Надеюсь на Вашу помощь, ребят. Уважаю ваш труд, справка по NSIS действительно внушительная и виден громадный объём проделанной работы.
Что касается моих вопросов, на мой взгляд вопросы про этим проверкам также могли бы быть наиболее подробно описаны в вашей справке. Думаю, это было бы интересно.

Благодарю за внимание.
С уважением, Aster.

kotkovets 21-11-2011 15:25 1799911

Цитата:

Цитата Aster
Уважаю ваш труд, справка по NSIS действительно внушительная и виден громадный объём проделанной работы »

Спасибо на добром слове.
Цитата:

Цитата Aster
Такая проверка мне нужна для того, чтобы пользователь не смог распаковать мой дистрибутив ни в какой другой каталог, кроме как в каталог с игрой YYY. »

В таком случае страничка выбора директории неуместна.
на примере 7-zip девятой версии
читать дальше »
Код:

!include "MUI2.nsh"
!include "FileFunc.nsh"

InstallDirRegKey HKCU "Software\7-Zip" "Path" ;берем путь из реестра, в противном случае ниже код.
InstallDir "$PROGRAMFILES\7-zip"

!insertmacro MUI_PAGE_WELCOME
  !define MUI_PAGE_CUSTOMFUNCTION_LEAVE LEAVE_COMPONENTS ;функция будет выполнена при закрытии странички компонентов
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE English

Name "Test"
OutFile "Test.exe"
ShowInstDetails show

Function LEAVE_COMPONENTS
  ${IfNot} ${FileExists} "$INSTDIR\7z.exe"
  ${OrIfNot} ${FileExists} "$INSTDIR\7z.dll" ;логика ИЛИ-НЕ ;при необходимости пишем еще раз на указанный ваш файл
      MessageBox MB_OK "Не найден один из файлов!" IDOK
      Abort ;прерывание
  ${Else}
    ;Здесь можно писать код проверки версии файлов и изменения файлов
    ${GetFileVersion} "$INSTDIR\7z.exe" $0 ; выявляем версию файла
    StrCpy $0 $0 1 ;берем из версии первую циферку(один первый символ)
    ;сравниваем версию
    ${If} $0 != 9
        MessageBox MB_OK "Это не 9 версия файла 7z" IDOK
        Abort
    ${EndIf}
    ;сравниваем пропатченный файл или нет плагом MD5
    ;;
    ;;

  ${EndIf}
FunctionEnd

Section MAIN
SectionEnd
Section MAIN_1
SectionEnd


Цитата:

Цитата Aster
Принцип: проверка должна выявить наличие в выбранной папке конкретных файлов (других файлов, никак не связанных с предыдущей проверкой) и если файлы обнаружены - должно всплывать уведомление вида "Компоненты игры YYY были ранее изменены »

На офф. сайте найдите плагин MD5 и сверьте хэш-сумму оригинала, если не сходится прерывание.

wolkow70 21-11-2011 17:29 1799997

Цитата:

Цитата kotkovets
последовательность, уважаемый забыли и прыжок,
если не нужно прерывание, примеры выше »

Оба ваших примера в моем случае не работают, точнее говоря работают при обычной установке. но при тихой не работают. Потому как, мне в тихом режиме нужно нажать кнопку "да", а не "нет, что реализуют приведенные вами примеры. А это и не удается сделать, так как в этом случае abort не перепрыгнуть.

Aster 21-11-2011 17:30 1799998

kotkovets
Спасибо за отклик!

Цитата:

Цитата kotkovets
В таком случае страничка выбора директории неуместна.
на примере 7-zip девятой версии »

Нет. Уместна. Мне нужна проверка именно в таком виде, как я описал.
Именно, чтобы пользователь указывал каталог для установки и нажимал "Далее".
Если он указал его неправильно - должно всплыть сообщение о неправильном каталоге.
А Вы мне привели пример выполнения функции проверки при "закрытии страницы с компонентами".
При этом у Вас в примере путь проверяемого файла берётся из реестра или из папки Program Files. Про реестр я написал отдельно, не факт что ключ есть в рестре. А Program Files мне вообще никак тут не нужна. Игра у пользователя может быть установлена где угодно вообще. Именно поэтому мне необходимо, чтобы пользователь САМ указывал папку для установки и нажимал "Далее". И после этого шла бы проверка. Ничего другое мне не подходит.

Цитата:

Цитата kotkovets
На офф. сайте найдите плагин MD5 и сверьте хэш-сумму оригинала, если не сходится прерывание. »

Это уже, к сожалению, за гранью моего понимания (

____________________________________________

Имеется к Вам предложение.
Наш проект высочайшей технической сложности.
Это обширное дополнение для игры. Требует высококачественного инсталлятора. Основы я знаю, проблемы лишь вот с такими доп.функциями, как проверки.
Мы уже много лет занимаемся выпуском комплексных патчей и у нас тысячи пользователей, ждущих релиза. Дабы не заниматься рекламой - умышленно не называю имя проекта.
Для создания инсталляторов у нас был отдельный человек, который создавал прекрасные инсталлы на основе Ghost Installer. В этом году он отошёл от дел и инсталлер вынужден делать я. Как Вы понимаете, должно быть не хуже чем было. Не хуже ни по функционалу, ни по оформлению. Так вот, если вы понимаете что именно я хочу реализовать по поводу проверок, могу ли я рассчитывать на Вашу ПРЯМУЮ помощь? Т.е Вы, по возможности подготовите уже готовые коды для необходимых нам функций. Если Вы согласны поучаствовать напрямую в создании инсталлятора - мы могли бы связаться с вами по ICQ, я бы вам поведал об обширности проекта и всей серьёзности дела.

Проект некоммерческий и денег, к сожалению, я вам предложить не могу.
Но обещаю Вам персональную благодарность в списке авторов, а также по Вашему желанию указать ссылку на Ваш ресурс или какие-либо другие координаты.
Вы также можете привлечь Ваших коллег по данному ремеслу.
Будем рады сотрудничеству.

Жду Вашего решения.

wolkow70 21-11-2011 17:31 1800000

Цитата:

Цитата kotkovets
Если я столь грубо выразился, то приношу извинения... »

Только извинений недостаточно. В таких случаях принято и сообщение поправить. Ведь, сюда люди иногда заходят почитать.

MKN 21-11-2011 17:51 1800008

Цитата:

Цитата wolkow70
Только извинений недостаточно. »

Ты тоже деликатностью не блещишь : :)
Цитата:

Цитата wolkow70
del - тут была плохая фраза»

Прям как в зоновском бараке, а не на обсуждении скриптов... :)

wolkow70 21-11-2011 18:12 1800028

kotkovets,

Немного изменил формат сообщения и все получилось :)

Function .onInit
MessageBox MB_YESNO|MB_ICONQUESTION "ВНИМАНИЕ!$\n\
$\nЕсли у вас открыты окна браузеров Internet Explorer, Mozilla Firefox, Opera, Chrome закройте их перед продолжением установки. \
$\nВ противном случае, они будут закрыты принудительно! \
$\nЭто избавит от конфликтов интеграции программы. \
$\n$\nПРОДОЛЖИТЬ ?" /SD IDYES IDYES continue IDNO close
;
close:
Abort
continue:
;
KillProcDLL::KillProc "opera.exe"
Sleep 700
KillProcDLL::KillProc "firefox.exe"
Sleep 700
KillProcDLL::KillProc "chrome.exe"
Sleep 700
KillProcDLL::KillProc "IEXPLORE.EXE"
Sleep 700
FunctionEnd

Цитата:

Цитата MKN
Ты тоже деликатностью не блещишь : »


kotkovets 21-11-2011 18:32 1800047

Цитата:

Цитата wolkow70
но при тихой не работают. Потому как, мне в тихом режиме нужно нажать кнопку "да", а не "нет, что реализуют »

^
Цитата:

Цитата MKN
Прям как в зоновском бараке, а не на обсуждении скриптов... »

А что делать, когда не понимают, того что делают и на пальцах когда уже показал.
Цитата:

Цитата Aster
Нет. Уместна. Мне нужна проверка именно в таком виде, как я описал.
Именно, чтобы пользователь указывал каталог для установки и нажимал "Далее".
Если он указал его неправильно - должно всплыть сообщение о неправильном каталоге.
А Вы мне привели пример выполнения функции проверки при "закрытии страницы с компонентами".
При этом у Вас в примере путь проверяемого файла берётся из реестра или из папки Program Files. Про реестр я написал отдельно, не факт что ключ есть в рестре. А Program Files мне вообще никак тут не нужна. Игра у пользователя может быть установлена где угодно вообще. Именно поэтому мне необходимо, чтобы пользователь САМ указывал папку для установки и нажимал "Далее". И после этого шла бы проверка. Ничего другое мне не подходит. »

Это всего лишь пример и не нужно его дословно воспринимать как так и нужно !
Это основа!
Коль Вы в справку просили не тыкать, но все же придется на счет команд:
InstallDirRegKey
Раз нужно так делаем так:
Код:

  !define MUI_PAGE_CUSTOMFUNCTION_LEAVE LEAVE_DIRECTORY
  !insertmacro MUI_PAGE_DIRECTORY
  ---
  Function LEAVE_DIRECTORY
        ;переносим код с функции LEAVE_COMPONENTS <-- и эту функцию и упраздняем.
  FunctionEnd

Цитата:

Цитата Aster
На офф. сайте найдите плагин MD5 и сверьте хэш-сумму оригинала »

Это элементарно, примеры есть там, плагином проверяем хэш оригинального файла - запоминаем циферки. Во время установки плагином проверяем хэш сумму файла.
Сравниваем хэш оргинала и хэш файла, точно как, как проверку версии.
Если ключ реестра не найден, то команда InstallDir "bla bla" - не нужна.
Откроется страничка директории без выбранного пути.
Цитата:

Цитата Aster
Жду Вашего решения »

Скажу так, двояково, с нуля не буду писать, нужна помощь - помогу (в личку).
Я в играх плохо разбираюсь :)
---
wolkow70, методом упрощения, не обязательно указывать на второй индетификатор, он сам туда придет :)
Код:

MessageBox MB_YESNO|MB_ICONQUESTION "ВНИМАНИЕ!$\n\
 $\nЕсли у вас открыты окна браузеров Internet Explorer, Mozilla Firefox, Opera, Chrome закройте их перед продолжением установки. \
 $\nВ противном случае, они будут закрыты принудительно! \
 $\nЭто избавит от конфликтов интеграции программы. \
 $\n$\nПРОДОЛЖИТЬ ?" /SD IDYES IDYES continue
 Abort
 continue:
  ;---


wolkow70 22-11-2011 15:42 1800797

Alexey_KF,

Я сам собираюсь делать сборку на пятую версию Eset. Вы бы изложили свои соображения по сборке. Может совместными усилиями что-нибудь сделаем.
Для четверки я делал раньше так:

Код:

!define PRODUCT_NAME "Eset Smart Security"
!define PRODUCT_VERSION "4.2.71.3"
!define pkgdir "D:\NSIS"
!define MUI_WELCOMEFINISHPAGE_BITMAP "${pkgdir}\ESS32\Eset.bmp"
; MUI 1.67 compatible ------
!include "MUI.nsh"
SetCompressor /SOLID lzma
SetCompressorDictSize 32

!define MUI_ABORTWARNING
!define MUI_ICON "${pkgdir}\ESS32\Eset.ico"

; MUI Settings
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "Russian"

Name "${PRODUCT_NAME}"
Caption "Установка ${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile ESSv4.exe
VIProductVersion "4.2.71.3 "
!define /date date "%H:%M %d %b, %Y"
VIAddVersionKey /LANG=1049 "LegalCopyright" "Eset"
VIAddVersionKey /LANG=1049 "Comments" "Built on ${date}"
VIAddVersionKey /LANG=1049 "CompanyName" "wolkow70"
VIAddVersionKey /LANG=1049 "FileVersion" "4.2.71.3 "
VIAddVersionKey /LANG=1049 "FileDescription" "Eset Smart Security"
SubCaption 3 " "
!include IsUserAdmin.nsh
!include FileFunc.nsh
!insertmacro GetRoot
!insertmacro DriveSpace
Function .onInit
System::Call 'kernel32::CreateMutexA(i 0, i 0, t "ESSSetup") i .r1 ?e'
Pop $R0
StrCmp $R0 0 +3
MessageBox MB_OK|MB_ICONQUESTION|MB_TOPMOST "Установка Eset Smart Security уже запущена..."
Abort
ReadRegDWORD $0 HKLM SYSTEM\Setup SystemSetupInProgress
IntCmp $0 1 0 +2
SetSilent silent
${GetRoot} "$WINDIR" $R0
${DriveSpace} "$R0" "/D=F /S=M" $R1
IntCmp $R1 100 +3 0 +3
MessageBox MB_OK|MB_ICONEXCLAMATION|MB_TOPMOST "На системном диске должно быть более$\n100 мегабайт свободного места.$\nУстановка Eset Smart Security отменена!"
Abort
!insertmacro IsUserAdmin $R0
StrCmp $R0 1 +3
MessageBox MB_OK|MB_ICONEXCLAMATION|MB_TOPMOST "Для установки программы у пользователя$\nдолжны быть права администратора.$\nУстановка Eset Smart Security отменена!"
Abort
FunctionEnd

Section "!${PRODUCT_NAME}"  ESS
SectionIn RO
SetOutPath "$TEMP\ESSSetup"
File /r "Distrib\*"
ExecWait "msiexec.exe /i $\"$TEMP\ESSSetup\ess_nt32_rus.msi$\"  /qn REBOOT=ReallySuppress"
SetOutPath "$TEMP"
RMDir /r "$TEMP\ESSSetup"
SectionEnd

LangString message ${LANG_ENGLISH} "Here is in English"
LangString message ${LANG_RUSSIAN} "А тут по русски"
LangString DESC_ESS  ${LANG_RUSSIAN} "Будет установлен пакет защиты компьютера от вирусов и интернет-угроз ${PRODUCT_NAME} ${PRODUCT_VERSION}"

!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
!insertmacro MUI_DESCRIPTION_TEXT ${ESS} $(DESC_ESS)
!insertmacro MUI_FUNCTION_DESCRIPTION_END

Сейчас хочу что-нибудь поинтереснее сделать.

MKN 22-11-2011 17:00 1800881

Обновился NSIS Dialog Designer до v 0.9.9 (http://coolsoft.altervista.org/en/nsisdialogdesigner)
Только у меня под XPx32 (другой ОС нет под рукой) - не работает.
Запускается с ошибкой - Runtime error: и т.д. целая портянка. После закрытия окна с сообщением об ошибке, запускается без тулбара... У кого какие результаты с этой версией ?

wolkow70 22-11-2011 20:08 1801050

Товарищи, подскажите есть ли какая-то ошибка в моем коде.
На x86 все нормально регистрируется. Юзеры пишут, что на x64 не функционирует контекстное меню.

Section "Использовать расширенную оболочку XnView" XnViewShell
SectionIn 1 2

SetOutPath "$INSTDIR" ; - подключить директорию установки
;
${If} ${RunningX64} ; открыть логическую конструкцию, и если запущена х64
SetOutPath "$INSTDIR\XnShellEx64" ; - подключить путь
RegDLL "$INSTDIR\XnShellEx64\XnViewShellExt.dll" ; - зарегистрировать

${Else} ; - иначе, если не x64

SetOutPath "$INSTDIR\ShellEx" ; -подключить путь
RegDLL "$INSTDIR\ShellEx\XnViewShellExt.dll" ; - зарегистрировать

${EndIf} ; - закрыть логическую конструкцию

WriteRegStr HKCU "Software\XnView\ShellEx" "Language" "ru"

SectionEnd

kotkovets 22-11-2011 20:51 1801087

wolkow70
XnViewShellExt.dll - файл должен быть именно для x64
иногда, встречается не часто, одна библиотека для разрядности систем.
Код:


${If} ${RunningX64} ; открыть логическую конструкцию, и если запущена х64
      SetOutPath "$INSTDIR\XnShellEx64"
      ExecWait `regsvr32 /s "$INSTDIR\XnShellEx64\XnViewShellExt.dll"` $0
      ;MessageBox MB_OK "код возврата: $0" IDOK
      ;если удачно, то $0 = 0, если $0 = 3 --> модуль не найден
 ${Else}
      RegDLL "$INSTDIR\ShellEx\XnViewShellExt.dll"
 ${EndIf}
 WriteRegStr HKCU "Software\XnView\ShellEx" "Language" "ru"

Будет время гляну, что и почему и как...
---
Глянул... для оболочки в x64 нужен 64-разрядный XnViewShellExt.dll
XnView Shell Extension ZIP 64bits

wolkow70 23-11-2011 13:46 1801625

Цитата:

Цитата kotkovets
XnViewShellExt.dll - файл должен быть именно для x64 »

Он и есть для X64. Отдельно скачивается с офсайта.

kotkovets 23-11-2011 14:22 1801645

Цитата:

Цитата wolkow70
Он и есть для X64 »

Регистрация в x64 этой библиотки именно так, проверено на xp x64 и 7 x64:
Код:

ExecWait `regsvr32 /s "$INSTDIR\XnShellEx64\XnViewShellExt.dll"`
Разрегистрация:
Код:

ExecWait `regsvr32 /s /u "$INSTDIR\XnShellEx64\XnViewShellExt.dll"`
Замечено, не только мной, но и Lisabon
независимо от системы, примерно на 100 случаев , 2 случая: regdll - не работает.
Очевидно не срабатывает команда regdll из-за "особенностей" регистрируемой библиотеки.
regsvr32 - не подводил пока ни разу.

MKN 23-11-2011 17:51 1801811

Сообщил автору NSIS Dialog Designer - баг исправлен в версии v.0.9.10

kotkovets 23-11-2011 18:11 1801841

MKN, а я этой прогой не пользуюсь, сомнительная какая-то, не знаешь какого результата ждать.
постоянно еще фокус элемента диалога пропадает при проектироании, невозможно элемент переместить, выделить ... жуть.
Чет даже, событие на кнопку не получилась создать, грубоватая прога и небтесанная еще, как первый релиз WinXP :)

MKN 23-11-2011 18:35 1801857

kotkovets,
Эта прога хороша исключительно для наглядного и быстрого создания компонентов на странице.
Собственно и всё... Минусы очевидны - надо корректировать код и единицы координат.
(Ну почему бы автору сразу было не сделать отсчёт в юнитах ! Попросил, может отзовётся...)

kotkovets 23-11-2011 18:40 1801865

Цитата:

Цитата MKN
Ну почему бы автору сразу было не сделать отсчёт в юнитах ! »

Наверно, технологически сложно и сильно усложняет код программы :)
а "страдают", как всегда обычные пользователи...

MKN 24-11-2011 08:59 1802175

Цитата:

Цитата kotkovets
Наверно, технологически сложно и сильно усложняет код программы »

Автор уже заинтересовался этим вопросом и призывает к дискуссии на http://forums.winamp.com/showthread.php?p=2801274
Только вот на английском...

kotkovets 24-11-2011 09:15 1802178

Цитата:

Цитата MKN
Ну почему бы автору сразу было не сделать отсчёт в юнитах ! »

Цитата:

Цитата MKN
Автор уже заинтересовался этим вопросом »

Если бы он понимал, русский.., давно бы сделал... :yes:

Krinkels 24-11-2011 10:29 1802215

Цитата:

Цитата kotkovets
Ну почему бы автору сразу было не сделать отсчёт в юнитах ! » »

Цитата:

Цитата kotkovets
Если бы он понимал, русский.. »

Если бы автор понимал в NSIS он бы давно сделал чтоб можно было считать и в юнитах

MKN 24-11-2011 11:20 1802240

Цитата:

Цитата kotkovets
Если бы он понимал »

Цитата:

Цитата Krinkels
Если бы автор понимал в NSIS »

Дык подскажите автору, пока у него запал не пропал... :)

K.A.V. 24-11-2011 13:24 1802342

Цитата:

Цитата MKN
Только вот на английском... »

Ну так идём все туда, Google переводчик в наши пальцы и вперёд :)
Американцы же бывают пишут переводчиками на русскоязычных форумах, а мы голову ломаем что они имели ввиду, пускай тоже почешут затылок разбираясь в бреднях переводчика, тем более на тех. тематику :laugh:

MKN 24-11-2011 13:39 1802364

К слову сказать. Пока автор ломает голову, кто подскажет - а каким всё же образом, имеющиеся в пикселах координаты, перевести в юниты ? Как это логически-математически будет выглядеть и возможно ли процесс конвертации автоматизировать ?

wolkow70 24-11-2011 14:58 1802439

Товарищи, подскажите как прописать в hosts 127.0.0.1 www.ursoftware.com. Че -то в справке не могу найти как просто добавить строку в файл.

K.A.V. 24-11-2011 15:32 1802470

Цитата:

Цитата wolkow70
Товарищи, подскажите как прописать в hosts 127.0.0.1 www.ursoftware.com. Че -то в справке не могу найти как просто добавить строку в файл. »

Код:

FileOpen $0 "$temp\kav_temp.log" w
# Создаём временный файл

FileWrite $0 "127.0.0.1 www.ursoftware.com"
# Записываем нужную информацию

FileClose $0
# Закрываем файл

${FileJoin} "$SYSDIR\drivers\etc\hosts" "$temp\kav_temp.log" ""
# Приклеиваем содержимое временного файла к нужному

Delete "$temp\kav_temp.log"
# Удаляем временный файл


wolkow70 24-11-2011 16:10 1802507

K.A.V.,
Нормально, все получилось. Прописалось. Теперь парюсь как удалить.
Так не получается:
${WordReplace} '$R9' '127.0.0.1 www.ursoftware.com' '' "+" '$R9'

kotkovets 24-11-2011 17:03 1802535

Цитата:

Цитата wolkow70
Теперь парюсь как удалить. »

Код:

${WordReplace} '$R9' '127.0.0.1 www.ursoftware.com$\r$\n' " " "+" '$R9'
или так
Код:

${WordReplace} '$R9' '127.0.0.1 www.ursoftware.com$\r$\n' "" "+" '$R9'
Пустая строка, грубо говоря это - $\r$\n
Цитата:

Цитата MKN
а каким всё же образом, имеющиеся в пикселах координаты, перевести в юниты ? »

http://www.firststeps.ru/mfc/winapi/dialog/r.php?50
http://forum.oszone.net/post-1768345-1728.html
С полученной базовой единицы нужно еще через битовую маску, выделить
старший и младший байт и применить формулу по ссылке
Как выделить старший и младший байт я точно не знаю, но примерно так:
Код:

Intop $var $var >> 16 ;Выделяет из 32-битового целочисленного значения старшее слово (X)
IntOp $var $var & 0xFFFF ;Выделяет из 32-битового целочисленного значения младшее слово (Y)

MKN Тебе эта муть надо ? :)

Krinkels 24-11-2011 20:03 1802642

MKN
Цитата:

Цитата MKN
К слову сказать. Пока автор ломает голову, кто подскажет - а каким всё же образом, имеющиеся в пикселах координаты, перевести в юниты ? Как это логически-математически будет выглядеть и возможно ли процесс конвертации автоматизировать ? »

Ну примерно так:
Код:

#define DLGP(wd) (LOWORD(GetDialogBaseUnits())*(wd)/4)
#define DLGU(wd) ((wd*4)/LOWORD(GetDialogBaseUnits()))

Но опять же смысл? :)

MKN 25-11-2011 09:23 1802908

Цитата:

Цитата kotkovets
Тебе эта муть надо ? »

Цитата:

Цитата Krinkels
Но опять же смысл? »

Надо, как пользователю NSIS Dialog Designer_а, который этого делать не умеет, но умеет быстро и наглядно сделать страницу с кучей разных элементов и плюс ко всему параллельно записать это в код.

А скажите пожалуйста - как вы сами расчитываете расположение создаваемых элементов на кастомной странице ?
Особенно когда их несколько десятков и их положение ещё приходится корректировать в процессе.
Неужели подбираете на ощупь число юнитов ? :) И сколько же времени у вас на этот гемор уходит ?

ps Ссылки на теоретические юнит-основы конечно интересны, но для меня сложны... И как применить GetDialogBaseUnits на практике я не представляю...

Krinkels 25-11-2011 09:36 1802919

Цитата:

Цитата MKN
А скажите пожалуйста - как вы сами расчитываете расположение создаваемых элементов на кастомной странице ? »

Я сначала делал через ini, но потом отказался. Да и в ручную как то интереснее все это рисовать и рассчитывать.

Цитата:

Цитата MKN
Особенно когда их несколько десятков и их положение ещё приходится корректировать в процессе. »

Ну обычно ты знаешь что хочется видеть на странице, по этому по каждому элементу рисуешь. Гораздо сложнее заставить все это работать.

Цитата:

Цитата MKN
И сколько же времени у вас на этот гемор уходит ? »

Все зависит от сложности страницы

MKN 25-11-2011 10:40 1802960

Krinkels,
Я так и знал, что получу обтекаемый ответ. :) Т.е. - сами мучаетесь. А ведь куда проще и быстрее расположить визуально элементы и ещё при этом получить готовый код.
Цитата:

Цитата Krinkels
Да и в ручную как то интереснее все это рисовать и рассчитывать. »

Поверь - совсем не интересно, нудно, скучно и оч. долго ! :)
(Ну, разве что , если гонять по странице одну единственную кнопочку и любоваться её расположением к тебе... :) )
Цитата:

Цитата Krinkels
Гораздо сложнее заставить все это работать. »

Это так , но это уже совсем другая история.

А касаемо нашей истории - всё же, каким образом практически перевести сотни циферок пикселей в юниты ?

wolkow70 25-11-2011 11:00 1802974

Цитата:

Цитата kotkovets
${WordReplace} '$R9' '127.0.0.1 www.ursoftware.com$\r$\n' " " "+" '$R9'
или так
Код:
${WordReplace} '$R9' '127.0.0.1 www.ursoftware.com$\r$\n' "" "+" '$R9' »

Не удаляется ни так , ни так....

Включены:
!include "WordFunc.nsh"
!include "TextFunc.nsh"

Krinkels 25-11-2011 11:19 1802985

Цитата:

Цитата MKN
А ведь куда проще и быстрее расположить визуально элементы и ещё при этом получить готовый код. »

Хе, а ты займись, сделай визуальный редактор. И будет счастье всем. И забугорным продуктом не нужно будет пользоваться. :)

Цитата:

Цитата MKN
А касаемо нашей истории - всё же, каким образом практически перевести сотни циферок пикселей в юниты ? »

Смотря на чем.

MKN 25-11-2011 12:03 1803015

Цитата:

Цитата Krinkels
Хе, а ты займись, сделай визуальный редактор. »

Вот те раз... Может мне и ОС под свои нужды написать ? :) Я прошу помощи при существующем положении вещей.
Цитата:

Цитата Krinkels
Смотря на чем. »

А вот это без разницы, хоть используя древнюю шумерскую письменность :) - важен положительный результат в среде Windows. Ты же сам приводил наброски с использованием GetDialogBaseUnits...

kotkovets 25-11-2011 12:35 1803040

Цитата:

Цитата MKN
GetDialogBaseUnits »

Эта функция непригодна практически, она не учитывает шрифт диалога, тупо
делит на половину циферки, т.е имеем 50 пикселей, возвращает 25 юнитов, соотношение 1:2, хотя на самом деле соотношение 1:~1,5
Посмотрев сырцы nsDialogs, плаг конвертит с помощью функции:
http://www.firststeps.ru/mfc/steps/help/r.php?604
Если сильно чешется, могу сварганить макрос, правда насчет результатов, не знаю.
Функция требует хэндл диалога и размер прямоугольника диалога,
что на практике NSIS не удобно, 2 структуры еще нужно объявлять.
Цитата:

Цитата Krinkels
Да и в ручную как то интереснее все это рисовать и рассчитывать »

Я тоже такого мнения :)
Цитата:

Цитата wolkow70
Не удаляется ни так , ни так....
Включены:
!include "WordFunc.nsh"
!include "TextFunc.nsh" »

Вопрос в том, как и где пользуетесь, а в остальном все работает безупречно, ИМХО

MKN 25-11-2011 12:59 1803061

Цитата:

Цитата kotkovets
могу сварганить макрос, правда насчет результатов, не знаю. »

Да чёрт с ним... Слишком много возни. Будем по старинки юниты двигать... :)

wolkow70 25-11-2011 15:01 1803155

Цитата:

Цитата kotkovets
Вопрос в том, как и где пользуетесь, а в остальном все работает безупречно, ИМХО »

Section /o "Запретить в Hosts доступ к серверу" Hosts
FileOpen $0 "$temp\urs_temp.txt" w
FileWrite $0 "127.0.0.1 www.ursoftware.com"
FileClose $0
${FileJoin} "$SYSDIR\drivers\etc\hosts" "$temp\urs_temp.txt" ""
Delete "$temp\urs_temp.txt"
SectionEnd

Section Uninstall Uninstall
SectionIn 1 RO
;
${WordReplace} '$R9' '127.0.0.1 www.ursoftware.com$\r$\n' "" "+" '$R9'
RMDir /r "$INSTDIR"
SetAutoClose true
SectionEnd

Не работает удаление...

wolkow70 25-11-2011 16:45 1803235

Товарищи вопрос: имею в реестре скрытый ключ типа EXECryptor 2+
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved\{34C86D6A-B57C-09D5-FE48-F0781F318B3F}|0|]
простая запись на удаление ни к чему не приводит. Его можно грохнуть через деинсталлятор?

MKN 25-11-2011 16:50 1803242

Подскажите пожалуйста, каким образом реализовать активность кнопки2 (не акт по умолчанию), при нажатии кнопки1 и
снятие активности с кнопки2 при ещё одном (повторном) нажатии на кнопку1 ?

kotkovets 25-11-2011 16:52 1803244

Цитата:

Цитата wolkow70
Section Uninstall Uninstall
SectionIn 1 RO
;
${WordReplace} '$R9' '127.0.0.1 www.ursoftware.com$\r$\n' "" "+" '$R9'
RMDir /r "$INSTDIR"
SetAutoClose true
SectionEnd »

И что это ? бред!
Вы открыли файл текстовый для записи/редактирования?
Вы как получаете строки из текстового файла в $R9 ?
Читайте "Замена строки в текстовых файлах"
Цитата:

Цитата MKN
Подскажите пожалуйста, каким образом реализовать активность кнопки2 (не акт по умолчанию), при нажатии кнопки1 и
снятие активности с кнопки2 при ещё одном (повторном) нажатии на кнопку1 ? »

Поступаем хитро и с фантазией, в зависимости от доступности кнопки меняем название
кнопки, добавление/удалением символа & - этот символ не виден!
читать дальше »
Код:

!include "MUI2.nsh"
Page custom Pageкнопа
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"
ShowInstDetails show
Name "EnumChildWindows"
OutFile UserInfo.exe
Section
SectionEnd
Function Pageкнопа
  nsDialogs::Create 1018
  Pop $0
  ${NSD_CreateButton} 0u 0u 50u 20u "Button&"
  Pop $R0
  EnableWindow $R0 0
 
  ${NSD_CreateButton} 70u 0u 50u 20u "Button 1"
  Pop $R1
  ${NSD_OnClick} $R1 Button
  nsDialogs::show
FunctionEnd

Function Button
  Pop $R1
  ${NSD_GetText} $R0 $1
  ${If} $1 == "Button&"
      EnableWindow $R0 1
      ${NSD_SetText} $R0 "Button"
  ${Else}
      EnableWindow $R0 0
      ${NSD_SetText} $R0 "Button&"
  ${EndIf}
FunctionEnd


wolkow70 25-11-2011 17:51 1803304

Так сделал, все равно не удаляется.

!include "TextFunc.nsh"
!include "WordFunc.nsh"

Function un.Replace
${WordReplace} '$R9' '127.0.0.1 www.ursoftware.com$\r$\n' "" "+" '$R9'
Push $0
FunctionEnd
;
Section Uninstall Uninstall
SectionIn 1 RO
;
${LineFind} "$SYSDIR\drivers\etc\hosts" "" "1:-1" "un.Replace"
RMDir /r "$INSTDIR"
SetAutoClose true
SectionEnd

kotkovets 25-11-2011 18:02 1803319

Код:

Error: resolving uninstall function "Replace" in uninstall section "Uninstall" (0)
Все пользовательские функции в деинсталляторе задаются через приставку un.
Код:

Function un.Replace
  ${WordReplace} '$R9' 'Counter-Strike' 'www.counter-strike.net' "+" '$R9'
  Push $0
FunctionEnd

Section Uninstall
  ${LineFind} "$EXEDIR\file.txt" "" "1:-1" "un.Replace"
SectionEnd


wolkow70 25-11-2011 18:21 1803334

Цитата:

Цитата kotkovets
Все пользовательские функции в деинсталляторе задаются через приставку un. »

Сделал через un. Все равно, не удаляется...
Function un.Replace
${WordReplace} '$R9' '127.0.0.1 www.ursoftware.com$\r$\n' "" "+" '$R9'
Push $0
FunctionEnd
;
Section Uninstall Uninstall
SectionIn 1 RO
;
${LineFind} "$SYSDIR\drivers\etc\hosts" "" "1:-1" "un.Replace"
RMDir /r "$INSTDIR"
SetAutoClose true
SectionEnd

kotkovets 25-11-2011 19:05 1803372

wolkow70, Проснитетесь!
У вас целостная строка строка есть в файле:
Код:

127.0.0.1 www.ursoftware.com
Скопируйте эту строку из текста, как есть, здесь все учитывается, пробелы, табуляция и т.д
Макрос сравнивает посимвольно строку, если указанная строка не совпадает, до свидания, ничего менять не будет
А если последняя строка и при условии, что нет после искомой строки пустой строки.
то так:
Код:

${WordReplace} '$R9' '127.0.0.1 www.ursoftware.com' "" "+" '$R9'
---
Код:

Function un.Replace
  MessageBox MB_OK "$R9" ;сюда возвращаются строки
  ;или лучше
  DetailPrint "$R9"
 ${WordReplace} '$R9' '127.0.0.1 www.ursoftware.com$\r$\n' "" "+" '$R9'
 Push $0
 FunctionEnd

Все работает проверено 1000 раз и сам так делаю!!!!

wolkow70 25-11-2011 19:54 1803418

kotkovets,
Прикольно получается: если два раза подряд прописать, то одна строка удаляется, а последняя нет. Повторный запуск деинсталлятора тоже ее не трогает. А откуда мне знать последняя там строка или нет. И вообще сколько раз повторяется.

kotkovets 25-11-2011 23:29 1803536

Цитата:

Цитата wolkow70
Прикольно получается: если два раза подряд прописать, то одна строка удаляется, а последняя нет »

Код:

Function un.Replace
  ${WordReplace} '$R9' '127.0.0.1 www.ursoftware.com$\r$\n' "" "+" '$R9'
  ${WordReplace} '$R9' '127.0.0.1 www.ursoftware.com' "" "+" '$R9'
  Push $0
FunctionEnd

И не трудно догадаться что, делать... Здесь цикл от первой строки до последней строки файла.
Хоть сколь угодно прописываете строку - удалятся все, главное указываемая строка совпадала с возвращенной из текста.

wolkow70 26-11-2011 13:40 1803723

kotkovets,
Может подскажите, чего делать?
Прописываю в секции:

Код:

DeleteRegKey HKLM "SOFTWARE\Classes\CLSID\{1F642286-85BA-DEC3-B727-47952F83BB84}" ""
DeleteRegValue HKLM "SOFTWARE\Licenses" "{I1A025C51A1747CC8}"
DeleteRegValue HKLM "SOFTWARE\Licenses" "{01A025C51A1747CC8}"
DeleteRegValue HKLM "SOFTWARE\Licenses" "{R7C0DB872A3F777C0}"
DeleteRegValue HKLM "SOFTWARE\Licenses" "{K7C0DB872A3F777C0}"
;
WriteRegBin HKLM "SOFTWARE\Licenses" "{R7C0DB872A3F777C0}" 560b9db5
WriteRegBin HKLM "SOFTWARE\Licenses" "{K7C0DB872A3F777C0}" 1f51f2f567121fffffffffee06959cafee6049ac81f3746f9c6616560b9db5f310cd2e736167a8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000006f9c661667121fffffffffee06959cafee6049ac81f3746f9c6616560b9db5f310cd2e736167a8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000006f9c66160000
WriteRegBin HKLM "SOFTWARE\Licenses" "{I1A025C51A1747CC8}" 15000000
WriteRegBin HKLM "SOFTWARE\Licenses" "{01A025C51A1747CC8}" 5b3e860fef81a3b4066f27ff5ac429d8b45ee10cbdd264d89fcaccf1b1d3c36edddf6218c75e58436165b5a3d9baac99aee50d496761630b27c263908122680335b32f7f6babd12fe90613ae194f75851f0aefa3e1ba48d58b799f2749852f4f09b5a5d9591110866be8c77645b1876ea71ed3da3d7be5fd7f9bd03a93c5e4e195634bd62d35d8c553c2a5934ae68b8bb2a19bf3eb3a56e72c9db114197f746b

То есть удаляю данные старой лицензии и вношу новые. все равно при запуске программы восстанавливаются старые данные.
Если те же ключи
HKLM "SOFTWARE\Classes\CLSID\{1F642286-85BA-DEC3-B727-47952F83BB84}" ""
HKLM "SOFTWARE\Licenses" "{I1A025C51A1747CC8}"
HKLM "SOFTWARE\Licenses" "{01A025C51A1747CC8}"
HKLM "SOFTWARE\Licenses" "{R7C0DB872A3F777C0}"
HKLM "SOFTWARE\Licenses" "{K7C0DB872A3F777C0}"
удалить не через NSIS а в программе TrashReg, то все нормально..

kotkovets 26-11-2011 14:15 1803744

Цитата:

Цитата wolkow70
все равно при запуске программы восстанавливаются старые данные »

Однозначно программа перезаписывает.
Цитата:

Цитата wolkow70
удалить не через NSIS а в программе TrashReg, то все нормально.. »

Не стоит, через NSIS ломать защиту армадилио, в которую вшита в прогу и создает скрытые записи в реестре.

wolkow70 01-12-2011 14:45 1807265

kotkovets,
Подскажите плиз, как комманду из cmd-файла конвертировать в NSIS для выполнения в тихом режиме:
TrashReg.exe /D=(!)HKLM\SOFTWARE\Classes\CLSID\{1F642286-85BA-DEC3-B727-47952F83BB84}

При условии, что данный кюч реестра создан.

kotkovets 01-12-2011 15:24 1807300

Цитата:

Цитата wolkow70
TrashReg.exe /D=(!)HKLM\SOFTWARE\Classes\CLSID\{1F642286-85BA-DEC3-B727-47952F83BB84} »

Код:

IfSilent 0 +2
ExecWait '"Путь к TrashReg.exe" /D=(!)HKLM\SOFTWARE\Classes\CLSID\{1F642286-85BA-DEC3-B727-47952F83BB84}'


dix75 03-12-2011 21:40 1808692

1) Подскажите как изменить картинку на странице выбора языка. Она распологается с лева.
2). Иконку инсталяции и деинсталяции (которая находится в левом верхнем углу, почти всех диалоговых окон).

vahe-91 04-12-2011 14:42 1809030

dix75,
это же иконка инсталлятора :dont-know

wolkow70 04-12-2011 14:52 1809036

Товарищи, подскажите как запустить установку драйвера из инфа коммандой NSIS.
В папку с программой распаковываются revoflt.inf и драйвер revoflt.sys.
После чего должна последовать установка драйвера из инфа.
В скрипте Inno оригинального инсталлятора так прописано:

[Run]
Filename: "rundll32.exe "; Parameters: "SETUPAPI.DLL,InstallHinfSection DefaultInstall 132 {app}\revoflt.inf"; WorkingDir: "{app}"; StatusMsg: "Installing revoflt..."; Description: "Install driver automatically"; MinVersion: 0.0,5.01.2600 Service Pack 1;

и на удаление:

[UninstallRun]
Filename: "rundll32.exe"; Parameters: "SETUPAPI.DLL,InstallHinfSection DefaultUninstall 132 {app}\revoflt.inf"; WorkingDir: "{app}"; MinVersion: 0.0,5.01.2600 Service Pack 1;

kotkovets 04-12-2011 16:11 1809064

wolkow70, да все также, мозг чуть включить и все!
Код:

ExecWait `rundll32.exe SETUPAPI.DLL,InstallHinfSection DefaultInstall 132 "путь\revoflt.inf"`
Причем, если путь к revoflt.inf не имеет пробелов, то кавычки необязательны.

wolkow70 04-12-2011 16:54 1809085

Че-то не пашет.
В Install прописал:
ExecWait 'rundll32.exe SETUPAPI.DLL,InstallHinfSection DefaultInstall 132 "$INSTDIR\revoflt.inf"'

В Uninstall прописал
ExecWait 'rundll32.exe SETUPAPI.DLL,InstallHinfSection DefaultUninstall 132 "$INSTDIR\revoflt.inf"'

Выводится ошибка, что установка не произведена (при удалении тоже).
С оригинальным инсталлятором нормально все.
Инф какой-то примитивный.

Код:

;;;
;;; Revoflt
;;;
;;;
;;; Copyright (c) 2009, VS Revo Group Ltd.
;;;

[Version]
Signature  = "$Windows NT$"
Class      = "ActivityMonitor"                        ;This is determined by the work this filter driver does
ClassGuid  = {b86dff51-a31e-4bac-b3cf-e8cfe75c9fc2}    ;This value is determined by the Class
Provider    = %VSRG%
DriverVer  = 12/30/2009,1.0.0.4
CatalogFile =


[DestinationDirs]
DefaultDestDir          = 12
Revoflt.DriverFiles    = 12            ;%windir%\system32\drivers

;;
;; Default install sections
;;

[DefaultInstall]
OptionDesc          = %ServiceDescription%
CopyFiles          = Revoflt.DriverFiles

[DefaultInstall.Services]
AddService          = %ServiceName%,,Revoflt.Service

;;
;; Default uninstall sections
;;

[DefaultUninstall]
DelFiles  = Revoflt.DriverFiles

[DefaultUninstall.Services]
DelService = %ServiceName%,0x200      ;Ensure service is stopped before deleting

;
; Services Section
;

[Revoflt.Service]
DisplayName      = %ServiceName%
Description      = %ServiceDescription%
ServiceBinary    = %12%\%DriverName%.sys        ;%windir%\system32\drivers\
Dependencies    = FltMgr
ServiceType      = 2                            ;SERVICE_FILE_SYSTEM_DRIVER
StartType        = 3                            ;SERVICE_DEMAND_START
ErrorControl    = 1                            ;SERVICE_ERROR_NORMAL
LoadOrderGroup  = "FSFilter Activity Monitor"
AddReg          = Revoflt.AddRegistry

;
; Registry Modifications
;

[Revoflt.AddRegistry]
HKR,"Instances","DefaultInstance",0x00000000,%DefaultInstance%
HKR,"Instances\"%Instance1.Name%,"Altitude",0x00000000,%Instance1.Altitude%
HKR,"Instances\"%Instance1.Name%,"Flags",0x00010001,%Instance1.Flags%

;
; Copy Files
;

[Revoflt.DriverFiles]
%DriverName%.sys

[Revoflt.UserFiles]

[SourceDisksFiles]
revoflt.sys = 1,,

[SourceDisksNames]
1 = %DiskId1%,,,

;;
;; String Section
;;

[Strings]
VSRG                        = "VS Revo Group"
ServiceDescription      = "Revo Uninstaller Filter driver"
ServiceName            = "Revoflt"
DriverName              = "revoflt"
DiskId1                = "Revoflt Device Installation Disk"

;Instances specific information.
DefaultInstance        = "Revoflt - Top Instance"
Instance1.Name          = "Revoflt - Top Instance"
Instance1.Altitude      = "370330"
Instance1.Flags        = 0x0          ; Set automatic attachments


kotkovets 04-12-2011 17:01 1809089

revoflt.inf - это тоже скрипт, а где файлы должны быть по скрипту в секции DefaultInstall revoflt.inf ?
Положите рядом с revoflt.inf - revoflt.sys
А вот так у меня все стало как нужно, т.е путь к revoflt.inf без кавычек
ExecWait "rundll32.exe SETUPAPI.DLL,InstallHinfSection DefaultInstall 132 $EXEDIR\revoflt.inf"

wolkow70 04-12-2011 17:26 1809102

revoflt.inf и драйвер revoflt.sys распаковываются в папку $INSTDIR и оттуда драйвер копируется в %windir%\system32\drivers\

kotkovets 04-12-2011 17:35 1809105

wolkow70, путь к inf файлу без кавычек:
Код:

ExecWait "rundll32.exe SETUPAPI.DLL,InstallHinfSection DefaultInstall 132 $INSTDIR\revoflt.inf"

wolkow70 04-12-2011 17:48 1809111

Да, все заработало.
Там еще разные версии драйверов распаковываются "под систему".
пока сделал так
!include "WinVer.nsh"

Section "!${PRODUCT_NAME}" Install
;
${If} ${IsWinXP}
SetOutPath "$INSTDIR"
File "${pkgdir}\Revo Uninstaller Pro\NT5\revoflt.sys"
${ElseIf} ${IsWin7}
SetOutPath "$INSTDIR"
File "${pkgdir}\Revo Uninstaller Pro\NT6\revoflt.sys"
${EndIf}

А если установка на Vista или Win 2000?

vahe-91 04-12-2011 20:13 1809193

Цитата:

Цитата wolkow70
А если установка на Vista или Win 2000? »

а ты вместо If, Else используй strcmp :)

kotkovets 04-12-2011 22:06 1809281

Цитата:

Цитата vahe-91
а ты вместо If, Else используй strcmp »

Здесь эта команда неуместна, у меня в скрипте задается условий этак 175,
И что, мне под каждое условие придумывать метку?
ИМХО, логическими конструкциями я задам столько условий, сколько фантазии хватит
и при этом никаких конфликтов по именам меткам никогда не получу и с легкостью пишется
любая, самая хитрая логика.
Цитата:

Цитата wolkow70
Там еще разные версии драйверов распаковываются "под систему".
пока сделал так »

Код:

  ${If} ${IsWinXP}

        ;если WinXP

  ${ElseIf} ${IsWin7}

        ;если Win7

  ${ElseIf} ${IsWinVista}

          ;если Vista

  ${ElseIf} ${IsWin2000}

          ;если Win2000

  ${EndIf}

Причем условия можно задавать + вложенные условия сколь угодно.

dix75 04-12-2011 23:31 1809332

Цитата:

Цитата vahe-91
dix75,
это же иконка инсталлятора »

И что из этого. Изменить нельзя?

А картинку при выборе языка?

kotkovets 05-12-2011 00:12 1809357

Цитата:

Цитата dix75
А картинку при выборе языка? »

Иконка в диалоге выбора языка - берется иконка инсталлятора, измените иконку инсталлятора,
изменится иконка в диалоге

dix75 05-12-2011 01:06 1809390

Понятно спасибо.

Super285 05-12-2011 11:56 1809544

Всем Привет!!! я навичок,хотел бы научится NSIS,не подскажите где можно найти для обучения видео??
я разбираюсь по батникам хорошо,как мне правильно написать,пример: в батник:
"fail.exe" /silentinstall
"fail.exe" /firewall
"fail.exe" /start
перевести код на NSIS?? что бы запускался.
если я не потеме обращаюсь с этим вапросом,подскажите куда писать??
Зарание блогодарю

kotkovets 05-12-2011 12:18 1809556

Цитата:

Цитата Super285
Всем Привет!!! я навичок, »

В шапке темы найдите ссылку на справочник по NSIS - начните с него.
Цитата:

Цитата Super285
"fail.exe" /silentinstall
"fail.exe" /firewall
"fail.exe" /start
перевести код на NSIS?? что бы запускался. »

Код:

ExecWait '"Путь к\fail.exe" /firewall'

wolkow70 05-12-2011 13:13 1809593

Цитата:

Цитата kotkovets
Причем условия можно задавать + вложенные условия сколь угодно. »

Сейчас пытаюсь разобраться с вашим хедером WinVer2.

Как я понял можно прописать в

Function .OnInit
${WinVersionMajor} $4
${WinVersionMinor} $5
${WinPlatformArchitecture} $R1
Quit
FunctionEnd

К примеру стоит задача создать логическую конструкцию такого типа:

Если установлена Vista или выше , то можно взять за старшую версию 6 и задать условие этим значением (оно будет работать на всех версиях включая Win7 и даже Win 8 ? Младшую версию нет смысла читать в этом случае?

Дальше как это условие забить в конструкцию? Так?

${If} $4=6 ;если версия 6.0 и выше
${AndIf} $R1=64 ; и 64 битка
-здесь следует комманда для Vista и выше X64
${ElseIf} $4=6 ;если версия 6.0 и выше
${AndIf} $R1=32 ; и 32 битка
-здесь следует комманда для Vista и выше X32
${ElseIf} $4=5 ;если версия 5.0 и выше
${AndIf} $R1=64 ; и 64 битка
здесь следует комманда для 2000 и XP X64
${ElseIf} $4=5 ;если версия 5.0 и выше
${AndIf} $R1=32 ; и 32 битка
-здесь следует комманда для 2000 и XP X32
${EndIf}

То есть, хочу сделать универсальную логическую конструкцию, в которой операции бы выполнялись не только в зависимости от версии, но и архитектуры оси (напрмер распаковка файлов).
Какая разница в значениях X32 и X86?

kotkovets 05-12-2011 13:37 1809608

Здесь логика И, т.е читаем так, если $4 = 0 и $R1 = 64
т.е условие будет выполнено, если $4 = 0 и $R1 = 64
Код:

${If} $4 == 6 ;если версия 6.0
${AndIf} $R1 == 64 ; и 64 битка
${EndIf}

А вот так условие выполнится, если $4 больше или равно 6 И $R1=64
Код:

  ${If} $4 >= 6
  ${AndIf} $R1 == 64 ; и 64 битка
  ;;;
  ${EndIf}

Цитата:

Цитата wolkow70
${AndIf} $R1=32 ; и 32 битка
-здесь следует комманда для 2000 и XP X32
${EndIf} »

Win2000 --> 64-битной версии в природе не существует.

wolkow70 05-12-2011 13:54 1809623

То есть примерно так?

!include "WinVer2.nsh"

Function .OnInit
${WinVersionMajor} $4
${WinVersionMinor} $5
${WinPlatformArchitecture} $R1
Quit
FunctionEnd

${If} $4 >= 6
${AndIf} $R1 == 64 ; и 64 битка
-здесь следует комманда для Vista и выше X64
${EndIf}
;
${If} $4 >= 6
${AndIf} $R1 == 32 ; и 32 битка
-здесь следует комманда для Vista и выше X32
${EndIf}
;
${If} $4 >= 5
${AndIf} $R1 == 64 ; и 64 битка
-здесь следует комманда для 2000 и XP X64
${EndIf}
;
${If} $4 >= 5
${AndIf} $R1 == 64 ; и 32 битка
-здесь следует комманда для 2000 и XP X32
${EndIf}

Здесь, по моему засада получится, так как $4 >= 5 и $4 >= 6 при этом 6 тоже >5

Не будет ли конфликта с хедером x64.nsh?

kotkovets 05-12-2011 14:22 1809638

Цитата:

Цитата wolkow70
Не будет ли конфликта с хедером x64.nsh? »

Нет
А лучше делать так:
Код:

${WinVersionMajor} $4
${WinVersionMinor} $5
${WinPlatformArchitecture} $R1
${If} $4 >= 6
    ${If} $R1 == 64
          ;64-битная Vista и выше
    ${ElseIf} $R1 == 32
        ;32-битная Vista и выше
    ${EndIf}
${ElseIf} $4 == 5
${OrIf} $5 == 1
${OrIf} $5 == 2
    ${If} $R1 == 64
        ;64-битная XP или схожая система-клиент и сервер Win2003
    ${ElseIf} $R1 == 32
        ;32-битная XP или схожая система-клиент и сервер Win2003
    ${EndIf}
${ElseIf} $4 == 5
${AndIf} $5 == 0
  ;Win2000
${EndIf}


wolkow70 05-12-2011 14:38 1809646

Цитата:

Цитата kotkovets
А лучше делать так: »

1. По такому варианту не обязательно помещать в Function .OnInit
${WinVersionMajor} $4
${WinVersionMinor} $5
${WinPlatformArchitecture} $R1 ?

2. Если в такой конструкции для какого-то варианта нет комманды?
3. Хедер WinVer.nsh удалять ?

kotkovets 05-12-2011 15:59 1809701

Цитата:

Цитата wolkow70
По такому варианту не обязательно помещать в Function .OnInit »

Необязательно
Цитата:

Цитата wolkow70
Хедер WinVer.nsh удалять ? »

если имеете ввиду совместное использование WinVer.nsh и WinVer2.nsh
недопустимо!

wolkow70 06-12-2011 16:55 1810435

Товарищи, как удалить папку, если она пустая? Чего-то не нашел.

wolkow70 06-12-2011 17:34 1810455

Сам нашел такой вариант:

StrCpy $0 "$PROGRAMFILES\FinalWire"
Call un.DeleteDirIfEmpty

Function un.DeleteDirIfEmpty
FindFirst $R0 $R1 "$0\*.*"
strcmp $R1 "." 0 NoDelete
FindNext $R0 $R1
strcmp $R1 ".." 0 NoDelete
ClearErrors
FindNext $R0 $R1
IfErrors 0 NoDelete
FindClose $R0
Sleep 1000
RMDir "$0"
NoDelete:
FindClose $R0
FunctionEnd

kotkovets 06-12-2011 18:20 1810483

Цитата:

Цитата wolkow70
Товарищи, как удалить папку, если она пустая »

Цитата:

Цитата wolkow70
Сам нашел такой вариант:
StrCpy $0 "$PROGRAMFILES\FinalWire"
Call un.DeleteDirIfEmpty »

Чет сложновато, Вот это вариант:
Код:

OutFile "emptydir.exe"
Section
  System::Call "Shlwapi::PathIsDirectoryEmpty(t'$PROGRAMFILES\FinalWire')i.r0"
  StrCmp $0 1 0 +2
  RmDir "$PROGRAMFILES\FinalWire"
SectionEnd


wolkow70 06-12-2011 18:39 1810495

Цитата:

Цитата kotkovets
Чет сложновато, Вот это вариант: »

Тут я понимаю, задействуется системная функция, а тот вариант чисто NSIS. Впрочем оба работают.

kotkovets 06-12-2011 18:42 1810498

wolkow70, WinAPI - четко и быстро, чем рекурсивно перебирать файлы, медленно!
Вот макрос сварганил для удобства:
Код:

!define RmEmptyDir "!insertmacro PathIsDirectoryEmpty"
!macro PathIsDirectoryEmpty Dir
  Push `${Dir}`
  System::Store S
  System::Call "Shlwapi::PathIsDirectoryEmpty(tsR1)i.R0"
  StrCmp $R0 1 0 +2
  RmDir `$R1`
  System::Store L
!macroend

запуск:
Код:

${RmEmptyDir} "Путь к папке"

dron008 06-12-2011 19:49 1810528

Подскажите, пожалуйста, как можно подписать EXE-файл после компиляции. В сети натыкался на неработающие варианты:
PHP код:

${PostExec2sign.bat ${OUTFILE

PHP код:

!finalize 'sign.bat "%1"' 

Если делать !system или !execute, то где их не размещай, они будут выполняться до завершения компиляции. Неужели только городить с самовызовом или через внешний bat-файл?

P.S. Выяснил, что !finalize это относительно новая опция, в последнем релизе её нет. Но использовать нестабильные бета-версии нежелательно на проекте. Кстати, кто-то знает, NSIS вообще поддерживается еще или проект умер и лучше MSI использовать?

kotkovets 06-12-2011 21:04 1810573

Цитата:

Цитата dron008
Подскажите, пожалуйста, как можно подписать EXE-файл после компиляции »

http://nsis.sourceforge.net/Run_Comm...er_Compilation
${PostExec*} - пишется последней командой в скрипте.
Если вкратце - для подписи файлов нужны:
Цитата:

SignTool
.NET Framework Tools
Sign Tool (SignTool.exe)
http://msdn.microsoft.com/en-us/libr...az(VS.80).aspx
The Sign Tool is a command-line tool that digitally signs files, verifies signatures in files, or time stamps files.
The command demonstrates how to sign a file automatically using the best certificate.
signtool sign /a MyFile.exe
и сертификат
Если честно, этим делом муторным не занимался, посему деталей я не знаю

Alexey_KF 06-12-2011 21:54 1810606

Пытаюсь написать скрипт (на выходе должен получиться Updates ESET.exe, в котором содержится папка с антивирусными базами eset_upd и файл лицензии eset.lic)
Updates ESET.exe - при запуске должен извлеч папку eset_upd по пути $PROGRAMFILES\ESET и извлеч файл eset.lic по пути $PROGRAMFILES\ESET\ESET NOD32 Antivirus\License
начал писать скрипт и застрял. Прошу помощи.
Начало скрипта:
Код:

!define version "4хх/5хх"
!define text "Создание...$\n"
!addplugindir ".\"
VIAddVersionKey /LANG=1049 "LegalCopyright" "Alexey_KF"
VIAddVersionKey /LANG=1049 "CompanyName" "Alexey_KF"
VIAddVersionKey /LANG=1049 "FileDescription" "Updates ESET"
VIAddVersionKey /LANG=1049 "FileVersion" "${version}"
VIProductVersion "${version}"
SetCompressor /SOLID lzma
XPStyle on
Name "Updates ESET"
SubCaption 3 " "
ShowInstDetails nevershow
Icon install.ico
OutFile "Updates ESET.exe"


kotkovets 06-12-2011 22:01 1810612

Цитата:

Цитата Alexey_KF
начал писать скрипт и застрял. Прошу помощи »

А где вы застряли? :lazy:

Alexey_KF 06-12-2011 22:22 1810624

вот где и застрял:
Код:

Function .onInit
System::Call 'kernel32::CreateMutexA(i 0, i 0, t "UpdatesESET") i .r1 ?e'
Pop $R0
StrCmp $R0 0 +3
MessageBox MB_OK|MB_TOPMOST|MB_ICONINFORMATION "Updates ESET уже запущен..."
Quit
messagebox::show MB_DEFBUTTON3|MB_TOPMOST "Установка антивирусных баз ESET 4хх/5хх" "Установить"  "Отмена"
Quit
start:
IfFileExists "$PROGRAMFILES\ESET\ESET NOD32 Antivirus\License\*.lic" 0 +2


kotkovets 06-12-2011 22:55 1810642

Цитата:

Цитата Alexey_KF
Пользователь нажимает "Установить" и начинается извлечение файлов.. »

Читайте больше справочных материалов - на пользу только вам!
Код:

    MessageBox MB_ICONQUESTION|MB_YESNO "Установить NOD_UPD ?" IDYES +2
    Abort ;прерывание установки при нажатии кнопки "нет"
    SetOutPath "$PROGRAMFILES\ESET"
    File /r "eset_upd"
    IfFileExists "$EXEDIR\eset.lic" 0 +2 ;если рядом с установщиком есть eset.lic, то
    CopyFiles /SILENT "$EXEDIR\eset.lic" "$PROGRAMFILES\ESET\ESET NOD32 Antivirus\License" ;копируем файл куда указали


dron008 07-12-2011 15:52 1811044

Цитата:

Цитата kotkovets
Цитата dron008:
Подскажите, пожалуйста, как можно подписать EXE-файл после компиляции »

http://nsis.sourceforge.net/Run_Comm...er_Compilation
${PostExec*} - пишется последней командой в скрипте.

С самой подпиской-то проблем никаких, сертификат имеется. Надо просто вызвать другую программу после создания EXE-файла уже, передавая его как параметр. Вариант с ${PostExec*} пробовал. Во-первых он не заработал, а детальнее не разбирался, во-вторых не нравится, что зависит от кучи системных вещей, наличия команд - неуниверсальное решение и громоздкое какое-то.

В общем, пришлось выносить эту команду из инсталлятора, пока в bat-файл, потом в ANT-скрипт. Но несколько разочарован развитием NSIS'а.

Alexey_KF 07-12-2011 20:42 1811217

Запускаю истолятор и он мне выдает ошибку с тектом Error opening file for writing: \eset_upd\nod12E.nup
Где ошибка в скрипте?
Код:

!define version "5.0.0.0"
!define text "Идёт подготовка...$\n"
!addplugindir ".\"
VIAddVersionKey /LANG=1049 "LegalCopyright" "Alexey_KF"
VIAddVersionKey /LANG=1049 "CompanyName" "Alexey_KF"
VIAddVersionKey /LANG=1049 "FileDescription" "Updates ESET"
VIAddVersionKey /LANG=1049 "FileVersion" "${version}"
VIProductVersion "${version}"
SetCompressor /SOLID lzma
XPStyle on
Name "Updates ESET"
SubCaption 3 " "
ShowInstDetails nevershow
Icon install.ico
OutFile "Updates ESET.exe"
Section
File /r "eset_upd*"
IfFileExists "$EXEDIR\eset.lic" 0 +2
File eset.lic
SectionEnd
Function .onInit
MessageBox MB_ICONQUESTION|MB_YESNO "Установить Антивирусные базы ?" IDYES +2
Abort ;прерывание установки при нажатии кнопки "нет"
FunctionEnd
Section
SetOutPath "$PROGRAMFILES64\ESET"
File /r "eset_upd*"
IfFileExists "$EXEDIR\eset.lic" 0 +2 ;если рядом с установщиком есть eset.lic, то
CopyFiles /SILENT "$EXEDIR\eset.lic" "$PROGRAMFILES64\ESET\ESET NOD32 Antivirus\License"
SectionEnd


kotkovets 07-12-2011 20:46 1811220

Цитата:

Цитата Alexey_KF
Где ошибка в скрипте? »

Код:

Section
File /r "eset_upd*"
IfFileExists "$EXEDIR\eset.lic" 0 +2
File eset.lic
SectionEnd

Что здесь за бред?
Трудно, что ли в справке почитать: » File: Добавляем файлы в инсталлятор

Alexey_KF 07-12-2011 22:24 1811263

Справка у меня открыта перед носом, а еще смотрю на примеры скриптов... Если не сложно то помогите

kotkovets 07-12-2011 22:44 1811274

Цитата:

Цитата Alexey_KF
Если не сложно то помогите »

Да мне то не сложно, то, вы читаете и непонимаете.. и не поймете.
Я писал это бред, так уберите этот бред в скрипте.
Код:

Section
File /r "eset_upd*"
IfFileExists "$EXEDIR\eset.lic" 0 +2
File eset.lic
SectionEnd

Цитата:

Код:

SetOutPath "путь распаковки"
File file.dat

Команда SetOutPath указывает путь распаковки файла file.dat и путь распаковки записывает в переменную $OUTDIR
В данном примере файл file.dat должен находится в одной папке со скриптом. Если мы хотим добавить файл(ы) с иного места, то пишем:
Код:

File "C:\Install\file.dat"
В этом примере файл добавиться в установщик из каталога C:\Install
Если нужно добавить все файлы, включая вложенные папки, добавляем параметр /r (рекурсивно)
При этом сохраняется вся структура вложенных папок в каталоге
Код:

File /r "C:\Install"

Что здесь сверхсложного?

MKN 10-12-2011 10:55 1812608

kotkovets,
Будет ли работать в x64 ОС команда :
ExecWait "rundll32.exe SETUPAPI.DLL,InstallHinfSection DefaultInstall 132 myInf.inf" ?

kotkovets 10-12-2011 11:45 1812622

MKN,
Какие то то сомнения в x64 ? откуда?
При правильном подходе все работает!

wolkow70 10-12-2011 15:29 1812725

kotkovets,
Не подскажите решение такой задачки?

Скрипт установки у меня создает папку с резервными копиями файлов настроек "$DOCUMENTS\Opera Backup".
Если повторно переустанавливать (устанавливать) программу опять будет создана резевная папка.
Можно, конечно проверить наличие и перименовать старую папку в Opera Backup_old1 или того рода.
Но как сделать, чтобы каждый раз ранее созданная папка Opera Backup автоматически переимеовывалась с новым именем (например, привязанным к дате и времени переименования или порядковым номером). Ну, короче, что бы не происходило наслоения.

kotkovets 10-12-2011 17:46 1812770

Цитата:

Цитата wolkow70
Но как сделать, чтобы каждый раз ранее созданная папка Opera Backup автоматически переимеовывалась с новым именем »

Элементарно, вариант на счетчике:
Код:

  ${If} ${FileExists} "$EXEDIR\Opera Backup"
      StrCpy $2 0 ;иницилизируем счетчик в нуль
      FindFirst $0 `$1` "$EXEDIR\Opera Backup*" ;поиск по маске Opera Backup
      ${Do}
          IntOp $2 $2 + 1 ;счетчик папок начинающийся с названия Opera Backup
          FindNext $0 `$1`
      ${LoopUntil} $1 == ``
      FindClose $0 ;закрываем поиск
      ${If} $2 != 0
        Rename "$EXEDIR\Opera Backup" "$EXEDIR\Opera Backup_old$2" ;переименовываем предыдущую папку "Opera Backup"
        CreateDirectory "$EXEDIR\Opera Backup" ;создаем новую папку "Opera Backup"
      ${EndIf}
  ${Else}
      CreateDirectory "$EXEDIR\Opera Backup"
  ${EndIf}

вариант на макросе GetTime
Код:

!include "filefunc.nsh"
OutFile "setup.exe"
var time_backup
Section
  ${GetTime} "" "L" $0 $1 $2 $3 $4 $5 $6
  StrCpy $time_backup "$0.$1.$2[$4.$5.$6]"
  CreateDirectory "$EXEDIR\Opera Backup_$time_backup"
SectionEnd


Painkiller 10-12-2011 19:58 1812817

Здравствуйте господа, нужна ваша помощь . Есть скрипт на языке Inno Setup
Сам скрип :
Код:

Filename: "rundll32.exe"; Parameters: "setupapi.dll, InstallHinfSection DefaultInstall 132 .\CisUtMonitor.inf"; WorkingDir: "{app}"; StatusMsg: "{cm:installing_driver}"; Tasks: "install_service"; Check: "NOT IsX64"; MinVersion: 0.0,5.0;
Нужно перевести в язык nsis. Вот как я сделал :
Код:

ExecWait "rundll32.exe SETUPAPI.DLL,InstallHinfSection DefaultInstall 132 $INSTDIR\CisUtMonitor.inf"
Ну во время установки выскакивает окно выбора файла . Что я сделал не так ?

Krinkels 10-12-2011 20:48 1812842

Цитата:

Цитата Painkiller
SETUPAPI.DLL,InstallHinfSection »

Попробуй убрать запятую

kotkovets 10-12-2011 20:55 1812843

Цитата:

Цитата Painkiller
Ну во время установки выскакивает окно выбора файла . Что я сделал не так ? »

команда выполняется успешно, претензий нет, претензии к inf файлу:
нужный файл не найден по скрипту inf, поэтому просит указать на файл, типа ты где, хоть сюда?!
в какой разрядности системы заводите? В x64 две версии rundll.exe
Цитата:

Цитата Krinkels
Попробуй убрать запятую »

не нужно убирать запятую, синтаксис верен.

Painkiller 10-12-2011 21:52 1812872

Цитата:

Цитата kotkovets
команда выполняется успешно, претензий нет, претензии к inf файлу:
нужный файл не найден по скрипту inf, поэтому просит указать на файл, типа ты где, хоть сюда?!
в какой разрядности системы заводите? В x64 две версии rundll.exe »

Вот что выскакивает :
http://fotohosting.org/share.php?id=C0CA_4EE3A23B
в x86 windows 7. То что просит показанном на скрине , он ищет в нужной папке

kotkovets 10-12-2011 22:55 1812895

Painkiller
Проблема не в NSIS, правте inf, в частности касаемого файла, да остальных наверняка..
заодно, не помешает, с правами разобраться.
Пробуйте так, расположите скрипт inf (все нужные компоненты прописанные в inf -рядом с inf),
рядом со скриптом NSIS
и выполните
Код:

ExecWait "rundll32.exe SETUPAPI.DLL,InstallHinfSection DefaultInstall 132 $EXEDIR\CisUtMonitor.inf"
А гадать, че так и что не так нечего!

kotkovets 10-12-2011 23:12 1812909

Painkiller,
И что здесь не работает????
Код:

OutFile "test.exe"

InstallDir "$PROGRAMFILES\test"
 
Section
  SetOutPath "$INSTDIR"
  File "CisUtMonitor.inf"
  File "CisUtMonitor.sys"
  ExecWait "rundll32.exe SETUPAPI.DLL,InstallHinfSection DefaultInstall 132 $INSTDIR\CisUtMonitor.inf"
SectionEnd

Все установилось штатно и без проблем!

Painkiller 10-12-2011 23:15 1812910

Цитата:

Цитата kotkovets
Painkiller
Проблема не в NSIS, правте inf, в частности касаемого файла, да остальных наверняка..
заодно, не помешает, с правами разобраться.
Пробуйте так, расположите скрипт inf (все нужные компоненты прописанные в inf -рядом с inf),
рядом со скриптом NSIS
и выполните
Код:
ExecWait "rundll32.exe SETUPAPI.DLL,InstallHinfSection DefaultInstall 132 $EXEDIR\CisUtMonitor.inf"
А гадать, че так и что не так нечего! »

Всё спасибо проблему решил. Проблема в другом была =) Проблема была в файлах=) Пришлось переименовывать файлы ) Когда я распаковал стандартный установщик то там была 2 фала CisUtMonitor1.sys и CisUtMonitor2.sys. А искалось CisUtMonitor.sys

MKN 11-12-2011 12:47 1813147

Цитата:

Цитата kotkovets
Какие то то сомнения в x64 ? откуда? »

Да вот пишут, что драйвер может не установится... Рекомендуют так :
Код:

  ${If} ${RunningX64}
        ${DisableX64FSRedirection}
        SetRegView 64
    ${EndIf}
ExecWait '$SYSDIR\RUNDLL32.EXE SETUPAPI.DLL,InstallHinfSection DefaultInstall 132 $INSTDIR\<myinf>.inf'

Но у меня похоже не в том загвоздка... Нужный мне драйвер, как всегда, не совсем классический (ArcSec.sys - драйвер системы доступа к данным, нужен для просмотра AACS-защищенных дисков) , хотя имеются все необходимые причиндалы - inf файл и пр. Короче не устанавливается ни в какую... Может дело в том , что он должен установиться как сервис...

wolkow70 11-12-2011 13:00 1813153

Цитата:

Цитата MKN
Может дело в том , что он должен установиться как сервис... »

Дак вы в инфе посмотрите в секциях устанавливается он в службы или нет. Хотя, можно быть уверенным, что устанавливается.
Убедиться еще нужно в следующем:
1. Что объявлена $INSTDIR.
2. Что в секции, из которой производится установка подключено SetOutPath "$INSTDIR"
3. Что к моменту запуска установки драйвера нужные файлы распакованы в папку назначения с верными именами.

Глюки могут быть связаны с наличием в реестре остатков предыдущей установки драйвера. Нужно попробовать установить программу из оригинального инсталлятора и также корректно деинсталлировать.

kotkovets 11-12-2011 13:48 1813165

MKN, А как он вообще ставится? т.е я имею ввиду штатными-системными способами?
Я очень многие дрова ставлю так:
http://forum.oszone.net/post-1733766-1482.html
но многие дрова не ставятся так.

MKN 11-12-2011 14:01 1813172

kotkovets,
Этот драйвер устанавливается из InstallShield инсталлятора согласно собственного сценария, доступа к которому нет...
Известно какие файлы и куда копируются, какие записи появляются в реестре. Также, предположительно, в установке участвуют собственные утилиты - MyDevCon32.exe и MyDevCon64.exe, при запуске которых даже появляется хелп синтаксиса команды установки. Но драйвер-служба всё равно почему то не устанавливается...

kotkovets 11-12-2011 14:11 1813178

Цитата:

Цитата MKN
InstallShield инсталлятора согласно собственного сценария, доступа к которому нет... »

Цитата:

Цитата MKN
Известно какие файлы и куда копируются, какие записи появляются в реестре. »

Этого мало.
Там сценарий установки драйвера написан на языке си(с++), если бы он был мне известен -
на nsis переделал в два счета или за сто лет :)
Так, что изучай тщательнее хелп синтаксис - MyDevCon64.exе и все получится

Alexey_KF 11-12-2011 16:05 1813252

Нашел в скрипте таку строку
Код:

\makensis.exe" /P2 /V3
Что за параметр запуска /P2 /V3 ? Что означает. В Справке такого нету.

kotkovets 12-12-2011 14:17 1813746

Цитата:

Цитата Alexey_KF
makensis.exe" /P2 /V3 »

Цитата:

/Px sets the compiler process priority, where x is 5=realtime,4=high,
3=above normal,2=normal,1=below normal,0=idle
/Vx verbosity where x is 4=all,3=no script,2=no info,1=no warnings,0=none
Командная строка компилятора:
P - уровень приоритета выполнения процесса makensis.exe
V - уровень вывода в консоли выводмого текcта и предупреждения в скрипте(при не фатальных ошибок в скрипте)
при компилировании компилировании скрипта

wolkow70 13-12-2011 13:46 1814339

kotkovets,

Идет последовательность комманд на удаление ключей реестра, которые вероятно уже не сущестуют.
Обязательно ли выставлять ClearErrors перед следующей коммандой на удаление ключа который тоже возможно не существует?

DeleteRegKey HKLM "SOFTWARE\Pandora.TV" ""
ClearErrors
DeleteRegKey HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\4F6D5E84-5826-4394-9F40-3A9A19165651_is1" ""
ClearErrors
DeleteRegKey HKLM "SYSTEM\CurrentControlSet\Services\PanService" ""
и т.д.?

kotkovets 13-12-2011 15:02 1814393

Цитата:

Цитата wolkow70
Обязательно ли выставлять ClearErrors перед следующей коммандой на Нужно, удаление ключа который тоже возможно не существует? »

Нужно по условиям скрипта, ключ не существует - установщик выкидывает флаг ошибки:
Код:

IfErrors 0 +2
MessageBox MB_OK "error" IDOK

Если имеется в скрипте иные команды, срабатывающие на флаге ошибке, но не по условию
несуществующего ключа в реестре, то обязательно, во избежание ложных срабатываний.
К примеру мне выдал установщик флаг ошибки из-за несуществующего ключа в реестре.
А затем в скрипте идет команда проверки удаления файла, то проверка удаления файла будет всегда срабатывать из-за ошибки ключа, а не удаления файла. По этому нужно выпиливать ненужный флаг ошибки принудительно - ошибку несуществующего ключа.

tisole 16-12-2011 20:39 1816525

Всем здравствуйте!
Возникла следующая проблема с Caption деинсталлятора. В зависимости от того, с каким ключом вызывается деинсталлятор, он либо деинсталлирует программу либо изменяет её настройки. Соответственно хотелось бы менять заголовок (caption) окон в зависимости от того, какие функции осуществляются деинсталлятором. Понятно, что выбор заголовка происходит только в момент запуска, а не во время компиляции.

Есть вариант делать это с помощью
SendMessage $HWNDPARENT ${WM_SETTEXT} 0 "STR:$(CaptionModify)" для каждого окна.
Тогда у меня возникает проблема со стандартной страницей MUI_UNPAGE_INSTFILES. При запуске этой страницы я посылаю указанное сообщение, устанавливается нужный мне заголовок. После выполнения действий по изменению/деинсталляции, окно автоматически не закрывается, то есть SetAutoClose = false, и заголовок меняется на первоначальный, указанный начале кода. Не могу понять, по какому событию мне послать новое сообщение, чтобы вернуть прежний, нужный мне заголовок.
Возможно, кто-то сможет мне помочь:)

kotkovets 17-12-2011 00:37 1816652

Цитата:

Цитата tisole
Возникла следующая проблема с Caption »

Можно так, хитростью, все события замены текста выполняются, когда страничка открывается
читать дальше »
Код:

OutFile Test.exe
ShowInstDetails show

!include "MUI2.nsh"
  !define MUI_PAGE_CUSTOMFUNCTION_SHOW WELCOME_SHOW
!insertmacro MUI_PAGE_WELCOME
  !define MUI_PAGE_CUSTOMFUNCTION_SHOW INSTFILES_SHOW
!insertmacro MUI_PAGE_INSTFILES
  !define MUI_PAGE_CUSTOMFUNCTION_SHOW FINISH_SHOW
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "Russian"

Function WELCOME_SHOW
  ${NSD_SetText} $HWNDPARENT "WELCOME_SHOW"
FunctionEnd

Function INSTFILES_SHOW
  ${NSD_SetText} $HWNDPARENT "INSTFILES_SHOW"
FunctionEnd

Function FINISH_SHOW
  ${NSD_SetText} $HWNDPARENT "FINISH_SHOW"
FunctionEnd

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Section
    MessageBox MB_OK "INSTFILES_SHOW" IDOK
SectionEnd


Аналогичные действия делаем с деинсталлятором, но с приставкой un

wolkow70 17-12-2011 15:26 1816874

kotkovets,

Ходатайствую о помощи в таком вопросе:

Пишу в секции:

StrCpy $3 "{Home}Мои документы"
StrCpy $4 "{Resources}program"

WriteINIStr "$APPDATA\Opera\Opera\operaprefs.ini" "User Prefs" "Download Directory" "$3"
WriteINIStr "$APPDATA\Opera\Opera\operaprefs.ini" "Saved Settings" "Save Dir" "$3"
WriteINIStr "$APPDATA\Opera\Opera\operaprefs.ini" "Saved Settings" "Open Dir" "$4"

В результате в UTF8 имею такую картину:
Download Directory={Home}ͮ桤﫳���[Saved Settings]
Save Dir={Home}ͮ桤﫳���Open Dir={Resources}program

Как корректно отразить строки с русским текстом?

Сама Opera как-то же сохраняет:
[Saved Settings]
Save Dir={Home}Мои документы

kotkovets 17-12-2011 16:56 1816916

Цитата:

Цитата wolkow70
Сама Opera как-то же сохраняет »

Опера настройки сохраняет в формате UTF8,
NSIS пишет файлы в формате ANSI: кирилица искажается при чтении браузером своих настроек
Попробуйте плагином Unicode созданный конфиг (ANSI)
конвертировать в формат UTF8, т.е с таким форматом хранит Opera свои настройки

wolkow70 17-12-2011 17:35 1816932

Цитата:

Цитата kotkovets
конвертировать в формат UTF8, т.е с таким форматом хранит Opera свои настройки »

Там приведено три типа комманд:
unicode::FileAnsi2Unicode "Input" "Output" Type
unicode::FileUnicode2UTF8 "Input" "Output" Type
unicode::FileUnicode2Ansi "Input" "Output" Type

То есть будет так?

unicode::FileAnsi2Unicode "Input" "Output" Type
unicode::FileUnicode2UTF8 "Input" "Output" Type

Конкретено что должно быть прописано в "Input" "Output" Type? Путь к файлу?
Примерно так?
unicode::FileAnsi2Unicode "$APPDATA\Opera\Opera\operaprefs.ini" "$APPDATA\Opera\Opera\operaprefs.ini" Unicode
unicode::FileUnicode2UTF8 "$APPDATA\Opera\Opera\operaprefs.ini" "$APPDATA\Opera\Opera\operaprefs.ini" UTF8

Так не работает.

kotkovets 17-12-2011 17:54 1816945

wolkow70,
Код:

       
unicode::FileAnsi2Unicode "$APPDATA\Opera\Opera\operaprefs.ini" "$APPDATA\Opera\Opera\operaprefs.ini" "UTF-8"
Pop $3
DetailPrint $3

Если $3=0, то успешно

wolkow70 17-12-2011 18:06 1816951

Работает.

[User Prefs]
Download Directory={Home}Мои документы
[Saved Settings]
Save Dir={Home}Мои документы

wolkow70 17-12-2011 18:39 1816967

kotkovets,
А возможно создать титульные строки ini файла?

Opera Preferences version 2.1
; Do not edit this file while Opera is running
; This file is stored in UTF-8 encoding

kotkovets 17-12-2011 18:59 1816971

Цитата:

Цитата wolkow70
А возможно создать титульные строки ini файла? »

Через WriteIniStr - нет!
А так можно:
Код:

  Fileopen $0 "user.ini" a
  FileWrite $0 '\
  ;Opera Preferences version 2.1$\r$\n\
  ;Do not edit this file while Opera is running$\r$\n\
  ;This file is stored in UTF-8 encoding$\r$\n$\r$\n$\r$\n\
  [User Prefs]$\r$\n\
  Download Directory={Home}Мои документы$\r$\n\
  [Saved Settings]$\r$\n\
  Save Dir={Home}Мои документы$\r$\n'
  FileClose $0


diakov 18-12-2011 20:57 1817548

Доброго времени суток! Уважаемые гуру, подскажите пожалуйста как реализовать такое


Выбор типа установки/распаковки когда выбрана распаковка портабла чекбоксы неактивны, и при выборе одного из радиобутонов изображение справа меняется!

Собственно сам ехе-шник DepositFiles.com

Желательно пример скрипта! Благодарствую!

kotkovets 19-12-2011 03:00 1817726

Цитата:

Цитата diakov
Выбор типа установки/распаковки когда выбрана распаковка портабла чекбоксы неактивны, и при выборе одного из радиобутонов изображение справа меняется! »

Читайте NSIS\Docs\nsDialogs\Readme.html там все расписано с примерами, ничего нестандартного в скрипте нет,
я потратил на создание скрипта 20 минут и +10 минут на чтение доков. Во общем пример для всех.
читать дальше »
Код:

!include "MUI2.nsh"
ShowInstDetails show
OutFile "Nstest.exe"

var dlg
var Label
var Check
var Check1
var CheckBox
var CheckBox1
var Radio
var Radio1
var RadioButton
var RadioButton1
var ImageHandle
var Image

!insertmacro MUI_PAGE_WELCOME
Page custom PageInit PageDestroy
!insertmacro MUI_PAGE_INSTFILES
;!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "Russian"

Function .onInit
  InitPluginsDir ;иницилизируем рабочую папку, куда будут распакованы картинки
  File "/oname=$PLUGINSDIR\nsis-r.bmp" "${NSISDIR}\Contrib\Graphics\Header\nsis-r.bmp"
  File "/oname=$PLUGINSDIR\orange-r.bmp" "${NSISDIR}\Contrib\Graphics\Header\orange-r.bmp"
FunctionEnd

Function PageInit
  !insertmacro MUI_HEADER_TEXT "О-па" "Вот оно как МИхалыч!"
  nsDialogs::Create 1018
  Pop $dlg
  ${NSD_CreateLabel} 0u 0u 120u 12u "Пожалуйста, сделайте выбор:"
  Pop $Label
  ;;
  ${NSD_CreateRadioButton} 0u 14u 120u 12u "Установка обычной версии"
  Pop $RadioButton
  ${NSD_SetState} $RadioButton 1            ;делаем радиобутон отмеченным
  ${NSD_OnClick} $RadioButton RadioButton  ;событие отметки радиобутона
  ;;
  ${NSD_CreateRadioButton} 0u 28u 150u 12u "Распаковка портативной версии"
  Pop $RadioButton1
  ${NSD_OnClick} $RadioButton1 RadioButton1 ;событие отметки радиобутона
  ;;
  ${NSD_CreateCheckBox} 0u 100u 120u 12u "Ярлык(и) на рабочем столе"
  Pop $CheckBox
  ${NSD_SetState} $CheckBox 1
  ;;
  ${NSD_CreateCheckBox} 0u 115u 100u 12u "Ярлыки в меню «Пуск»"
  Pop $CheckBox1
  ${NSD_SetState} $CheckBox1 1
  ;;;;;;;;
  ${NSD_CreateBitmap} 190u 0 100% 100% "" ;создаем контрол для картинок
  Pop $Image
  ${NSD_SetImage} $Image "$PLUGINSDIR\nsis-r.bmp" $ImageHandle ;загружаем картинку
  nsDialogs::Show
  ${NSD_FreeImage} $ImageHandle ;удаляем картинку
FunctionEnd

Function switching
  ${NSD_GetState} $RadioButton $Radio ;снимаем статус отметки радиобуттона
  ${If} $Radio == 1                  ;если радибуттон "Установка обычной версии" отмеченный то...
      EnableWindow $CheckBox 1
      EnableWindow $CheckBox1 1
      ${NSD_SetState} $CheckBox 1
      ${NSD_SetState} $CheckBox1 1
      ${NSD_FreeImage} $ImageHandle                  ;удаляем картинку
      ${NSD_SetImage} $Image "$PLUGINSDIR\nsis-r.bmp" $ImageHandle  ;загружаем картинку
  ${Else}                          ;если радибуттон "Установка обычной версии" неотмеченный то...
      EnableWindow $CheckBox 0    ;затеняем чекбокс
      EnableWindow $CheckBox1 0    ;затеняем чекбокс
      ${NSD_SetState} $CheckBox 0  ;делаем чекбокс неотмеченным
      ${NSD_SetState} $CheckBox1 0 ;делаем чекбокс неотмеченным
      ${NSD_FreeImage} $ImageHandle              ;удаляем картинку
      ${NSD_SetImage} $Image "$PLUGINSDIR\orange-r.bmp" $ImageHandle  ;загружаем картинку
  ${EndIf}
FunctionEnd
 ;функции события отметки радиобуттонов
Function RadioButton
  Pop $RadioButton
  Call switching
FunctionEnd
Function RadioButton1
  Pop $RadioButton1
  Call switching
FunctionEnd

Function PageDestroy
  ;функция которая выполняется при закрытии кастомной станички
  ;снимаем статусы отметок радиобуттонов и чекбоксов
  ${NSD_GetState} $RadioButton $Radio
  ${NSD_GetState} $RadioButton1 $Radio1
  ${NSD_GetState} $CheckBox $Check
  ${NSD_GetState} $CheckBox1 $Check1
FunctionEnd

Section "-Обычная установка"
  ${If} $Radio == 1

      ;;;
      ;тут пишем все команды при обычной установке
      DetailPrint "Обычная установка"
      ;;;

  ${EndIf}
SectionEnd

Section "-Распаковка портативной версии"
  ${If} $Radio1 == 1
 
      ;;;
      ;тут пишем все команды при распаковки портативной версии
      DetailPrint "Распаковка портативной версии"
      ;;;
     
  ${EndIf}
SectionEnd

Section "-Ярлыки"
  ${If} $Check == 1

      ;;;
      DetailPrint "Ярлык на рабочий стол"
      ;;;

  ${EndIf}
  ${If} $Check1 == 1

      ;;;
      DetailPrint "Ярлык в меню Пуск"
      ;;;

  ${EndIf}
SectionEnd


wolkow70 19-12-2011 09:53 1817802

kotkovets,

Нужен совет:

Реализую резервное копирование настроек:
Код:

Function .onInit
SetShellVarContext current
SetOutPath "$APPDATA"
IfFileExists "$APPDATA\Opera\Opera\*.ini" 0 no_backup 
MessageBox MB_YESNOCANCEL|MB_USERICON|MB_TOPMOST "ВНИМАНИЕ!$\n\
$\nВ папке с профилем текущего Пользователя программы обнаружены файлы настроек предыдущей установки Opera. \
$\nПри нажатии кнопки 'Yes' будет выполнено резервное копирование файлов Opera в каталог $DOCUMENTS\Opera Backup. \
$\nПри нажатии кнопки 'No' будет выполнена чистая установка. Все данные предыдущей установки Opera будут уничтожены без сохранения резервных копий. \
$\nПри нажатии кнопки 'Cancel' установка Opera будет отменена. \
$\nВыполнить резервное копирование файлов Opera для их дальнейшего использования ?" /SD IDYES IDNO no_backup IDCANCEL cancel
;
CreateDirectory "$DOCUMENTS\Opera Backup\AppData\Opera"
;
CopyFiles /silent "$APPDATA\Opera\Opera\*.ini" "$DOCUMENTS\Opera Backup\AppData\Opera"
CopyFiles /silent "$APPDATA\Opera\Opera\*.adr" "$DOCUMENTS\Opera Backup\AppData\Opera"
CopyFiles /silent "$APPDATA\Opera\Opera\*.dat" "$DOCUMENTS\Opera Backup\AppData\Opera"
CopyFiles /silent "$APPDATA\Opera\Opera\*.xml" "$DOCUMENTS\Opera Backup\AppData\Opera"
CopyFiles /silent "$APPDATA\Opera\Opera\*.js" "$DOCUMENTS\Opera Backup\AppData\Opera"
goto no_backup
cancel:
Abort
no_backup: 
FunctionEnd

В данном случае поиск настроек реализуется по файлам с расширением Ini. Хочу сделать проверку по нескольким расширением с логикой "Или". То есть если есть файлы с расширением ini adr dat xml js, или папки с определенными названиеями (menu), то вывод сообщения.
Еще в функции копирования можно ли объединить файлы с искомыми расширениями в одну комманду?

diakov 19-12-2011 10:26 1817821

Большое спасибо kotkovets опробую и отпишусь обезательно :)

kotkovets 19-12-2011 10:45 1817829

Цитата:

Цитата wolkow70
Еще в функции копирования можно ли объединить файлы с искомыми расширениями в одну комманду? »

Да незачем такие проверки делать - излишне, достаточно проверку сделать,
что бы искомая папка не была пуста
Код:

${If} ${FileExists} "$APPDATA\Opera"
      System::Call "Shlwapi::PathIsDirectoryEmpty(t'$APPDATA\Opera')i.R0"
      ${AndIf} $R0 != 1
      ;${AndIf} ${FileExists} "$APPDATA\Opera\Opera\*.ini ;если есть ini
      CopyFiles /silent "$APPDATA\Opera" "$DOCUMENTS\Opera Backup\AppData\Opera"
${EndIf}

${AndIf} - логика И
${OrIf} - логика ИЛИ

wolkow70 19-12-2011 11:05 1817837

Цитата:

Цитата kotkovets
Да незачем такие проверки делать - излишне, достаточно проверку сделать,
что бы искомая папка не была пуста »

Весь профиль копировать не хочется, там лишнего много. Мне нужны копии файлов определенных расширений и несколько нужных папок.
Здесь можно прописать?
${If} ${FileExists} "$APPDATA\Opera"
System::Call "Shlwapi::PathIsDirectoryEmpty(t'$APPDATA\Opera')i.R0"
${AndIf} $R0 != 1
${AndIf} ${FileExists} "$APPDATA\Opera\Opera\*.ini"
${OrIf} ${FileExists} "$APPDATA\Opera\Opera\*.adr"
${OrIf} ${FileExists} "$APPDATA\Opera\Opera\*.xml"
${OrIf} ${FileExists} "$APPDATA\Opera\Opera\*.js"
${OrIf} ${FileExists} "$APPDATA\Opera\Opera\*.dat"
${OrIf} ${FileExists} "$APPDATA\Opera\Opera\menu"
${OrIf} ${FileExists} "$APPDATA\Opera\Opera\toolbar"
MessageBox MB_YESNOCANCEL|MB_USERICON|MB_TOPMOST "ВНИМАНИЕ!$\n\....

CopyFiles /silent.....

kotkovets 19-12-2011 11:23 1817845

Пробуйте так, но различные указанные расширения, одной командой копирования невозможно по логике вещей.
читать дальше »
Код:

${If} ${FileExists} "$APPDATA\Opera"
    System::Call "Shlwapi::PathIsDirectoryEmpty(t'$APPDATA\Opera')i.R0"
    ${AndIf} $R0 != 1
    ${AndIf} ${FileExists} "$APPDATA\Opera\Opera\*.ini"
    ${OrIf} ${FileExists} "$APPDATA\Opera\Opera\*.adr"
    ${OrIf} ${FileExists} "$APPDATA\Opera\Opera\*.xml"
    ${OrIf} ${FileExists} "$APPDATA\Opera\Opera\*.js"
    ${OrIf} ${FileExists} "$APPDATA\Opera\Opera\*.dat"
    ${OrIf} ${FileExists} "$APPDATA\Opera\Opera\menu"
    ${OrIf} ${FileExists} "$APPDATA\Opera\Opera\toolbar"
    MessageBox MB_YESNOCANCEL|MB_USERICON|MB_TOPMOST "ВНИМАНИЕ!$\n\
    $\nВ папке с профилем текущего Пользователя программы обнаружены файлы    настроек предыдущей установки Opera. \
    $\nПри нажатии кнопки 'Yes' будет выполнено резервное копирование файлов Opera в каталог $DOCUMENTS\Opera Backup. \
    $\nПри нажатии кнопки 'No' будет выполнена чистая установка. Все данные предыдущей установки Opera будут уничтожены без сохранения резервных копий. \
    $\nПри нажатии кнопки 'Cancel' установка Opera будет отменена. \
    $\nВыполнить резервное копирование файлов Opera для их дальнейшего использования ?" /SD IDYES IDNO no_backup IDCANCEL cancel
      ;;;
      CopyFiles /silent.....
      ;;;
      Goto no_backup
      cancel:
        Abort
      no_backup:
${EndIf}


Krinkels 19-12-2011 11:29 1817849

kotkovets
Хорошее число сообщений: Сообщения: 666 :)

kotkovets 19-12-2011 11:31 1817852

Цитата:

Цитата Krinkels
Хорошее число сообщений: »

Скорее бы отписаться...ФУ

wolkow70 19-12-2011 11:47 1817860

Цитата:

Цитата kotkovets
Пробуйте так, но различные указанные расширения, одной командой копирования невозможно по логике вещей. »

Ну с копированием ладно, а в поиске? Дело в том, что мне нужно сохранить переход по метке
no_backup , если искомое отсутствует, что бы не выводилось MB.

Я думал можно как-то так сделать
IfFileExists "$APPDATA\Opera\Opera\*.ini *.adr *.xml *.dat " 0 no_backup

В логическую конструкцию нельзя переход по метке встроить?

wolkow70 19-12-2011 12:03 1817867

Попробовал, так не пашет.
IfFileExists "$APPDATA\Opera\Opera\*.ini *.adr *.xml *.dat" 0 no_backup

wolkow70 19-12-2011 15:22 1817973

kotkovets,

Пошел по сложному пути и сделал так для двух типов установки (многопользовательской и однопользовательской):

Код:

Function .onInit
SetShellVarContext current
;                                                                                                                                                                   
IfFileExists "$APPDATA\Opera\Opera\*.ini" message_01 0
IfFileExists "$APPDATA\Opera\Opera\*.adr" message_01 0
IfFileExists "$APPDATA\Opera\Opera\*.xml" message_01 0
IfFileExists "$APPDATA\Opera\Opera\*.dat" message_01 0
IfFileExists "$APPDATA\Opera\Opera\*.js" message_01 0
IfFileExists "$APPDATA\Opera\Opera\sessions" message_01 0
IfFileExists "$APPDATA\Opera\Opera\toolbar" message_01 0
IfFileExists "$APPDATA\Opera\Opera\menu" message_01 0
IfFileExists "$APPDATA\Opera\Opera\user_jscript" message_01 0
IfFileExists "$APPDATA\Opera\Opera\skin" message_01 0
IfFileExists "$APPDATA\Opera\Opera\keyboard" message_01 0
IfFileExists "$APPDATA\Opera\Opera\mouse" message_01 0
;                                                                                                                                                            SetOutPath "$LOCALAPPDATA"
IfFileExists "$LOCALAPPDATA\Opera\Opera\mail" message_01 0
IfFileExists "$LOCALAPPDATA\Opera\Opera\cache" message_01 0
goto check_programdir
message_01:
MessageBox MB_YESNOCANCEL|MB_USERICON|MB_TOPMOST "ВНИМАНИЕ!$\n\
$\nВ профиле текущего Пользователя обнаружены папка, содержащая файлы настроек предыдущей установки Opera. \
$\nПри нажатии кнопки 'Yes' будет выполнено резервное копирование файлов Opera в каталог $DOCUMENTS\Opera Backup. \
$\nПри нажатии кнопки 'No' будет выполнена установка без сохранения резервных копий. Все данные предыдущей установки Opera будут уничтожены . \
$\nПри нажатии кнопки 'Cancel' установка Opera будет отменена. \
$\nВыполнить резервное копирование файлов Opera для их дальнейшего использования ?" /SD IDYES IDNO no_backup IDCANCEL cancel
;
CreateDirectory "$DOCUMENTS\Opera Backup\AppData\Opera"
CreateDirectory "$DOCUMENTS\Opera Backup\LocalAppData\Opera"
;
IfFileExists "$APPDATA\Opera\Opera\*.ini" 0 +2
CopyFiles /silent "$APPDATA\Opera\Opera\*.ini" "$DOCUMENTS\Opera Backup\AppData\Opera"
IfFileExists "$APPDATA\Opera\Opera\*.adr" 0 +2
CopyFiles /silent "$APPDATA\Opera\Opera\*.adr" "$DOCUMENTS\Opera Backup\AppData\Opera"
IfFileExists "$APPDATA\Opera\Opera\*.dat" 0 +2
CopyFiles /silent "$APPDATA\Opera\Opera\*.dat" "$DOCUMENTS\Opera Backup\AppData\Opera"
IfFileExists "$APPDATA\Opera\Opera\*.xml" 0 +2
CopyFiles /silent "$APPDATA\Opera\Opera\*.xml" "$DOCUMENTS\Opera Backup\AppData\Opera"
IfFileExists "$APPDATA\Opera\Opera\*.js" 0 +2
CopyFiles /silent "$APPDATA\Opera\Opera\*.js" "$DOCUMENTS\Opera Backup\AppData\Opera"
IfFileExists "$APPDATA\Opera\Opera\sessions" 0 +2
CopyFiles /silent "$APPDATA\Opera\Opera\sessions" "$DOCUMENTS\Opera Backup\AppData\Opera\sessions"
IfFileExists "$APPDATA\Opera\Opera\toolbar" 0 +2
CopyFiles /silent "$APPDATA\Opera\Opera\toolbar" "$DOCUMENTS\Opera Backup\AppData\Opera\toolbar"
IfFileExists "$APPDATA\Opera\Opera\menu" 0 +2
CopyFiles /silent "$APPDATA\Opera\Opera\menu" "$DOCUMENTS\Opera Backup\AppData\Opera\menu"
IfFileExists "$APPDATA\Opera\Opera\user_jscript" 0 +2
CopyFiles /silent "$APPDATA\Opera\Opera\user_jscript" "$DOCUMENTS\Opera Backup\AppData\Opera\user_jscript"
IfFileExists "$APPDATA\Opera\Opera\skin" 0 +2
CopyFiles /silent "$APPDATA\Opera\Opera\skin" "$DOCUMENTS\Opera Backup\AppData\Opera\skin"
IfFileExists "$APPDATA\Opera\Opera\keyboard" 0 +2
CopyFiles /silent "$APPDATA\Opera\Opera\keyboard" "$DOCUMENTS\Opera Backup\AppData\Opera\keyboard"
IfFileExists "$APPDATA\Opera\Opera\mouse" 0 +2
CopyFiles /silent "$APPDATA\Opera\Opera\mouse" "$DOCUMENTS\Opera Backup\AppData\Opera\mouse"
;
IfFileExists "$LOCALAPPDATA\Opera\Opera\mail" 0 +2
CopyFiles /silent "$LOCALAPPDATA\Opera\Opera\mail" "$DOCUMENTS\Opera Backup\LocalAppData\Opera\mail"
IfFileExists "$LOCALAPPDATA\Opera\Opera\cache" 0 +2
CopyFiles /silent "$LOCALAPPDATA\Opera\Opera\cache" "$DOCUMENTS\Opera Backup\LocalAppData\Opera\cache"
;
goto check_programdir
check_programdir:
SetShellVarContext all
SetOutPath "$INSTDIR"
IfFileExists "$INSTDIR\Profile\*.ini" message_02 0
IfFileExists "$INSTDIR\Profile\*.adr" message_02 0
IfFileExists "$INSTDIR\Profile\*.xml" message_02 0
IfFileExists "$INSTDIR\Profile\*.dat" message_02 0
IfFileExists "$INSTDIR\Profile\*.js" message_02 0
IfFileExists "$INSTDIR\Profile\sessions" message_02 0
IfFileExists "$INSTDIR\Profile\toolbar" message_02 0
IfFileExists "$INSTDIR\Profile\menu" message_02 0
IfFileExists "$INSTDIR\Profile\user_jscript" message_02 0
IfFileExists "$INSTDIR\Profile\skin" message_02 0
IfFileExists "$INSTDIR\Profile\keyboard" message_02 0
IfFileExists "$INSTDIR\Profile\mouse" message_02 0
IfFileExists "$INSTDIR\Profile\mail" message_02 0
IfFileExists "$INSTDIR\Profile\cache" message_02 0
goto no_backup
message_02:
MessageBox MB_YESNOCANCEL|MB_USERICON|MB_TOPMOST "ВНИМАНИЕ!$\n\
$\nВ директории назначения обнаружена папка с профилем программы, содержащая файлы настроек предыдущей установки Opera. \
$\nПри нажатии кнопки 'Yes' будет выполнено резервное копирование файлов Opera в каталог $DOCUMENTS\Opera Backup. \
$\nПри нажатии кнопки 'No' будет выполнена установка без сохранения резервных копий. Все данные предыдущей установки Opera будут уничтожены . \
$\nПри нажатии кнопки 'Cancel' установка Opera будет отменена. \
$\nВыполнить резервное копирование файлов Opera для их дальнейшего использования ?" /SD IDYES IDNO no_backup IDCANCEL cancel
;
CreateDirectory "$DOCUMENTS\Opera Backup\Opera\profile"
;
IfFileExists "$INSTDIR\Profile\*.ini" 0 +2
CopyFiles /silent "$INSTDIR\Profile\*.ini" "$DOCUMENTS\Opera Backup\Opera\profile"
IfFileExists "$INSTDIR\Profile\*.adr" 0 +2
CopyFiles /silent "$INSTDIR\Profile\*.adr" "$DOCUMENTS\Opera Backup\Opera\profile"
IfFileExists "$INSTDIR\Profile\*.dat" 0 +2
CopyFiles /silent "$INSTDIR\Profile\*.dat" "$DOCUMENTS\Opera Backup\Opera\profile"
IfFileExists "$INSTDIR\Profile\*.xml" 0 +2
CopyFiles /silent "$INSTDIR\Profile\*.xml" "$DOCUMENTS\Opera Backup\Opera\profile"
IfFileExists "$INSTDIR\Profile\*.js" 0 +2
CopyFiles /silent "$INSTDIR\Profile\*.js" "$DOCUMENTS\Opera Backup\Opera\profile"
IfFileExists "$INSTDIR\Profile\sessions" 0 +2
CopyFiles /silent "$INSTDIR\Profile\sessions" "$DOCUMENTS\Opera Backup\Opera\profile\sessions"
IfFileExists "$INSTDIR\Profile\toolbar" 0 +2
CopyFiles /silent "$INSTDIR\Profile\toolbar" "$DOCUMENTS\Opera Backup\Opera\profile\toolbar"
IfFileExists "$INSTDIR\Profile\menu" 0 +2
CopyFiles /silent "$INSTDIR\Profile\menu" "$DOCUMENTS\Opera Backup\Opera\profile\menu"
IfFileExists "$INSTDIR\Profile\user_jscript" 0 +2
CopyFiles /silent "$INSTDIR\Profile\user_jscript" "$DOCUMENTS\Opera Backup\Opera\profile\user_jscript"
IfFileExists "$INSTDIR\Profile\skin" 0 +2
CopyFiles /silent "$INSTDIR\Profile\skin" "$DOCUMENTS\Opera Backup\Opera\profile\skin"
IfFileExists "$INSTDIR\Profile\keyboard" 0 +2
CopyFiles /silent "$INSTDIR\Profile\keyboard" "$DOCUMENTS\Opera Backup\Opera\profile\keyboard"
IfFileExists "$INSTDIR\Profile\mouse" 0 +2
CopyFiles /silent "$INSTDIR\Profile\mouse" "$DOCUMENTS\Opera Backup\Opera\profile\mouse"
IfFileExists "$INSTDIR\Profile\mail" 0 +2
CopyFiles /silent "$INSTDIR\Profile\mail" "$DOCUMENTS\Opera Backup\Opera\profile\mail"
IfFileExists "$INSTDIR\Profile\cache" 0 +2
CopyFiles /silent "$INSTDIR\Profile\cache" "$DOCUMENTS\Opera Backup\Opera\profile\cache"
goto no_backup
cancel:
Abort
no_backup: 
FunctionEnd


kotkovets 19-12-2011 16:36 1818019

wolkow70, Слишком сложно и много лишнего...
А если у меня будет профиль в папке программы и профиль в $APPDATA и $LOCALAPPDATA ???

wolkow70 19-12-2011 16:58 1818032

Цитата:

Цитата kotkovets
А если у меня будет профиль в папке программы и профиль в $APPDATA и $LOCALAPPDATA ??? »

Такая ситуация в функции предусмотрена не смотря на всю ее невероятность.
goto check_programdir
check_programdir:
После проверки и копирования профиля в $APPDATA и $LOCALAPPDATA в "Мои документы" функция переходит в программную папку и резервирует папку profile, если в ней есть нужные файлы в "Общие документы".
Я гипотетически исходил из того, что такое может у кого-то случится.
В контексте всего скрипта эта функция не кажется сложной или содержащей что-то лишнее. Всего лишь маленькая часть.

kotkovets 19-12-2011 17:17 1818042

wolkow70,
Код:

CreateDirectory "$DOCUMENTS\Opera Backup\AppData\Opera"
CreateDirectory "$DOCUMENTS\Opera Backup\LocalAppData\Opera"
CreateDirectory "$DOCUMENTS\Opera Backup\Opera\profile"

Излишне, команда Copy сама создаст нужные каталоги.

diakov 19-12-2011 18:53 1818118

kotkovets есть такой вопрос глянул скрипт (разобраля с бутонами, чекбоксом, картинками), но есть проблема по сути...
вот скрин

вот код...

Код:

!define PRODUCT_NAME "Winamp"
!define PRODUCT_VERSION "5.5.4.2147"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"
!include "MUI2.nsh"
SetCompressor /SOLID lzma

!define MUI_ABORTWARNING
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\winamp.ico"
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"
!define MUI_CUSTOMFUNCTION_GUIINIT myGuiInit
!define BRANDING "RePack by D!akov"

var dlg
var Label
var Check
var Check1
var Check2
var CheckBox
var CheckBox1
var CheckBox2
var Radio
var Radio1
var RadioButton
var RadioButton1
var ImageHandle
var Image

!insertmacro MUI_PAGE_WELCOME
Page custom PageInit PageDestroy
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "Russian"

; Описание фаqла
VIProductVersion "${PRODUCT_VERSION}"
  VIAddVersionKey /LANG=${LANG_Russian} "CompanyName" "RePack by D!akov"
  VIAddVersionKey /LANG=${LANG_Russian} "FileDescription" "${PRODUCT_NAME} ${PRODUCT_VERSION}"
  VIAddVersionKey /LANG=${LANG_Russian} "FileVersion" "${PRODUCT_VERSION}"
; Конец описания файла

Name "${PRODUCT_NAME}"
Caption "Установка ${PRODUCT_NAME} ${PRODUCT_VERSION}"
UninstallCaption "Удаление ${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "${PRODUCT_NAME}-${PRODUCT_VERSION}.exe"
InstallDir "$PROGRAMFILES\Winamp"
ShowInstDetails show
ShowUnInstDetails show
BrandingText "${BRANDING}"


Function .onInit
  InitPluginsDir ;иницилизируем рабочую папку, куда будут распакованы картинки
  File "/oname=$PLUGINSDIR\nsis-r.bmp" "${NSISDIR}\Contrib\Graphics\Header\nsis-r.bmp"
  File "/oname=$PLUGINSDIR\orange-r.bmp" "${NSISDIR}\Contrib\Graphics\Header\orange-r.bmp"
FunctionEnd

Function PageInit
  !insertmacro MUI_HEADER_TEXT "Выбор типа и компонентов установки" "..."
  nsDialogs::Create 1018
  Pop $dlg
  ${NSD_CreateLabel} 0u 0u 120u 12u "Пожалуйста, сделайте выбор:"
  Pop $Label
  ;;
  ${NSD_CreateRadioButton} 0u 14u 150u 12u "Установка Winamp 5.623 Build 3199 Pro"
  Pop $RadioButton
  ${NSD_SetState} $RadioButton 1            ;делаем радиобутон отмеченным
  ${NSD_OnClick} $RadioButton RadioButton  ;событие отметки радиобутона
  ;;
  ${NSD_CreateRadioButton} 0u 28u 160u 12u "Распаковка Winamp 5.6.2.3199 Pro Full Final"
  Pop $RadioButton1
  ${NSD_OnClick} $RadioButton1 RadioButton1 ;событие отметки радиобутона
  ;;
  ${NSD_CreateCheckBox} 0u 100u 120u 12u "Ярлык(и) на рабочем столе"
  Pop $CheckBox
  ${NSD_SetState} $CheckBox 1
  ;;
  ${NSD_CreateCheckBox} 0u 115u 100u 12u "Ярлыки в меню «Пуск»"
  Pop $CheckBox1
  ${NSD_SetState} $CheckBox1 1
  ;;;;;;;;;;
  ${NSD_CreateCheckBox} 150u 115u 140u 12u "Установить набор скинов"
  Pop $CheckBox2
  ${NSD_SetState} $CheckBox2 1
  ;;;;;;;;
  ${NSD_CreateBitmap} 180u 0u 100% 100% "" ;создаем контрол для картинок
  Pop $Image
  ${NSD_SetImage} $Image "$PLUGINSDIR\nsis-r.bmp" $ImageHandle ;загружаем картинку
  nsDialogs::Show
  ${NSD_FreeImage} $ImageHandle ;удаляем картинку
FunctionEnd

Function switching
  ${NSD_GetState} $RadioButton $Radio ;снимаем статус отметки радиобуттона
  ${If} $Radio == 1                  ;если радибуттон "Установка обычной версии" отмеченный то...
      EnableWindow $CheckBox 1
      EnableWindow $CheckBox1 1
      EnableWindow $CheckBox2 1
      ${NSD_SetState} $CheckBox 1
      ${NSD_SetState} $CheckBox1 1
      ${NSD_SetState} $CheckBox2 1
      ${NSD_FreeImage} $ImageHandle                  ;удаляем картинку
      ${NSD_SetImage} $Image "$PLUGINSDIR\nsis-r.bmp" $ImageHandle  ;загружаем картинку
  ${Else}                          ;если радибуттон "Установка обычной версии" неотмеченный то...
      EnableWindow $CheckBox 0    ;затеняем чекбокс
      EnableWindow $CheckBox1 0    ;затеняем чекбокс
      EnableWindow $CheckBox2 0    ;затеняем чекбокс
      ${NSD_SetState} $CheckBox 0  ;делаем чекбокс неотмеченным
      ${NSD_SetState} $CheckBox1 0 ;делаем чекбокс неотмеченным
      ${NSD_SetState} $CheckBox2 0
      ${NSD_FreeImage} $ImageHandle              ;удаляем картинку
      ${NSD_SetImage} $Image "$PLUGINSDIR\orange-r.bmp" $ImageHandle  ;загружаем картинку
  ${EndIf}
FunctionEnd
 ;функции события отметки радиобуттонов
Function RadioButton
  Pop $RadioButton
  Call switching
FunctionEnd
Function RadioButton1
  Pop $RadioButton1
  Call switching
FunctionEnd

Function PageDestroy
  ;функция которая выполняется при закрытии кастомной станички
  ;снимаем статусы отметок радиобуттонов и чекбоксов
  ${NSD_GetState} $RadioButton $Radio
  ${NSD_GetState} $RadioButton1 $Radio1
  ${NSD_GetState} $CheckBox $Check
  ${NSD_GetState} $CheckBox1 $Check1
  ${NSD_SetState} $CheckBox2 $Check2
FunctionEnd

Section "-Обычная установка"
  ${If} $Radio == 1
  SetOutPath "$INSTDIR\Winamp"
File /r "D:\Winamp\Winamp\*.*"
 SetShellVarContext all
  CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}"
  WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Nullsoft" "" ""
  WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Nullsoft\Winamp" "regname" "D!akov"
  WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Nullsoft\Winamp" "regkey" "~AYKPaDABBRfbBTiZGjQO"
  ExecWait '$INSTDIR\winamp.exe /REG=LCAD'
  WriteUninstaller "$INSTDIR\uninst.exe"
  CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Удалить ${PRODUCT_NAME}.lnk" "$INSTDIR\uninst.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$INSTDIR\winamp.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "${PRODUCT_VERSION}"
Delete "$INSTDIR\Winamp"
      ;;;
      ;тут пишем все команды при обычной установке
      ;DetailPrint "Обычная установка"
      ;;;
  ${EndIf}
SectionEnd

Section "-Распаковка портативной версии"
  ${If} $Radio1 == 1
  SetOutPath "$INSTDIR"
  File /r "D:\Winamp\WinampPortable\*.*"
  SetShellVarContext all
      ;тут пишем все команды при распаковки портативной версии
      MessageBox MB_OK "Портативная версия распакована в текущую папку."
      ;;;
  ${EndIf}
SectionEnd

Section "-Ярлыки"
  ${If} $Check == 1
 CreateShortCut "$Desktop\${PRODUCT_NAME}.lnk" "$INSTDIR\winamp.exe"
      ;;;
      DetailPrint "Ярлык на рабочий стол"
      ;;;

  ${EndIf}
  ${If} $Check1 == 1
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\winamp.exe"
      ;;;
      DetailPrint "Ярлык в меню Пуск"
      ;;;
      ${EndIf}
SectionEnd

 
Section "-Скины"
  ${If} $Check2 == 1
SetOutPath "$PROGRAMFILES\Winamp\Winamp\Skins"
File /r "D:\Skins\*.*"
SetShellVarContext all
      ;;;
  ${EndIf}
SectionEnd

Section Uninstall
  ExecWait '$INSTDIR\winamp.exe /UNREG'
  RMDir /r "$INSTDIR"
  SetShellVarContext all
  RMDir /r "$SMPROGRAMS\${PRODUCT_NAME}"
  Delete "$Desktop\${PRODUCT_NAME}.lnk"
  DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
  DeleteRegKey HKLM "SOFTWARE\Nullsoft"
  SetAutoClose true
SectionEnd

Теперь проблема! хочу чтобы при отмеченом чекбоксе Установить набор скинов устанавливались скины из D:\Skins\*.* в $PROGRAMFILES\Winamp\Winamp\Skins но почемуто не ставятся( и еще при компиляции NIS Edit пишет variable "Check2" not referenced or never set, wasting memory что не правильно делаю подскажите??? Спасибо!

tisole 19-12-2011 19:11 1818128

kotkovets,
Цитата:

Можно так, хитростью, все события замены текста выполняются, когда страничка открывается...
Аналогичные действия делаем с деинсталлятором, но с приставкой un.
Этот прием не помогает для страницы INSTFILES. При открытии страницы действительно появляется заголовок из сообщения ${NSD_SetText} $HWNDPARENT "INSTFILES_SHOW". Но после выполнения действий из секции и перехода страницы в состояние Finished (установка завершена, кнопка Next активна и т д), заголовок страницы меняется на первоначальный заголовок из UninstallCaption. Хотелось бы все таки понять, можно как-нибудь отловить событие по переходу страницы в состояние успешной установки, может быть есть какой-то callback на этот случай.

А проблема решилась просто установкой переменной в UninstallCaption и изменением этой переменной в процессе выполнения деинсталлятора.

kotkovets 19-12-2011 21:32 1818232

Цитата:

Цитата diakov
и еще при компиляции NIS Edit пишет variable "Check2" not referenced or never set, wasting memory что не правильно делаю подскажите??? »

Внимательней смотрите:
Код:

Function PageDestroy
  ;функция которая выполняется при закрытии кастомной станички
  ;снимаем статусы отметок радиобуттонов и чекбоксов
  ;;;
  ${NSD_SetState} $CheckBox2 $Check2
FunctionEnd

Нужно снимать статус отметки чекбокса, а не назначать.
Код:

${NSD_GetState} $CheckBox2 $Check2
Поэтому компилятор честно предупредил, что переменная $Check2 объявлена,
но не иницилизирована (не используется), а условие поставлено для распаковки скинов:если $Check2 = 1
Поэтому ничего и не работало.
Цитата:

Цитата tisole
Хотелось бы все таки понять, можно как-нибудь отловить событие по переходу страницы в состояние успешной установки, может быть есть какой-то callback на этот случай »

Не дает NSIS такой callback - возвращает текст из Caption (UninstallCaption )

kylt_lichnosti 20-12-2011 03:34 1818437

Добрый день.
Такой вопрос - можно ли во время выполнения инсталятора выбирать - показывать или нет страницы.
Например у меня стоит:
Код:

!insertmacro MUI_PAGE_WELCOME
А я по параметру в командной строке хочу его не показывать.
Можно ли такой в рантайме делать?

diakov 20-12-2011 10:43 1818536

Спасибо человечище kotkovets...буду курить скрипт дальше...
Еще есть такие вопросы

Документация
Справочник по NSIS . Создан силами нашего сообщества. Начните с него.
Официальное руководство
Статья: создаем инсталлятор под Windows в NSIS
Статья: Инсталляция by NSIS
Примеры от K.A.V.
Кликабельный BrandingText
Картинки-превьюшки для радиокнопок
От меня лично (hb860): Я давно хотел создать что-то вроде учебника по NSIS. Я уже начал работать над этим, с целью написать простое руководство на практических примерах. Что у меня на данный момент получилось:
Создание своего инсталлятора на NSIS. Первые шаги
Создание своего инсталлятора на NSIS. Секции и выбор компонентов
Создание своего инсталлятора на NSIS. Деинсталлятор
NSIS. Создаем собственные страницы инсталлятора
Создание своего инсталлятора на NSIS. Ассоциации файлов. Макросы
Создание своего инсталлятора на NSIS. Определяем системный диск
Создание своего инсталлятора на NSIS. Один инсталлятор для x86 и х64 систем сразу
Создание своего инсталлятора на NSIS. Подробней о скрытых секциях. Скрытые группы секций.
Реализация дополнительных ключей командной строки
Определение версии и редакции операционной системы в NSIS
Запуск "родного" x64 процесса из x86 инсталлятора NSIS. Перенаправление папок

Большинство ссылок не доступны..у кого нибудь нет оф лайн варианта...
Как сделать так что бы при нажатии на готово в конце открывался url адрес..
И еще єто интересует Создание своего инсталлятора на NSIS. Один инсталлятор для x86 и х64 и Реализация дополнительных ключей командной строки систем сразу но нигде нет...

Еще раз большое спасибо!

Krinkels 20-12-2011 10:59 1818545

Если по ссылкам переходить вот что выдает:
читать дальше »
If you are looking for Winreview's software, click here. Now its on Winaero.com
Если вы ищете программы, разработанные проектом Winreview, нажмите сюда
Если вы ищете статью, просто откройте главную страницу сайта, и введите в поиск то, что хотите найти. Большинство полезных статей мы перенесли на новый движок сайта.

Нужно обновить ссылки, но я, увы, не могу редактировать шапку

Хм, поиск на сайте по слову "NSIS" ничего не дает.

diakov 20-12-2011 12:14 1818602

Цитата:

Цитата Krinkels
Нужно обновить ссылки, но я, увы, не могу редактировать шапку »

А у тебя есть эти материалы?
Если есть то скинь пожалуйста на електронку romasok88@gmail.com!

Krinkels 20-12-2011 13:13 1818657

Не, у меня такого нету. Мне хватает справки

wolkow70 20-12-2011 13:17 1818660

Вот здесь выложил подборку статей hb860 по созданию собственных инсталляторов на NSIS.
http://ifolder.ru/27697716

Я с этих материалов начинал :)

kotkovets 20-12-2011 13:25 1818667

Цитата:

Цитата diakov
Как сделать так что бы при нажатии на готово в конце открывался url адрес.. »

Функция будет выполнена после завершения инсталляции.
Код:

Function .onInstSuccess
    ExecShell open "http://forum.oszone.net"
FunctionEnd

Для MUI c использованием странички завершения (финиша) в начале скрипта:
Код:

!define MUI_FINISHPAGE_SHOWREADME "http://forum.oszone.net/"
!define MUI_FINISHPAGE_SHOWREADME_TEXT "Форум Oszone"


wolkow70 20-12-2011 14:30 1818728

Цитата:

Цитата kotkovets
Излишне, команда Copy сама создаст нужные каталоги. »

А еще какие комманды сами создают директории?
Например в такой секции, что на Ваш взгляд является лишним?

Код:

Section "Установить скрипт fastesttube" fastesttube
ReadINIStr $0 "$INSTDIR\operaprefs_default.ini" "System" "Multi User"
StrCmp $0 "1" 0 no_multi_user
SetShellVarContext current
${If} ${FileExists} "$APPDATA\Opera\Opera\user_jscript"
SetOutPath "$APPDATA\Opera\Opera\user_jscript"
File "${pkgdir}\Opera11\custom\fastesttube.js"
${Else}
SetOutPath "$APPDATA\Opera\Opera"
CreateDirectory "$APPDATA\Opera\Opera\user_jscript"
SetOutPath "$APPDATA\Opera\Opera\user_jscript"
File "${pkgdir}\Opera11\custom\fastesttube.js"
${EndIf}
Goto Done
no_multi_user:
${If} ${FileExists} "$INSTDIR\profile\user_jscript"
SetOutPath "$INSTDIR\profile\user_jscript"
File "${pkgdir}\Opera11\custom\fastesttube.js"
${Else}
SetOutPath "$INSTDIR\profile"
CreateDirectory "$INSTDIR\profile\user_jscript"
SetOutPath "$INSTDIR\profile\user_jscript"
File "${pkgdir}\Opera11\custom\fastesttube.js"
${EndIf}
Done:
SectionEnd

или тут

Код:

Section "Альтернативный список служб Поиска" Search
ReadINIStr $0 "$INSTDIR\operaprefs_default.ini" "System" "Multi User"
StrCmp $0 "1" 0 no_multi_user
SetShellVarContext current
SetOutPath "$APPDATA"
CreateDirectory "$APPDATA\Opera\Opera"
SetOutPath "$APPDATA\Opera\Opera"
SetOverwrite on
File "${pkgdir}\Opera11\custom\search.ini"
WriteINIStr "$APPDATA\Opera\Opera\operaprefs.ini" "State" "Data2" "02827edd9d4c131d98daea963133db3d757"
WriteINIStr "$APPDATA\Opera\Opera\operaprefs.ini" "State" "Data4" "004283130a2be3af796264a9071790fff30"
Goto Done
no_multi_user:
SetOutPath "$INSTDIR"
CreateDirectory "$INSTDIR\profile"
SetOutPath "$INSTDIR\profile"
SetOverwrite on
File "${pkgdir}\Opera11\custom\search.ini"
WriteINIStr "$INSTDIR\profile\operaprefs.ini" "State" "Data2" "02827edd9d4c131d98daea963133db3d757"
WriteINIStr "$INSTDIR\profile\operaprefs.ini" "State" "Data4" "004283130a2be3af796264a9071790fff30"
Done:
SectionEnd


kotkovets 20-12-2011 14:48 1818737

Цитата:

Цитата wolkow70
что на Ваш взгляд является лишним? »

По порядку в первом скрипте:
SetOutPath "$APPDATA\Opera\Opera"
CreateDirectory "$APPDATA\Opera\Opera\user_jscript"
;;;
SetOutPath "$INSTDIR\profile"
CreateDirectory "$INSTDIR\profile\user_jscript"

SetOutPath - тоже создает директории и делает текущую указанную папку инсталяционной

wolkow70 20-12-2011 15:38 1818759

Цитата:

Цитата kotkovets
CreateDirectory "$DOCUMENTS\Opera Backup\AppData\Opera"
CreateDirectory "$DOCUMENTS\Opera Backup\LocalAppData\Opera"
CreateDirectory "$DOCUMENTS\Opera Backup\Opera\profile"
Излишне, команда Copy сама создаст нужные каталоги. »

Закомментировал эти строки, пересобрал инсталлятор и папки не создаются. Раскоментировал и вновь стали создаваться. Странно...

kotkovets 20-12-2011 16:12 1818789

wolkow70, Это у вас в этом месте 2 раза SetOutPath:
после первой команды SetOutPath - ничего нет,
отсюда и вывод, в остальном я не телепат
Код:

SetOutPath "$APPDATA\Opera\Opera"
CreateDirectory "$APPDATA\Opera\Opera\user_jscript"
SetOutPath "$APPDATA\Opera\Opera\user_jscript"
File "${pkgdir}\Opera11\custom\fastesttube.js"

ищите другие кляксы, в скрипте, что вас вынудило выше так писать.

Цитата:

Цитата wolkow70
Излишне, команда Copy сама создаст нужные каталоги »

Извиняюсь заврался, хотя странно в XP не создает, а в Win7 создает каталоги...

wolkow70 20-12-2011 16:30 1818806

Цитата:

Цитата kotkovets
Извиняюсь заврался, хотя странно в XP не создает »

Я на XP тестировал.

Цитата:

Цитата kotkovets
Это у вас в этом месте 2 раза SetOutPath:
после первой команды SetOutPath - ничего нет, »

А почему ничего нет?
Подключается папка. В ней создается папка и подключается вновь созданная.
SetOutPath "$APPDATA\Opera\Opera"
CreateDirectory "$APPDATA\Opera\Opera\user_jscript"
SetOutPath "$APPDATA\Opera\Opera\user_jscript"

Вообще мне с коммандой SetOutPath не ясно создает ли она промежуточные директории?
Для сравнения тождественны ли комманды?
SetOutPath "$APPDATA\Opera\Opera"
и
SetOutPath "$APPDATA"
CreateDirectory "$APPDATA\Opera"
SetOutPath "$APPDATA\Opera"
CreateDirectory "$APPDATA\Opera\Opera"
SetOutPath "$APPDATA\Opera\Opera"

kotkovets 20-12-2011 17:11 1818846

Цитата:

Цитата wolkow70
Вообще мне с коммандой SetOutPath не ясно создает ли она промежуточные директории? »

Конечно создает, проверяйте:
Код:

SetOutPath "$EXEDIR\1\2\3"
MessageBox MB_OK "$OUTDIR" IDOK

Папка "3" будет текущей инсталляционной директорией.

wolkow70 20-12-2011 17:25 1818857

Цитата:

Цитата wolkow70
Для сравнения тождественны ли комманды? »

Тест показал, что тождественны и нужная папка создается просто одной коммандой.

!include "MUI.nsh"
!include "FileFunc.nsh"
OutFile "Creat.exe"
Section "Creat"
SetOutPath "$APPDATA\Opera\Opera"
SectionEnd

kotkovets 20-12-2011 17:29 1818860

Вместо трех команд:
Код:

SetOutPath "$APPDATA\Opera\Opera"
CreateDirectory "$APPDATA\Opera\Opera\user_jscript"
SetOutPath "$APPDATA\Opera\Opera\user_jscript"

одной достаточно:
Код:

SetOutPath "$APPDATA\Opera\Opera\user_jscript"

wolkow70 20-12-2011 17:46 1818875

Цитата:

Цитата kotkovets
Вместо трех команд: »

Цитата:

Цитата kotkovets
одной достаточно:
Код:
SetOutPath "$APPDATA\Opera\Opera\user_jscript" »

Тогда такая конструкция вообще не имеет смысла и я банально перестраховался.

${If} ${FileExists} "$APPDATA\Opera\Opera\user_jscript"
SetOutPath "$APPDATA\Opera\Opera\user_jscript"
File "${pkgdir}\Opera11\custom\fastesttube.js"
${Else}
SetOutPath "$APPDATA\Opera\Opera"
CreateDirectory "$APPDATA\Opera\Opera\user_jscript"
SetOutPath "$APPDATA\Opera\Opera\user_jscript"
File "${pkgdir}\Opera11\custom\fastesttube.js"
${EndIf}

kotkovets 20-12-2011 17:57 1818883

Цитата:

Цитата wolkow70
Тогда такая конструкция вообще не имеет смысла »

Именно, я прямо об этом не говорил - мне важнее, что бы сами поняли...
Цитата:

Цитата wolkow70
я банально перестраховался »

Это не тот страховой случай, как говорят в страховой компании
А инсталяционная директория - каталог, куда устремятся файлы(командой File)

kylt_lichnosti 20-12-2011 20:22 1818969

И опять добрый всем день.
Вопрос - можно ли как то реализовать задержку? По типу Wait и время в миллисекундах например.

Запускаю инсталятор в сайленте из программы, что бы он ее обновил. И нет твердой уверенности, что она успеет закрыться?

kotkovets 20-12-2011 22:22 1819028

Цитата:

Цитата kylt_lichnosti
Вопрос - можно ли как то реализовать задержку? По типу Wait и время в миллисекундах например »

Sleep 3000 - установщик отправится в паузу на 3с
Если нужно ожидать завершение чужого процесса, то в шапке темы найдите
ссылку на справочник по NSIS и в справочнике найдете:
Работа с процессами с помощью NSIS>>Ожидание завершения запущенного процесса заданное время

kylt_lichnosti 20-12-2011 23:48 1819081

kotkovets, большое спасибо - то что нужно.
Странно - я вчера час по инету шарился - не нашел.

diakov 22-12-2011 00:24 1819827

Доброго времени суток уважаемые господа!) Возникла идея перепаковать ccleaner под себя и интегрировать CCEnhancer

Вообщем все нормально с х86, а с х64 траблы

вот скрин идеи



вот код

Код:

!define PRODUCT_NAME "CCleaner"
!define PRODUCT_VERSION "3.1.4.1616"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"
!include "MUI2.nsh"
!include "x64.nsh"
SetCompressor /SOLID lzma

!define MUI_ABORTWARNING
!define MUI_ICON "D:\ccleaner.ico"
!define MUI_UNICON "D:\ccleaner.ico"
!define MUI_HEADERIMAGE
!define MUI_CUSTOMFUNCTION_GUIINIT myGuiInit
!define BRANDING "RePack by D!akov"

var dlg
var Label
var Check
var Check1
var Check2
var Check3
var CheckBox
var CheckBox1
var CheckBox2
var CheckBox3
var Radio
var Radio1
var RadioButton
var RadioButton1
var ImageHandle
var Image
Var product_version

!insertmacro MUI_PAGE_WELCOME
Page custom PageInit PageDestroy
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_UNPAGE_FINISH
!insertmacro MUI_LANGUAGE "Russian"

; Описание фаqла
VIProductVersion "${PRODUCT_VERSION}"
  VIAddVersionKey /LANG=${LANG_Russian} "CompanyName" "RePack by D!akov"
  VIAddVersionKey /LANG=${LANG_Russian} "FileDescription" "${PRODUCT_NAME} ${PRODUCT_VERSION}"
  VIAddVersionKey /LANG=${LANG_Russian} "FileVersion" "${PRODUCT_VERSION}"
; Конец описания файла

Name "${PRODUCT_NAME}"
Caption "Установка ${PRODUCT_NAME} ${PRODUCT_VERSION}"
UninstallCaption "Удаление ${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "${PRODUCT_NAME}-${PRODUCT_VERSION}.exe"
InstallDir "$PROGRAMFILES\CCleaner"
;ShowInstDetails show
;ShowUnInstDetails show
BrandingText "${BRANDING}"

Var SysDrive
Function .onInit
    ${If} ${RunningX64}
        StrCpy $product_version "CCleaner64 x64"
    ${Else}
        StrCpy $product_version "CCleaner x86"
    ${EndIf}
    StrCpy $SysDrive $WINDIR 2
    StrCpy $INSTDIR "$SysDrive\$PROGRAMFILES\CCleaner"
FunctionEnd


Function .onInit
  InitPluginsDir ;иницилизируем рабочую папку, куда будут распакованы картинки
  File "/oname=$PLUGINSDIR\nsis-r.bmp" "${NSISDIR}\Contrib\Graphics\Header\nsis-r.bmp"
  File "/oname=$PLUGINSDIR\orange-r.bmp" "${NSISDIR}\Contrib\Graphics\Header\orange-r.bmp"
FunctionEnd

Function PageInit
  !insertmacro MUI_HEADER_TEXT "Выбор типа и компонентов установки" "..."
  nsDialogs::Create 1018
  Pop $dlg
  ${NSD_CreateLabel} 0u 0u 120u 12u "Пожалуйста, сделайте выбор:"
  Pop $Label
  ;;
  ${NSD_CreateRadioButton} 0u 14u 150u 12u "Установка CCleaner 3.14.1616"
  Pop $RadioButton
  ${NSD_SetState} $RadioButton 1            ;делаем радиобутон отмеченным
  ${NSD_OnClick} $RadioButton RadioButton  ;событие отметки радиобутона
  ;;
  ${NSD_CreateRadioButton} 0u 28u 160u 12u "Распаковка CCleaner 3.14.1616"
  Pop $RadioButton1
  ${NSD_OnClick} $RadioButton1 RadioButton1 ;событие отметки радиобутона
  ;;
  ${NSD_CreateCheckBox} 0u 85u 120u 12u "Ярлык(и) на рабочем столе"
  Pop $CheckBox
  ${NSD_SetState} $CheckBox 1
  ;;
  ${NSD_CreateCheckBox} 0u 100u 100u 12u "Ярлыки в меню «Пуск»"
  Pop $CheckBox1
  ${NSD_SetState} $CheckBox1 1
  ;;;;;;;;;;
  ${NSD_CreateCheckBox} 0u 115u 300u 12u "Добавить пункт меню корзины 'Открыть/Запустить CCleaner'"
  Pop $CheckBox2
  ${NSD_SetState} $CheckBox2 1
  ;;;;;;;;
  ${NSD_CreateCheckBox} 0u 70u 120u 12u "Установить CCEnhancer"
  Pop $CheckBox3
  ${NSD_SetState} $CheckBox3 1
  ;;;;;;;;;;;;4
  ${NSD_CreateBitmap} 180u 0u 100% 100% "" ;создаем контрол для картинок
  Pop $Image
  ${NSD_SetImage} $Image "$PLUGINSDIR\nsis-r.bmp" $ImageHandle ;загружаем картинку
  nsDialogs::Show
  ${NSD_FreeImage} $ImageHandle ;удаляем картинку
FunctionEnd

Function switching
  ${NSD_GetState} $RadioButton $Radio ;снимаем статус отметки радиобуттона
  ${If} $Radio == 1                  ;если радибуттон "Установка обычной версии" отмеченный то...
      EnableWindow $CheckBox 1
      EnableWindow $CheckBox1 1
      EnableWindow $CheckBox2 1
      EnableWindow $CheckBox3 1
      ${NSD_SetState} $CheckBox 1
      ${NSD_SetState} $CheckBox1 1
      ${NSD_SetState} $CheckBox2 1
      ${NSD_SetState} $CheckBox3 1
      ${NSD_FreeImage} $ImageHandle                  ;удаляем картинку
      ${NSD_SetImage} $Image "$PLUGINSDIR\nsis-r.bmp" $ImageHandle  ;загружаем картинку
  ${Else}                          ;если радибуттон "Установка обычной версии" неотмеченный то...
      EnableWindow $CheckBox 0    ;затеняем чекбокс
      EnableWindow $CheckBox1 0    ;затеняем чекбокс
      EnableWindow $CheckBox2 0    ;затеняем чекбокс
      EnableWindow $CheckBox3 0
      ${NSD_SetState} $CheckBox 0  ;делаем чекбокс неотмеченным
      ${NSD_SetState} $CheckBox1 0 ;делаем чекбокс неотмеченным
      ${NSD_SetState} $CheckBox2 0
      ${NSD_SetState} $CheckBox3 0
      ${NSD_FreeImage} $ImageHandle              ;удаляем картинку
      ${NSD_SetImage} $Image "$PLUGINSDIR\orange-r.bmp" $ImageHandle  ;загружаем картинку
  ${EndIf}
FunctionEnd
 ;функции события отметки радиобуттонов
Function RadioButton
  Pop $RadioButton
  Call switching
FunctionEnd
Function RadioButton1
  Pop $RadioButton1
  Call switching
FunctionEnd

Function PageDestroy
  ;функция которая выполняется при закрытии кастомной станички
  ;снимаем статусы отметок радиобуттонов и чекбоксов
  ${NSD_GetState} $RadioButton $Radio
  ${NSD_GetState} $RadioButton1 $Radio1
  ${NSD_GetState} $CheckBox $Check
  ${NSD_GetState} $CheckBox1 $Check1
  ${NSD_GetState} $CheckBox2 $Check2
  ${NSD_GetState} $CheckBox3 $Check3
FunctionEnd

Section "-Обычная установка"
  ${If} $Radio == 1
  SetOutPath "$INSTDIR"
${If} ${RunningX64}
File /r "D:\CCleaner\*.*"
 CreateDirectory "${PRODUCT_NAME}"
 SetShellVarContext all
;здесь я так понимаю ключи которые надо прописать при установке на х64, которые я получаю путем сравнивания снимков системы до и после инсталяции на 64 битную ось ССклинера
  WriteUninstaller "$INSTDIR\Удалить CCleaner.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$INSTDIR\CCleaner.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\Удалить CCleaner.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "${PRODUCT_VERSION}"
  ${Else}
  File /r "D:\CCleaner1\*.*"
 CreateDirectory "${PRODUCT_NAME}"
 SetShellVarContext all
WriteRegStr HKEY_CURRENT_USER "Software\Piriform" "" ""
WriteRegStr HKEY_CURRENT_USER "Software\Piriform\CCleaner" "UpdateKey" "12/21/2011 03:28:56 PM"
WriteRegStr HKEY_CURRENT_USER "Software\Piriform\CCleaner" "Language" "1049"
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Classes\cclaunch" "" "URL: CCleaner Protocol"
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Classes\cclaunch" "URL Protocol" ""
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Classes\cclaunch\shell" "" ""
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Classes\cclaunch\shell\open" "" ""
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Classes\cclaunch\shell\open\command" "" "$\"$PROGRAMFILES\CCleaner\ccleaner.exe$\" /%1"
WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Tracing\ccsetup314_RASAPI32" "EnableFileTracing" 0x0
WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Tracing\ccsetup314_RASAPI32" "EnableConsoleTracing" 0x0
WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Tracing\ccsetup314_RASAPI32" "FileTracingMask" 0xffff0000
WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Tracing\ccsetup314_RASAPI32" "ConsoleTracingMask" 0xffff0000
WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Tracing\ccsetup314_RASAPI32" "MaxFileSize" 0x100000
WriteRegBin HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Tracing\ccsetup314_RASAPI32" "FileDirectory" 2500770069006e0064006900720025005c00740072006100630069006e0067000000
  WriteUninstaller "$INSTDIR\Удалить CCleaner.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$INSTDIR\CCleaner.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\Удалить CCleaner.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "${PRODUCT_VERSION}"
  ${EndIf}
      ;;;
      ;тут пишем все команды при обычной установке
      ;DetailPrint "Обычная установка"
      ;;;
  ${EndIf}
SectionEnd

Section "-Распаковка портативной версии"
  ${If} $Radio1 == 1
  SetOutPath "$INSTDIR"
  File /r "D:\CCleanerPortable\*.*"
  SetShellVarContext all
      ;тут пишем все команды при распаковки портативной версии
      MessageBox MB_OK "Портативная версия ${PRODUCT_NAME} ${PRODUCT_VERSION} распакована в текущую папку."
      ;;;
  ${EndIf}
SectionEnd

Section "-Ярлыки"
  ${If} $Check == 1
 CreateShortCut "$Desktop\${PRODUCT_NAME}.lnk" "$INSTDIR\CCleaner.exe"
      ;;;
      DetailPrint "Ярлык на рабочий стол"
      ;;;

  ${EndIf}
  ${If} $Check1 == 1
CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}"
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\CCleaner.exe"
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Удалить ${PRODUCT_NAME}.lnk" "$INSTDIR\Удалить CCleaner.exe"
      ;;;
      DetailPrint "Ярлык в меню Пуск"
      ;;;
      ${EndIf}
SectionEnd

Section "-Надстройка"
  ${If} $Check3 == 1
SetOutPath "$INSTDIR"
File /r "D:\iNTEGER\*.*"
SetShellVarContext all
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Запустить CCEnhancer.lnk" "$INSTDIR\CCEnhancer.exe"
      ;;;
  ${EndIf}
SectionEnd

Section "-Корзина"
  ${If} $Check2 == 1
WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Открыть CCleaner..." "CCRBType" 0x2
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Открыть CCleaner...\command" "" "$PROGRAMFILES\CCleaner\CCleaner.exe"
WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Запустить CCleaner" "CCRBType" 0x1
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Запустить CCleaner\command" "" "$PROGRAMFILES\CCleaner\CCleaner.exe /AUTO"
      ;;;
  ${EndIf}
SectionEnd

Section Uninstall
  RMDir /r "$INSTDIR"
  SetShellVarContext all
  RMDir /r "$SMPROGRAMS\${PRODUCT_NAME}"
  Delete  "$Desktop\${PRODUCT_NAME}.lnk"
  Delete "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk"
  Delete "$SMPROGRAMS\${PRODUCT_NAME}\Удалить ${PRODUCT_NAME}.lnk"
  DeleteRegKey HKLM "SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Открыть CCleaner..."
  DeleteRegKey HKLM "SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Открыть CCleaner...\command"
  DeleteRegKey HKLM "SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Запустить CCleaner"
  DeleteRegKey HKLM "SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Запустить CCleaner\command"
  DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
  DeleteRegKey HKCU "Software\Piriform"
  DeleteRegKey HKLM "SOFTWARE\Classes\cclaunch"
  DeleteRegKey HKLM "SOFTWARE\Microsoft\Tracing\ccsetup314_RASAPI32"
MessageBox MB_OK "Удаление ${PRODUCT_NAME} ${PRODUCT_VERSION} успешно завершено!"
  SetAutoClose true
SectionEnd

Прочитал статью Создание своего инсталлятора на NSIS. Один инсталлятор для x86 и х64 систем сразу создал

Код:

!include "x64.nsh"
Var product_version

-----

Var SysDrive
Function .onInit
    ${If} ${RunningX64}
        StrCpy $product_version "0.18 x64"
    ${Else}   
        StrCpy $product_version "0.21 x86"
    ${EndIf}
    StrCpy $SysDrive $WINDIR 2
    StrCpy $INSTDIR "$SysDrive\Greylink"
FunctionEnd

-------

Section "" 
    SetOutPath "$INSTDIR"
    ${If} ${RunningX64} 
        File /r "${pkgdir}\greylink\x64\"
    ${Else}   
        File /r "${pkgdir}\greylink\x86\"
    ${EndIf}

-------
Вообщем все в коде но не фурычит....:durak:
Суть проблемы такова на х64 не создаються контекст корзины запустить/открыть Ссклеанер, и ставиться соотвественно CCleaner.exe а не CCleaner64.exe вот....

Как допустим перепаковывать такие проги...я допустим так распаковал на х86 машину а потом на х64, потом просканировал реестр сравнил снимки со старыми, а теперь как реализовать если х86 то ставить файлы х86 + записи реестра под х86, а если х64 то ставить файлы х64 + записи реестра под х64.

Уважаемый kotkovets обьясните пожалуйста на примере CCleaner! Спасибо за помощь!

kotkovets 22-12-2011 00:47 1819832

Цитата:

Цитата diakov
если х86 то ставить файлы х86 + записи реестра под х86, а если х64 то ставить файлы х64 + записи реестра под х64 »

Ну все же очевидно:
читать дальше »
Код:

Section
${If} ${RunningX64} 
        SetOutPath "$ProgramFiles64\greylink"
        File /r "${pkgdir}\greylink\x64\"
        ;;
        ;до конструкции Else - будет выполнено в х64 Windows
        ;;
${Else}
        SetOutPath "$ProgramFiles\greylink"
        File /r "${pkgdir}\greylink\x86\"
        ;;
        ;до конструкции EndIf - будет выполнено в х32 Windows
        ;;
${EndIf}
SectionEnd

Скачайте в шапке темы справочник по NSIS - много полезного найдете!
» SetRegView: использование реестра от разрядности ОС
Код:

!include x64.nsh
;;
Section
${If} ${RunningX64}
  SetRegView 32
  ReadRegStr $0 HKLM Software\Microsoft\Windows\CurrentVersion ProgramFilesDir
  MessageBox MB_OK $0 # C:\Program Files (x86)
  SetRegView 64
  ReadRegStr $0 HKLM Software\Microsoft\Windows\CurrentVersion ProgramFilesDir
  MessageBox MB_OK $0 # C:\Program Files
${Else}
  ReadRegStr $0 HKLM Software\Microsoft\Windows\CurrentVersion ProgramFilesDir
  MessageBox MB_OK $0 # C:\Program Files
${EndIf}
SectionEnd

Откройте хедер x64.nsh - дает еще возможность:
"перенаправляться" к папкам 64-битных программ и 32-бытных
Код:

 
  SetOutPath $SYSDIR
  ${DisableX64FSRedirection}
  File some.dll # extracts to C:\Windows\System32
  ${EnableX64FSRedirection}
  File some.dll # extracts to C:\Windows\SysWOW64


diakov 22-12-2011 10:47 1819991

Спасибо буду шаманить...отпишусь!

kotkovets, с извлечения файлов все понятно, а вот реестр...

!include x64.nsh
;;
Section
${If} ${RunningX64}
SetRegView 32
ReadRegStr $0 HKLM Software\Microsoft\Windows\CurrentVersion ProgramFilesDir
MessageBox MB_OK $0 # C:\Program Files (x86)
SetRegView 64
ReadRegStr $0 HKLM Software\Microsoft\Windows\CurrentVersion ProgramFilesDir
MessageBox MB_OK $0 # C:\Program Files
; И ТУТ ПИСАТЬ ВСЕ КЛЮЧИ ЧТО ДОЛЖНЫ БЫТЬ ПРОПИСАНЫ В Х64
${Else}
ReadRegStr $0 HKLM Software\Microsoft\Windows\CurrentVersion ProgramFilesDir
MessageBox MB_OK $0 # C:\Program Files
; А ТУТ ПИСАТЬ ВСЕ КЛЮЧИ ЧТО ДОЛЖНЫ БЫТЬ ПРОПИСАНЫ В Х86
${EndIf}
SectionEnd

я правильно понял?

kotkovets 22-12-2011 11:20 1820012

Цитата:

Цитата diakov
я правильно понял? »

Почти и не обязательно плодить кучу секций в скриптах:
читать дальше »
Код:

Section "-Обычная установка"
${If} $Radio == 1
  ${If} ${RunningX64} 
          SetOutPath "$ProgramFiles64\greylink"
          File /r "${pkgdir}\greylink\x64\"
          ;;
          ;до конструкции Else - будет выполнено в х64 Windows
          SetRegView 64
          ; И ТУТ ПИСАТЬ ВСЕ КЛЮЧИ ЧТО ДОЛЖНЫ БЫТЬ ПРОПИСАНЫ В Х64
          ;;
  ${Else}
          SetOutPath "$ProgramFiles\greylink"
          File /r "${pkgdir}\greylink\x86\"
          ;;
          ;до конструкции EndIf - будет выполнено в х32 Windows
          SetRegView 32
          ; А ТУТ ПИСАТЬ ВСЕ КЛЮЧИ ЧТО ДОЛЖНЫ БЫТЬ ПРОПИСАНЫ В Х86
          ;;
  ${EndIf}
      ; А ТУТ ПИСАТЬ МОЖНО ВСЕ ОБЩИЕ КЛЮЧИ ДЛЯ х64 и х32
      ;;
${EndIf}
SectionEnd


diakov 22-12-2011 11:30 1820016

Понятно я просто вынес эти ключи для создание контекста корзины

Код:

Section "-Корзина"
  ${If} $Check2 == 1
WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Открыть CCleaner..." "CCRBType" 0x2
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Открыть CCleaner...\command" "" "$PROGRAMFILES\CCleaner\CCleaner.exe"
WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Запустить CCleaner" "CCRBType" 0x1
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Запустить CCleaner\command" "" "$PROGRAMFILES\CCleaner\CCleaner.exe /AUTO"
      ;;;
  ${EndIf}
SectionEnd

И еще такое теперь получается, если х64 то

Section "-Ярлыки"
${If} $Check == 1
${If} ${RunningX64}
CreateShortCut "$Desktop\${PRODUCT_NAME}.lnk" "$INSTDIR\CCleaner.exe" сответственно будет $INSTDIR\CCleaner64.exe"
;;;
DetailPrint "Ярлык на рабочий стол"
;;;

${EndIf}
${If} $Check1 == 1
CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}"
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\CCleaner.exe" сответственно будет $INSTDIR\CCleaner64.exe"
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Удалить ${PRODUCT_NAME}.lnk" "$INSTDIR\Удалить CCleaner.exe"
;;;
DetailPrint "Ярлык в меню Пуск"
${Else}

и уже если х86
;;;
${EndIf}
${EndIf}
SectionEnd

И аналогично при удалении ключей реестра в секции Uninstall так?

И аналогично при создании контекста корзина

Section "-Корзина"
${If} $Check2 == 1
${If} ${RunningX64}
ключи для контекста под х64
${Else}
ключи для контекста под х86
;;;
${EndIf}
${EndIf}
SectionEnd

Ил моно как то упростить)))

kotkovets 22-12-2011 12:46 1820052

diakov, Я же говорил общие ключи, ярлыки пишите вне логики, ну зачем
же писать одно тоже по несколько раз.
Цитата:

И еще такое теперь получается, если х64 то
Ил моно как то упростить)))
Все зависит от конкретной программы и требований к установке.
Ну к примеру, если 32-битная и 64-битная программа распаковывается в папку C:\app,
то команду создания ярлыков по логике пишем один раз, а если в папку программ, то можно
пуступить так:
Код:

InstallDir "$ProgramFiles64\App"
-
Section
  SetOutPath "$INSTDIR"
  ${If} ${RunningX64} 
          File /r "${pkgdir}\greylink\x64\"
          ;;
  ${Else}
          File /r "${pkgdir}\greylink\x86\"
        ;;
  ${EndIf}
    ;команда cоздания ярлыков
SecnionEnd

В x64 в переменную $INSTDIR - вернет путь к папке 64-битных программ
Program Files, а не 32 битных программ - Program Files(х86)
И следовательно в х32 вернет путь к обычной папке программ Program Files
С деинсталятором почти также, но важное отличие, деисталлятор возвращает путь в
переменную $INSTDIR - текущий каталог, откуда запущен деинсталлятор.
Цитата:

ключи для контекста под х64
${Else}
ключи для контекста под х86
Если CLSID ключей одинаковы, то можно писать только один раз.
Во общем смотрите, что общее в х32 и х64, а различия пишите в логику RunningX64

diakov 22-12-2011 12:56 1820061

спасибо...kotkovets, шаманю тогда дальше...жалко что ноут не поддерживает х64 виртуализацию...так бы счас потестил...а так надо два компа под руками :)

diakov 22-12-2011 13:40 1820077

kotkovets, я хотел бы еще реализовать командные ключb

например при S/port распаковывалась портативная версия S/inst устанавливалась обычная и еще добавить S/inst установку скажем CCEnhancer

и это все в тихом режиме
что где надо добавить в коде

читать дальше »

Код:

!define PRODUCT_NAME "CCleaner"
!define PRODUCT_VERSION "3.1.4.1616"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"
!include "MUI2.nsh"
!include "FileFunc.nsh"
!include x64.nsh
SetCompressor /SOLID lzma

!define MUI_ABORTWARNING
!define MUI_ICON "D:\cleaner.ico"
!define MUI_UNICON "D:\cleaner.ico"
!define MUI_HEADERIMAGE
!define MUI_CUSTOMFUNCTION_GUIINIT myGuiInit
!define BRANDING "RePack by D!akov"

var dlg
var Label
var Check
var Check1
var Check2
var Check3
var CheckBox
var CheckBox1
var CheckBox2
var CheckBox3
var Radio
var Radio1
var RadioButton
var RadioButton1
var ImageHandle
var Image

!insertmacro MUI_PAGE_WELCOME
Page custom PageInit PageDestroy
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_UNPAGE_FINISH
!insertmacro MUI_LANGUAGE "Russian"

; Описание фаqла
VIProductVersion "${PRODUCT_VERSION}"
  VIAddVersionKey /LANG=${LANG_Russian} "CompanyName" "RePack by D!akov"
  VIAddVersionKey /LANG=${LANG_Russian} "FileDescription" "${PRODUCT_NAME} ${PRODUCT_VERSION}"
  VIAddVersionKey /LANG=${LANG_Russian} "FileVersion" "${PRODUCT_VERSION}"
; Конец описания файла

Name "${PRODUCT_NAME}"
Caption "Установка ${PRODUCT_NAME} ${PRODUCT_VERSION}"
UninstallCaption "Удаление ${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "${PRODUCT_NAME}-${PRODUCT_VERSION}.exe"
InstallDir "$PROGRAMFILES\CCleaner"
;ShowInstDetails show
;ShowUnInstDetails show
BrandingText "${BRANDING}"


Function myGuiInit
GetDlgItem $0 $HWNDPARENT 1028
Linker::link /NOUNLOAD $0 "http://forum.oszone.net"
FunctionEnd

Function .onGUIEnd
Linker::unload
FunctionEnd

Function .onInit
  InitPluginsDir ;иницилизируем рабочую папку, куда будут распакованы картинки
  File "/oname=$PLUGINSDIR\nsis-r.bmp" "${NSISDIR}\Contrib\Graphics\Header\nsis-r.bmp"
  File "/oname=$PLUGINSDIR\orange-r.bmp" "${NSISDIR}\Contrib\Graphics\Header\orange-r.bmp"
FunctionEnd

Function PageInit
  !insertmacro MUI_HEADER_TEXT "Выбор типа и компонентов установки" "..."
  nsDialogs::Create 1018
  Pop $dlg
  ${NSD_CreateLabel} 0u 0u 120u 12u "Пожалуйста, сделайте выбор:"
  Pop $Label
  ;;
  ${NSD_CreateRadioButton} 0u 14u 150u 12u "Установка CCleaner 3.14.1616"
  Pop $RadioButton
  ${NSD_SetState} $RadioButton 1            ;делаем радиобутон отмеченным
  ${NSD_OnClick} $RadioButton RadioButton  ;событие отметки радиобутона
  ;;
  ${NSD_CreateRadioButton} 0u 28u 160u 12u "Распаковка CCleaner 3.14.1616"
  Pop $RadioButton1
  ${NSD_OnClick} $RadioButton1 RadioButton1 ;событие отметки радиобутона
  ;;
  ${NSD_CreateCheckBox} 0u 85u 120u 12u "Ярлык(и) на рабочем столе"
  Pop $CheckBox
  ${NSD_SetState} $CheckBox 1
  ;;
  ${NSD_CreateCheckBox} 0u 100u 100u 12u "Ярлыки в меню «Пуск»"
  Pop $CheckBox1
  ${NSD_SetState} $CheckBox1 1
  ;;;;;;;;;;
  ${NSD_CreateCheckBox} 0u 115u 300u 12u "Добавить пункт меню корзины 'Открыть/Запустить CCleaner'"
  Pop $CheckBox2
  ${NSD_SetState} $CheckBox2 1
  ;;;;;;;;
  ${NSD_CreateCheckBox} 0u 70u 120u 12u "Установить CCEnhancer"
  Pop $CheckBox3
  ${NSD_SetState} $CheckBox3 1
  ;;;;;;;;;;;;4
  ${NSD_CreateBitmap} 180u 0u 100% 100% "" ;создаем контрол для картинок
  Pop $Image
  ${NSD_SetImage} $Image "$PLUGINSDIR\nsis-r.bmp" $ImageHandle ;загружаем картинку
  nsDialogs::Show
  ${NSD_FreeImage} $ImageHandle ;удаляем картинку
FunctionEnd

Function switching
  ${NSD_GetState} $RadioButton $Radio ;снимаем статус отметки радиобуттона
  ${If} $Radio == 1                  ;если радибуттон "Установка обычной версии" отмеченный то...
      EnableWindow $CheckBox 1
      EnableWindow $CheckBox1 1
      EnableWindow $CheckBox2 1
      EnableWindow $CheckBox3 1
      ${NSD_SetState} $CheckBox 1
      ${NSD_SetState} $CheckBox1 1
      ${NSD_SetState} $CheckBox2 1
      ${NSD_SetState} $CheckBox3 1
      ${NSD_FreeImage} $ImageHandle                  ;удаляем картинку
      ${NSD_SetImage} $Image "$PLUGINSDIR\nsis-r.bmp" $ImageHandle  ;загружаем картинку
  ${Else}                          ;если радибуттон "Установка обычной версии" неотмеченный то...
      EnableWindow $CheckBox 0    ;затеняем чекбокс
      EnableWindow $CheckBox1 0    ;затеняем чекбокс
      EnableWindow $CheckBox2 0    ;затеняем чекбокс
      EnableWindow $CheckBox3 0
      ${NSD_SetState} $CheckBox 0  ;делаем чекбокс неотмеченным
      ${NSD_SetState} $CheckBox1 0 ;делаем чекбокс неотмеченным
      ${NSD_SetState} $CheckBox2 0
      ${NSD_SetState} $CheckBox3 0
      ${NSD_FreeImage} $ImageHandle              ;удаляем картинку
      ${NSD_SetImage} $Image "$PLUGINSDIR\orange-r.bmp" $ImageHandle  ;загружаем картинку
  ${EndIf}
FunctionEnd
 ;функции события отметки радиобуттонов
Function RadioButton
  Pop $RadioButton
  Call switching
FunctionEnd
Function RadioButton1
  Pop $RadioButton1
  Call switching
FunctionEnd

Function PageDestroy
  ;функция которая выполняется при закрытии кастомной станички
  ;снимаем статусы отметок радиобуттонов и чекбоксов
  ${NSD_GetState} $RadioButton $Radio
  ${NSD_GetState} $RadioButton1 $Radio1
  ${NSD_GetState} $CheckBox $Check
  ${NSD_GetState} $CheckBox1 $Check1
  ${NSD_GetState} $CheckBox2 $Check2
  ${NSD_GetState} $CheckBox3 $Check3
FunctionEnd

Section "-Обычная установка"
  ${If} $Radio == 1
  ${If} ${RunningX64}
  SetOutPath "$INSTDIR"
File /r "D:\CCleaner\*.*"
 CreateDirectory "${PRODUCT_NAME}"
 SetShellVarContext all
 SetRegView 64
 WriteRegStr HKEY_CURRENT_USER "Software\Piriform" "" ""
WriteRegStr HKEY_CURRENT_USER "Software\Piriform\CCleaner" "Language" "1049"
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Classes\cclaunch\shell" "" ""
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Classes\cclaunch\shell\open" "" ""
 ${Else}
 MessageBox MB_OK "Система x86"
 SetOutPath "$INSTDIR"
File /r "D:\CCleaner1\*.*"
SetShellVarContext all
SetRegView 32
WriteRegStr HKEY_CURRENT_USER "Software\Piriform" "" ""
WriteRegStr HKEY_CURRENT_USER "Software\Piriform\CCleaner" "Language" "1049"
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Classes\cclaunch\shell" "" ""
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Classes\cclaunch\shell\open" "" ""
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Classes\cclaunch\shell\open\command" "" "$\"$PROGRAMFILES\CCleaner\ccleaner.exe$\" /%1"
WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Tracing\ccsetup314_RASAPI32" "EnableFileTracing" 0x0
WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Tracing\ccsetup314_RASAPI32" "EnableConsoleTracing" 0x0
WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Tracing\ccsetup314_RASAPI32" "FileTracingMask" 0xffff0000
WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Tracing\ccsetup314_RASAPI32" "ConsoleTracingMask" 0xffff0000
WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Tracing\ccsetup314_RASAPI32" "MaxFileSize" 0x100000
WriteRegBin HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Tracing\ccsetup314_RASAPI32" "FileDirectory" 2500770069006e0064006900720025005c00740072006100630069006e0067000000
  WriteUninstaller "$INSTDIR\Удалить CCleaner.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$INSTDIR\CCleaner.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\Удалить CCleaner.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "${PRODUCT_VERSION}"
      ;;;
      ;тут пишем все команды при обычной установке
      ;DetailPrint "Обычная установка"
      ;;;
      ${EndIf}
  ${EndIf}
SectionEnd

Section "-Распаковка портативной версии"
  ${If} $Radio1 == 1
  ${GetOptions} $CMDLINE "/S=" $port
  SetOutPath "$INSTDIR"
  File /r "D:\CCleanerPortable\*.*"
  SetShellVarContext all
      ;тут пишем все команды при распаковки портативной версии
      MessageBox MB_OK "Портативная версия ${PRODUCT_NAME} ${PRODUCT_VERSION} распакована в текущую папку."
      ;;;
  ${EndIf}
SectionEnd

Section "-Ярлыки"
  ${If} $Check == 1
  ${If} ${RunningX64}
 CreateShortCut "$Desktop\${PRODUCT_NAME}.lnk" "$INSTDIR\CCleaner64.exe"
 ${Else}
 CreateShortCut "$Desktop\${PRODUCT_NAME}.lnk" "$INSTDIR\CCleaner.exe"
 ${EndIf}
  ${EndIf}
;;;;;;;
  ${If} $Check1 == 1
  CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}"
  ${If} ${RunningX64}
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\CCleaner64.exe"
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Удалить ${PRODUCT_NAME}.lnk" "$INSTDIR\Удалить CCleaner.exe"
${Else}
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\CCleaner.exe"
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Удалить ${PRODUCT_NAME}.lnk" "$INSTDIR\Удалить CCleaner.exe"
${EndIf}
      ;;;
      DetailPrint "Ярлык в меню Пуск"
      ;;;
      ${EndIf}
SectionEnd

Section "-Надстрйока"
  ${If} $Check3 == 1
SetOutPath "$INSTDIR"
File /r "D:\iNTEGER\*.*"
SetShellVarContext all
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Запустить модуль CCEnhancer.lnk" "$INSTDIR\CCEnhancer.exe"
      ;;;
  ${EndIf}
SectionEnd

Section "-Корзина"
  ${If} $Check2 == 1
WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Открыть CCleaner..." "CCRBType" 0x2
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Открыть CCleaner...\command" "" "$PROGRAMFILES\CCleaner\CCleaner.exe"
WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Запустить CCleaner" "CCRBType" 0x1
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Запустить CCleaner\command" "" "$PROGRAMFILES\CCleaner\CCleaner.exe /AUTO"
      ;;;
  ${EndIf}
SectionEnd

Section Uninstall
  RMDir /r "$INSTDIR"
  SetShellVarContext all
  RMDir /r "$SMPROGRAMS\${PRODUCT_NAME}"
  Delete  "$Desktop\${PRODUCT_NAME}.lnk"
  Delete "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk"
  Delete "$SMPROGRAMS\${PRODUCT_NAME}\Удалить ${PRODUCT_NAME}.lnk"
  DeleteRegKey HKLM "SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Открыть CCleaner..."
  DeleteRegKey HKLM "SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Открыть CCleaner...\command"
  DeleteRegKey HKLM "SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Запустить CCleaner"
  DeleteRegKey HKLM "SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Запустить CCleaner\command"
  DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
  DeleteRegKey HKCU "Software\Piriform"
  DeleteRegKey HKLM "SOFTWARE\Classes\cclaunch"
  DeleteRegKey HKLM "SOFTWARE\Microsoft\Tracing\ccsetup314_RASAPI32"
MessageBox MB_OK "Удаление ${PRODUCT_NAME} ${PRODUCT_VERSION} успешно завершено!"
  SetAutoClose true
SectionEnd

Function .onInstSuccess
    ExecShell open "http://forum.oszone.net"
FunctionEnd


wolkow70 22-12-2011 14:23 1820100

Уважаемый kotkovets, ощущается нехватка информации по созданию инсталляторов, совместимых с установкой на 64-битные системы. Если аспекты распаковки файлов и регистрации библиотек более менее понятны, то работа со строками реестра представляет сложности. К примеру, написал сегодня скрипт, в котором регистрируются разные dll в зависимости от разрядности системы, скрипт вроде не сложный, а что поправить для совместимости с реестром 64 не совсем ясно. Не помешала бы небольшая инструкция в дополнение к справке на примере простого скрипта.
Например такой скрипт:
Код:

!define MUI_WELCOMEFINISHPAGE_BITMAP "D:\NSIS\Jame2.bmp"
!define MUI_UNWELCOMEFINISHPAGE_BITMAP "D:\NSIS\Jame2.bmp"
!define PRODUCT_NAME "TreeSize Professional"
!define PRODUCT_VERSION "5.5.0.776"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"
!define pkgdir "D:\NSIS"
!define FSizeDLL "${pkgdir}\TreeSize\FSizeCol.dll"
!define HelpLink "http://www.jam-software.de/customers/contact.php?language=EN&article_no=101&version_no=5.4.3.702"
!define URLInfoAbout "http://www.jam-software.com"
!define URLUpdateInfo "https://www.jam-software.de/customers/index.php?language=EN"
!define PRODUCT_WEB_SITE "http://www.jam-software.com"
!define Comments "Программа, анализирующая пространство на жестком диске вашего компьютера!"
;
; MUI 1.67 compatible
!include "MUI2.nsh"
!include "Library.nsh"
!include "LogicLib.nsh"
!include "x64.nsh"
;
SetCompressor /SOLID lzma
;
; MUI Settings
;
!define MUI_ABORTWARNING
!define MUI_ICON "D:\NSIS\TreeSize.ico"
!define MUI_UNICON "D:\NSIS\modern-uninstall-blue-full.ico"
!define MUI_COMPONENTSPAGE_SMALLDESC
;
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
;
!insertmacro MUI_UNPAGE_WELCOME
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_COMPONENTS
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_UNPAGE_FINISH
;
; Language files
!insertmacro MUI_LANGUAGE "Russian"
;
!define RmEmptyDir "!insertmacro PathIsDirectoryEmpty"
!macro PathIsDirectoryEmpty Dir
Push `${Dir}`
System::Store S
System::Call "Shlwapi::PathIsDirectoryEmpty(tsR1)i.R0"
StrCmp $R0 1 0 +2
RmDir `$R1`
System::Store L
!macroend
;
; MUI end ------
Name "${PRODUCT_NAME}"
Caption "${PRODUCT_NAME} ${PRODUCT_VERSION}"
UninstallCaption "Удаление ${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "${PRODUCT_NAME}-${PRODUCT_VERSION}.exe"
InstallDir "$PROGRAMFILES\JAM Software\TreeSize Professional"
BrandingText "${BRANDING}"
;
Section "!${PRODUCT_NAME} (Установка программы)" Install
;
SetOutPath "$INSTDIR"
File "${pkgdir}\TreeSize\FSizeCol.dll"
File "${pkgdir}\TreeSize\FSizeCol64.dll"
File "${pkgdir}\TreeSize\license.En.rtf"
File "${pkgdir}\TreeSize\TreeSize.chm"
File "${pkgdir}\TreeSize\TreeSize.exe"
File "${pkgdir}\TreeSize\TreeSize.pdf"
File "${pkgdir}\TreeSize\tsizepro.css"
File "${pkgdir}\TreeSize\tsizepro.xsl"
File "${pkgdir}\TreeSize\tszurl.ico"
;
WriteUninstaller "$INSTDIR\uninst.exe"
;
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "${PRODUCT_NAME} v${PRODUCT_VERSION}"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\TreeSize.exe"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "HelpLink" "${HelpLink}"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${URLInfoAbout}"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLUpdateInfo" "${URLUpdateInfo}"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Comments" "${Comments}"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "JAM Software"
;
${If} ${RunningX64} 
ExecWait 'regsvr32 /s "$INSTDIR\FSizeCol64.dll"'
${Else}
ExecWait 'regsvr32 /s "$INSTDIR\FSizeCol.dll"'
${EndIf}
;
WriteRegStr HKLM "SOFTWARE\Classes\Folder\shellex\ColumnHandlers\{0BC1E559-9D68-4E99-AFD9-98D27DAB971D}" "" "TreeSize FolderSizeColumn"
;
WriteRegStr HKLM "SOFTWARE\CodeGear" "" ""
WriteRegStr HKLM "SOFTWARE\CodeGear\Locales" "$INSTDIR\TreeSize.exe" "EN"
;
WriteRegStr HKCU "Software\JAM Software\TreeSize Professional" "" ""
WriteRegDWORD HKCU "Software\JAM Software\TreeSize Professional\Shell Column" "Decimals" 0x1
WriteRegDWORD HKCU "Software\JAM Software\TreeSize Professional\Shell Column" "Unit" 0x2
SectionEnd
;
!macro CreateInternetShortcut FILENAME URL ICONFILE ICONINDEX
WriteINIStr "${FILENAME}.url" "InternetShortcut" "URL" "${URL}"
WriteINIStr "${FILENAME}.url" "InternetShortcut" "IconFile" "${ICONFILE}"
WriteINIStr "${FILENAME}.url" "InternetShortcut" "IconIndex" "${ICONINDEX}"
!macroend
;
SectionGroup "Создать ярлыки TreeSize Professional" Shortcuts
Section "Создать группу ярлыков в меню Пуск" Startmenu
SetOutPath "$INSTDIR"
SetShellVarContext all
CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}"
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\TreeSize.exe"
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME} Поиск файлов.lnk" "$INSTDIR\TreeSize.exe" /SEARCH
;CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME} Поиск дублирующихся файлов.lnk" "$INSTDIR\TreeSize.exe" /SEARCH ;/TABS 4
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME} Руководство пользователя.lnk" "$INSTDIR\TreeSize.pdf"
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME} Справка.lnk" "$INSTDIR\TreeSize.chm"
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Удалить ${PRODUCT_NAME}.lnk" "$INSTDIR\uninst.exe"
!insertmacro CreateInternetShortcut \
  "$SMPROGRAMS\${PRODUCT_NAME}\Домашняя страница ${PRODUCT_NAME}" \
  "${PRODUCT_WEB_SITE}" \
  "$INSTDIR\tszurl.ico" "0"
SectionEnd
;
Section "Разместить ярлык на Рабочем столе" Desktop
SetOutPath "$INSTDIR"
CreateShortCut "$Desktop\${PRODUCT_NAME}.lnk" "$INSTDIR\TreeSize.exe"
SectionEnd
;
Section "Добавить ярлык в Панель быстрого запуска" Quicklaunch
SetOutPath "$INSTDIR"
CreateShortCut "$QUICKLAUNCH\${PRODUCT_NAME}.lnk" "$INSTDIR\TreeSize.exe"
SectionEnd
SectionGroupEnd
;
SectionGroup "Интегрировать в контекстное меню" Context
Section "Интегрировать TreeSize Professional 5" TreeSize
SetOutPath $INSTDIR
WriteRegStr HKCU "Software\Classes\Directory\shell\TreeSize Professional" "" "TreeSize Professional &5"
WriteRegStr HKCU "Software\Classes\Directory\shell\TreeSize Professional\command" "" "$\"$INSTDIR\TreeSize.exe$\" /CONTEXT $\"%1$\""
;
WriteRegStr HKCU "Software\Classes\Drive\shell\TreeSize Professional" "" "TreeSize Professional &5"
WriteRegStr HKCU "Software\Classes\Drive\shell\TreeSize Professional\command" "" "$\"$INSTDIR\TreeSize.exe$\" /CONTEXT $\"%1$\""
SectionEnd
;
Section "Интегрировать File Search" FileSearch
SetOutPath $INSTDIR
WriteRegStr HKCU "Software\Classes\Directory\shell\TreeSize_fs" "" "TreeSize &File Search"
WriteRegStr HKCU "Software\Classes\Directory\shell\TreeSize_fs\command" "" "$\"$INSTDIR\TreeSize.exe$\" /SEARCH /TABS 5 $\"%1$\""
;
WriteRegStr HKCU "Software\Classes\Drive\shell\TreeSize_fs" "" "TreeSize Professional &File Search"
WriteRegStr HKCU "Software\Classes\Drive\shell\TreeSize_fs\command" "" "$\"$INSTDIR\TreeSize.exe$\" /SEARCH /TABS 5 $\"%1$\""
SectionEnd
SectionGroupEnd
;
Function un.onInit
SectionSetText ${Uninstall} "Удалить программу ${PRODUCT_NAME}"
FunctionEnd

Section Uninstall Uninstall
SectionIn 1 RO
KillProcDLL::KillProc "TreeSize.exe"
Sleep 700
;
SetShellVarContext all
RMDir /r "$SMPROGRAMS\${PRODUCT_NAME}"
Delete "$Desktop\${PRODUCT_NAME}.lnk"
Delete "$QUICKLAUNCH\${PRODUCT_NAME}.lnk"
;
${If} ${RunningX64}
ExecWait 'regsvr32 /s /u "$INSTDIR\FSizeCol64.dll"' 
${Else} 
ExecWait 'regsvr32 /s /u "$INSTDIR\FSizeCol.dll"'
${EndIf}
;
DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
DeleteRegKey HKCU "Software\JAM Software\TreeSize Professional" ""
DeleteRegKey /ifempty HKCU "Software\JAM Software"
DeleteRegKey HKLM "SOFTWARE\JAM Software\TreeSize Professional" ""
DeleteRegKey /ifempty HKLM "SOFTWARE\JAM Software"
DeleteRegValue HKLM "SOFTWARE\CodeGear\Locales" "$INSTDIR\TreeSize.exe"
DeleteRegKey /ifempty HKLM "SOFTWARE\CodeGear"
;
DeleteRegKey HKCU "Software\Classes\Directory\shell\TreeSize_fs" ""
DeleteRegKey HKCU "Software\Classes\Drive\shell\TreeSize_fs" ""
DeleteRegKey HKCU "Software\Classes\Directory\shell\TreeSize Professional" ""
DeleteRegKey HKCU "Software\Classes\Drive\shell\TreeSize Professional" ""
DeleteRegKey HKLM "SOFTWARE\Classes\CLSID\{0BC1E559-9D68-4E99-AFD9-98D27DAB971D}" ""
DeleteRegKey HKLM "SOFTWARE\Classes\FSizeCol.JamFolderSizeColumn" ""
DeleteRegKey HKLM "SOFTWARE\Classes\Folder\shellex\ColumnHandlers\{0BC1E559-9D68-4E99-AFD9-98D27DAB971D}" ""
RMDir /r /REBOOTOK "$INSTDIR"
${RmEmptyDir} "$PROGRAMFILES\JAM Software"
SetAutoClose true
SectionEnd


kotkovets 22-12-2011 15:19 1820133

Цитата:

Цитата diakov
например при S/port распаковывалась портативная версия »

Все достаточно просто, условие портативной установки, если $Radio = 1, а если в тихом режиме
устанавливать значение $Radio = 1, то условие распаковки будет выполнено..
и заодно парсить командную строку инсталлятора
Читайте в оригинальной справке - поиск по индексу GetOptions
читать дальше »
Код:

!include "MUI2.nsh"
!include "FileFunc.nsh"

!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"
OutFile "test.exe"

var Radio
var Radio1

Function .OnInit
  ClearErrors
  ${GetOptions} "$CMDLINE" "/port" $R0
  ${If} ${Silent} ;если тихий режим
    ${IfNot} ${Errors}
      ;здесь будет код выполняться с ключом /port в тихом режиме
        StrCpy $Radio1 1 ;распаковка портативной версии
        StrCpy $Radio 0 ;запрет установки в обычном режиме
    ${Else}
        ;здесь будет код выполняться в тихом режиме без ключей (по умолчанию)
        StrCpy $Radio1 0 ;запрет портативной версии
        StrCpy $Radio 1 ;установка в обычном режиме
    ${EndIf}
  ${Else}
    ClearErrors
  ${EndIf}
FunctionEnd

Section ""
 ${If} $Radio == 1
      MessageBox MB_OK "Обычная установка в тихую" IDOK
 ${ElseIf} $Radio1 == 1
      MessageBox MB_OK "Портативка установка в тихую" IDOK
 ${Else}
  MessageBox MB_OK "Обычная установка" IDOK
 ${EndIf}
SectionEnd


Цитата:

Цитата wolkow70
а что поправить для совместимости с реестром 64 »

В данный момент у меня нет под рукой х64, читайте выше мои сообщения.
Если программа 64-битная, то следовательно ей нужен доступ к 64-разрядному виду реестра,
что достигается командой SetRegView 64 - смотрите справки,
а также редирект на папки 64-битных программ - смотрите хедер х64.nsh

wolkow70 22-12-2011 15:49 1820156

Цитата:

Цитата kotkovets
Если программа 64-битная, то следовательно ей нужен доступ к 64-разрядному виду реестра,
что достигается командой SetRegView 64 - смотрите справки,
а также редирект на папки 64-битных программ - смотрите хедер х64.nsh »

Программа не 64-битная, но предусмотрена возможность установки на x64 (отдельная dll).
Какой нибудь скрипт нужен для примера. По скриптам легче изучать, чем по справке на инглише. А в хедере я все равно не пойму многого.

diakov 22-12-2011 16:30 1820176

kotkovets, при постановке в скрипт кода выдаёт такую ошибку
Function: ".OnInit"
Error: Function named ".OnInit" already exists.
Error in script "C:\Users\Diakov\Desktop\Ccleaner.nsi" on line 261 -- aborting creation process


Я так понимаю это потому что уже есть функция

Function .onInit
InitPluginsDir ;иницилизируем рабочую папку, куда будут распакованы картинки
File "/oname=$PLUGINSDIR\nsis-r.bmp" "${NSISDIR}\Contrib\Graphics\Header\nsis-r.bmp"
File "/oname=$PLUGINSDIR\orange-r.bmp" "${NSISDIR}\Contrib\Graphics\Header\orange-r.bmp"
FunctionEnd



Как быть?

kotkovets 22-12-2011 16:32 1820181

Цитата:

Цитата wolkow70
Программа не 64-битная »

То и не нужно, ничего делать, есть программы не 64-битные для полноценной работы,
требуют редиректа к некоторым ключам в реестра.
Например кусочек скрипта Nero 11, здесь на один ключ в реестре включаем
перенаправление к 64-разрядному виду реестра, а затем возвращаемся к 32-разрядному виду реестра
Код:

${If} ${RunningX64}
  SetRegView 64
  WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components\6FA8588DEBF295543BD8D53E676560BE" "A4EAA01E8B89A024DB390E25C0326D42" "$INSTDIR\Nero Burning ROM\NeroExpress.exe"
  SetRegView 32
${Else}
  WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components\6FA8588DEBF295543BD8D53E676560BE" "A4EAA01E8B89A024DB390E25C0326D42" "$INSTDIR\Nero Burning ROM\NeroExpress.exe"
${EndIf}

Поэтому все зависит от программ и какие условия установки эти программы требуют.

Цитата:

Цитата diakov
Error: Function named ".OnInit" already exists. »

Эта функция уже объявлена, впишите содержимое в функцию и проблема решена.

diakov 22-12-2011 16:36 1820185

сча попробуем)

diakov 22-12-2011 16:59 1820202

kotkovets, все заработало но ставиться в тихом только клинер без ярлыков и надстройки...

Просто прописать дополнительно команды?

kotkovets 22-12-2011 17:17 1820215

Цитата:

Цитата diakov
Просто прописать дополнительно команды? »

Совершенно верно, условия вы знаете.

wolkow70 22-12-2011 17:26 1820222

Цитата:

Цитата kotkovets
есть программы не 64-битные для полноценной работы,
требуют редиректа к некоторым ключам в реестра. »

Вот меня и интересует какие ключи обычно требуют редеректа, а какие нет. Где про это почитать можно?
К примеру:
1. Ключ деинсталлятора?
2. CLSID-ы?
3. Ключи интеграции в оболочку Explorer?
4. Ключи настроек программы в HKLM SOFTWARE и HKCU Software?
5. Файловые ассоциации?

diakov 22-12-2011 17:38 1820233

kotkovets, а если прописано уже

${If} ${RunningX64}
SetOutPath "$INSTDIR"


то инстальник определит уже на вин х64 папку установки Program Files а не Program Files х86 верно?

kotkovets 22-12-2011 17:40 1820235

Цитата:

Цитата wolkow70
Вот меня и интересует какие ключи обычно требуют редеректа, а какие нет »

Вопрос не в тему, ставите себе х64 и анализируйте
Цитата:

Цитата kotkovets
все зависит от программ и какие условия установки эти программы требуют »

Уже третий раз цитирую :closed-to
Цитата:

Цитата diakov
то инстальник определит уже на вин х64 папку установки Program Files »

Читайте в справочнике <<Преопределённые переменные>>, там все расписано на русском языке:
Цитата:

Предопределенных констант несколько:
$PROGRAMFILES, $PROGRAMFILES32, $PROGRAMFILES64 — папка Program files. В 64разрядной системе констатация $PROGRAMFILES и $PROGRAMFILES32 представляют папку C:\Program Files (x86), а $PROGRAMFILES64 - C:\Program Files.
$COMMONFILES, $COMMONFILES32, $COMMONFILES64 — по аналогии с предыдущей константой, ссылается на C:\Program Files\Common Files.

wolkow70 22-12-2011 17:47 1820247

Цитата:

Цитата kotkovets
Вопрос не в тему, ставите себе х64 и анализируйте »

Да нету у меня X64 и процессор не поддерживает виртуализацию.

kotkovets 22-12-2011 18:06 1820259

wolkow70, Я могу написать программку (в теории, не 64-битную) и инсталлятор к нему,
так вот я делаю так, что в программа не будет работать в х64 без записи ключа в 64-битном реестре,
на примере, который я приводил (Nero11) без этого ключа не будут работать переключения в проге с
NeroExpress.exe на Nero.exe и наоборот, а в остальном прога работать будет.
Цитата:

Цитата wolkow70
а нету у меня X64 и процессор не поддерживает виртуализацию. »

если процессор х86(почти все современные процессы - 99% позволяют работать в х64), то ставите себе,
к примеру x32 и параллельно x64 - появится меню выбора меню загрузки ОС.
А где взять х64? в интернете... да где угодно, как говорится, если сильно захотеть...

wolkow70 22-12-2011 18:22 1820268

kotkovets,
Сделал сейчас по вашей рекоммендации так:
${If} ${FileExists} "$DOCUMENTS\Opera Backup"
StrCpy $2 0 ;иницилизируем счетчик в нуль
FindFirst $0 `$1` "$DOCUMENTS\Opera Backup*" ;поиск по маске Opera Backup
${Do}
IntOp $2 $2 + 1 ;счетчик папок начинающийся с названия Opera Backup
FindNext $0 `$1`
${LoopUntil} $1 == ``
FindClose $0 ;закрываем поиск
${If} $2 != 0
Rename "$DOCUMENTS\Opera Backup" "$DOCUMENTS\Opera Backup_old$2" ;переименовываем предыдущую папку "Opera Backup"
CreateDirectory "$DOCUMENTS\Opera Backup" ;создаем новую папку "Opera Backup"
${EndIf}
${Else}
CreateDirectory "$DOCUMENTS\Opera Backup"
${EndIf}

Все работает, количество резервных папок может быть любым.
Возник вопрос:
Эта логическая конструкция применена к SetShellVarContext current ("Мои документы"/многопользовательская установка).
Можно ли в пределах одной функции onInit повторить ее еще раз для SetShellVarContext all
(папка "Общие документы"/однопользовательская установка)?
Или нужно "обнулять" значения переменных или вводить другие переменные, или ничего не нужно делать (написать также)?

kotkovets 22-12-2011 18:39 1820274

Цитата:

Цитата wolkow70
Можно ли в пределах одной функции onInit повторить ее еще раз для SetShellVarContext all »

Условно повторяющийся код обычно выводят в функцию или в макрос - хороший тон кодинга.
читать дальше »
Код:

Function OperaBackup
 ${If} ${FileExists} "$DOCUMENTS\Opera Backup"
    StrCpy $2 0
    FindFirst $0 `$1` "$DOCUMENTS\Opera Backup*"
    ${Do}
      IntOp $2 $2 + 1
      FindNext $0 `$1`
    ${LoopUntil} $1 == ``
    FindClose $0
    ${If} $2 != 0
      Rename "$DOCUMENTS\Opera Backup" "$DOCUMENTS\Opera Backup_old$2"
      CreateDirectory "$DOCUMENTS\Opera Backup"
    ${EndIf}
 ${Else}
    CreateDirectory "$DOCUMENTS\Opera Backup"
 ${EndIf}
FunctionEnd

Function .onInit
  SetShellVarContext current
  Call OperaBackup
  SetShellVarContext all
  Call OperaBackup
FunctionEnd


diakov 22-12-2011 20:07 1820343

kotkovets, такая байда переменная $PROGRAMFILES64 и для х86 папка Program files и для х64 папка Program files

когда пишу InstallDir "$PROGRAMFILES64\CCleaner"

а в секции
${If} ${RunningX64}
SetOutPath "$INSTDIR"
File /r "D:\CCleaner\*.*"

инстальник ставит путь ProgramFiles но кнопка установить не активна

а если делаю так

InstallDir "$PROGRAMFILES\CCleaner"

Всё разобрался!

а в секции
${If} ${RunningX64}
SetOutPath "$PROGRAMFILES64\CCleaner"
File /r "D:\CCleaner\*.*"

то инстальник ставит путь ProgramFiles (x86) и ставиться все гуд

Вопрос в чем не гуд?)

Всё разобрался!

diakov 22-12-2011 21:29 1820398

kotkovets, как изменить это



пишу

Код:

!insertmacro MUI_PAGE_WELCOME
!define MUI_LICENSEPAGE_TEXT_TOP "Перед установкой ознакомьтесь с этой информацией:"
!define MUI_LICENSEPAGE_TEXT "Вы прочли справочник по NSIS"
!define MUI_LICENSEPAGE_BUTTON "Далее >"
!insertmacro MUI_PAGE_LICENSE "${NSISDIR}\COPYING.rtf"
Page custom PageInit PageDestroy
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_UNPAGE_FINISH
!insertmacro MUI_LANGUAGE "Russian"

Меняет только "Перед установкой ознакомьтесь с этой информацией:" и "Далее >"

Но Вы прочли справочник по NSIS не меняет внизу...
писал !define MUI_PAGE_LICENSE_HEADER_TEXT "Справочник по NSIS"
!define MUI_PAGE_LICENSE_HEADER_TEXT "Справочник по NSIS"

не действует, в чем дело?
Спасибо!

kotkovets 22-12-2011 21:54 1820418

Цитата:

Цитата diakov
не действует, в чем дело? »

Опечатка, спасибо, что заметили!
Код:

!define MUI_LICENSEPAGE_TEXT_BOTTOM "Вы прочли справочник по NSIS"
Меняем текст в заголовке, когда страничка лицензии открывается
Код:

!define MUI_LICENSEPAGE_TEXT_TOP "Перед установкой ознакомьтесь с этой информацией:"
!define MUI_LICENSEPAGE_TEXT_BOTTOM "Вы прочли справочник по NSIS"

!include "MUI2.nsh"
!insertmacro MUI_PAGE_WELCOME
  !define MUI_PAGE_CUSTOMFUNCTION_SHOW SHOW_LICENSE
!insertmacro MUI_PAGE_LICENSE "${NSISDIR}\COPYING"
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

Function SHOW_LICENSE
  !insertmacro MUI_HEADER_TEXT "Вот оно как" "...!"
FunctionEnd


diakov 22-12-2011 21:56 1820419

А как изменить в шапке?)

Лицензионное соглашение
и Перед установкой ссклинер....


Цитата:

Цитата kotkovets
Function SHOW_LICENSE
!insertmacro MUI_HEADER_TEXT "Вот оно как" "...!"
FunctionEnd »

Я так пробовал но писал MUI_PAGE_LICENSE) Спасибо счас сбацаю!

kotkovets, почему когда я хочу указать путь тихой установки вот так CCleaner-3.1.4.1616.exe /S /port /D=C:\CCleaner

инстальник всеравно распаковывает в папку с ехе-шником?

kotkovets 22-12-2011 22:29 1820448

Цитата:

Цитата diakov
почему когда я хочу указать путь тихой установки вот так CCleaner-3.1.4.1616.exe /S /port /D=C:\CCleaner »

Все очень просто, запустите с ключом: /S /port /D=C:\CCleaner
Ключ D помещает свое значение в переменную $INSTDIR
И смотрите в скрипте на сообщение:
читать дальше »
Код:

!include "MUI2.nsh"
!include "FileFunc.nsh"

!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"
OutFile "test.exe"

var Radio
var Radio1

Function .OnInit
  ClearErrors
  ${GetOptions} "$CMDLINE" "/port" $R0
  ${If} ${Silent} ;если тихий режим
    ${IfNot} ${Errors}
      ;здесь будет код выполняться с ключом /port в тихом режиме
        StrCpy $Radio1 1 ;распаковка портативной версии
        StrCpy $Radio 0 ;запрет установки в обычном режиме
    ${Else}
        ;здесь будет код выполняться в тихом режиме без ключей (по умолчанию)
        StrCpy $Radio1 0 ;запрет портативной версии
        StrCpy $Radio 1 ;установка в обычном режиме
    ${EndIf}
  ${Else}
    ClearErrors
  ${EndIf}
FunctionEnd

Section
 ${If} $Radio == 1
      MessageBox MB_OK "Обычная установка в тихую" IDOK
 ${ElseIf} $Radio1 == 1
      MessageBox MB_OK "Портативная распаковка$\n\
      Папка распаковки: $INSTDIR" IDOK
 ${Else}
  MessageBox MB_OK "Обычная установка" IDOK
 ${EndIf}
SectionEnd


diakov 22-12-2011 22:49 1820459

kotkovets, А как сделать что бы после установки в MUI_PAGE_FINISH стояла галка запустить программу, а если распаковывалась портабл весрия то что бы галки не было?

kotkovets 22-12-2011 23:05 1820467

diakov, Да все так же, когда страница финиша открывается...
Если портативка, то $Radio=1, а в хедере NSIS\Contrib\Modern UI 2\Pages\Finish.nsh объявлена
переменная $mui.FinishPage.Run - это хэндл чекбокса, а раз есть хэндл делаем с контролом почти все, что захотим...
Код:

    !define MUI_PAGE_CUSTOMFUNCTION_SHOW SHOW_FINISH
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "Russian"

Function SHOW_FINISH
  ${If} $Radio1 == 1
    ShowWindow $mui.FinishPage.Run 0 ;скрываем чекбокс
    ${NSD_SetState} $mui.FinishPage.Run 0 ;и делаем чекбокс неотмеченным
  ${EndIf}
FunctionEnd


diakov 22-12-2011 23:07 1820469

Как всегда спасибо! Железное у тебя терпение kotkovets :)

kotkovets 22-12-2011 23:14 1820471

Цитата:

Цитата diakov
Железное у тебя терпение kotkovets »

У меня терпения не хватает, когда человек просто тупит...и не хочет включать мозг

diakov 22-12-2011 23:49 1820482

kotkovets, подскажи уже минут 40 парюсь есть

!define MUI_CUSTOMFUNCTION_GUIINIT myGuiInit
!define BRANDING "RePack by D!akov"


есть

Function myGuiInit
GetDlgItem $0 $HWNDPARENT 1028
Linker::link /NOUNLOAD $0 "http://forum.oszone.net/"
FunctionEnd

Function .onGUIEnd
Linker::unload
FunctionEnd

плагин Linker.dll для NSIS есть

убран флаг "WS_DISABLED" с элемента 1028

раньше все работало а сейчас текст выглядит как ссылка но не кликабельный :durak:

читать дальше »

Код:

!define PRODUCT_NAME "CCleaner"
!define PRODUCT_VERSION "3.1.4.1616"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"
!include "MUI2.nsh"
!include "FileFunc.nsh"
!include "x64.nsh"
SetCompressor /SOLID lzma


!define MUI_ABORTWARNING
!define MUI_ICON "D:\cleaner.ico"
!define MUI_UNICON "D:\cleaner.ico"
!define MUI_HEADERIMAGE
!define MUI_CUSTOMFUNCTION_GUIINIT myGuiInit
!define BRANDING "RePack by D!akov"

var dlg
var Label
var Check
var Check1
var Check2
var Check3
var CheckBox
var CheckBox1
var CheckBox2
var CheckBox3
var Radio
var Radio1
var RadioButton
var RadioButton1
var ImageHandle
var Image

!insertmacro MUI_PAGE_WELCOME
!define MUI_LICENSEPAGE_TEXT_TOP "Перед установкой ознакомьтесь с этой информацией:"
!define MUI_LICENSEPAGE_TEXT_BOTTOM "Ознакомились! Отлично жмите 'Далее'."
!define MUI_LICENSEPAGE_BUTTON "Далее >"
!define MUI_PAGE_CUSTOMFUNCTION_SHOW SHOW_LICENSE
!insertmacro MUI_PAGE_LICENSE "${NSISDIR}\COPYING.rtf"
Page custom PageInit PageDestroy
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_UNPAGE_FINISH
!insertmacro MUI_LANGUAGE "Russian"

Function myGuiInit
GetDlgItem $0 $HWNDPARENT 1028
Linker::link /NOUNLOAD $0 "http://forum.oszone.net/"
FunctionEnd

Function .onGUIEnd
Linker::unload
FunctionEnd

Function SHOW_LICENSE
  !insertmacro MUI_HEADER_TEXT "Информация" "Инструкции, описание изменений в версии программы."
FunctionEnd


; Описание фаqла
VIProductVersion "${PRODUCT_VERSION}"
  VIAddVersionKey /LANG=${LANG_Russian} "CompanyName" "RePack by D!akov"
  VIAddVersionKey /LANG=${LANG_Russian} "FileDescription" "${PRODUCT_NAME} ${PRODUCT_VERSION}"
  VIAddVersionKey /LANG=${LANG_Russian} "FileVersion" "${PRODUCT_VERSION}"
; Конец описания файла

Name "${PRODUCT_NAME}"
Caption "Установка ${PRODUCT_NAME} ${PRODUCT_VERSION}"
UninstallCaption "Удаление ${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "${PRODUCT_NAME}-${PRODUCT_VERSION}.exe"
InstallDir "$PROGRAMFILES64\CCleaner"
;ShowInstDetails show
;ShowUnInstDetails show
BrandingText "${BRANDING}"


Function .onInit
  InitPluginsDir ;иницилизируем рабочую папку, куда будут распакованы картинки
  File "/oname=$PLUGINSDIR\nsis-r.bmp" "${NSISDIR}\Contrib\Graphics\Header\nsis-r.bmp"
  File "/oname=$PLUGINSDIR\orange-r.bmp" "${NSISDIR}\Contrib\Graphics\Header\orange-r.bmp"
 
  ClearErrors
  ${GetOptions} "$CMDLINE" "/port" $R0
  ${If} ${Silent} ;если тихий режим
    ${IfNot} ${Errors}
    SetOutPath "$EXEDIR\CCleanerPortable"
  File /r "D:\CCleanerPortable\*.*"
  SetShellVarContext all
      ;тут пишем все команды при распаковки портативной версии
      ;здесь будет код выполняться с ключом /port в тихом режиме
        StrCpy $Radio1 1 ;распаковка портативной версии
        StrCpy $Radio 0 ;запрет установки в обычном режиме
    ${Else}
    ${GetOptions} "$CMDLINE" "/inst" $R0
      ${If} ${RunningX64}
      SetShellVarContext all
 CreateShortCut "$Desktop\${PRODUCT_NAME}.lnk" "$INSTDIR\CCleaner64.exe"
 ${Else}
 SetShellVarContext all
 CreateShortCut "$Desktop\${PRODUCT_NAME}.lnk" "$INSTDIR\CCleaner.exe"
 ${EndIf}
 SetShellVarContext all
  CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}"
  ${If} ${RunningX64}
  SetShellVarContext all
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\CCleaner64.exe"
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Удалить ${PRODUCT_NAME}.lnk" "$INSTDIR\Удалить CCleaner.exe"
${Else}
SetShellVarContext all
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\CCleaner.exe"
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Удалить ${PRODUCT_NAME}.lnk" "$INSTDIR\Удалить CCleaner.exe"
${EndIf}
SetOutPath "$INSTDIR"
File /r "D:\iNTEGER\*.*"
SetShellVarContext all
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Запустить модуль CCEnhancer.lnk" "$INSTDIR\CCEnhancer.exe"
 ${If} ${RunningX64}
 SetShellVarContext all
  SetRegView 64
WriteRegStr HKEY_CLASSES_ROOT "CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell" "" ""
WriteRegStr HKEY_CLASSES_ROOT "CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Запустить CCleaner" "" ""
WriteRegStr HKEY_CLASSES_ROOT "CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Запустить CCleaner\command" "" "$INSTDIR\ccleaner64.exe /AUTO"
WriteRegStr HKEY_CLASSES_ROOT "CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Открыть CCleaner..." "" ""
WriteRegStr HKEY_CLASSES_ROOT "CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Открыть CCleaner...\command" "" "$INSTDIR\ccleaner64.exe"
${Else}
SetShellVarContext all
SetRegView 32
WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Открыть CCleaner..." "CCRBType" 0x2
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Открыть CCleaner...\command" "" "$INSTDIR\CCleaner.exe"
WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Запустить CCleaner" "CCRBType" 0x1
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Запустить CCleaner\command" "" "$INSTDIR\CCleaner.exe /AUTO"
${EndIf}
MessageBox MB_OK "${PRODUCT_NAME} ${PRODUCT_VERSION} установлена в тихом режыме."
        ;здесь будет код выполняться в тихом режиме без ключей (по умолчанию)
        StrCpy $Radio1 0 ;запрет портативной версии
        StrCpy $Radio 1 ;установка в обычном режиме
    ${EndIf}
  ${Else}
    ClearErrors
  ${EndIf}
 
FunctionEnd


Function PageInit
  !insertmacro MUI_HEADER_TEXT "Выбор типа и компонентов установки" "..."
  nsDialogs::Create 1018
  Pop $dlg
  ${NSD_CreateLabel} 0u 0u 120u 12u "Пожалуйста, сделайте выбор:"
  Pop $Label
  ;;
  ${NSD_CreateRadioButton} 0u 14u 150u 12u "Установка CCleaner 3.14.1616"
  Pop $RadioButton
  ${NSD_SetState} $RadioButton 1            ;делаем радиобутон отмеченным
  ${NSD_OnClick} $RadioButton RadioButton  ;событие отметки радиобутона
  ;;
  ${NSD_CreateRadioButton} 0u 28u 160u 12u "Распаковка CCleaner 3.14.1616"
  Pop $RadioButton1
  ${NSD_OnClick} $RadioButton1 RadioButton1 ;событие отметки радиобутона
  ;;
  ${NSD_CreateCheckBox} 0u 85u 120u 12u "Ярлык(и) на рабочем столе"
  Pop $CheckBox
  ${NSD_SetState} $CheckBox 1
  ;;
  ${NSD_CreateCheckBox} 0u 100u 100u 12u "Ярлыки в меню «Пуск»"
  Pop $CheckBox1
  ${NSD_SetState} $CheckBox1 1
  ;;;;;;;;;;
  ${NSD_CreateCheckBox} 0u 115u 300u 12u "Добавить пункт меню корзины 'Открыть/Запустить CCleaner'"
  Pop $CheckBox2
  ${NSD_SetState} $CheckBox2 1
  ;;;;;;;;
  ${NSD_CreateCheckBox} 0u 70u 120u 12u "Установить CCEnhancer"
  Pop $CheckBox3
  ${NSD_SetState} $CheckBox3 1
  ;;;;;;;;;;;;4
  ${NSD_CreateBitmap} 180u 0u 100% 100% "" ;создаем контрол для картинок
  Pop $Image
  ${NSD_SetImage} $Image "$PLUGINSDIR\nsis-r.bmp" $ImageHandle ;загружаем картинку
  nsDialogs::Show
  ${NSD_FreeImage} $ImageHandle ;удаляем картинку
FunctionEnd

Function switching
  ${NSD_GetState} $RadioButton $Radio ;снимаем статус отметки радиобуттона
  ${If} $Radio == 1                  ;если радибуттон "Установка обычной версии" отмеченный то...
      EnableWindow $CheckBox 1
      EnableWindow $CheckBox1 1
      EnableWindow $CheckBox2 1
      EnableWindow $CheckBox3 1
      ${NSD_SetState} $CheckBox 1
      ${NSD_SetState} $CheckBox1 1
      ${NSD_SetState} $CheckBox2 1
      ${NSD_SetState} $CheckBox3 1
      ${NSD_FreeImage} $ImageHandle                  ;удаляем картинку
      ${NSD_SetImage} $Image "$PLUGINSDIR\nsis-r.bmp" $ImageHandle  ;загружаем картинку
  ${Else}                          ;если радибуттон "Установка обычной версии" неотмеченный то...
      EnableWindow $CheckBox 0    ;затеняем чекбокс
      EnableWindow $CheckBox1 0    ;затеняем чекбокс
      EnableWindow $CheckBox2 0    ;затеняем чекбокс
      EnableWindow $CheckBox3 0
      ${NSD_SetState} $CheckBox 0  ;делаем чекбокс неотмеченным
      ${NSD_SetState} $CheckBox1 0 ;делаем чекбокс неотмеченным
      ${NSD_SetState} $CheckBox2 0
      ${NSD_SetState} $CheckBox3 0
      ${NSD_FreeImage} $ImageHandle              ;удаляем картинку
      ${NSD_SetImage} $Image "$PLUGINSDIR\orange-r.bmp" $ImageHandle  ;загружаем картинку
  ${EndIf}
FunctionEnd
 ;функции события отметки радиобуттонов
Function RadioButton
  Pop $RadioButton
  Call switching
FunctionEnd
Function RadioButton1
  Pop $RadioButton1
  Call switching
FunctionEnd

Function PageDestroy
  ;функция которая выполняется при закрытии кастомной станички
  ;снимаем статусы отметок радиобуттонов и чекбоксов
  ${NSD_GetState} $RadioButton $Radio
  ${NSD_GetState} $RadioButton1 $Radio1
  ${NSD_GetState} $CheckBox $Check
  ${NSD_GetState} $CheckBox1 $Check1
  ${NSD_GetState} $CheckBox2 $Check2
  ${NSD_GetState} $CheckBox3 $Check3
FunctionEnd

 
Section "-Обычная установка"
  ${If} $Radio == 1
  ${If} ${RunningX64}
  SetOutPath "$INSTDIR"
File /r "D:\CCleaner\*.*"
 CreateDirectory "${PRODUCT_NAME}"
 SetShellVarContext all
 SetRegView 64
 WriteRegStr HKEY_CURRENT_USER "Software\Piriform" "" ""
WriteRegStr HKEY_CURRENT_USER "Software\Piriform\CCleaner" "Language" "1049"
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Classes\cclaunch\shell" "" ""
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Classes\cclaunch\shell\open" "" ""
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Classes\cclaunch\shell\open\command" "" "$\"$INSTDIR\ccleaner.64exe$\" /%1"
WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Tracing\ccsetup314_RASAPI32" "EnableFileTracing" 0x0
WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Tracing\ccsetup314_RASAPI32" "EnableConsoleTracing" 0x0
WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Tracing\ccsetup314_RASAPI32" "FileTracingMask" 0xffff0000
WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Tracing\ccsetup314_RASAPI32" "ConsoleTracingMask" 0xffff0000
WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Tracing\ccsetup314_RASAPI32" "MaxFileSize" 0x100000
WriteRegBin HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Tracing\ccsetup314_RASAPI32" "FileDirectory" 2500770069006e0064006900720025005c00740072006100630069006e0067000000
WriteUninstaller "$INSTDIR\Удалить CCleaner.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$INSTDIR\CCleaner64.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\Удалить CCleaner.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "${PRODUCT_VERSION}"
 ${Else}
 SetOutPath "$INSTDIR"
File /r "D:\CCleaner1\*.*"
SetShellVarContext all
SetRegView 32
WriteRegStr HKEY_CURRENT_USER "Software\Piriform" "" ""
WriteRegStr HKEY_CURRENT_USER "Software\Piriform\CCleaner" "Language" "1049"
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Classes\cclaunch\shell" "" ""
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Classes\cclaunch\shell\open" "" ""
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Classes\cclaunch\shell\open\command" "" "$\"$INSTDIR\ccleaner.exe$\" /%1"
WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Tracing\ccsetup314_RASAPI32" "EnableFileTracing" 0x0
WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Tracing\ccsetup314_RASAPI32" "EnableConsoleTracing" 0x0
WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Tracing\ccsetup314_RASAPI32" "FileTracingMask" 0xffff0000
WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Tracing\ccsetup314_RASAPI32" "ConsoleTracingMask" 0xffff0000
WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Tracing\ccsetup314_RASAPI32" "MaxFileSize" 0x100000
WriteRegBin HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Tracing\ccsetup314_RASAPI32" "FileDirectory" 2500770069006e0064006900720025005c00740072006100630069006e0067000000
  WriteUninstaller "$INSTDIR\Удалить CCleaner.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$INSTDIR\CCleaner.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\Удалить CCleaner.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "${PRODUCT_VERSION}"
      ;;;
      ;тут пишем все команды при обычной установке
      ;DetailPrint "Обычная установка"
      ;;;
      ${EndIf}
  ${EndIf}
SectionEnd

Section "-Распаковка портативной версии"
  ${If} $Radio1 == 1
  SetOutPath "$INSTDIR"
  File /r "D:\CCleanerPortable\*.*"
  SetShellVarContext all
      ;тут пишем все команды при распаковки портативной версии
      MessageBox MB_OK "Портативная версия ${PRODUCT_NAME} ${PRODUCT_VERSION} распакована в текущую папку."
      ;;;
  ${EndIf}
SectionEnd

Section "-Ярлыки"
  ${If} $Check == 1
  ${If} ${RunningX64}
 CreateShortCut "$Desktop\${PRODUCT_NAME}.lnk" "$INSTDIR\CCleaner64.exe"
 ${Else}
 CreateShortCut "$Desktop\${PRODUCT_NAME}.lnk" "$INSTDIR\CCleaner.exe"
 ${EndIf}
  ${EndIf}
;;;;;;;
  ${If} $Check1 == 1
  CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}"
  ${If} ${RunningX64}
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\CCleaner64.exe"
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Удалить ${PRODUCT_NAME}.lnk" "$INSTDIR\Удалить CCleaner.exe"
${Else}
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\CCleaner.exe"
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Удалить ${PRODUCT_NAME}.lnk" "$INSTDIR\Удалить CCleaner.exe"
${EndIf}
      ;;;
      DetailPrint "Ярлык в меню Пуск"
      ;;;
      ${EndIf}
SectionEnd

Section "-Надстрйока"
  ${If} $Check3 == 1
SetOutPath "$INSTDIR"
File /r "D:\iNTEGER\*.*"
SetShellVarContext all
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Запустить модуль CCEnhancer.lnk" "$INSTDIR\CCEnhancer.exe"
      ;;;
  ${EndIf}
SectionEnd

Section "-Корзина"
  ${If} $Check2 == 1
  ${If} ${RunningX64}
  SetRegView 64
WriteRegStr HKEY_CLASSES_ROOT "CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell" "" ""
WriteRegStr HKEY_CLASSES_ROOT "CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Запустить CCleaner" "" ""
WriteRegStr HKEY_CLASSES_ROOT "CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Запустить CCleaner\command" "" "$INSTDIR\ccleaner64.exe /AUTO"
WriteRegStr HKEY_CLASSES_ROOT "CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Открыть CCleaner..." "" ""
WriteRegStr HKEY_CLASSES_ROOT "CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Открыть CCleaner...\command" "" "$INSTDIR\ccleaner64.exe"
${Else}
SetRegView 32
WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Открыть CCleaner..." "CCRBType" 0x2
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Открыть CCleaner...\command" "" "$INSTDIR\CCleaner.exe"
WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Запустить CCleaner" "CCRBType" 0x1
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Запустить CCleaner\command" "" "$INSTDIR\CCleaner.exe /AUTO"
${EndIf}
      ;;;
  ${EndIf}
SectionEnd

Section Uninstall
  RMDir /r "$INSTDIR"
  SetShellVarContext all
  RMDir /r "$SMPROGRAMS\${PRODUCT_NAME}"
  Delete  "$Desktop\${PRODUCT_NAME}.lnk"
  Delete "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk"
  Delete "$SMPROGRAMS\${PRODUCT_NAME}\Удалить ${PRODUCT_NAME}.lnk"
  DeleteRegKey HKLM "SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Открыть CCleaner..."
  DeleteRegKey HKLM "SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Открыть CCleaner...\command"
  DeleteRegKey HKLM "SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Запустить CCleaner"
  DeleteRegKey HKLM "SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Запустить CCleaner\command"
  SetRegView 64
  DeleteRegKey HKLM "SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Открыть CCleaner..."
  DeleteRegKey HKLM "SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Открыть CCleaner...\command"
  DeleteRegKey HKLM "SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Запустить CCleaner"
  DeleteRegKey HKLM "SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Запустить CCleaner\command"
  DeleteRegKey HKCR "CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Запустить CCleaner"
  DeleteRegKey HKCR "CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Запустить CCleaner\command"
  DeleteRegKey HKCR "CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Открыть CCleaner..."
  DeleteRegKey HKCR "CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Открыть CCleaner...\command"
  DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
  DeleteRegKey HKCU "Software\Piriform"
  DeleteRegKey HKLM "SOFTWARE\Classes\cclaunch"
  DeleteRegKey HKLM "SOFTWARE\Microsoft\Tracing\ccsetup314_RASAPI32"
MessageBox MB_OK "Удаление ${PRODUCT_NAME} ${PRODUCT_VERSION} успешно завершено!"
  SetAutoClose true
SectionEnd

Function .onInstSuccess
    ExecShell open "http://forum.oszone.net"
FunctionEnd




Давним методом тыка выяснил что если убрать !define MUI_HEADERIMAGE то BRANDING "RePack by D!akov кликабельный а если прописать то становится про как ссылка и не кликабельный...

КАК ИСПРАВИТЬ???

kotkovets 23-12-2011 00:10 1820489

Цитата:

Цитата diakov
плагин Linker.dll для NSIS есть »

Устаревший плагин, берите этот плагин: http://nsis.sourceforge.net/BrandingURL_plug-in
И ничего редактировать не нужно редактором ресурсов, работает с оригинальным ресурсом

diakov 23-12-2011 00:19 1820492

Давним методом тыка выяснил что если убрать !define MUI_HEADERIMAGE то BRANDING "RePack by D!akov кликабельный а если прописать то становится про как ссылка и не кликабельный...

все настроил и цвет подобрал) теперь все гуд) Завтра уже возьмусь за запуск с финиш страницы

kotkovets 23-12-2011 00:39 1820497

diakov, Уберите эту хрень в функции .OnInit
читать дальше »
Код:

    ${GetOptions} "$CMDLINE" "/inst" $R0
      ${If} ${RunningX64}
      SetShellVarContext all
 CreateShortCut "$Desktop\${PRODUCT_NAME}.lnk" "$INSTDIR\CCleaner64.exe"
 ${Else}
 SetShellVarContext all
 CreateShortCut "$Desktop\${PRODUCT_NAME}.lnk" "$INSTDIR\CCleaner.exe"
 ${EndIf}
 SetShellVarContext all
  CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}"
  ${If} ${RunningX64}
  SetShellVarContext all
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\CCleaner64.exe"
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Удалить ${PRODUCT_NAME}.lnk" "$INSTDIR\Удалить CCleaner.exe"
${Else}
SetShellVarContext all
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\CCleaner.exe"
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Удалить ${PRODUCT_NAME}.lnk" "$INSTDIR\Удалить CCleaner.exe"
${EndIf}
SetOutPath "$INSTDIR"
File /r "D:\iNTEGER\*.*"
SetShellVarContext all
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Запустить модуль CCEnhancer.lnk" "$INSTDIR\CCEnhancer.exe"
 ${If} ${RunningX64}
 SetShellVarContext all
  SetRegView 64
WriteRegStr HKEY_CLASSES_ROOT "CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell" "" ""
WriteRegStr HKEY_CLASSES_ROOT "CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Запустить CCleaner" "" ""
WriteRegStr HKEY_CLASSES_ROOT "CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Запустить CCleaner\command" "" "$INSTDIR\ccleaner64.exe /AUTO"
WriteRegStr HKEY_CLASSES_ROOT "CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Открыть CCleaner..." "" ""
WriteRegStr HKEY_CLASSES_ROOT "CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Открыть CCleaner...\command" "" "$INSTDIR\ccleaner64.exe"
${Else}
SetShellVarContext all
SetRegView 32
WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Открыть CCleaner..." "CCRBType" 0x2
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Открыть CCleaner...\command" "" "$INSTDIR\CCleaner.exe"
WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Запустить CCleaner" "CCRBType" 0x1
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shell\Запустить CCleaner\command" "" "$INSTDIR\CCleaner.exe /AUTO"
${EndIf}
MessageBox MB_OK "${PRODUCT_NAME} ${PRODUCT_VERSION} установлена в тихом режыме."


Условия только задавайте, по переменным - остальное все выполнится из секций. Если запуск производить с ключом /S,
то будет обычная тихая установка.
Тобишь можно принудительно устанавливать значения переменных, а от значений будет выполняться, та или иная задача:
StrCpy $Radio 1 - установка обычная
StrCpy $Radio1 1 - портативная установка
StrCpy $Check2 1 - контекст корзины
StrCpy $Check 1 - ярлык на рабочем столе
StrCpy $Check1 1 - меню пуск
Естественно, если задать нулевые значения, то выполняться не будет, то или иное действие

diakov 23-12-2011 01:18 1820519

kotkovets, Я так делал но инстальник почемуто не писал ключи :(

Ок попробую еще раз и отпишусь)

wolkow70 24-12-2011 10:58 1821318

Цитата:

Цитата kotkovets
то ставите себе,
к примеру x32 и параллельно x64 - появится меню выбора меню загрузки ОС. »

Поставил себе XPX64 Edition. Для эксперементов с инсталляторами ее хватит?
Сразу возникли вопросы:
Если я инициализирую папку программы:

Var SysDrive
Function .onInit
${If} ${RunningX64}
StrCpy $INSTDIR "$SysDrive\$PROGRAMFILES64\CCleaner"
${Else}
StrCpy $INSTDIR "$SysDrive\$PROGRAMFILES\CCleaner"
${EndIf}
StrCpy $SysDrive $WINDIR 2
FunctionEnd

то строка
InstallDir "$PROGRAMFILES\${PRODUCT_NAME}" не нужна или она просто не будет выполняться в этом случае?
Еще у меня после снятия снимков реестра получилается такая конструкция
:
Код:

${If} ${RunningX64}
WriteRegStr HKLM "SOFTWARE\Classes\cclaunch" "" "URL: CCleaner Protocol"
WriteRegStr HKLM "SOFTWARE\Classes\cclaunch" "URL Protocol" ""
WriteRegStr HKLM "SOFTWARE\Classes\cclaunch\shell" "" ""
WriteRegStr HKLM "SOFTWARE\Classes\cclaunch\shell\open" "" ""
WriteRegStr HKLM "SOFTWARE\Classes\cclaunch\shell\open\command" "" "$\"$INSTDIR\CCleaner.exe$\" /%1"
;
WriteRegStr HKLM "SOFTWARE\Classes\Wow6432Node\cclaunch" "" "URL: CCleaner Protocol"
WriteRegStr HKLM "SOFTWARE\Classes\Wow6432Node\cclaunch" "URL Protocol" ""
WriteRegStr HKLM "SOFTWARE\Classes\Wow6432Node\cclaunch\shell" "" ""
WriteRegStr HKLM "SOFTWARE\Classes\Wow6432Node\cclaunch\shell\open" "" ""
WriteRegStr HKLM "SOFTWARE\Classes\Wow6432Node\cclaunch\shell\open\command" "" "$\"$INSTDIR\CCleaner.exe$\" /%1"
;
WriteRegStr HKLM "SOFTWARE\Wow6432Node\Classes\cclaunch" "" "URL: CCleaner Protocol"
WriteRegStr HKLM "SOFTWARE\Wow6432Node\Classes\cclaunch" "URL Protocol" ""
WriteRegStr HKLM "SOFTWARE\Wow6432Node\Classes\cclaunch\shell" "" ""
WriteRegStr HKLM "SOFTWARE\Wow6432Node\Classes\cclaunch\shell\open" "" ""
WriteRegStr HKLM "SOFTWARE\Wow6432Node\Classes\cclaunch\shell\open\command" "" "$\"$INSTDIR\CCleaner.exe$\" /%1"
${Else}
WriteRegStr HKLM "SOFTWARE\Classes\cclaunch" "" "URL: CCleaner Protocol"
WriteRegStr HKLM "SOFTWARE\Classes\cclaunch" "URL Protocol" ""
WriteRegStr HKLM "SOFTWARE\Classes\cclaunch\shell" "" ""
WriteRegStr HKLM "SOFTWARE\Classes\cclaunch\shell\open" "" ""
WriteRegStr HKLM "SOFTWARE\Classes\cclaunch\shell\open\command" "" "$\"$INSTDIR\ccleaner.exe$\" /%1"
${EndIf}

Это правильно, или по другому надо делать? Мне просто один раз разобраться нужно с X64.

diakov 24-12-2011 11:19 1821329

Цитата:

Цитата wolkow70
Var SysDrive
Function .onInit
${If} ${RunningX64}
StrCpy $INSTDIR "$SysDrive\$PROGRAMFILES64\CCleaner"
${Else}
StrCpy $INSTDIR "$SysDrive\$PROGRAMFILES\CCleaner"
${EndIf}
StrCpy $SysDrive $WINDIR 2
FunctionEnd »

Можеш ставить $PROGRAMFILES64 потому как и для х86 и для х64 єто C:\Program Files, а вот уже в 64разрядной системе констатация $PROGRAMFILES и $PROGRAMFILES32 представляют папку C:\Program Files (x86).

А в реестре

так

Код:

${If} ${RunningX64}
 SetShellVarContext all
  SetRegView 64
;;;;;;;;;;ключи для х64
${Else}
SetShellVarContext all
SetRegView 32
;;;;;;;;;ключи для х86
${EndIf}

И не забудь подключить !include "x64.nsh"
тоесть тебе надо добавить SetRegView 64 или SetRegView 32

wolkow70 24-12-2011 12:04 1821349

Цитата:

Цитата diakov
Можеш ставить $PROGRAMFILES64 потому как и для х86 и для х64 єто C:\Program Files, а вот уже в 64разрядной системе констатация $PROGRAMFILES и $PROGRAMFILES32 представляют папку C:\Program Files (x86). »

То есть, ты хочешь сказать, что для х86 $PROGRAMFILES64=$PROGRAMFILES?
Может это на практике и будет так интерпретировано, но все таки это не "комильфо".
Если соблюдать все тонкости, то в данном случае $INSTDIR отличается в зависимости от разрядности, тем более эта переменная используется по ходу всего скрипта, поэтому во избежание каких-либо накладок, лучше объявить ее по разному.
Еще я заметил, что в X64 распаковываются оба экзешника, и ccleaner.exe берет на себя часть функций, что следует из комманды cclaunch\shell\open\command" "" "$\"$INSTDIR\ccleaner.exe$\" /%1", в то время, как основным исполняемым файлом является CCleaner64.exe.
Я посмотрел твой скрипт, не могу понять, что это за ключ HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Tracing\ccsetup314_RASAPI32"? Я у себя такого ключа не нашел.

Цитата:

Цитата diakov
${If} ${RunningX64}
SetShellVarContext all
SetRegView 64
;;;;;;;;;;ключи для х64
${Else}
SetShellVarContext all
SetRegView 32
;;;;;;;;;ключи для х86
${EndIf} »

Это понятно, мне не понятно какие из приведенных выше ключей предназначены для X64.

diakov 24-12-2011 12:11 1821356

то по моему ключ по приоритету выполнения...дело в том что я ставил клинер на х86 и сканировал ключи, а потом ставил на х64 и сканировал ключи и соотвественно прописывал их в разные секции...

wolkow70 24-12-2011 12:20 1821361

Цитата:

Цитата diakov
то по моему ключ по приоритету выполнения...дело в том что я ставил клинер на х86 и сканировал ключи, а потом ставил на х64 и сканировал ключи и соотвественно прописывал их в разные секции... »

Я тоже ставил на разные оси и сравнивал ключи.
На X86 только:

WriteRegStr HKLM "SOFTWARE\Classes\cclaunch" "" "URL: CCleaner Protocol"
WriteRegStr HKLM "SOFTWARE\Classes\cclaunch" "URL Protocol" ""
WriteRegStr HKLM "SOFTWARE\Classes\cclaunch\shell" "" ""
WriteRegStr HKLM "SOFTWARE\Classes\cclaunch\shell\open" "" ""
WriteRegStr HKLM "SOFTWARE\Classes\cclaunch\shell\open\command" "" "$\"$INSTDIR\ccleaner.exe$\" /%1"

На X64 все это:

WriteRegStr HKLM "SOFTWARE\Classes\cclaunch" "" "URL: CCleaner Protocol"
WriteRegStr HKLM "SOFTWARE\Classes\cclaunch" "URL Protocol" ""
WriteRegStr HKLM "SOFTWARE\Classes\cclaunch\shell" "" ""
WriteRegStr HKLM "SOFTWARE\Classes\cclaunch\shell\open" "" ""
WriteRegStr HKLM "SOFTWARE\Classes\cclaunch\shell\open\command" "" "$\"$INSTDIR\CCleaner.exe$\" /%1"
;
WriteRegStr HKLM "SOFTWARE\Classes\Wow6432Node\cclaunch" "" "URL: CCleaner Protocol"
WriteRegStr HKLM "SOFTWARE\Classes\Wow6432Node\cclaunch" "URL Protocol" ""
WriteRegStr HKLM "SOFTWARE\Classes\Wow6432Node\cclaunch\shell" "" ""
WriteRegStr HKLM "SOFTWARE\Classes\Wow6432Node\cclaunch\shell\open" "" ""
WriteRegStr HKLM "SOFTWARE\Classes\Wow6432Node\cclaunch\shell\open\command" "" "$\"$INSTDIR\CCleaner.exe$\" /%1"
;
WriteRegStr HKLM "SOFTWARE\Wow6432Node\Classes\cclaunch" "" "URL: CCleaner Protocol"
WriteRegStr HKLM "SOFTWARE\Wow6432Node\Classes\cclaunch" "URL Protocol" ""
WriteRegStr HKLM "SOFTWARE\Wow6432Node\Classes\cclaunch\shell" "" ""
WriteRegStr HKLM "SOFTWARE\Wow6432Node\Classes\cclaunch\shell\open" "" ""
WriteRegStr HKLM "SOFTWARE\Wow6432Node\Classes\cclaunch\shell\open\command" "" "$\"$INSTDIR\CCleaner.exe$\" /%1"

diakov 24-12-2011 12:34 1821370

А чем сравнивал то?

wolkow70 24-12-2011 12:50 1821374

Я использую программы RegOrganizer и Registry WorkShop
В RegOrganizer делаю снимок изменений, а в Registry WorkShop просматриваю ключи и осуществляю экспорт их в рег-файлы, которые дальше конвертирую в Reg2NSIS.
Вот сами ключи:

Код:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\cclaunch]
@="URL: CCleaner Protocol"
"URL Protocol"=""

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\cclaunch\shell]
@=""

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\cclaunch\shell\open]
@=""

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\cclaunch\shell\open\command]
@="\"F:\\Program Files\\CCleaner\\ccleaner.exe\" /%1"
===========================================================
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node\cclaunch]
@="URL: CCleaner Protocol"
"URL Protocol"=""

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node\cclaunch\shell]
@=""

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node\cclaunch\shell\open]
@=""

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node\cclaunch\shell\open\command]
@="\"F:\\Program Files\\CCleaner\\ccleaner.exe\" /%1"
===========================================================
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\cclaunch]
@="URL: CCleaner Protocol"
"URL Protocol"=""

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\cclaunch\shell]
@=""

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\cclaunch\shell\open]
@=""

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\cclaunch\shell\open\command]
@="\"F:\\Program Files\\CCleaner\\ccleaner.exe\" /%1"


diakov 24-12-2011 13:16 1821385

А я использовал Regshot, мож потому...

kotkovets подскажи как сделать что бы иконка проги отображалась в панели управление программы?
где то видел статью но теперь не могу найти

kotkovets 24-12-2011 14:02 1821408

Цитата:

Цитата wolkow70
StrCpy $INSTDIR "$SysDrive\$PROGRAMFILES64\CCleaner" »

Бред!!! получится, что так:
$INSTDIR = С:\C:\Program Files\CCleaner :o
InstallDir помещает свое значение в переменную $INSTDIR
Цитата:

Цитата wolkow70
Это понятно, мне не понятно какие из приведенных выше ключей предназначены для X64. »

Реестр 64-разрядных версий Windows подразделяется на 32- и 64-разрядные разделы. Большинство 32-разрядных разделов имеют те же имена, что и их аналоги в 64-разрядном разделе, и наоборот. По умолчанию редактор реестра 64-разрядных версий Windows отображает 32-разрядные разделы в разделе HKEY_LOCAL_MACHINE\Software\WOW6432Node
В комплекте поставки Windows XP 64-bit Edition имеются две версии Редактора реестра:
одна, запускаемая по умолчанию, демонстрирует только 64-битный раздел реестра Windows XP,
другая предназначена для редактирования 32-разрядного раздела.
Естественно 64-битную программу система "заставляет" использовать по умолчанию 64-разрядный реестр
и 32-битные программы использовать по умолчанию 32-разрядный реестр.
установщик NSIS в х64 - это 32-разрядный процесс, а значит по умолчанию вид (SetRegView 32)
Использование (SetRegView 64) позволяет инсталлятору NSIS использовать доступ к 64-разрядному виду реестра.
Цитата:

Цитата diakov
как сделать что бы иконка проги отображалась в панели управление программы? »

Смотрите ключи в ветке:
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Control Panel

diakov 24-12-2011 14:20 1821412

kotkovets,
Цитата:

Цитата kotkovets
diakov, Да все так же, когда страница финиша открывается...
Если портативка, то $Radio=1, а в хедере NSIS\Contrib\Modern UI 2\Pages\Finish.nsh объявлена
переменная $mui.FinishPage.Run - это хэндл чекбокса, а раз есть хэндл делаем с контролом почти все, что захотим...
Код:
!define MUI_PAGE_CUSTOMFUNCTION_SHOW SHOW_FINISH
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "Russian"
Function SHOW_FINISH
${If} $Radio1 == 1
ShowWindow $mui.FinishPage.Run 0 ;скрываем чекбокс
${NSD_SetState} $mui.FinishPage.Run 0 ;и делаем чекбокс неотмеченным
${EndIf}
FunctionEnd »


Чето не получается мож что не так вылазить две страницы финиша

kotkovets 24-12-2011 14:23 1821413

Цитата:

Цитата diakov
Чето не получается мож что не так вылазить две страницы финиша »

Потому что, у вас 2 записи странички финиша: !insertmacro MUI_PAGE_FINISH
Уберите одну запись.

diakov 24-12-2011 14:24 1821414

Цитата:

Цитата kotkovets
Смотрите ключи в ветке:
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Control Panel »

kotkovets,, наверное неправильно понял или я так обьяснил))

Что бы установленный мною репак отображался в установка и удаление программ, или вот скажем в рево юнинсталер не видит мого установленого репака.

Цитата:

Цитата kotkovets
Потому что, у вас 2 записи странички финиша: !insertmacro MUI_PAGE_FINISH
Уберите одну запись. »

А что бы появился чекбокс запустить например ссклинер в фцию


Код:

Function SHOW_FINISH
  ${If} $Radio1 == 1
    ShowWindow $mui.FinishPage.Run 0 ;скрываем чекбокс
    ${NSD_SetState} $mui.FinishPage.Run 0 ;и делаем чекбокс неотмеченным
  ${EndIf}
 ${If} $Radio == 1
    ShowWindow $mui.FinishPage.Run 1 ;скрываем чекбокс
    ${NSD_SetState} $mui.FinishPage.Run 1 ;и делаем чекбокс неотмеченным
  ${EndIf}
FunctionEnd

надо дописать

${If} $Radio == 1
ShowWindow $mui.FinishPage.Run 1
${NSD_SetState} $mui.FinishPage.Run 1
${EndIf}

или как его там нарисовать)) Чето я туплю :durak:

kotkovets 24-12-2011 14:36 1821421

Цитата:

Цитата diakov
Что бы установленный мною репак отображался в установка и удаление программ »

Код:

WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Название программы" "DisplayName" "Название программы"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Название программы" "UninstallPath" "Путь к папке программы"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Название программы" "UninstallString" "Путь к деинсталлятору программы"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Название программы" "DisplayIcon" "Путь к исполняемому файлу программы"

Естественно в ключи подставляете свои данные программы.
Цитата:

Цитата diakov
А что бы появился чекбокс запустить например ссклинер в фцию »

Что это за вопрос и как его понять, изъясняйтесь понятнее!

wolkow70 24-12-2011 14:52 1821431

Цитата:

Цитата kotkovets
Бред!!! получится, что так:
$INSTDIR = С:\C:\Program Files\CCleaner
InstallDir помещает свое значение в переменную $INSTDIR »

Согласен, что бред (скопировал где-то не подумав).
;
Function .onInit
${If} ${RunningX64}
StrCpy $INSTDIR "$PROGRAMFILES64\CCleaner"
${Else}
StrCpy $INSTDIR "$PROGRAMFILES\CCleaner"
${EndIf}
FunctionEnd

InstallDir помещает свое значение в переменную $INSTDIR
Это понятно, поэтому и удаляем строку
InstallDir "$PROGRAMFILES\${PRODUCT_NAME}"

ТАК?

kotkovets 24-12-2011 14:55 1821434

Цитата:

Цитата wolkow70
ТАК? »

так
Можно и так:
Код:

InstallDir "$PROGRAMFILES64\${PRODUCT_NAME}"

diakov 24-12-2011 15:01 1821438

Цитата:

А как сделать что бы после установки на MUI_PAGE_FINISH стояла галка запустить программу, а если распаковывалась портабл весрия то что бы галки не было?


Если $Radio == 1 установка обычной версии и есть галка запустить
Если $Radio1 == 1 распаковка портабла и тогда нет галки запустить на MUI_PAGE_FINISH

kotkovets 24-12-2011 15:09 1821444

Цитата:

Цитата diakov
А как сделать что бы после установки на MUI_PAGE_FINISH стояла галка запустить программу, а если распаковывалась портабл весрия то что бы галки не было? »

Код:

Function SHOW_FINISH
  ${If} $Radio1 == 1
    ${NSD_SetState} $mui.FinishPage.Run 0 ;и делаем чекбокс неотмеченным
    ShowWindow $mui.FinishPage.Run 0 ;скрываем чекбокс из ввиду
  ${EndIf}
FunctionEnd

И больше ничего не нужно писать в этой функции, код будет выполняться, если
Цитата:

Цитата diakov
распаковывалась портабл весрия то что бы галки не было »


diakov 24-12-2011 15:23 1821450

Все заработало :)
Я олень просто !define MUI_FINISHPAGE_RUN "$INSTDIR\ххххххххх.exe" не вставил! :sorry:
Спасибо!

wolkow70 24-12-2011 15:30 1821457

Цитата:

Цитата diakov
как сделать что бы иконка проги отображалась в панели управление программы?
где то видел статью но теперь не могу найти »

Иногда нужно еще, чтобы это было отмечено в файле настроек программы и имелась в реестре ссылка на CLSID

Например, для AIDA64 :

Section "Показывать Aida64 в Панели управления" ControlPanel
SetOutPath "$INSTDIR"
WriteRegStr HKLM "SOFTWARE\Classes\CLSID\{185110B9-387D-435D-A165-829D17C583B8}" "" "AIDA64 Extreme Edition"
WriteRegStr HKLM "SOFTWARE\Classes\CLSID\{185110B9-387D-435D-A165-829D17C583B8}" "InfoTip" "System diagnostics and benchmarking"
WriteRegStr HKLM "SOFTWARE\Classes\CLSID\{185110B9-387D-435D-A165-829D17C583B8}" "System.ApplicationName" "FinalWire.AIDA64"
WriteRegStr HKLM "SOFTWARE\Classes\CLSID\{185110B9-387D-435D-A165-829D17C583B8}" "System.ControlPanel.Category" "2,5,8"
WriteRegDWORD HKLM "SOFTWARE\Classes\CLSID\{185110B9-387D-435D-A165-829D17C583B8}" "System.ControlPanel.EnableInSafeMode" 0x3
WriteRegStr HKLM "SOFTWARE\Classes\CLSID\{185110B9-387D-435D-A165-829D17C583B8}\DefaultIcon" "" "$INSTDIR\aida64.exe,0"
WriteRegStr HKLM "SOFTWARE\Classes\CLSID\{185110B9-387D-435D-A165-829D17C583B8}\Shell" "" ""
WriteRegStr HKLM "SOFTWARE\Classes\CLSID\{185110B9-387D-435D-A165-829D17C583B8}\Shell\Open" "" ""
WriteRegStr HKLM "SOFTWARE\Classes\CLSID\{185110B9-387D-435D-A165-829D17C583B8}\Shell\Open\Command" "" "$INSTDIR\aida64.exe"
;
WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ControlPanel\NameSpace\{185110B9-387D-435D-A165-829D17C583B8}" "" "AIDA64 Extreme Edition"
;
WriteINIStr "$INSTDIR\aida64.ini" "Generic" "ControlPanelIcon" "1"
SectionEnd

diakov 24-12-2011 15:36 1821464

Уважаемый kotkovets, такой вопрос! Берусь за перепаковку AIMP 3.00 Build 970 RC 3 , хочу добавить ассоциацию файлов и что бы они открывались уже аимпом, потому как в стандартном инсталляторе такого нет)

Так вот правильно ли так будет??
Код:

!macro RegisterExtension extenstion 
; например для .mp3
WriteRegStr HKLM "Software\Classes\.mp3" "" "Aimp.File"
WriteRegStr HKLM "Software\Classes\Aipm.File" "" "Aimp Media File"
WriteRegStr HKLM "Software\Classes\Aipm.File\DefaultIcon" "" "$INSTDIR\Aipm.exe,1"
WriteRegStr HKLM "Software\Classes\Aipm.File\shell" "" "Play"
WriteRegStr HKLM "Software\Classes\Aipm.File\shell\Play" "" "&Play in Aimp"
WriteRegStr HKLM "Software\Classes\Aipm.File\shell\Play\command" "" "$\"$INSTDIR\Aipm.exe$\" $\"%1$\""
WriteRegStr HKLM "Software\Classes\Aipm.File\shell\open\command" "" "$\"$INSTDIR\Aipm.exe$\" $\"%1$\""
WriteRegStr HKLM "Software\Classes\Aipm.File\shell\ListBookmark" "" "Add to Aipm's &Bookmark list"
WriteRegStr HKLM "Software\Classes\Aipm.File\shell\ListBookmark\command" "" "$\"$INSTDIR\Aipm.exe$\"/BOOKMARK $\"%1$\""
WriteRegStr HKLM "Software\Classes\Aipm.File\shell\Enqueue" "" "&Enqueue in Aipm"
WriteRegStr HKLM "Software\Classes\Aipm.File\shell\Enqueue\command" "" "$\"$INSTDIR\Aipm.exe$\"/ADD $\"%1$\""
; ставим приложением по умолчанию для текущего пользователя
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.mp3\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.mp3\UserChoice" "Progid" "Aimp.File"

;потом например для .wav
WriteRegStr HKLM "Software\Classes\.wav" "" "Aimp.File"
WriteRegStr HKLM "Software\Classes\Aipm.File" "" "Aimp Media File"
WriteRegStr HKLM "Software\Classes\Aipm.File\DefaultIcon" "" "$INSTDIR\Aimp.exe,1"
WriteRegStr HKLM "Software\Classes\Aipm.File\shell" "" "Play"
WriteRegStr HKLM "Software\Classes\Aipm.File\shell\Play" "" "&Play in Aipm"
WriteRegStr HKLM "Software\Classes\Aipm.File\shell\Play\command" "" "$\"$INSTDIR\Aipm.exe$\" $\"%1$\""
WriteRegStr HKLM "Software\Classes\Aipm.File\shell\open\command" "" "$\"$INSTDIR\Aipm.exe$\" $\"%1$\""
WriteRegStr HKLM "Software\Classes\Aipm.File\shell\ListBookmark" "" "Add to Aipm's &Bookmark list"
WriteRegStr HKLM "Software\Classes\Aipm.File\shell\ListBookmark\command" "" "$\"$INSTDIR\Aipm.exe$\"/BOOKMARK $\"%1$\""
WriteRegStr HKLM "Software\Classes\Aipm.File\shell\Enqueue" "" "&Enqueue in Aipm"
WriteRegStr HKLM "Software\Classes\Aipm.File\shell\Enqueue\command" "" "$\"$INSTDIR\Aipm.exe$\"/ADD $\"%1$\""
; ставим приложением по умолчанию для текущего пользователя
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.wav\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.wav\UserChoice" "Progid" "Aipm.File"
!macroend

тоесть писать так для всех .CDA, .AAC, .AC3, .APE, .DTS, .FLAC, .IT, .MIDI, .MO3, .MOD, .M4A, .M4B, .MP1, .MP2, .MP3,
.MPC, .MTM, .OFR, .OGG, .RMI, .S3M, .SPX, .TAK, .TTA, .UMX, .WAV, .WMA, .WV, .XM

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

то делать так:
Код:


Section "ассоциации для аудио файлов"
${If} $Check == 1
  SetShellVarContext all
!insertmacro RegisterExtension
${EndIf}

Так правильно будет?

wolkow70 24-12-2011 15:49 1821467

Цитата:

Цитата diakov
Так правильно будет? »

Все скопом регистрировать не лучший вариант. Для каждого расширения лучше отдельную секцию делать. Потом меньше проблем с деинсталляцией будет.
Вот посмотрите как у меня в скрипте Winamp сделано:
http://forum.oszone.net/post-1754972-257.html

diakov 24-12-2011 16:02 1821470

Цитата:

Цитата wolkow70
Для каждого расширения лучше отдельную секцию делать. »

мне не подходит сколько чекбоксов не влезит))))



Цитата:

Цитата wolkow70
Потом меньше проблем с деинсталляцией будет. »

Операционная система Windows перестает считать тип файла ассоциированным, если в реестре отсутствует описание приложения-обработчика. Таким образом, применительно к вышеуказанному примеру, достаточно удалить раздел HKLM\Software\Classes\Aimp.File для снятия всех ассоциация при удалении Aimp. Можно эту операцию оформить вызовом команды DeleteRegKey в секции деисталлятора:

Код:

Section Uninstall
    ...
    DeleteRegKey HKLM "Software\Classes\Aimp.File"
    ...
    SectionEnd


kotkovets 24-12-2011 16:07 1821472

Цитата:

Цитата diakov
и хочу чтобы был чекбокс Установить ассоциации для аудио файлов, тоесть пользователь мог выбрать ассоциировать или просто установить аимп... »

Макрос предполагает аргумент, в качестве передаваемого расширения файла для ассоциации с приложением
читать дальше »
Код:

!macro RegisterExtension extenstion
WriteRegStr HKLM "Software\Classes\.${extenstion}" "" "Aimp.File"
WriteRegStr HKLM "Software\Classes\Aimp.File" "" "Aimp Media File"
WriteRegStr HKLM "Software\Classes\Aimp.File\DefaultIcon" "" "$INSTDIR\Aimp.exe,1"
WriteRegStr HKLM "Software\Classes\Aimp.File\shell" "" "Play"
WriteRegStr HKLM "Software\Classes\Aimp.File\shell\Play" "" "&Play in Aimp"
WriteRegStr HKLM "Software\Classes\Aimp.File\shell\Play\command" "" "$\"$INSTDIR\Aimp.exe$\" $\"%1$\""
WriteRegStr HKLM "Software\Classes\Aimp.File\shell\open\command" "" "$\"$INSTDIR\Aimp.exe$\" $\"%1$\""
WriteRegStr HKLM "Software\Classes\Aimp.File\shell\ListBookmark" "" "Add to Aipm's &Bookmark list"
WriteRegStr HKLM "Software\Classes\Aimp.File\shell\ListBookmark\command" "" "$\"$INSTDIR\Aimp.exe$\"/BOOKMARK $\"%1$\""
WriteRegStr HKLM "Software\Classes\Aimp.File\shell\Enqueue" "" "&Enqueue in Aipm"
WriteRegStr HKLM "Software\Classes\Aimp.File\shell\Enqueue\command" "" "$\"$INSTDIR\Aimp.exe$\"/ADD $\"%1$\""
; ставим приложением по умолчанию для текущего пользователя
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "Progid" "Aimp.File"
!macroend

И запуск макроса:
Код:

!insertmacro RegisterExtension mp3
!insertmacro RegisterExtension acc
;и так далее


Цитата:

Цитата wolkow70
Все скопом регистрировать не лучший вариант. Для каждого расширения лучше отдельную секцию делать. »

wolkow70 прав, но хозяин барин, хочет все - пожалуйста :read:

diakov 24-12-2011 16:12 1821476

Тоесть так

Код:

Section "ассоциации для аудио файлов"
${If} $Check == 1
  SetShellVarContext all
!insertmacro RegisterExtension mp3
!insertmacro RegisterExtension acc
;и так далее

${EndIf}

Я правильно понял?

kotkovets 24-12-2011 16:15 1821477

diakov, Правильно, пишете запуск макроса, столько, сколько вам нужно ассоциаций с связанным приложением
Цитата:

Цитата diakov
мне не подходит сколько чекбоксов не влезит)))) »

Всегда можно нарисовать еще свои странички, но это будет слишком сложно для вас.

diakov 24-12-2011 16:17 1821481

окейно, счас бду пробовать)

wolkow70 24-12-2011 16:31 1821484

Цитата:

Цитата diakov
Операционная система Windows перестает считать тип файла ассоциированным, если в реестре отсутствует описание приложения-обработчика. Таким образом, применительно к вышеуказанному примеру, достаточно удалить раздел HKLM\Software\Classes\Aimp.File для снятия всех ассоциация при удалении Aimp. Можно эту операцию оформить вызовом команды DeleteRegKey в секции деисталлятора »


Но сами то расширения файлов при этом останутся по умолчанию закрепленными за отсутствующим приложением, а это мусор в реестре, который в конце концов обманывает и саму операционную систему.
Считаю, что нужно удалять значения расширений по умолчанию, причем в обеих разделах реестра.
Кроме того, в windows 7 есть еще значения ключей, передающие системе сведения о программах, связанных с определенными расширениями.

diakov 24-12-2011 18:23 1821533

kotkovets, как теперь изменить иконку для зарегистрированных файлов?

kotkovets 24-12-2011 18:46 1821538

Цитата:

Цитата diakov
изменить иконку для зарегистрированных файлов? »

После применения всех регистраций,обновляем кэш иконок, пишем:
Код:

${RefreshShellIcons}
Этот макрос описан в FileFunc.nsh, естественно если этот хедер не подключен к телу скрипта, то в самом начале пишем:
Код:

!include "FileFunc.nsh"

diakov 24-12-2011 19:01 1821549

Что то я не правильно делаю смотри:

Код:

!macro RegisterExtension extenstion
  SetShellVarContext all
WriteRegStr HKLM "Software\Classes\.mp3" "" "Aimp.File"
WriteRegStr HKLM "Software\Classes\Aimp.File" "" "Aimp Media File"
WriteRegStr HKLM "Software\Classes\Aimp.File\DefaultIcon" "" "$INSTDIR\AIMP2.exe,1"
WriteRegStr HKLM "Software\Classes\Aimp.File\shell" "" "Play"
WriteRegStr HKLM "Software\Classes\Aimp.File\shell\Play" "" "&Play in Aimp"
WriteRegStr HKLM "Software\Classes\Aimp.File\shell\Play\command" "" "$\"$INSTDIR\AIMP2.exe$\" $\"%1$\""
WriteRegStr HKLM "Software\Classes\Aimp.File\shell\open\command" "" "$\"$INSTDIR\AIMP2.exe$\" $\"%1$\""
WriteRegStr HKLM "Software\Classes\Aimp.File\shell\ListBookmark" "" "Add to Aipm's &Bookmark list"
WriteRegStr HKLM "Software\Classes\Aimp.File\shell\ListBookmark\command" "" "$\"$INSTDIR\AIMP2.exe$\"/BOOKMARK $\"%1$\""
WriteRegStr HKLM "Software\Classes\Aimp.File\shell\Enqueue" "" "&Enqueue in Aipm"
WriteRegStr HKLM "Software\Classes\Aimp.File\shell\Enqueue\command" "" "$\"$INSTDIR\AIMP2.exe$\"/ADD $\"%1$\""
; ставим приложением по умолчанию для текущего пользователя
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.mp3\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.mp3\UserChoice" "Progid" "Aimp.File"
${RefreshShellIcons}
!macroend

А иконки стают вот такими


kotkovets 24-12-2011 19:16 1821557

diakov,
Цитата:

Цитата kotkovets
После применения всех регистраций,обновляем кэш иконок, пишем: »

Я в макросе говорил писать???
Цитата:

Цитата diakov
WriteRegStr HKLM "Software\Classes\Aimp.File\DefaultIcon" "" "$INSTDIR\AIMP2.exe,1" »

Здесь задается путь к ресурсам иконок, а вообще иконки берутся из aimp_icons.dll
Индекс иконок смотрите редактором ресурсом, ессно первая иконка - индекс = 0.

diakov 24-12-2011 19:34 1821566

Непонял :durak:

Я пока что хочу поэксперементировать с .mp3

Вставляю макрос
Код:

!macro RegisterExtension extenstion
  SetShellVarContext all
WriteRegStr HKLM "Software\Classes\.mp3" "" "Aimp.File"
WriteRegStr HKLM "Software\Classes\Aimp.File" "" "Aimp Media File"
WriteRegStr HKLM "Software\Classes\Aimp.File\DefaultIcon" "" "$INSTDIR\AIMP2.exe,1"
WriteRegStr HKLM "Software\Classes\Aimp.File\shell" "" "Play"
WriteRegStr HKLM "Software\Classes\Aimp.File\shell\Play" "" "&Play in Aimp"
WriteRegStr HKLM "Software\Classes\Aimp.File\shell\Play\command" "" "$\"$INSTDIR\AIMP2.exe$\" $\"%1$\""
WriteRegStr HKLM "Software\Classes\Aimp.File\shell\open\command" "" "$\"$INSTDIR\AIMP2.exe$\" $\"%1$\""
WriteRegStr HKLM "Software\Classes\Aimp.File\shell\ListBookmark" "" "Add to Aipm's &Bookmark list"
WriteRegStr HKLM "Software\Classes\Aimp.File\shell\ListBookmark\command" "" "$\"$INSTDIR\AIMP2.exe$\"/BOOKMARK $\"%1$\""
WriteRegStr HKLM "Software\Classes\Aimp.File\shell\Enqueue" "" "&Enqueue in Aipm"
WriteRegStr HKLM "Software\Classes\Aimp.File\shell\Enqueue\command" "" "$\"$INSTDIR\AIMP2.exe$\"/ADD $\"%1$\""
; ставим приложением по умолчанию для текущего пользователя
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.mp3\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.mp3\UserChoice" "Progid" "Aimp.File"
!macroend

Куда писать ${RefreshShellIcons}???

Ну вот открыл ресхакером aimp2.dll есть иконка



Как сделать и куда писать индекс (я понял что он 53) что бы была иконка такая...

Или как просто сделать что бы иконки были как значок аимпа???

kotkovets 24-12-2011 19:56 1821584

diakov, Вы даже не пытаетесь понять, что я писал, вам не нужно писать
каждый раз макрос обновления иконок, достаточно одного раза, после регистрации
Код:

Section "ассоциации для аудио файлов"
${If} $Check == 1
  SetShellVarContext all
!insertmacro RegisterExtension mp3
!insertmacro RegisterExtension acc
;и так далее
${RefreshShellIcons}
${EndIf}

Код:

WriteRegStr HKLM "Software\Classes\Aimp.File\DefaultIcon" "" "$INSTDIR\AIMP2.exe,1"
Ну никогда не будет отображаться иконка, нет такой иконки в файле AIMP2.exe
Цитата:

Цитата kotkovets
задается путь к ресурсам иконок, а вообще иконки берутся из aimp2.dll »

Файл с иконками - в aimp2.dll , пишите путь к этому файлу - $INSTDIR\Icons\aimp2.dll,1
Что бы изменять иконки для каждого из типов, следует доработать макрос регистрации:
А именно ввести аргумент индекса иконки:
Код:

!macro RegisterExtension extenstion index
WriteRegStr HKLM "Software\Classes\.${extenstion}" "" "Aimp.File"
WriteRegStr HKLM "Software\Classes\Aimp.File" "" "Aimp Media File"
WriteRegStr HKLM "Software\Classes\Aimp.File\DefaultIcon" "" "$INSTDIR\Icons\aimp2.dll,${index}"
WriteRegStr HKLM "Software\Classes\Aimp.File\shell" "" "Play"
WriteRegStr HKLM "Software\Classes\Aimp.File\shell\Play" "" "&Play in Aimp"
WriteRegStr HKLM "Software\Classes\Aimp.File\shell\Play\command" "" "$\"$INSTDIR\AIMP2.exe$\" $\"%1$\""
WriteRegStr HKLM "Software\Classes\Aimp.File\shell\open\command" "" "$\"$INSTDIR\AIMP2.exe$\" $\"%1$\""
WriteRegStr HKLM "Software\Classes\Aimp.File\shell\ListBookmark" "" "Add to Aipm's &Bookmark list"
WriteRegStr HKLM "Software\Classes\Aimp.File\shell\ListBookmark\command" "" "$\"$INSTDIR\AIMP2.exe$\"/BOOKMARK $\"%1$\""
WriteRegStr HKLM "Software\Classes\Aimp.File\shell\Enqueue" "" "&Enqueue in Aipm"
WriteRegStr HKLM "Software\Classes\Aimp.File\shell\Enqueue\command" "" "$\"$INSTDIR\AIMP2.exe$\"/ADD $\"%1$\""
; ставим приложением по умолчанию для текущего пользователя
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "Progid" "Aimp.File"
!macroend

запуск макроса:
Код:

!insertmacro RegisterExtension mp3 1
Для mp3 индекс иконки 1

diakov 24-12-2011 20:07 1821590

тоесть получается что в этой иконки индекс 53?

kotkovets 24-12-2011 20:11 1821591

Цитата:

Цитата diakov
тоесть получается что в этой иконки индекс 53 »

Первая иконка в списке будет --> отсчет индекса иконок система ведет от нуля и далее по порядку
НЕЗАВИСИМО ОТ НУМЕРАЦИИ и НАЗВАНИЯ ИКОНОК В РЕСУРСЕ

diakov 24-12-2011 20:14 1821594

тоесть все индексы на 1 меньше?

Понял, походу самому считать от нуля)

diakov 24-12-2011 20:31 1821598

Спасибо kotkovets, все играй боян, скажи а моно сторонние .ico файлы так подцепить?

diakov 24-12-2011 22:04 1821644

kotkovets, опять трабла
пишу такое
Код:

SetShellVarContext all
WriteRegStr HKLM "Software\Classes\.mp3" "" "Aimp.File"
WriteRegStr HKLM "Software\Classes\Aimp.File" "" "Aimp Media File"
WriteRegStr HKLM "Software\Classes\Aimp.File\DefaultIcon" "" "$INSTDIR\Icons\Black Style.dll,6"
; ставим приложением по умолчанию для текущего пользователя
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.mp3\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.mp3\UserChoice" "Progid" "Aimp.File"

WriteRegStr HKLM "Software\Classes\.AAC" "" "Aimp.File"
WriteRegStr HKLM "Software\Classes\Aimp.File" "" "Aimp Media File"
WriteRegStr HKLM "Software\Classes\Aimp.File\DefaultIcon" "" "$INSTDIR\Icons\Black Style.dll,0"
; ставим приложением по умолчанию для текущего пользователя
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.AAC\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.AAC\UserChoice" "Progid" "Aimp.File"

WriteRegStr HKLM "Software\Classes\.APE" "" "Aimp.File"
WriteRegStr HKLM "Software\Classes\Aimp.File" "" "Aimp Media File"
WriteRegStr HKLM "Software\Classes\Aimp.File\DefaultIcon" "" "$INSTDIR\Icons\Black Style.dll,1"
; ставим приложением по умолчанию для текущего пользователя
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.APE\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.APE\UserChoice" "Progid" "Aimp.File"

WriteRegStr HKLM "Software\Classes\.FLAC" "" "Aimp.File"
WriteRegStr HKLM "Software\Classes\Aimp.File" "" "Aimp Media File"
WriteRegStr HKLM "Software\Classes\Aimp.File\DefaultIcon" "" "$INSTDIR\Icons\Black Style.dll,3"
; ставим приложением по умолчанию для текущего пользователя
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.FLAC\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.FLAC\UserChoice" "Progid" "Aimp.File"


WriteRegStr HKLM "Software\Classes\.m4a" "" "Aimp.File"
WriteRegStr HKLM "Software\Classes\Aimp.File" "" "Aimp Media File"
WriteRegStr HKLM "Software\Classes\Aimp.File\DefaultIcon" "" "$INSTDIR\Icons\Black Style.dll,4"
; ставим приложением по умолчанию для текущего пользователя
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.m4a\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.m4a\UserChoice" "Progid" "Aimp.File"

WriteRegStr HKLM "Software\Classes\.MOD" "" "Aimp.File"
WriteRegStr HKLM "Software\Classes\Aimp.File" "" "Aimp Media File"
WriteRegStr HKLM "Software\Classes\Aimp.File\DefaultIcon" "" "$INSTDIR\Icons\Black Style.dll,5"
; ставим приложением по умолчанию для текущего пользователя
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.MOD\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.MOD\UserChoice" "Progid" "Aimp.File"

WriteRegStr HKLM "Software\Classes\.MPC" "" "Aimp.File"
WriteRegStr HKLM "Software\Classes\Aimp.File" "" "Aimp Media File"
WriteRegStr HKLM "Software\Classes\Aimp.File\DefaultIcon" "" "$INSTDIR\Icons\Black Style.dll,7"
; ставим приложением по умолчанию для текущего пользователя
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.MPC\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.MPC\UserChoice" "Progid" "Aimp.File"

WriteRegStr HKLM "Software\Classes\.OGG" "" "Aimp.File"
WriteRegStr HKLM "Software\Classes\Aimp.File" "" "Aimp Media File"
WriteRegStr HKLM "Software\Classes\Aimp.File\DefaultIcon" "" "$INSTDIR\Icons\Black Style.dll,8"
; ставим приложением по умолчанию для текущего пользователя
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.OGG\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.OGG\UserChoice" "Progid" "Aimp.File"


WriteRegStr HKLM "Software\Classes\.acs3" "" "Aimp.File"
WriteRegStr HKLM "Software\Classes\Aimp.File" "" "Aimp Media File"
WriteRegStr HKLM "Software\Classes\Aimp.File\DefaultIcon" "" "$INSTDIR\Icons\Black Style.dll,10"
; ставим приложением по умолчанию для текущего пользователя


WriteRegStr HKLM "Software\Classes\.acs2" "" "Aimp.File"
WriteRegStr HKLM "Software\Classes\Aimp.File" "" "Aimp Media File"
WriteRegStr HKLM "Software\Classes\Aimp.File\DefaultIcon" "" "$INSTDIR\Icons\Black Style.dll,10"
; ставим приложением по умолчанию для текущего пользователя


WriteRegStr HKLM "Software\Classes\.WAV" "" "Aimp.File"
WriteRegStr HKLM "Software\Classes\Aimp.File" "" "Aimp Media File"
WriteRegStr HKLM "Software\Classes\Aimp.File\DefaultIcon" "" "$INSTDIR\Icons\Black Style.dll,11"
; ставим приложением по умолчанию для текущего пользователя
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.WAV\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.WAV\UserChoice" "Progid" "Aimp.File"


WriteRegStr HKLM "Software\Classes\.WMA" "" "Aimp.File"
WriteRegStr HKLM "Software\Classes\Aimp.File" "" "Aimp Media File"
WriteRegStr HKLM "Software\Classes\Aimp.File\DefaultIcon" "" "$INSTDIR\Icons\Black Style.dll,12"
; ставим приложением по умолчанию для текущего пользователя
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.WMA\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.WMA\UserChoice" "Progid" "Aimp.File"

потом такое...

Код:

ection "Установить ассоциации с аудио файлами"
  ${If} $Check2 == 1
  SetShellVarContext all
!insertmacro RegisterExtension mp3 6
!insertmacro RegisterExtension AAC 0
!insertmacro RegisterExtension APE 1
!insertmacro RegisterExtension FLAC 3
!insertmacro RegisterExtension MOD 5
!insertmacro RegisterExtension MPC 7
!insertmacro RegisterExtension OGG 8
!insertmacro RegisterExtension acs3 10
!insertmacro RegisterExtension acs2 10
!insertmacro RegisterExtension WAV 11
!insertmacro RegisterExtension WMA 12

${RefreshShellIcons}
    ;;;
  ${EndIf}

И получается везде стоит иконка последнего !insertmacro RegisterExtension WMA 12 тоесть WMA :durak:

Я так понял что это потому как везде стоит "Aimp.File", как исправить подскажи!

Все разобрался сделав так...
Код:

WriteRegStr HKLM "Software\Classes\.mp3" "" "mp3.File"
WriteRegStr HKLM "Software\Classes\mp3.File" "" "mp3 Media File"
WriteRegStr HKLM "Software\Classes\mp3.File\DefaultIcon" "" "$INSTDIR\Icons\Black Style.dll,6"
; ставим приложением по умолчанию для текущего пользователя
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.mp3\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.mp3\UserChoice" "Progid" "mp3.File"

WriteRegStr HKLM "Software\Classes\.WMA" "" "WMA.File"
WriteRegStr HKLM "Software\Classes\WMA.File" "" "Aimp Media File"
WriteRegStr HKLM "Software\Classes\WMA.File\DefaultIcon" "" "$INSTDIR\Icons\Black Style.dll,12"
; ставим приложением по умолчанию для текущего пользователя
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.WMA\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.WMA\UserChoice" "Progid" "WMA.File"


diakov 24-12-2011 22:37 1821664

не не разобрался если сделть так как я написал выше то получается что иконки меняються а приложеним аимп по умолчанию не ствится

Вообщем что нада поминять здесь чтобы иконка менялась и ассоциация по открытию сохранялась?

Код:

SetShellVarContext all
WriteRegStr HKLM "Software\Classes\.mp3" "" "Aimp.File"
WriteRegStr HKLM "Software\Classes\Aimp.File" "" "Aimp Media File"
WriteRegStr HKLM "Software\Classes\Aimp.File\DefaultIcon" "" "$INSTDIR\Icons\Black Style.dll,6"
; ставим приложением по умолчанию для текущего пользователя
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.mp3\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.mp3\UserChoice" "Progid" "Aimp.File"

WriteRegStr HKLM "Software\Classes\.AAC" "" "Aimp.File"
WriteRegStr HKLM "Software\Classes\Aimp.File" "" "Aimp Media File"
WriteRegStr HKLM "Software\Classes\Aimp.File\DefaultIcon" "" "$INSTDIR\Icons\Black Style.dll,0"
; ставим приложением по умолчанию для текущего пользователя
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.AAC\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.AAC\UserChoice" "Progid" "Aimp.File"

WriteRegStr HKLM "Software\Classes\.APE" "" "Aimp.File"
WriteRegStr HKLM "Software\Classes\Aimp.File" "" "Aimp Media File"
WriteRegStr HKLM "Software\Classes\Aimp.File\DefaultIcon" "" "$INSTDIR\Icons\Black Style.dll,1"
; ставим приложением по умолчанию для текущего пользователя
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.APE\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.APE\UserChoice" "Progid" "Aimp.File"

WriteRegStr HKLM "Software\Classes\.FLAC" "" "Aimp.File"
WriteRegStr HKLM "Software\Classes\Aimp.File" "" "Aimp Media File"
WriteRegStr HKLM "Software\Classes\Aimp.File\DefaultIcon" "" "$INSTDIR\Icons\Black Style.dll,3"
; ставим приложением по умолчанию для текущего пользователя
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.FLAC\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.FLAC\UserChoice" "Progid" "Aimp.File"


WriteRegStr HKLM "Software\Classes\.m4a" "" "Aimp.File"
WriteRegStr HKLM "Software\Classes\Aimp.File" "" "Aimp Media File"
WriteRegStr HKLM "Software\Classes\Aimp.File\DefaultIcon" "" "$INSTDIR\Icons\Black Style.dll,4"
; ставим приложением по умолчанию для текущего пользователя
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.m4a\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.m4a\UserChoice" "Progid" "Aimp.File"

WriteRegStr HKLM "Software\Classes\.MOD" "" "Aimp.File"
WriteRegStr HKLM "Software\Classes\Aimp.File" "" "Aimp Media File"
WriteRegStr HKLM "Software\Classes\Aimp.File\DefaultIcon" "" "$INSTDIR\Icons\Black Style.dll,5"
; ставим приложением по умолчанию для текущего пользователя
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.MOD\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.MOD\UserChoice" "Progid" "Aimp.File"

WriteRegStr HKLM "Software\Classes\.MPC" "" "Aimp.File"
WriteRegStr HKLM "Software\Classes\Aimp.File" "" "Aimp Media File"
WriteRegStr HKLM "Software\Classes\Aimp.File\DefaultIcon" "" "$INSTDIR\Icons\Black Style.dll,7"
; ставим приложением по умолчанию для текущего пользователя
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.MPC\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.MPC\UserChoice" "Progid" "Aimp.File"

WriteRegStr HKLM "Software\Classes\.OGG" "" "Aimp.File"
WriteRegStr HKLM "Software\Classes\Aimp.File" "" "Aimp Media File"
WriteRegStr HKLM "Software\Classes\Aimp.File\DefaultIcon" "" "$INSTDIR\Icons\Black Style.dll,8"
; ставим приложением по умолчанию для текущего пользователя
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.OGG\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.OGG\UserChoice" "Progid" "Aimp.File"


WriteRegStr HKLM "Software\Classes\.acs3" "" "Aimp.File"
WriteRegStr HKLM "Software\Classes\Aimp.File" "" "Aimp Media File"
WriteRegStr HKLM "Software\Classes\Aimp.File\DefaultIcon" "" "$INSTDIR\Icons\Black Style.dll,10"
; ставим приложением по умолчанию для текущего пользователя


WriteRegStr HKLM "Software\Classes\.acs2" "" "Aimp.File"
WriteRegStr HKLM "Software\Classes\Aimp.File" "" "Aimp Media File"
WriteRegStr HKLM "Software\Classes\Aimp.File\DefaultIcon" "" "$INSTDIR\Icons\Black Style.dll,10"
; ставим приложением по умолчанию для текущего пользователя


WriteRegStr HKLM "Software\Classes\.WAV" "" "Aimp.File"
WriteRegStr HKLM "Software\Classes\Aimp.File" "" "Aimp Media File"
WriteRegStr HKLM "Software\Classes\Aimp.File\DefaultIcon" "" "$INSTDIR\Icons\Black Style.dll,11"
; ставим приложением по умолчанию для текущего пользователя
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.WAV\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.WAV\UserChoice" "Progid" "Aimp.File"


WriteRegStr HKLM "Software\Classes\.WMA" "" "Aimp.File"
WriteRegStr HKLM "Software\Classes\Aimp.File" "" "Aimp Media File"
WriteRegStr HKLM "Software\Classes\Aimp.File\DefaultIcon" "" "$INSTDIR\Icons\Black Style.dll,12"
; ставим приложением по умолчанию для текущего пользователя
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.WMA\UserChoice"
WriteRegStr HKCU "

Помоги kotkovets

diakov 25-12-2011 12:22 1821904

Разобрался сделав так

Код:

WriteRegStr HKLM "Software\Classes\.mp3" "" "mp3.File"
WriteRegStr HKLM "Software\Classes\mp3.File" "" "mp3 Media File"
WriteRegStr HKLM "Software\Classes\mp3.File\DefaultIcon" "" "$INSTDIR\Icons\Black Style.dll,6"
WriteRegStr HKLM "Software\Classes\mp3.File\shell\open\command" "" "$\"$INSTDIR\AIMP2.exe$\" $\"%1$\""
; ставим приложением по умолчанию для текущего пользователя
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.mp3\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.mp3\UserChoice" "Progid" "mp3.File"
; ставим приложением по умолчанию для текущего пользователя

WriteRegStr HKLM "Software\Classes\.WAV" "" "Aimp.File"
WriteRegStr HKLM "Software\Classes\WAV.File" "" "WAV Media File"
WriteRegStr HKLM "Software\Classes\WAV.File\DefaultIcon" "" "$INSTDIR\Icons\Black Style.dll,11"
WriteRegStr HKLM "Software\Classes\WAV.File\shell\open\command" "" "$\"$INSTDIR\AIMP2.exe$\" $\"%1$\""
; ставим приложением по умолчанию для текущего пользователя
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.WAV\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.WAV\UserChoice" "Progid" "WAV.File"

Плюс в секции удаление отметил восстановление по дефолту ассоциаций

Код:

WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.mp3" "" ""
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.mp3\OpenWithList" "a" "wmplayer.exe"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.mp3\UserChoice" "Progid" "WMP11.AssocFile.MP3"

WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.aac" "" ""
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.aac\OpenWithList" "a" "wmplayer.exe"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.aac\UserChoice" "Progid" "WMP11.AssocFile.aac"

WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.wav" "" ""
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.wav\OpenWithList" "a" "wmplayer.exe"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.wav\UserChoice" "Progid" "WMP11.AssocFile.wav"


diakov 25-12-2011 12:58 1821922

kotkovets, теперь такая проблемка, не знаю даже возможно ли её исправить...
есть такие записи

Код:

WriteRegStr HKLM "SOFTWARE\Classes\*\shellex\ContextMenuHandlers\AIMPClassic" "" "{1F77B17B-F531-44DB-ACA4-76ABB5010A28}"
WriteRegStr HKLM "SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}" "" "AIMP2: ShellExt"
WriteRegStr HKLM "SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}\InprocServer32" "" "C:\PROGRA~1\AIMP2\System\AIMP_S~1.DLL"
WriteRegStr HKLM "SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}\InprocServer32" "ThreadingModel" "Apartment"
WriteRegStr HKLM "SOFTWARE\Classes\Directory\shellex\ContextMenuHandlers\AIMPClassic" "" "{1F77B17B-F531-44DB-ACA4-76ABB5010A28}"

они отвечают за такое



Но это действует только в х86, а на х64 даже при установке с оригинального инсталлятора такого контекста нет...
Как это моно поправь, и возможно ли вообще?

И еще как проверить не установлена ли программа в системе при запуске инсталятора???

kotkovets 25-12-2011 13:33 1821953

diakov,
Вам нужно регистрировать библиотеку aimp_shell.dll, а не ламерские и глупые сообщения разводить...
Код:

Regdll "путь к aimp_shell.dll"
и разрегистрация:
Код:

UnRegdll "путь к aimp_shell.dll"
Для контекстного меню AIMP3 есть файлики:
aimp_menu32.dll
aimp_menu64.dll
Эти файлики регистрируются, так:
Код:

regdll "$INSTDIR\Modules\aimp_menu32.dll" ContextMenuAddonRegister
разрегистрация:
Код:

regdll "$INSTDIR\Modules\aimp_menu32.dll" ContextMenuAddonUnregister
Цитата:

Цитата diakov
И еще как проверить не установлена ли программа в системе при запуске инсталятора??? »

Проверяйте путь, куда устанавливали программу - IfFileExists
--
Книжки читайте, там все расписано.

diakov 25-12-2011 14:24 1821979

Если что извините за торможение я просто еще учусь....

kotkovets 25-12-2011 14:28 1821982

diakov, Не нужно извиняться, просто почитайте, поэкспериментируйте, а затем пишите,
а то не гоже - тот час писать, не получается, толком не разобравшись.

diakov 25-12-2011 14:33 1821986

да не тот час, если есть предположения то я экспериментирую, а если нет то спаршиваю...

з регистрацией и ассоциацией сидел часа 4 глаза с ночи красные как у быка! Но разобрался :ok:

wolkow70 25-12-2011 15:48 1822038

diakov,


IfFileExists "$PROGRAMFILES\AIMP3\AIMP3.exe" 0 CheckProfiles
Goto CheckComplete
;
CheckProfiles:
IfFileExists "$APPDATA\AIMP3\AIMP3.INI" 0 CheckComplete
;
CheckComplete:
MessageBox MB_ICONINFORMATION|MB_OK "AIMP3 уже установлен, или на вашем компьютере есть настройки этого приложения. Данный инсталлятор не может быть использован поверх AIMP3"
Abort

Это обязательное требование автора программы для участников этого форума.

diakov 25-12-2011 16:29 1822073

wolkow70, а если пользователь установил прогу не в $PROGRAMFILES а AIMP3.INI нет тода как?

kotkovets 25-12-2011 16:58 1822093

wolkow70,
Совершенно неверная логика, которая всегда приведет к сообщению, что AIMP3 установлен!
А Вот так правильна, логика ИЛИ
Код:

${If} ${FileExists} "$PROGRAMFILES\AIMP3\AIMP3.exe"
${OrIf} ${FileExists} "$APPDATA\AIMP3\AIMP3.INI"
${OrIf} ${FileExists} "$INSTDIR\AIMP3\AIMP3.INI"
      MessageBox MB_ICONINFORMATION|MB_OK "AIMP3 уже установлен, или на вашем компьютере есть настройки этого приложения. Данный инсталлятор не может быть использован поверх AIMP3"         
 Abort
${EndIf}

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

wolkow70 25-12-2011 17:50 1822141

Цитата:

Цитата diakov
wolkow70, а если пользователь установил прогу не в $PROGRAMFILES а AIMP3.INI нет тода как? »

Это требование автора, а не мое. Видимо его беспокоит только стандартная установка.

Цитата:

Цитата kotkovets
wolkow70,
Совершенно неверная логика »

Это не я придумал, а выдернул из скрипта, который тут на форуме выложен.
Там так:
Function .onInit

--бла-бла--

;Выполняем требования автора проекта.
StrCpy $Violation 0
;
IfFileExists "$PROGRAMFILES\AIMP3\AIMP3.exe" 0 CheckProfiles
StrCpy $Violation 1
Goto CheckComplete
;
CheckProfiles:
IfFileExists "$APPDATA\AIMP3\AIMP3.INI" 0 CheckComplete
;
StrCpy $Violation 1
;
CheckComplete:
StrCmp $Violation 1 0 +4
HideWindow
MessageBox MB_ICONINFORMATION|MB_OK "AIMP3 уже установлен, или на вашем компьютере есть настройки этого приложения. Данный инсталлятор не может быть использован поверх AIMP3"
Abort
EndFunc:
FunctionEnd

diakov 25-12-2011 17:58 1822148

kotkovets, подскажи, ато счас криша поедет :help:

такой код для IcoFX2 отлично работает и на ссклинер такой ставил тоже работает и с /S /inst и с /S /port

Код:

Function .onInit
  InitPluginsDir ;иницилизируем рабочую папку, куда будут распакованы картинки
  File "/oname=$PLUGINSDIR\nsis-r.bmp" "${NSISDIR}\Contrib\Graphics\Header\nsis-r.bmp"
  File "/oname=$PLUGINSDIR\orange-r.bmp" "${NSISDIR}\Contrib\Graphics\Header\orange-r.bmp"
 
  ClearErrors
  ${GetOptions} "$CMDLINE" "/port" $R0
  ${If} ${Silent} ;если тихий режим
    ${IfNot} ${Errors}
          SetOutPath "$EXEDIR\IcoFX2Portable"
            File /r "D:\IcoFX\IcoFX 2.0\*.*"
  CreateDirectory "$APPDATA\IcoFX2"
  SetOutPath "$APPDATA\IcoFX2"
  File /r "D:\IcoFX\IcoFX2\*.*"
      ;тут пишем все команды при распаковки портативной версии
      ;здесь будет код выполняться с ключом /port в тихом режиме
        StrCpy $Radio1 1 ;распаковка портативной версии
        StrCpy $Radio 0 ;запрет установки в обычном режиме
    ${Else}
    ${GetOptions} "$CMDLINE" "/inst" $R0
      SetOutPath "$INSTDIR"
        StrCpy $Radio1 0 ;запрет портативной версии
        StrCpy $Radio 1 ;установка в обычном режиме 
        StrCpy $Check2 1
        StrCpy $Check 1
        StrCpy $Check1 1
        MessageBox MB_OK "${PRODUCT_NAME} ${PRODUCT_VERSION} установлена в тихом режиме."
    ClearErrors
  ${EndIf}
  ${EndIf}
FunctionEnd

и такой же только для аимпа не работает :durak:

Код:

Function .onInit
  InitPluginsDir ;иницилизируем рабочую папку, куда будут распакованы картинки
  File "/oname=$PLUGINSDIR\nsis-r.bmp" "${NSISDIR}\Contrib\Graphics\Header\nsis-r.bmp"
  File "/oname=$PLUGINSDIR\orange-r.bmp" "${NSISDIR}\Contrib\Graphics\Header\orange-r.bmp"
 
 ClearErrors
  ${GetOptions} "$CMDLINE" "/port" $R0
  ${If} ${Silent} ;если тихий режим
    ${IfNot} ${Errors}
          SetOutPath "$EXEDIR\AIMPPortable"
            File /r "D:\Aimp\AIMP2\*.*"
      ;тут пишем все команды при распаковки портативной версии
      ;здесь будет код выполняться с ключом /port в тихом режиме
        StrCpy $Radio1 1 ;распаковка портативной версии
        StrCpy $Radio 0 ;запрет установки в обычном режиме
        StrCpy $Check3 1
    ${Else}
    ${GetOptions} "$CMDLINE" "/inst" $R0
      SetOutPath "$INSTDIR"
        StrCpy $Radio1 0 ;запрет портативной версии
        StrCpy $Radio 1 ;установка в обычном режиме 
        StrCpy $Check2 1
        StrCpy $Check 1
        StrCpy $Check1 1
        StrCpy $Check3 1
        MessageBox MB_OK "${PRODUCT_NAME} ${PRODUCT_VERSION} установлена в тихом режиме."
    ClearErrors
  ${EndIf}
  ${EndIf}
FunctionEnd

Просто мелькает черное кошко командной строки и все..
Как так?????????????

wolkow70 25-12-2011 17:58 1822149

Цитата:

Цитата kotkovets
Путь можно из реестра получать, например, при регистрации библиотеки оболочки,
можно получить путь к dll, т.е папку установленной программы, затем проверяем наличие выше указанных файлов. »

А зачем жизнь усложнять. Автор требует проверять стандартные пути.

diakov 25-12-2011 18:21 1822166

Все разобрался...оказывается у меня имя екзешника AIMP-3.0.0.970 RC3.exe переименовал его на AIMP-3.0.0.970.exe

и все заработало)

kotkovets 25-12-2011 18:23 1822168

diakov, Сколько можно а...вы прикалываетесь или мегамоск спать хочет?
ЕСЛИ, $Radio1 = 1 ---> распаковка портативной версии
Какого? в функции .onInit писать распаковку, если распаковываться будет из секции, дважды распаковка O_o
уберите
Код:

SetOutPath "$EXEDIR\AIMPPortable"
            File /r "D:\Aimp\AIMP2\*.*"

Просто возьмите в портабле в вместо выше кода, пишите, принудительно установите значение $INSTDIR:
Код:

StrCpy "$INSTDIR" "$EXEDIR\AIMPPortable"
Читайте книжки, в оригинальной справке введите, поиск по индексу: GetOptions
${GetOptions} "$CMDLINE" "/inst" $R0 - уберите это зло :)
Зачем вам куча ключей, когда вам достаточно ключа (/port) портативной установки в тихом режиме
Нет ключа этого в тихом режиме - обычная установка в тихом режиме.
Че тебе старче надо то еще??? :biggrin:

wolkow70 25-12-2011 18:30 1822175

diakov,
Вы не обращали внимание, что оригинальный инсталлятор ставит ассоциации в HKCU, и там же прописывает $ClassName?

diakov 25-12-2011 18:35 1822180

Затупил согласен)
Цитата:

Цитата kotkovets
${GetOptions} "$CMDLINE" "/inst" $R0 »

ну это же не ошибка? просто я хочу два ключа порт - портативка а инст - иснталяция)

Цитата:

Цитата wolkow70
Вы не обращали внимание, что оригинальный инсталлятор ставит ассоциации в HKCU, и там же прописывает $ClassName? »

Это Вы к чему?

kotkovets 25-12-2011 18:51 1822195

Цитата:

Цитата diakov
ну это же не ошибка? просто я хочу два ключа порт - портативка а инст - иснталяция) »

Не ошибка, зачем усложнять код, который вы до конца не понимаете???
А что будет, если создать поддержку ключа /inst, запустив установщик с ключом /S ???
А будет, тоже самое, что с ключом /inst !, отсюда вывод -
не нужно усложнять сложное - себе же мозг выносить, причем понапрасну :yes:

wolkow70 25-12-2011 19:15 1822221

Цитата:

Цитата diakov
Это Вы к чему? »

К тому, что это неправильно. Но, иногда нужно подстраиваться под поведение программы для дальнейшего с ней взаимодействия.


Себе я сборку собрал уже. Все работает. Проблему наблюдаю только с регистрацией библиотеки
RegDLL "$INSTDIR\Modules\aimp_menu32.dll"
Впрочем проблема наблюдается и при использовании коммандной строки и программы RegDlllview? Ну не хочет она ни регистрироваться ни де-регистрироваться, хотя через саму программу запросто.

diakov 25-12-2011 19:23 1822226

wolkow70, не знаю как у Вас но меня после установки AIMP 3.00 Build 970 RC 3 вообще никаких ассоциаций с медиа файлами не было

только эти строки появились

WriteRegStr HKLM "SOFTWARE\Classes\*\shellex\ContextMenuHandlers\AIMPClassic" "" "{1F77B17B-F531-44DB-ACA4-76ABB5010A28}"
WriteRegStr HKLM "SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}" "" "AIMP2: ShellExt"
WriteRegStr HKLM "SOFTWARE\Classes\Directory\shellex\ContextMenuHandlers\AIMPClassic" "" "{1F77B17B-F531-44DB-ACA4-76ABB5010A28}"
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}\InprocServer32" "" "$INSTDIR\System\aimp_shell.dll"
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}\InprocServer32" "ThreadingModel" "Apartment"

а я уже настроил по своему....плюс подключил библиотеку иконок и привязал к аудио Black Style.dll

kotkovets 25-12-2011 19:27 1822231

Цитата:

Цитата wolkow70
Себе я сборку собрал уже. Все работает. Проблему наблюдаю только с регистрацией библиотеки
RegDLL "$INSTDIR\Modules\aimp_menu32.dll" »

Дело в том, что Regdll вызывает в библиотеке сервера стандартную процедуру регистрации - DllRegisterServer
Однако, разработчик может сменить название процедуры регистрации, что позволяет и NSIS.
А команда UnRegDll вызывает только - DllUnregisterServer,
поэтому разрегистрацию производим тоже, через Regdll.
http://forum.oszone.net/post-1821953-2142.html
В х64 пока прокатил такой вот вариант:
Код:

Windows Registry Editor Version 5.00


[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\shellex\ContextMenuHandlers\AIMP]
@="{1F77B17B-F531-44DB-ACA4-76ABB5010A28}"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\*\shellex\ContextMenuHandlers\AIMP]
@="{1F77B17B-F531-44DB-ACA4-76ABB5010A28}"


[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}]
@="AIMP ShellExt Unit"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}\InprocServer32]
@="D:\\AIMP3\\Modules\\aimp_menu64.dll"
"ThreadingModel"="Apartment"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved]
"{1F77B17B-F531-44DB-ACA4-76ABB5010A28}"="AIMP ShellExt Unit"


wolkow70 26-12-2011 10:50 1822565

Цитата:

Цитата kotkovets
поэтому разрегистрацию производим тоже, через Regdll. »

Я решил перестраховаться и все еще перед вызовом регистрации продублировал в ручную. Сработает - перезапишет. Если сбой будет - не страшно.

Код:

Section "Расширенная интеграция в контекстое меню Проводника" ContextMenu
SectionIn 1 2
SetOutPath "$INSTDIR"
WriteRegStr HKLM "SOFTWARE\Classes\Directory\shellex\ContextMenuHandlers\AIMP" "" "{1F77B17B-F531-44DB-ACA4-76ABB5010A28}"
WriteRegStr HKLM "SOFTWARE\Classes\*\shellex\ContextMenuHandlers\AIMP" "" "{1F77B17B-F531-44DB-ACA4-76ABB5010A28}"
WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved" "{1F77B17B-F531-44DB-ACA4-76ABB5010A28}" "AIMP ShellExt Unit"
;
${If} ${RunningX64}
WriteRegStr HKLM "SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}" "" "AIMP ShellExt Unit"
WriteRegStr HKLM "SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}\InprocServer32" "" "$INSTDIR\Modules\aimp_menu64.dll"
WriteRegStr HKLM "SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}\InprocServer32" "ThreadingModel" "Apartment"
;
regdll "$INSTDIR\Modules\aimp_menu64.dll" ContextMenuAddonRegister
${Else}
WriteRegStr HKLM "SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}" "" "AIMP ShellExt Unit"
WriteRegStr HKLM "SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}\InprocServer32" "" "$INSTDIR\Modules\aimp_menu32.dll"
WriteRegStr HKLM "SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}\InprocServer32" "ThreadingModel" "Apartment"
;
regdll "$INSTDIR\Modules\aimp_menu32.dll" ContextMenuAddonRegister
${EndIf}       
SectionEnd

В удалялке тоже продублировал в ручную.

sk07 26-12-2011 11:38 1822582

Цитата:

Цитата kotkovets
Читайте NSIS\Docs\nsDialogs\Readme.html там все расписано с примерами, ничего нестандартного в скрипте нет,
я потратил на создание скрипта 20 минут и +10 минут на чтение доков. Во общем пример для всех.
читать дальше»

всё тоже самое можно как-то реализовать для Classic UI ?

kotkovets 26-12-2011 11:39 1822583

wolkow70, в х32 не нужно дублировать реестр, достаточно процедуры регистрации,
проверил на чистой оси XP - 100% вариант.
А вот x64 немного сложнее, в папке Modules программы должны обязательно
присутствовать 2 файла: aimp_menu32.dll и aimp_menu64.dll
При добавлени записей в реестр скорее всего нужно переключать 64-битный вид реестра.
Пока только проверял добавления записей реестра с файла reg, а не установщиком.
И скорее всего нужно в х64 регистрировать тоже aimp_menu32.dll , а затем добалять ключи регистрации aimp_menu64.dll - проверю отпишусь.
Цитата:

всё тоже самое можно как-то реализовать для Classic UI ?
Да, с добавлением хедера в тело скрипта:
Код:

!include "nsDialogs.nsh"
И мелкими изменениями, изменения координат контролов,
пробуйте и вылаживайте, если что-то не получается, то
я попробую добавить мозгов скрипту.

wolkow70 26-12-2011 11:55 1822588

Что бы контекстное меню сразу запустилось после установки нужно создать в папке профиля ini-файл. Таким макаром:
Код:

SetShellVarContext current
SetOutPath "$APPDATA\AIMP3"
WriteINIStr "$APPDATA\AIMP3\aimp3_menu.ini" "Menu" "SubItemsCount" "3"
WriteINIStr "$APPDATA\AIMP3\aimp3_menu.ini" "Menu" "SubItem1" "MenuItemPlay"
WriteINIStr "$APPDATA\AIMP3\aimp3_menu.ini" "Menu" "SubItem2" "MenuItemInsert"
WriteINIStr "$APPDATA\AIMP3\aimp3_menu.ini" "Menu" "SubItem3" "MenuItemEditTags"
WriteINIStr "$APPDATA\AIMP3\aimp3_menu.ini" "Menu" "Cascade" "1"
WriteINIStr "$APPDATA\AIMP3\aimp3_menu.ini" "Menu" "ExtsEdit" "*.ape;*.mac;*.wma;*.wv;*.flac;*.fla;*.ogg;*.oga;*.ofr;*.ofs;*.tak;*.mp3;*.aac;*.mpc;*.mp+;*.tta;"
WriteINIStr "$APPDATA\AIMP3\aimp3_menu.ini" "Menu" "ExtsPlay" "*.mp3;*.mp2;*.mp1;*.ogg;*.oga;*.umx;*.mod;*.mo3;*.it;*.s3m;*.mtm;*.xm;*.wav;*.m3u;*.m3u8;*.aimppl;*.plc;*.pls;*.xspf;*.wax;*.asx;*.cue;"
WriteINIStr "$APPDATA\AIMP3\aimp3_menu.ini" "Menu" "ExtsLists" "*.m3u;*.m3u8;*.aimppl;*.plc;*.pls;*.xspf;*.wax;*.asx;*.cue;"
;
WriteINIStr "$APPDATA\AIMP3\aimp3_menu.ini" "MenuItemPlay" "Application" "AIMP3.exe"
WriteINIStr "$APPDATA\AIMP3\aimp3_menu.ini" "MenuItemPlay" "Filter" "ExtsPlay"
WriteINIStr "$APPDATA\AIMP3\aimp3_menu.ini" "MenuItemPlay" "SendParams" "/ADD_PLAY %1"
WriteINIStr "$APPDATA\AIMP3\aimp3_menu.ini" "MenuItemPlay" "SupportFiles" "1"
WriteINIStr "$APPDATA\AIMP3\aimp3_menu.ini" "MenuItemPlay" "SupportDirs" "1"
WriteINIStr "$APPDATA\AIMP3\aimp3_menu.ini" "MenuItemPlay" "WndClass" "TAIMP2Player"
WriteINIStr "$APPDATA\AIMP3\aimp3_menu.ini" "MenuItemPlay" "Caption" "$CONTEXT->1"
;
WriteINIStr "$APPDATA\AIMP3\aimp3_menu.ini" "MenuItemInsert" "Application" "AIMP3.exe"
WriteINIStr "$APPDATA\AIMP3\aimp3_menu.ini" "MenuItemInsert" "Filter" "ExtsPlay"
WriteINIStr "$APPDATA\AIMP3\aimp3_menu.ini" "MenuItemInsert" "SendParams" "/INSERT %1"
WriteINIStr "$APPDATA\AIMP3\aimp3_menu.ini" "MenuItemInsert" "SupportFiles" "1"
WriteINIStr "$APPDATA\AIMP3\aimp3_menu.ini" "MenuItemInsert" "SupportDirs" "1"
WriteINIStr "$APPDATA\AIMP3\aimp3_menu.ini" "MenuItemInsert" "WndClass" "TAIMP2Player"
WriteINIStr "$APPDATA\AIMP3\aimp3_menu.ini" "MenuItemInsert" "Caption" "$CONTEXT->2"

WriteINIStr "$APPDATA\AIMP3\aimp3_menu.ini" "MenuItemEditTags" "Application" "AIMP3ate.exe"
WriteINIStr "$APPDATA\AIMP3\aimp3_menu.ini" "MenuItemEditTags" "Filter" "ExtsEdit"
WriteINIStr "$APPDATA\AIMP3\aimp3_menu.ini" "MenuItemEditTags" "SendParams" "%1"
WriteINIStr "$APPDATA\AIMP3\aimp3_menu.ini" "MenuItemEditTags" "SupportFiles" "1"
WriteINIStr "$APPDATA\AIMP3\aimp3_menu.ini" "MenuItemEditTags" "SupportDirs" "1"
WriteINIStr "$APPDATA\AIMP3\aimp3_menu.ini" "MenuItemEditTags" "WndClass" "TAIMPATEForm"
WriteINIStr "$APPDATA\AIMP3\aimp3_menu.ini" "MenuItemEditTags" "Caption" "$CONTEXT->5"


wolkow70 26-12-2011 13:25 1822637

AIMP3 не видит ассоциации, прописанные в HKLM, даже, если они полностью зеркалятся в HKCR. В окне программы отражаются зарегистрированными только расширения, ассоциированные в HKCU.
Сейчас потестировал аддон от Habetdin. У него просто дублируются записи в HKLM и в HKCU.
Причем попробовал в реестре удалить значения в HKCU и в окне ассоциаций галочки пропали.
Нелепость какая-то. Что-бы тут придумать?

diakov 26-12-2011 22:20 1823000

Доброго времени суток господа! Исследуя тернистые тропы Nsis нарисовалось два вопроса! kotkovets, подскажи
при установке Foxit PhantomPDF Business увидел: при нажатии кнопки help появляется такое окно, как такое реализовать в нсис??

и второе при запуске инсталлятора аимп идет его распаковка и появляется такое окошко (статус распаковки) как самому такое смастерить?


Спасибо!

kotkovets 27-12-2011 00:15 1823031

Цитата:

Цитата diakov
как самому такое смастерить? »

Вообще это 7z SFX модифицированный модуль - распаковка файлов и запуск установщика.
Такое окошко в NSIS, похожее, появится при объемном установщике и сильном сжатии установщика.
Подобное окошко можно с имитировать еще с помощью:
http://nsis.sourceforge.net/Nxs_plug-in
Цитата:

Цитата diakov
Foxit PhantomPDF Business увидел: при нажатии кнопки help появляется такое окно »

Такие странички делаются в NSIS только с помощью плагинов, причем своих написанных,
и нет такой необходимости отрисовывать подобное.
Вообще это инсталлятор msi... и для этого есть страничка лицензии.
Вы хоть разберитесь в простых вещах, а то не с того краю начинаете изучать...

silione 28-12-2011 18:27 1824273

Есть ли возможность осуществить такое:
Имеется 3 компонента установки на выбор.
В случае выбора только компонента 1, установка завершается без показа финишной страницы.
В случае выбора только компонента 2 или 1+2, установка завершается с показом финишной страницы v1.
В случае выбора только компонента 3 или 1+3, установка завершается с показом финишной страницы v2.
В случае выбора компонентов 2+3 или 1+2+3, установка завершается с показом финишной страницы v3.

Смысл этого всего в том, что компоненты установки 2 и 3 имеют разные инструкции необходимые к выполнению по завершении установки (1-ый компонент дополнительных инструкций не имеет). Инструкции эти я как раз вывожу на финишной странице.

Или может есть еще какой-то вариант, без финишной страницы? Подскажите пожалуйста.

kotkovets 28-12-2011 20:07 1824329

Цитата:

Цитата silione
Или может есть еще какой-то вариант, без финишной страницы? Подскажите пожалуйста »

Да куча вариантов, рисуйте свои странички.
Откажитесь в конце концов от странички финиша...
Цитата:

Цитата silione
В случае выбора только компонента 2 или 1+2, установка завершается с показом финишной страницы v1.
В случае выбора только компонента 3 или 1+3, установка завершается с показом финишной страницы v2.
В случае выбора компонентов 2+3 или 1+2+3, установка завершается с показом финишной страницы v3. »

А что значат финишные странички v1,v2,v3 - ?? - O_o, вам достаточно переотрисовывать,
переименовывать компоненты финишной странички, во время открытия странички (callback функция)
Цитата:

Цитата silione
В случае выбора только компонента 1, установка завершается без показа финишной страницы »

В этом случае обычное прерывание установки --> Abort,
ессно до этой команды, выполняем необходимые действия при выборе компонента 1.

diakov 29-12-2011 17:41 1825017

Добрый день! kotkovets, есть идея подключить 4 радиобутона (2 на одну прогу, 2 на вторую), вот код для 2

Код:

Function switching
  ${NSD_GetState} $RadioButton $Radio ;снимаем статус отметки радиобуттона
  ${If} $Radio == 1                  ;если радибуттон "Установка обычной версии" отмеченный то...
      EnableWindow $CheckBox 1
      EnableWindow $CheckBox1 1
      EnableWindow $CheckBox2 1
      EnableWindow $CheckBox3 1
      ${NSD_SetState} $CheckBox 1
      ${NSD_SetState} $CheckBox1 1
      ${NSD_SetState} $CheckBox2 1
      ${NSD_SetState} $CheckBox3 1
      ${NSD_FreeImage} $ImageHandle                  ;удаляем картинку
      ${NSD_SetImage} $Image "$PLUGINSDIR\nsis-r.bmp" $ImageHandle  ;загружаем картинку
  ${Else}                          ;если радибуттон "Установка обычной версии" неотмеченный то...
      EnableWindow $CheckBox 0    ;затеняем чекбокс
      EnableWindow $CheckBox1 0    ;затеняем чекбокс
      EnableWindow $CheckBox2 0    ;затеняем чекбокс
      EnableWindow $CheckBox3 0
      ${NSD_SetState} $CheckBox 0  ;делаем чекбокс неотмеченным
      ${NSD_SetState} $CheckBox1 0 ;делаем чекбокс неотмеченным
      ${NSD_SetState} $CheckBox2 0
      ${NSD_SetState} $CheckBox3 0
      ${NSD_FreeImage} $ImageHandle              ;удаляем картинку
      ${NSD_SetImage} $Image "$PLUGINSDIR\orange-r.bmp" $ImageHandle  ;загружаем картинку
  ${EndIf}
FunctionEnd

как реализовать такое для 4 радиобутонов ? На до ли подключать !include LogicLib.nsh

если делать так, то не работает...

Код:

Function switching
  ${NSD_GetState} $RadioButton $Radio ;снимаем статус отметки радиобуттона
  ${If} $Radio == 1                  ;если радибуттон "Установка обычной версии" отмеченный то...
События
      ${NSD_FreeImage} $ImageHandle                  ;удаляем картинку
      ${NSD_SetImage} $Image "$PLUGINSDIR\nsis-r.bmp" $ImageHandle  ;загружаем картинку
  ${ElseIf}  $Radio1 == 1                        ;если радибуттон "Установка обычной версии" неотмеченный то...
    события
      ${NSD_FreeImage} $ImageHandle              ;удаляем картинку
      ${NSD_SetImage} $Image "$PLUGINSDIR\orange-r.bmp" $ImageHandle  ;загружаем картинку
  ${ElseIf}  $Radio2 == 1                        ;если радибуттон "Установка обычной версии" неотмеченный то...
    события
  ${ElseIf}  $Radio3 == 1                        ;если радибуттон "Установка обычной версии" неотмеченный то...
    события
  ${EndIf}
FunctionEnd


kotkovets 29-12-2011 18:59 1825079

Цитата:

Цитата diakov
если делать так, то не работает... »

что не работает?

diakov 29-12-2011 19:11 1825090

Суть идеи такова, хочу запихнуть в один инстальник Wise Disk Cleaner и Wise Registry Cleaner. Так хочу чтобы когда $Radio == 1 установка обычной версии Wise Disk Cleaner и чекбоксы ярлыки на робочем столе и в меню пуск активны и соответс. изображение nsis-r.bmp, если $Radio1 == 1 то распаковка портативной Wise Disk Cleaner и чекбоксы неактивны и соответс. изображение orange-r.bmp, если $Radio2 == 1 установка обычной версии Wise Registry Cleaner и чекбоксы ярлыки на робочем столе и в меню пуск активны и соответс. изображение nsis-r.bmp, если $Radio3 == 1 распаковка портативной версии Wise Registry Cleaner и чекбоксы ярлыки на робочем столе и в меню пуск не активны, вот пробовал так

Код:

Function switching
  ${NSD_GetState} $RadioButton $Radio ;снимаем статус отметки радиобуттона
  ${If} $Radio == 1                  ;если радибуттон "Установка обычной версии" отмеченный то...
событие
      ${NSD_SetImage} $Image "$PLUGINSDIR\nsis-r.bmp" $ImageHandle  ;загружаем картинку
  ${Elseif}  $Radio1 == 1                     
событие
      ${NSD_SetImage} $Image "$PLUGINSDIR\orange-r.bmp" $ImageHandle  ;загружаем картинку
  ${Elseif}  $Radio2 == 1 
событие
      ${NSD_SetImage} $Image "$PLUGINSDIR\nsis-r.bmp" $ImageHandle  ;загружаем картинку
${Elseif}  $Radio1 == 1                     
событие
      ${NSD_SetImage} $Image "$PLUGINSDIR\orange-r.bmp" $ImageHandle  ;загружаем картинку
  ${EndIf}
FunctionEnd

Не работает!Не меняет картинки, и не затеняет чекбоксы!

kotkovets 29-12-2011 19:30 1825098

Цитата:

Цитата diakov
Не работает!Не меняет картинки, и не затеняет чекбоксы! »

А почему оно будет какие либо действия???? Где функции обработки событий на клик радибуттона?
читать дальше »
Код:

!include "MUI2.nsh"
ShowInstDetails show
OutFile "Nstest.exe"

var dlg
var RadioButton
var RadioButton1

Page custom PageInit
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

Function PageInit
  !insertmacro MUI_HEADER_TEXT "О-па" "Вот оно как МИхалыч!"
  nsDialogs::Create 1018
  Pop $dlg
  ${NSD_CreateRadioButton} 0u 14u 120u 12u "RadioButton"
  Pop $RadioButton
  ${NSD_SetState} $RadioButton 1            ;делаем радиобутон отмеченным
  ${NSD_OnClick} $RadioButton RadioButton  ;событие отметки радиобутона
  ;;;;;;;;;
  ${NSD_CreateRadioButton} 0u 34u 120u 12u "RadioButton1"
  Pop $RadioButton1
  ${NSD_SetState} $RadioButton1 0            ;делаем радиобутон неотмеченным
  ${NSD_OnClick} $RadioButton1 RadioButton1  ;событие отметки радиобутона
  nsDialogs::Show
FunctionEnd

 ;функция события отметки радиобуттона
Function RadioButton
  Pop $RadioButton
  ${NSD_GetState} $RadioButton $R0
  ${If} $R0 == 1
        MessageBox MB_OK "RadioButton отмеченный" IDOK
  ${EndIf}
FunctionEnd

 ;функция события отметки радиобуттона1
Function RadioButton1
  Pop $RadioButton1
  ${NSD_GetState} $RadioButton1 $R0
  ${If} $R0 == 1
        MessageBox MB_OK "RadioButton1 отмеченный" IDOK
  ${EndIf}
FunctionEnd

Section
SectionEnd


diakov 29-12-2011 20:32 1825136

Спасибо счас бду розбирацо!)

diakov 29-12-2011 23:27 1825264

kotkovets, все получилось но вот теперь такой вопрос... вот скрин



Как все таки правильно реализовать ключи командной строки для тихой установки, например:

Тихая установка Wise Registry Cleaner 6.21 /S /inst1 /
Тихая распаковка Wise Registry Cleaner 6.21 /S /port1 /
Тихая установка Wise Disk Cleaner 6.21 /S /inst2 /
Тихая распаковка Wise Disk Cleaner 6.21 /S /port2 /

пробовал как то так....не получается

Код:

ClearErrors
  ${GetOptions} "$CMDLINE" "/preg" $R0
  ${If} ${Silent} ;если тихий режим
    ${IfNot} ${Errors}
    StrCpy "$INSTDIR" "$EXEDIR\Wise Registry Cleaner"
      ;тут пишем все команды при распаковки портативной версии
      ;здесь будет код выполняться с ключом /port в тихом режиме
        StrCpy $Radio1 1 ;распаковка портативной версии
        StrCpy $Radio 0 ;запрет установки в обычном режиме
        StrCpy $Radio2 0
        StrCpy $Radio3 0
    ${Else}
    ${GetOptions} "$CMDLINE" "/instreg" $R0
      SetOutPath "$INSTDIR"
        StrCpy $Radio1 0 ;запрет портативной версии
        StrCpy $Radio 1 ;установка в обычном режиме
                StrCpy $Radio2 0
                StrCpy $Radio3 0
        StrCpy $Check 1
        StrCpy $Check1 1
        MessageBox MB_OK "Wise Registry Cleaner 6.21 установлен в тихом режиме."
${Else}
  ${GetOptions} "$CMDLINE" "/portdisk" $R0
  ${If} ${Silent} ;если тихий режим
    ${IfNot} ${Errors}
    StrCpy "$INSTDIR" "$EXEDIR\Wise Disk Cleaner 6.21"
      ;тут пишем все команды при распаковки портативной версии
      ;здесь будет код выполняться с ключом /port в тихом режиме
        StrCpy $Radio1 0 ;распаковка портативной версии
        StrCpy $Radio 0 ;запрет установки в обычном режиме
                StrCpy $Radio2 0
                StrCpy $Radio3 1
    ${Else}
    ${GetOptions} "$CMDLINE" "/instdisk" $R0
      SetOutPath "$INSTDIR"
        StrCpy $Radio1 0 ;запрет портативной версии
        StrCpy $Radio 0 ;установка в обычном режиме
        StrCpy $Radio2 1
        StrCpy $Radio3 0
        StrCpy $Check 1
        StrCpy $Check1 1
        MessageBox MB_OK "Wise Disk Cleaner 6.21 установлен в тихом режиме."
    ClearErrors
  ${EndIf}
  ${EndIf}


kotkovets 30-12-2011 01:05 1825299

diakov, Читайте GetOptions тысячу раз говорил, что ли трудно уделить полчаса справкам?
Или скопипастить, что тоже плохо получается или аля лижбы работала?
читать дальше »
Код:

!include "MUI2.nsh"
!include "FileFunc.nsh"
ShowInstDetails show
OutFile "keycmd.exe"

!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

Function .OnInit
${If} ${Silent}
    ClearErrors
    ${GetOptions} "$CMDLINE" "/inst=" $R0
    ${If} $R0 == 1
        MessageBox MB_ICONINFORMATION|MB_OK "Меня запустили тихо с ключом : /S /inst=1"
    ${ElseIf} $R0 == 2
        MessageBox MB_ICONINFORMATION|MB_OK "Меня запустили тихо с ключом : /S /inst=2"
    ${Else}
        ClearErrors
        ${GetOptions} "$CMDLINE" "/port=" $R0
        ${If} $R0 == 1
            MessageBox MB_ICONINFORMATION|MB_OK "Меня запустили тихо с ключом : /S /port=1"
        ${ElseIf} $R0 == 2
            MessageBox MB_ICONINFORMATION|MB_OK "Меня запустили тихо с ключом : /S /port=2"
        ${Else}
            ClearErrors
        ${EndIf}
    ${EndIf}
${EndIf}
FunctionEnd

Section
SectionEnd


diakov 30-12-2011 21:57 1825846

kotkovets, почему когда делаю так

Код:

${If} ${Silent}
    ClearErrors
    ${GetOptions} "$CMDLINE" "/inst=" $R0
    ${If} $R0 == 1
    SetOutPath "$INSTDIR"
        ;MessageBox MB_ICONINFORMATION|MB_OK "Меня запустили тихо с ключом : /S /inst=1"
        StrCpy $Radio == 1
        StrCpy $Check == 1
        StrCpy $Check1 == 1
    ${ElseIf} $R0 == 2
        ;MessageBox MB_ICONINFORMATION|MB_OK "Меня запустили тихо с ключом : /S /inst=2"
          StrCpy $Radio2 == 1
        StrCpy $Check == 1
        StrCpy $Check1 == 1
    ${Else}
        ClearErrors
        ${GetOptions} "$CMDLINE" "/port=" $R0
        ${If} $R0 == 1
        StrCpy "$INSTDIR" "$EXEDIR\Wise Registry Cleaner 6.21"
        StrCpy $Radio1 == 1
            ; MessageBox MB_ICONINFORMATION|MB_OK "Меня запустили тихо с ключом : /S /port=1"
        ${ElseIf} $R0 == 2
            ;MessageBox MB_ICONINFORMATION|MB_OK "Меня запустили тихо с ключом : /S /port=2"
            SetOutPath "$EXEDIR\Wise Disk Cleaner 6.21"
            StrCpy $Radio3 == 1
        ${Else}
            ClearErrors
        ${EndIf}
    ${EndIf}

не работает, а когда ставлю конкретно действия например вместо StrCpy $Radio1 == 1 пишу из секции:
Код:

SetOutPath "$INSTDIR"
File /r "D:\Registry\Wise Registry Cleaner\*.*"
CreateDirectory "$APPDATA\Wise Registry Cleaner"
  SetOutPath "$APPDATA\Wise Registry Cleaner"
  File /r "D:\Registry\config\*.*"

тогда работает?

kotkovets 30-12-2011 22:50 1825878

Цитата:

Цитата diakov
не работает, а когда ставлю конкретно действия »

Вы в секции определите, с каким условием, например, если $Radio1 == 1, то:
Код:

Section
  ${If} $Radio1 == 1
    ;действия
  ${EndIf}
SectionEnd

Почему я так говорю делать, да очень просто, если есть своя страничка и связанные действия, например с переменной
$Radio1, то при запуске в обычном режиме, вы манипулируете значением переменной $Radio1: отмечен или не отмечен
чекбокс(1 или 0 = $Radio). Еснно, что при запуске в тихом режиме никаких страничек нет, и переменная $Radio1 -
не иницилизирована, соответственно ничего выполняться не будет. Поэтому, если запуск в тихом режиме, то в функции
иницилизации, устанавливаем значение $Radio1: 0 или 1, т.е исходя из выбранных задач. Дальше в секции заданы условия выполненения тех или иных задач, читайте первое предложение сообщения.
Так что, "не работает" не принимается, ищите ошибки в своем скрипте.

frostyland 03-01-2012 11:07 1827356

Здравствуйте.
Простите, может повтор, но полторы сотни страниц не осилить быстро, а надо срочно.
Хочу поставить опцию "ярлык на рабочий стол", но локализуемую.
ТО есть, инсталлятор должен выбрать языковую константу "place link", "поместить ярлык...", "gemacht sheize ))" в зависимости от локали.
Заранее спасибо за подсказку.

Нашел ответ вот тут
Вкратце
Код:

LangString message ${LANG_ENGLISH} "English message"
LangString message ${LANG_FRENCH} "French message"
LangString message ${LANG_KOREAN} "Korean message"
MessageBox MB_OK "A translated message: $(message)"


frostyland 03-01-2012 12:21 1827387

А можно ли на штатное окно, например, MUI_PAGE_STARTMENU, добавить свой контрол.
Хочу, не плодя окон, добавить опцию установки ярлыка на рабочий стол

kotkovets 03-01-2012 15:07 1827463

Цитата:

Цитата frostyland
А можно ли на штатное окно, например, MUI_PAGE_STARTMENU, добавить свой контрол.
Хочу, не плодя окон, добавить опцию установки ярлыка на рабочий стол »

Нет, не позволяет штатный плагин(контрола не видно), альтернатива, на мой взгляд, своя страничка,
там уж добавите свой чекбокс: http://forum.oszone.net/post-1697090-1271.html

frostyland 04-01-2012 12:44 1828120

MUI_PAGE_STARTMENU: В секции Uninstall теряется нештатное значение переменной ICONS_GROUP

Трабла.
В инсталляторе использую страничку MUI_PAGE_STARTMENU:

Код:

...
!insertmacro MUI_PAGE_STARTMENU Application $ICONS_GROUP
...
Section -post
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
SetShellVarContext all
...
CreateDirectory "$SMPROGRAMS\$ICONS_GROUP"
CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\$(UNINST_TEXT) ${PRODUCT_NAME}.lnk" "$INSTDIR\uninst.exe"
CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\${PRODUCT_NAME}.lnk" "$INSTDIR\run.bat"
!insertmacro MUI_STARTMENU_WRITE_END
...
SectionEnd
...

Section "Uninstall"
...
!insertmacro MUI_STARTMENU_GETFOLDER "Application" $ICONS_GROUP
...
RMDir /r "$SMPROGRAMS\$ICONS_GROUP" ; !Вот тут берется умолчательное $ICONS_GROUP, а не то, которое задал пользователь при установке
...
SectionEnd

Но проблема в том, что при деинсталляции значение $ICONS_GROUP не запоминается, а подставляется по умолчанию.
Как следствие, стоит переименовать умолчательную папку в Диалоге MUI_PAGE_STARTMENU, и ее удаление не происходит.

Как быть?

kotkovets 04-01-2012 13:05 1828141

frostyland,
Из секций инсталлятора в секции деинсталлятора - никакие значения переменных не переносятся
и это очень правильно сделано.
Откуда узнать деинсталлятору, где юзер создал папку в меню Пуск ???
1. В инсталляторе записывать в реестр, путь к папке в меню Пуск.
2. В деинсталляторе считывать путь из реестра.
http://nsis.sourceforge.net/Frozen_Bubble
Цитата:

Цитата frostyland
Но проблема в том, что при деинсталляции значение $ICONS_GROUP не запоминается, а подставляется по умолчанию. »

Берется значение по умолчанию, из значения команды - Name

frostyland 04-01-2012 13:39 1828162

Цитата:

Цитата kotkovets
Из секций инсталлятора в секции деинсталлятора - никакие значения переменных не переносятся »

Уже понял, tnxx.
Цитата:

Цитата kotkovets
1. В инсталляторе записывать в реестр, путь к папке в меню Пуск.
2. В деинсталляторе считывать путь из реестра. »

Так и сделал.

diakov 07-01-2012 12:40 1830130

Привет kotkovets, с Рождеством! Есть такой вопрос! Вот хочу перепаковать Advanced SystemCare, и здесь нужно прописывать 127.0.0.1 iobit.com в файл hosts, тоесть заменить его при инсталяции нет проблем, а как именно дописать нужные строки (тоесть внести изменения в уже существующий файл hosts)?

И возможно ли при инсталяции принудительно отключить подключение к интернету, а по завершению включить???

kotkovets 07-01-2012 13:21 1830145

diakov, с Рождеством!
Цитата:

Цитата diakov
нужно прописывать 127.0.0.1 iobit.com в файл hosts »

Код:

!include "TextFunc.nsh"
#1933
Цитата:

Цитата diakov
И возможно ли при инсталяции принудительно отключить подключение к интернету, а по завершению включить??? »

Не знаю, может быть, но проверку делать, если есть активное подключение к сети - знаю.
читать дальше »
Код:

!define INTERNET_CONNECTION_MODEM      0x01
!define INTERNET_CONNECTION_LAN        0x02
!define INTERNET_CONNECTION_PROXY      0x04
!define INTERNET_RAS_INSTALLED          0x10
!define INTERNET_CONNECTION_OFFLINE    0x20
!define INTERNET_CONNECTION_CONFIGURED  0x40

OutFile GetInet.exe
ShowInstDetails show

Function FLAGS
  IntOp $1 $2 & ${INTERNET_CONNECTION_CONFIGURED}
  IntCmp $1 ${INTERNET_CONNECTION_CONFIGURED} +1 +2 +2
  DetailPrint "Система настроена для соединения с Интернетом"

  IntOp $1 $2 & ${INTERNET_CONNECTION_MODEM}
  IntCmp $1 ${INTERNET_CONNECTION_MODEM} +1 +2 +2
  DetailPrint "Для соединения с Интернетом используется модем"

  IntOp $1 $2 & ${INTERNET_RAS_INSTALLED}
  IntCmp $1 ${INTERNET_RAS_INSTALLED} +1 +2 +2
  DetailPrint "Установлена служба удаленного доступа (RAS)"

  IntOp $1 $2 & ${INTERNET_CONNECTION_PROXY}
  IntCmp $1 ${INTERNET_CONNECTION_PROXY} +1 +2 +2
  DetailPrint "Для соединения с Интернетом используется LAN"

  IntOp $1 $2 & ${INTERNET_CONNECTION_OFFLINE}
  IntCmp $1 ${INTERNET_CONNECTION_OFFLINE} +1 +2 +2
  DetailPrint "Система находится в автономном режиме"

  IntOp $1 $2 & ${INTERNET_CONNECTION_LAN}
  IntCmp $1 ${INTERNET_CONNECTION_LAN} +1 +2 +2
  DetailPrint "Для соединения с Интернетом используется LAN"
FunctionEnd

Section "GetInternet"
  System::Call "wininet.dll::InternetGetConnectedState(*i.r2, i0) i.r3"
  StrCmp $3 1 0 +2
  DetailPrint "Имеется активное подключение к Интернету"
  StrCmp $3 0 0 +2
  DetailPrint "Отсутствует активное подключение к Интернету"
  Call FLAGS
SectionEnd


diakov 07-01-2012 13:28 1830150

спасибо счас буду пробовать!

Цитата:

Цитата kotkovets
если есть активное подключение к сети - знаю. »

Тогда как сделать такое если подключение сети активное MessageBox Отключите подключение к интернету, а если нет тода вперед!)

kotkovets 07-01-2012 13:36 1830161

Цитата:

Цитата diakov
Тогда как сделать такое если подключение сети активное MessageBox »

Код:

  System::Call "wininet.dll::InternetGetConnectedState(*i.r2, i0) i.r3"
  StrCmp $3 1 0 +3
  MessageBox MB_OK "Имеется активное подключение к Интернету!$\nОтключите модем и еще что нибудь!" IDOK
  abort


diakov 07-01-2012 13:45 1830164

kotkovets, а что бы каждое значение было с новой строки так правильно будет???

Код:

FileWrite $0 "127.0.0.1 www.iobit.com"
FileWrite $0 "$\r$\n"
FileWrite $0 "127.0.0.1 iobit.com"
FileWrite $0 "$\r$\n"
FileWrite $0 "127.0.0.1 98.129.229.186"
FileWrite $0 "$\r$\n"
FileWrite $0 "127.0.0.1 www.iana.org"
FileWrite $0 "$\r$\n"
FileWrite $0 "127.0.0.1 iana.org"


kotkovets 07-01-2012 13:53 1830166

diakov, Правильно, но лучше писать так:
Код:

FileOpen $0 "$TEMP\temp.txt" w
FileWrite $0 "127.0.0.1 www.iobit.com$\r$\n\
127.0.0.1 iobit.com$\r$\n\
127.0.0.1 98.129.229.186$\r$\n\
127.0.0.1 www.iana.org$\r$\n\
127.0.0.1 iana.org$\r$\n"
FileClose $0

Имейте ввиду, что многие антивирусы не дают изменять файл hosts, следовательно нужно настраивать антивири - давать добро.

diakov 08-01-2012 12:35 1830811

kotkovets, не в курсе случайно, где Advanced SystemCare PRO хранит настройки активации, а то прогу активирую и не могу понять где изменения...в реестре ничего нет!

romgun 08-01-2012 12:45 1830818

Подскажите, пожалуйста, как сделать:
1) установщик должен добавить строку в файл "N.cfg" в раздел [Main]
В этом разделе у пользователя уже имеются записи:
аа.1=путь1
аа.2=путь2
...
аа.х=путь3
При этом количество пунктов мне неизвестно. Добавляемая строка должна быть "аа.х+1=мой путь". При этом "мой путь" определяется как папка в установленной $INSTDIR (берется из реестра).

2) установщик должен дописать определенный текст в конец файла "XX.xml" (encoding="Windows-1252")
<xx>
<Name>МММ</Name>
<Path>$INSTDIR\xx\МММ.exe</Path>
</xx>

kotkovets 08-01-2012 14:12 1830868

Цитата:

Цитата diakov
kotkovets, не в курсе случайно, где Advanced SystemCare PRO хранит настройки активации »

не знаю и нет желания узнавать и не пользуюсь такими родами программ...
Цитата:

Цитата romgun
установщик должен добавить строку в файл "N.cfg" в раздел [Main] »

WriteIniStr - поможет
Цитата:

Цитата romgun
Добавляемая строка должна быть "аа.х+1=мой путь" »

InTop - математика в цикле поможет...
Приводите свою реализацию задачи, вместе разберем и подправим: толику мозги добавим скрипту :)
Цитата:

Цитата romgun
установщик должен дописать определенный текст в конец файла "XX.xml" »

Цитата:

Цитата romgun
(encoding="Windows-1252") »

UTF-8
http://nsis.sourceforge.net/XML_plug-in - пробуйте плагом

kotkovets 08-01-2012 16:58 1830962

Наткнулся на плагин: InvokeShellVerb Plugin for NSIS
Этот плагин вызывает командную оболочку Shell: правой клавишей мышью - контектстное меню файлов и папок
и вызывает выбранный пункт меню на исполнение
Но напрямую использовать плагин совершенно неудобно, даже сказал бы - невозможно без определенных знаний.
Поэтому написал хедер для удобного использования плагина:
InvokeShellVerb.nsh
Код:

!ifndef INVOKESHELLVERB_INCLUDED
!define INVOKESHELLVERB_INCLUDED

!macro __DefineTaskbar Def ID
  !define ${Def}Taskbar "!insertmacro Shellverb ${ID}"
!macroend
!insertmacro __DefineTaskbar "PinTo" "5386"
!insertmacro __DefineTaskbar "UnPin" "5387"

!macro __DefinePusk Def ID
  !define ${Def}Pusk "!insertmacro Shellverb ${ID}"
!macroend

!insertmacro __DefinePusk "PinTo" "5381"
!insertmacro __DefinePusk "UnPin" "5382"

!macro __DefineAdmin Def ID
  !define ${Def}Admin "!insertmacro Shellverb ${ID}"
!macroend
!insertmacro __DefineAdmin "Run" "8505"

!macro Shellverb ID filename
  Push `${ID}`
  Push `${filename}`
  System::Store SR0R1
  IfFileExists `$R0` 0 +5
  System::Call "shlwapi::PathRemoveFileSpecW(wR0R3)"
  System::Call "shlwapi::PathStripPathW(wR0R2)"
  InvokeShellVerb::DoIt "$R3" "$R2" "$R1"
  Pop $R0
  System::Store L
!macroend

!endif


Сохраняем файл InvokeShellVerb.nsh (для юникодной NSIS - в любом юникоде) рядом со скриптом или в папке NSIS\Include
Скачиваем плагин, копируем InvokeShellVerb.dll (для юникодной NSIS файл берем из папки Unicode архива) в NSIS\Plugins
Далее подключаем хедер к телу скрипта:
Код:

!include "InvokeShellVerb.nsh"
Закрепляем приложение на панели задач
- только для Vista и выше, в Win8 - работает, платформа любая: х86 или х64.
Код:

${PinToTaskBar} "$WINDIR\notepad.exe"

Открепляем приложение от панели задач
- только для Vista и выше, в Win8 - работает, платформа любая: х86 или х64.
Код:

${UnPinTaskBar} "$WINDIR\notepad.exe"

Закрепляем приложение в меню «Пуск»

Код:

${PinToPusk} "$WINDIR\notepad.exe"

Открепляем приложение в меню «Пуск»

Код:

${UnPinPusk} "$WINDIR\notepad.exe"


XCV 09-01-2012 15:37 1831701

Не подскажет кто как средствами nsis создать переменную среды? сколько ни искал как это делать через реестр или командную строку - безуспешно... все на что натыкаюсь: http://support.microsoft.com/kb/310519/ru но делать для этого AutoIt скрипт и запихивать его в инсталятор - ИМХО некрасиво, может есть другой способ? (если это можно сделать, то может можно еще и дополнить существующую переменную?)
через "set variablename=значение" переменная не создается, точнее не остается в системе после отработки команды....
Сори, столько искал не мог найти, написал вопрос - нашел сам, сделать можно через реестр в ветке HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\
Только до сих пор не понимаю как дописать переменную, тоесть к примеру есть переменная "path=c:\windows", а надо "path=c:\windows;c:\my_papka"

romgun 09-01-2012 15:49 1831716

Цитата:

Цитата romgun
1) установщик должен добавить строку в файл "N.cfg" в раздел [Main]
В этом разделе у пользователя уже имеются записи:
аа.1=путь1
аа.2=путь2
...
аа.х=путь3
При этом количество пунктов мне неизвестно. Добавляемая строка должна быть "аа.х+1=мой путь". При этом "мой путь" определяется как папка в установленной $INSTDIR (берется из реестра)..

Цитата:

Цитата kotkovets
WriteIniStr - поможет InTop - математика в цикле поможет...

У меня была идея подсчитать кол-во упоминаний в файле выражения "аа.", добавить 1 и соответственно записать свое значение.
Но можно ли как то реализовать подсчет? Пока не могу найти ничего подходящего..

Сама строка вроде бы добавляется через WriteINIStr...

Код:

Section 
SetOutPath "$INSTDIR" 
GetFullPathName $0 .. 
ReadINIStr $1 "$INSTDIR\1.cfg" "main" "аа" 
IntOp $1 $1 + 1 
WriteINIStr $INSTDIR\1.cfg main "аа.$1" "$0\хх\ххх" 
FlushINI $INSTDIR\1.cfg
SectionEnd


kotkovets 09-01-2012 20:33 1831979

к сожалению ближайшую неделю полноценно не смогу помочь - в командировке.
XCV читайте сначала сначала значение patch в переменную $0, а затем записывате в реестр: "$0;My papka"
rogmun смотрите в папке примеров - WordFunc. Можно подсчитать количество совпадений части общих символов строки: аа..

romgun 10-01-2012 15:52 1832519

kotkovets, возвращайтесь скорее ))
Нужно применять WordFind?
В мануале вроде как речь идет о поиске файлов или я что-то не понял?
Код:

Example (Sum of words):

Section
        ${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" " C:\" "#" $R0
        ; $R0="3"
SectionEnd

Пробовал
Код:

${WordFind} "аа" "$INSTDIR\1.cfg" "#" $R0
в итоге дает $R0=0.

XCV 10-01-2012 18:26 1832614

Цитата:

Цитата kotkovets
XCV читайте сначала сначала значение patch в переменную $0, а затем записывате в реестр: "$0;My papka" »

попробовал сделать так, натолкнулся на следующий косяк:
Изначально patch имеет тип "reg_expand_sz", а после того как я делаю:
Код:

ReadRegStr $0 HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path"
WriteRegStr HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path" "$0;$INSTDIR"

он становится "reg_sz" и как следствие система "перестает видеть" служебные утилиты находящиеся к примеру в "%SystemRoot%\system32" (хотя моя библиотеки которые я добавлял этим инсталятором видятся нормально =) ) ну это конечно не дело, я так понимаю чтобы параметр "Path" остался "правильным" его надо добавлять с помощью команды:
Код:

WriteRegBin HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path" значение
но как определить тогда какое должно быть значение? "$0;$INSTDIR" - не прокатывает =(

Lisabon 10-01-2012 19:56 1832678

XCV,
Цитата:

Цитата XCV
Изначально patch имеет тип "reg_expand_sz", а после того как я делаю: »

Цитата:

Цитата XCV
он становится "reg_sz" и как следствие система "перестает видеть" служебные утилиты »

Используй плагин Registry, и будет нормально писаться именно reg_expand_sz . В своё время сам мучался... С этим плагином, работает без проблем.

kotkovets 10-01-2012 22:30 1832789

XCV если ваша библиотека, то определите свой ключ в реестре, читаемый библиотекой,так проще наверно будет.
rogmun под рукой нет справочных материалов нет,вам нужно читать файл построчно в цикле - readfromend(по индек найдете в справке, в теме тоже есть примеры) в цикле вы можете обрезать строки до нужного значения в др. переменную(strcpy в $0) через strcmp или через оператор:
Код:

${if} $0 == "обр.строка"
      Intop $1 $1 + 1
      ;в $R9 - цельная строка,точно не помню.
${endif}

В $1 количество совпадений

XCV 10-01-2012 22:47 1832807

Цитата:

Цитата kotkovets
XCV если ваша библиотека, то определите свой ключ в реестре, читаемый библиотекой,так проще наверно будет. »

библиотеки свои, но нужна для работы нескольких приложений код которых менять не могу, как вариант закидать ее в папку к приложению, точнее в 3 папки (зачем плодить файлы), пока нашел другой выход, тупо закидаю их в папку sys32 которая по своей природе прописана в переменной path, попробую плагин покрутить, жаль времени не хватает (особенно когда найдено временное, может не совсем красивое, но вполне рабочее решение)

kotkovets 10-01-2012 23:01 1832817

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

XCV 11-01-2012 10:17 1833009

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

ReadRegStr $0 HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path"
WriteRegExpandStr HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path" "$0;$INSTDIR"

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

kotkovets 11-01-2012 12:34 1833071

вот точно, совсем забыл,про WriteRegExpandStr...

Lisabon 11-01-2012 15:47 1833190

kotkovets, может вспомнишь как писать REG_MULTI_SZ штатными средствами?

При помощи плагина Registry, пишется без проблем, например:

${registry::Write} "HKCU\Software\GNU\ffdshow\default" "avisynthScriptMULTI_SZ" "SetMTMode(3,2)$\nffdShow_Source()$\nSetMTMode(2,2)$\nDither_convert_8_to_16 ()$\nSmoothGrad(thr=0.9, radius=8)$\nDitherPost ()" "REG_MULTI_SZ" $FFDRaw
${registry::Unload}

kotkovets 11-01-2012 19:35 1833331

Lisabon,смотри в справочник из шапки,там есть(метод WinApi) в оригинальной справке тоже есть- не иоспользуй,глюки!
Все значения, читаюся в цикле построчно.

Lisabon 11-01-2012 20:17 1833362

Цитата:

Цитата kotkovets
не иоспользуй,глюки! »

О каких глюках идёт речь?

kotkovets 11-01-2012 21:01 1833401

при чтении многострочных значений.
Строка вычисляется из 16-ричного адреса в ОЗУ.
Следущия строка (адрес строки) высчитывается из длины предыдущей строки + 1 символ. Стандартный плагин system конвертирует адрес в строку-плохо у плагина system получается,приводит к краху инсталятор.по этому я в своей либе применил IntFmt - работает безупречно.

Lisabon 11-01-2012 21:46 1833448

kotkovets, теперь мне не понятно зачем в справочнике есть описание использования плагина Registry, в котором наблюдаются проблемы? Тогда может есть смысл в справочнике расписать альтернативу (метод WinApi) так сказать по-полному, все функции которые используются в плагине Registry.

kotkovets 11-01-2012 22:27 1833479

Lisabon, с плагином registry всё в порядке :)
Я о говорил о некоторых ключевых моментах при использовании стандартных средств, в моей либе(RegistryFunc.nsh) полностью исключены эти глюки, по сути эта либа аналог плагина Registry.
Просто стремлюсь насколько возможно использовать стандартные средства NSIS

romgun 13-01-2012 12:00 1834652

Опять по той же задаче пишу... Пытался разобраться, но из-за плохих знаний ничего не получается.
Смотрел пример, но как реализовать до конца не понял



Вот такое пытался писать..

Код:

Section
SetOutPath "$INSTDIR"
;нужен поиск по файлу 1.cfg на предмет наличия записи "aaaaaaaaaaaaaa.*=$INSTDIR\xxx\yyy". Если запись есть, ничего делать не нужно.
StrCpy $0 0
  loop:
  ReadINIStr $1 "$INSTDIR\1.cfg" "main" "aaaaaaaaaaaaaa"
  StrCmp $1 "" Done
  StrCmp $1 "xxx\yyy" 0 +3
  StrCpy $0 1
  Goto Done
  IntOp $0 $0 + 1
  Goto Loop
 Done:
  StrCmp $0 1 Next
  ; если записи нет, то нужно ее вставить "aaaaaaaaaaaaaa.*=$INSTDIR\xxx\yyy", где * - порядковый номер.
GetFullPathName $6 ..
${FileReadFromEnd} "$INSTDIR\1.cfg" "Find" ;читает строку за строкой? и записывает в $9?
WriteINIStr $INSTDIR\1.cfg main "aaaaaaaaaaaaaa.$3" "$6\xxx\yyy"
 Next:
SectionEnd
 
Function Find
  StrCpy $2 $9 14 ;Эту строку нужно обрезать до 14 первых символов (SimObjectPaths)
  ${if} $2 == "aaaaaaaaaaaaaa"
  Intop $3 $3 + 1
  ${endif}
FunctionEnd


kotkovets 13-01-2012 20:15 1835154

romgun, я же говорил в цикле читаем файл,в функции макроса значения совпадений уничтожается, поэтому для подсчёта объявляем свою переменную:
Код:

Var int
Пример файла:
Код:

[setup]
Name=app.exe
[dir]
Dirpatch_1=C:\
Dirpatch_2=D:\
Dirpatch_3=E:\

Пример:
Код:

Section
StrCpy $int 0

${FileReadFromEnd} "$InstDir\file.cfg" "Read"
${if} ${Errors}
  MessageBox mb_ok "файл не найден"
${Else}
  ${For} $0 1 $int
      ReadIniStr $1 "$InstDir\file.cfg"  "dir" "Dirpatch_$0"
  MessageBox mb_ok "$1"
  ${Next}
${EndIf}
SectionEnd

Function Read
  StrCpy $R0 $9 9
  ${If} $R0 == "Dirpatch_"
    InTop $int $int + 1
 
    MessageBox mb_ok "$R0 - $int"
  ${EndIf}
  Push $0
FunctionEnd


yyv 17-01-2012 15:48 1837972

делаю свою страничку UNPAGE_CONFIRM для деинсталятора
подскажите как получить папку из какой был запущен деинсталятор?


$EXEDIR и $EXEPATH не подходят

в стандартной страничке куда бы я не скопировал файл деиняталятора тот путь и указывается
например

C:\Program Files\uninstal\
C:\Documents and Settings\Admin\Рабочий стол\

используя же $EXEDIR я всегда получаю :
C:\WINDOWS\Temp\~nsu.tmp

up $OUTDIR - решает мою проблему

yyv 17-01-2012 17:12 1838056

возвращаясь к старому вопросу

можно ли изменить внешний вид PAGE_INSTFILES
точнее UNPAGE_INSTFILES. но я думаю нет особых различий.
пробовал вызывать функции SHOW PRE
что-то типа
Код:

 
nsDialogs::Create 1018 
  Pop $5
    ${NSD_CreateLabel} 120u 10u 195u 40u "dialog create function"
  Pop $R4 
  SetCtlColors $R4 "" "FFFFE1"    nsDialogs::Show


но это не дает желаемого эффекта
Я получаю пустую страничку с одним лейблом без остальных контролов.

как можно (если можно) добавить собственные контролы?

И при этом что бы остались старые контролы и выполнялся код в секциях. (те что бы прогрес бар также адекватно на это реагировал)

kotkovets 17-01-2012 17:20 1838066

текущая папка деинсталлятора - $INSTDIR
Деинсталлятор имеет два процесса - $EXEDIR, для того, чтобы удалить деинсталлятор.

Paval 17-01-2012 18:14 1838131

Есть текстовый файл (list.txt). В нем находиться список файлов(а точнее пути к ним), которые требуется удалить. Задача стоит в том, что бы написать код деинсталятора, короый удаляет эти файлы.

Я пробовал так:

Код:

   
    ${LineSum} "$INSTDIR\list.txt" $NumOfFiles ;узнаем кол-во файлов, и значение заносим в $NumOfFiles
   
    ${For} $CurrentFileNumber 1 $NumOfFiles
        ${LineRead} "$INSTDIR\list.txt" $CurrentFileNumber $CurrentFileName ; в цикле for читаем построчно файл "list.txt" и значение (путь к файлу) заносим в $CurrentFileName
        Delete "$CurrentFileName" ;удаляем файл по его пути.
    ${Next}

Ничего не получается. Удаляется лишь тот фал, что был последним в списке.

romgun 18-01-2012 14:14 1838837

Надеюсь на помощь...
Структура нужна примерно такая: проверка1---проверка2---если нет данных, то запись---копирование новых файлов
Пытался делать кусками, но теперь проблема объединить.
С логикой беда - если значение не найдено, из цикла выползти не могу (разве что через ${LoopUntil} - см. в первом куске)

1 этап Проверка была ли уже установка. Желательно двумя способами - по cfg и по xml , которые могут быть либо в папке юзера, либо в папке All users
Проблема с циклом и переходом к анализу xml?

читать дальше »

Код:

; поиск в cfg
Section
;если установлено для текущего пользователя
ClearErrors
IfFileExists "$APPDATA\Microsoft\FSX\fsx.cfg" 0 NotFiles
StrCpy $0 0
${Do}
ReadINIStr $1 "$APPDATA\Microsoft\FSX\fsx.cfg" "main" "SimObjectPaths.$0"
${If} $1 == "SimObjects\UT2 Aircraft"
    MessageBox mb_ok "найден в юзерпапке"
        ${ExitDo}
        ${EndIf}
        InTop $0 $0 + 1
        ${LoopUntil} $0 == '50'  ;??????
        Goto end
;если установлено для всех
        NotFiles:
ClearErrors
SetShellVarContext all
StrCpy $0 0
${Do}
ReadINIStr $1 "$APPDATA\Microsoft\FSX\fsx.cfg" "main" "SimObjectPaths.$0"
${If} $1 == "SimObjects\UT2 Aircraft"
    MessageBox mb_ok "найден в allusers"
        ${ExitDo}
        ${EndIf}
        InTop $0 $0 + 1
        ${LoopUntil} $0 == '50'  ;??????
        end:
SectionEnd

; поиск в xml
 Section
 ;если установлено для текущего пользователя
 ClearErrors
 StrCpy $0 0
 IfFileExists "$APPDATA\Microsoft\FSX\exe.xml" 0 NotFiles
 ${xml::LoadFile} "$APPDATA\Microsoft\FSX\exe.xml" $0
          loop1:
        ${xml::FindNextElement} "Name" $0 $1
        ${xml::GetText} $1 $2
        ${If} $1 == "UT2"
    MessageBox MB_OK "$1 найден"
        Goto end
        ${EndIf}
        Goto loop1
        ${xml::FindCloseElement}
        ${xml::Unload}       
NotFiles:
ClearErrors
;если установлено для всех
SetShellVarContext all
StrCpy $0 0
    ${xml::LoadFile} "$APPDATA\Microsoft\FSX\exe.xml" $0
          loop:
        ${xml::FindNextElement} "Name" $0 $1
        ${xml::GetText} $1 $2
        ${If} $1 == "UT2"
    MessageBox MB_OK "$1 найден"
        Goto end
        ${EndIf}
        Goto loop
        ${xml::FindCloseElement}
        ${xml::Unload}       
        end:
SectionEnd



2. Если в cfg не найдено, запись туда.
Слишком, по-моему, путано написано
читать дальше »

Код:

Function Read
  StrCpy $R0 $9 15
  ${If} $R0 == "SimObjectPaths."
    InTop $int $int + 1
  ${EndIf}
  Push $0
FunctionEnd

Section
;если установлено для текущего пользователя
 IfFileExists "$APPDATA\Microsoft\FSX\fsx.cfg" 0 NotFiles
 StrCpy $int 0
${FileReadFromEnd} "$APPDATA\Microsoft\FSX\fsx.cfg" "Read"
${if} ${Errors}
  MessageBox mb_ok "CFG файл не найден"
${Else}
  ${For} $0 1 $int
    ReadINIStr $1 "$APPDATA\Microsoft\FSX\fsx.cfg" "main" "SimObjectPaths.$0"
    ${Next}
${EndIf}
  InTop $0 $0 - 1
  WriteINIStr "$APPDATA\Microsoft\FSX\fsx.cfg" main "SimObjectPaths.$0" "SimObjects\UT2 Aircraft"
 Goto Done
NotFiles:
; если установлено в папку для всех пользователей
 SetShellVarContext all
 IfFileExists "$APPDATA\Microsoft\FSX\fsx.cfg" 0 NotFiles2
 StrCpy $int 0
${FileReadFromEnd} "$APPDATA\Microsoft\FSX\fsx.cfg" "Read"
${if} ${Errors}
  MessageBox mb_ok "CFG файл не найден"
${Else}
  ${For} $0 1 $int
    ReadINIStr $1 "$APPDATA\Microsoft\FSX\fsx.cfg" "main" "SimObjectPaths.$0"
  ${Next}
${EndIf}
  InTop $0 $0 - 1
  WriteINIStr "$APPDATA\Microsoft\FSX\fsx.cfg" main "SimObjectPaths.$0" "SimObjects\UT2 Aircraft"
 Goto Done
 NotFiles2:
 MessageBox MB_OK "CFG файл не найден"
Done:
SectionEnd



3. если в xml не найдено, запись туда

читать дальше »


Код:

Section
SetOutPath "$INSTDIR"
GetFullPathName $ID ..
    ${xml::LoadFile} "$APPDATA\Microsoft\FSX\exe.xml" $0
        ${xml::GotoPath} "/SimBase.Document" $0
          ${xml::CreateNode} <Launch.Addon></Launch.Addon> $1
        ${xml::InsertEndChild} "$1" $0
        ${xml::CreateNode} <Disabled>False</Disabled> $1
        ${xml::InsertEndChild} "$1" $0
        ${xml::CreateNode} <ManualLoad>False</ManualLoad> $2
        ${xml::InsertAfterNode} "$2" $1
        ${xml::CreateNode} <Name>UT2</Name> $3
        ${xml::InsertAfterNode} "$3" $2
        ${xml::CreateNode} '<Path>$ID\Flight One Software\Ultimate Traffic 2\UT2Services.exe</Path>' $4
        ${xml::InsertAfterNode} "$4" $3
        ${xml::CreateNode} <NewConsole>True</NewConsole> $5
        ${xml::InsertAfterNode} "$5" $4
        ${xml::SaveFile} "$APPDATA\Microsoft\FSX\test_sааaved.xml" $0
    ${xml::Unload} ; unload plugin
SectionEnd



4. Переименование и копирование папок. Здесь в принципе все ясно

SamLab 18-01-2012 14:49 1838856

Вопросик по переменным системной папки винды

$SYSDIR в системе x86 и x64 ведет в System32

поэтому для помещения файлов в x64 системе в папку SysWOW64 приходится указывать $WINDIR\SysWOW64

может есть способ для оригинального установщика, дабы при определении системы как x86 файлы в System32 кидались, а в x64 в SysWOW64?


пока вот так делаю:
${If} ${SectionIsSelected} ${secX86install} ;
SetOutPath "$WINDIR\SysWOW64"
File "C:\x86.url"
${Else}
${EndIf}
${If} $R1 == "64" ;
SetOutPath "$WINDIR\System32\"
File "C:\x64.url"
${Else}
${EndIf}

но так в системе x86 файлы будут в SysWOW64 вместо System32 кидаться...

Krinkels 18-01-2012 15:04 1838865

SamLab
Подобный вопрос уже проскальзывал, нужно просто проверять версию системы( х86 или х64 ) и в зависимости от результата выбирать ту или иную папку.

Paval 18-01-2012 15:17 1838873

Есть каталог. В нем подкаталоги. Некоторые из них пустые. Как их удалить (только пустые)?

kotkovets 19-01-2012 01:19 1839258

SamLab, посмотрите в хедере x64.nsh - макросы ${DisableX64FSRedirection} и ${EnableX64FSRedirection}
переключение направления - ваш случай.
Paval, Смотрите макрос #1985

wolkow70 20-01-2012 16:37 1840461

kotkovets,

Не подскажите как создать пустой ini-файл.
Пробую так :

Fileopen $1 "$INSTDIR\aida64.assetprofile.ini" w
FileClose $1

После компиляции выводится:
comment contains line-continuation character, following line will be ignored (D:\NSIS\Aida64BE.nsi:177)

kotkovets 20-01-2012 18:26 1840553

Цитата:

Цитата wolkow70
Не подскажите как создать пустой ini-файл. »

Можно и так:
Код:

Writeinistr "$EXEDIR\assetprofile.ini" " " "" ""
Цитата:

Цитата wolkow70
После компиляции выводится:
comment contains line-continuation character, following line will be ignored (D:\NSIS\Aida64BE.nsi:177) »

так покажите 177 строку
---
у меня никаких проблем с созданием файла двумя способами

wolkow70 21-01-2012 08:00 1840927

Цитата:

Цитата kotkovets
так покажите 177 строку »

В конструкции
Fileopen $1 "$INSTDIR\aida64.assetprofile.ini" w
FileClose $1

стр 177 это
FileClose $1

Впрочем, другой способ мне больше понравился.

romgun 21-01-2012 12:38 1841007

если можно, мне тоже помогите, а?
http://forum.oszone.net/post-1838837-2217.html

kotkovets 21-01-2012 14:03 1841059

romgun, Слишком сложно - загоните реализацию в тупик, упрощайте задачу.
Цитата:

Цитата romgun
С логикой беда - если значение не найдено, из цикла выползти не могу »

${Break} - прерывание любого цикла.
Можно так, но есть проблема - подсказка, сделайте признак, значение переменной 0 или 1, для того, если
все нужные действия сделаны при SetShellVarContext all, не вызывать заново функцию cfg при SetShellVarContext current
читать дальше »
Код:

!include "textfunc.nsh"
!include "logiclib.nsh"

var int

outfile file.exe

Section
  SetShellVarContext all
  Call cfg
  ;---
  SetShellVarContext current
  Call cfg
SectionEnd

Function Read
  StrCpy $R0 $9 9
  StrCmp $R0 "Dirpatch_" 0 +2
  InTop $int $int + 1
  Push $0
FunctionEnd

Function cfg
  StrCpy $int 0
  ClearErrors
 ${FileReadFromEnd} "$APPDATA\Microsoft\file.cfg" "Read"
 ${If} ${Errors}
    Call xml ;если file.cfg - не найден!
 ${Else}
  ${If} $int != 0
      ${For} $0 1 $int
          ReadIniStr $1 "$APPDATA\Microsof\file.cfg" "dir" "Dirpatch_$0"
          MessageBox mb_ok "$0$\n$1"
      ${Next}
  ${ElseIf} $int == 0
      Call xml ;если пути нужные не найдены, т.е $int = 0
  ${EndIf}
${EndIf}
FunctionEnd

Function xml
  MessageBox MB_ICONINFORMATION|MB_OK "xml" IDOK
  ;команды для работы с xml файлами и проверки сушествования xml
FunctionEnd


Повторюсь еще раз, условно повторяющийся код переносится в функцию или в макрос - это очень удобно!
Важно знать, что Вы хотите - какой результат!
Поиск наиболее простого и эффективного решения - ключевые свойства любого проекта.
Про цикл For, с каждым циклом переменная $0 увеличивается на единицу, отсчет от единицы до значения $int,
какое Вам нужно значение - я не знаю...
Если Вам нужно последнее значение, то цикл не нужен, достаточно:
Код:

ReadIniStr $1 "$APPDATA\Microsof\file.cfg" "dir" "Dirpatch_$int"
В $int - количество совпадений заданного выражения, если выражение(обрезанная строка) совпадет в другой секции cfg файла,
делайте так, что бы нужные выражения были в нужной секции файла и больше нигде.
Цитата:

Цитата wolkow70
стр 177 это
FileClose $1 »

Скорее всего небольшие проблемы, до этой строки, наверно в команде FileWrite -
из-за неверного синтаксиса или неверного/закрытого значения дескриптора файла - второе значение синтаксиса команды FileWrite

denixx 21-01-2012 21:54 1841409

kotkovets, видимо мне надо обращаться конкретно к тебе :)

Гугл выдаёт по запросу WinVer2 только одну из страниц этой темы...
Где взять собственно сам WinVer2.nsh?
Поможешь?

Мне нужно просто определить, является ли операционка x64, и если это так, то дальнейшие действия выполнять по нужной ветке.
Насколько я понял, этот хедер как раз это и позволяет узнать.
Конкретно: надо в зависимости от архитектуры просматривать, есть ли уже установленный Firefox на компе, у него кажется ключи в разных ветках находятся. А ещё надо ставить разные версии JVM.

kotkovets 21-01-2012 22:18 1841427

Цитата:

Цитата denixx
Где взять собственно сам WinVer2.nsh? »

в шапке темы ссылка на справочник по NSIS - там он живет.
Цитата:

Цитата denixx
является ли операционка x64 »

есть для этого хедер - х64.nsh, в стандартной "коробке" NSIS

denixx 21-01-2012 22:31 1841435

Спасибо, всё оказалось гораздо проще =)
Там прямо в самом x64.nsh есть пример с показом окошка.

Ну теперь осталось дело за малым - написать годные скрипты.
Вроде нужна только работа с реестром, да запуск .exe в нужных местах.
Плюс ещё работа с папкой TEMP виндовой, чтобы туда выгружать нужные файлы перед запуском.

wolkow70 24-01-2012 10:11 1843208

kotkovets, доброго времени суток.

Можете, что-то посоветовать в таком случае?

Код:

Function .OnInit
StrCpy "$INSTDIR" "$PROGRAMFILES\AIMP3"
${If} ${FileExists} "$PROGRAMFILES\AIMP3\AIMP3.exe"
${OrIf} ${FileExists} "$APPDATA\AIMP3\AIMP3.INI"
${OrIf} ${FileExists} "$INSTDIR\AIMP3\AIMP3.INI"
      MessageBox MB_OKCANCEL|MB_USERICON|MB_TOPMOST "ВНИМАНИЕ!$\n\
$\nAIMP3 уже установлен, или на вашем компьютере есть настройки этого приложения. \
$\nДанный инсталлятор не может быть использован поверх установленного AIMP3. \     
$\nПри нажатии кнопки 'Ok' будет произведено удаление следов предыдущей установки \
$\nи выполнена новая установка AIMP3. \
$\nПри нажатии кнопки 'Отмена' установка AIMP3 будет отменена. \
$\nВыполнить новую установку AIMP3?" /SD IDOK IDCANCEL cancel
;
Код удаления программы
;
ExecWait 'taskkill /F /IM explorer.exe' $0
DetailPrint "taskkill exit: [ $0 ]"
Sleep 500
StrCmp $0 0 0 +2
Exec "explorer.exe"
;
${If} ${RunningX64} 
Delete "$INSTDIR\Modules\aimp_menu64.dll"
RMDir /r "$INSTDIR\Modules"
RMDir /r "$INSTDIR"
${Else}
Delete "$INSTDIR\Modules\aimp_menu32.dll"
RMDir /r "$INSTDIR\Modules"
RMDir /r "$INSTDIR"
${EndIf}
SetShellVarContext current
RMDir /r "$APPDATA\AIMP3" 
Goto Done
cancel:
Abort
Done:
${EndIf}
FunctionEnd

В принципе работает, если AIMP3 установлен по дефолтному пути, а если нет?
Как можно вычислить директорию установки и локацию dll-файла для задания комманд удаления и дерегистрации?

И еще вопрос: Вы обещали сообщить, что выяснится с дерегистрацией aimp_menu64.dll?

kotkovets 24-01-2012 14:22 1843348

Цитата:

Цитата wolkow70
В принципе работает, если AIMP3 установлен по дефолтному пути, а если нет? »

программа портабельная, настройки в реестре не хранит.
Если чешется можно искать файлы/настройки по всему компу...
Вопрос в том, сколько времени это займет... :)
Цитата:

Цитата wolkow70
Как можно вычислить директорию установки и локацию dll-файла для задания комманд удаления и дерегистрации? »

Сканируйте реестр при регистрации dll - вы найдете путь к dll, а из пути dll через
GetParent(смотрите справку) - папку программы
Код:

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}\InprocServer32]
@="C:\\AIMP3\\Modules\\aimp_menu32.dll"

Цитата:

Цитата wolkow70
И еще вопрос: Вы обещали сообщить, что выяснится с дерегистрацией aimp_menu64.dll? »

Пробуйте запускать исполняемый файл программы ключами:
AIMP3.exe /REG=MENU --> контекстное меню файлов (регистрация dll, независимо от системы)
AIMP3.exe /REG=R --> ассоциация файлов с AIMP3 (независимо от системы)
AIMP3.exe /REG=UALL --> разрегистрирует dll и уберет ассоциации файлов. (независимо от системы)
Вроде бы все просто и достаточно прозрачно.

wolkow70 24-01-2012 14:22 1843349

Пока не придумал ничего другого, чем взять путь из CLSID

ReadRegStr $0 HKLM "SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}\InprocServer32" ""
StrCpy $DllPath $0
;
regdll "$DllPath" ContextMenuAddonUnregister
DeleteRegKey HKLM "SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}" ""
DeleteRegValue HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved" "{1F77B17B-F531-44DB-ACA4-76ABB5010A28}"

wolkow70 24-01-2012 14:37 1843356

Искать путь к AIMP3.exe через DLL не надежно, программа может быть установлена и без регистрации контекста.

Paval 25-01-2012 15:52 1844240

Ситуация такая. На компьютере у пользователя стоит программа. Я ставлю точно такую же, но другой версии. Нужно сравнить версии программы на компе и той, что я ставлю. Если у пользователя версия новее - просот обрубаем инсталятор, если новее моя - удаляем старую и ставим мою. С этим проблем нет. И с определением версии программы на комьютере проблем нет(просто посмотрим в реестре), а вот как узнать версию инсталируемого продукта (чтобы провести сравнение)?
P.S. В скрипт версию хардкодить нельзя.

MKN 25-01-2012 16:40 1844273

Paval,
Возможно так :
Код:

!include "FileFunc.nsh"

Section
ReadRegStr $R0 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\App1" "DisplayVersion"
MessageBox MB_OK "Версия установленной программы $R0"

${GetFileVersion} "App2.exe" $R1
MessageBox MB_OK "Версия устанавливаемой программы $R1"

;затем сравниваем значения переменных (здесь тоже могут быть варианты, в зависимости от нумерации и пр.) , и т.д.
SectionEnd

App2.exe может находиться рядом с скриптом.
(Если же инсталлятор устанавливаемой программы, бестолковый, т.е. версия не указана, то придётся предварительно распаковать эту прогу в Temp и фиксировать версию исполняемого файла или ещё какого-нибудь с признаком версии...)

Paval 25-01-2012 17:06 1844296

Цитата:

Цитата MKN
Paval,
Возможно так :
Код:
!include "FileFunc.nsh"
Section
ReadRegStr $R0 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\App1" "DisplayVersion"
MessageBox MB_OK "Версия установленной программы $R0"
${GetFileVersion} "App2.exe" $R1
MessageBox MB_OK "Версия устанавливаемой программы $R1"
;затем сравниваем значения переменных (здесь тоже могут быть варианты, в зависимости от нумерации и пр.) , и т.д.
SectionEnd
App2.exe может находиться рядом с скриптом. »

Интересно, а откуда на компьютере у пользователя появиться файл App2.exe ?

P.S. Мне рекомендовали передавать версию через параметры. (я так понимаю командной стороки). Только хз как их задать.

MKN 25-01-2012 17:11 1844302

Цитата:

Цитата Paval
Интересно, а откуда на компьютере у пользователя появиться файл App2.exe ? »

Ты не внятно ставишь задачу. Понимать можно всяко :
Цитата:

Цитата Paval
На компьютере у пользователя стоит программа. Я ставлю точно такую же, но другой версии. »

Расшифруй, где и что ты ставишь.

wolkow70 25-01-2012 17:18 1844306

Цитата:

Цитата kotkovets
AIMP3.exe /REG=MENU --> контекстное меню файлов (регистрация dll, независимо от системы)
AIMP3.exe /REG=R --> ассоциация файлов с AIMP3 (независимо от системы)
AIMP3.exe /REG=UALL --> разрегистрирует dll и уберет ассоциации файлов. (независимо от системы)
Вроде бы все просто и достаточно прозрачно. »

Мы же не ищем легких путей :).
Сделал так:

Код:

Function .OnInit
;
StrCpy $SysDrive $WINDIR 2
;
${If} ${FileExists} "$PROGRAMFILES\AIMP3\AIMP3.exe"
${OrIf} ${FileExists} "$PROGRAMFILES\AIMP3\AIMP3.INI"
${OrIf} ${FileExists} "$PROGRAMFILES\AIMP3\profile\AIMP3.INI"
${OrIf} ${FileExists} "$PROGRAMFILES\AIMP3\profile\AIMP3_MENU.INI"
${OrIf} ${FileExists} "$PROGRAMFILES\AIMP3\Modules\aimp_menu32.dll"
${OrIf} ${FileExists} "$PROGRAMFILES\AIMP3\Modules\aimp_menu64.dll"
;
${OrIf} ${FileExists} "$SysDrive\AIMP3\AIMP3.exe"
${OrIf} ${FileExists} "$SysDrive\AIMP3\AIMP3.INI"
${OrIf} ${FileExists} "$SysDrive\AIMP3\profile\AIMP3.INI"
${OrIf} ${FileExists} "$SysDrive\AIMP3\profile\AIMP3_MENU.INI"
${OrIf} ${FileExists} "$SysDrive\AIMP3\Modules\aimp_menu32.dll"
${OrIf} ${FileExists} "$SysDrive\AIMP3\Modules\aimp_menu64.dll"
;
${OrIf} ${FileExists} "$APPDATA\AIMP3\AIMP3.INI"
${OrIf} ${FileExists} "$APPDATA\AIMP3\AIMP3_MENU.INI"
${OrIf} ${FileExists} "$INSTDIR\AIMP3.INI"
${OrIf} ${FileExists} "$INSTDIR\profile\AIMP3.INI"
${OrIf} ${FileExists} "$INSTDIR\AIMP3\AIMP3.INI"
;
      MessageBox MB_OKCANCEL|MB_USERICON|MB_TOPMOST "ВНИМАНИЕ!$\n\
$\nAIMP3 уже установлен, или на вашем компьютере есть настройки этого приложения. \
$\nДанный инсталлятор не может быть использован поверх уже установленного AIMP3. \     
$\nПри нажатии кнопки 'Ok' будет произведено полное удаление предыдущей установки \
$\nи выполнена новая установка AIMP3. \
$\nПри нажатии кнопки 'Отмена' установка AIMP3 будет отменена. \
$\nВыполнить новую установку AIMP3 ?" /SD IDOK IDCANCEL cancel
;
${If} ${RunningX64} 
        ${If} ${FileExists} "$PROGRAMFILES\AIMP3\AIMP3.exe"
        ${AndIf} ${FileExists} "$PROGRAMFILES\AIMP3\Modules\aimp_menu64.dll"
ExecWait "$\"$PROGRAMFILES\AIMP3\AIMP3.exe$\" /REG=UALL"
StrCpy $R1 "$PROGRAMFILES\AIMP3\Modules\aimp_menu64.dll"
        ${Else}
ReadRegStr $1 HKLM "SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}\InprocServer32" ""
StrCpy $R1 $1
regdll "$R1" ContextMenuAddonUnregister
        ${EndIf}
${Else}
        ${If} ${FileExists} "$PROGRAMFILES\AIMP3\AIMP3.exe"
        ${AndIf} ${FileExists} "$PROGRAMFILES\AIMP3\Modules\aimp_menu32.dll"
ExecWait "$\"$PROGRAMFILES\AIMP3\AIMP3.exe$\" /REG=UALL"
StrCpy $R1 "$PROGRAMFILES\AIMP3\Modules\aimp_menu32.dll"
        ${Else}
ReadRegStr $1 HKLM "SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}\InprocServer32" ""
StrCpy $R1 $1
regdll "$R1" ContextMenuAddonUnregister
        ${EndIf}
${EndIf}
;
DeleteRegKey HKLM "SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}" ""
DeleteRegValue HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved" "{1F77B17B-F531-44DB-ACA4-76ABB5010A28}"
;
ExecWait 'taskkill /F /IM explorer.exe' $0
DetailPrint "taskkill exit: [ $0 ]"
Sleep 500
StrCmp $0 0 0 +2
Exec "explorer.exe"
;
Delete "$R1"
;
${If} ${FileExists} "$PROGRAMFILES\AIMP3\AIMP3.exe"
RMDir /r "$PROGRAMFILES\AIMP3"
${Else}
${GetParent} "$R1" $2
StrCpy "$R2" $2
${GetParent} "$R2" $3
StrCpy "$R3" $3
RMDir /r "$R3"
${EndIf}
;
ReadRegStr $4 HKLM "SOFTWARE\Classes\CLSID\{0041494D-5033-4472-6F70-546172676574}\LocalServer32" ""
StrCpy "$R4" $4
${GetParent} "$R4" $5
StrCpy "$R5" $5
RMDir /r "$R5" 
;
ReadRegStr $6 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\AIMP3.exe" ""
StrCpy "$R6" $6
${GetParent} "$R6" $7
StrCpy "$R7" $7
RMDir /r "$R7"
;
-прочие комманды удаления
;
SetShellVarContext current
RMDir /r "$APPDATA\AIMP3" 
${EndIf}
FunctionEnd


kotkovets 25-01-2012 17:34 1844319

Цитата:

Цитата Paval
Нужно сравнить версии программы на компе и той, что я ставлю. Если у пользователя версия новее - просот обрубаем инсталятор, если новее моя - удаляем старую и ставим мою »

Сначала нужно получить версию программы, откуда получить?
1. Из реестра, текстового файла...
2. Из исполняемого файла программы, макросом GetFileVersion (FileFunc.nsh)
3. Затем сравниваем полученную версию программы и исходно устанавливаемую.
Код:

!include "WordFunc.nsh"
!define version "1.1.3" ;исходно устанавлимая версия
;--
Section
  ;команды получения установленной версии
  ;к примеру мы получили версию в $1
  StrCpy $1 "1.1.0"
  ${VersionCompare} "$1" "${version}" $0
  ${If} $0 == 0
      MessageBox MB_OK "версии равны"
  ${ElseIf} $0 == 1
      MessageBox MB_OK "исходная версия, меньше полученной"
  ${ElseIf} $0 == 2
      MessageBox MB_OK "исходная версия, больше полученной"
  ${EndIf}
SectionEnd

Цитата:

Цитата Paval
P.S. В скрипт версию хардкодить нельзя. »

здесь обсуждаются только скрипты NSIS, я правильно понял или мне телепатом становится :)
1. У вас есть некий установщик проги, назовем его Х, а скрипта нет.
2. Вы хотите написать скрипт, который заводит/отменяет установку X в зависимости от ваших условий.
Цитата:

Цитата wolkow70
Мы же не ищем легких путей »

Зачем делать то, что можно делать ключами проги: легко и просто....смысла нет огород 0городить :)
Цитата:

Цитата kotkovets
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}\InprocServer32]
@="C:\\AIMP3\\Modules\\aimp_menu32.dll" »

при первом GetParent будет --> C:\AIMP3\Modules
при втором GetParent будет --> C:\AIMP3 , и затем нужно удалить папку проги
Код:

ReadRegStr $4 HKLM "SOFTWARE\Classes\CLSID\{0041494D-5033-4472-6F70-546172676574}\LocalServer32" ""
${GetParent} "$4" "$4"
${GetParent} "$4" "$4"
RMDir /r "$4"
;--
 StrCpy $4 "C:\AIMP3\Modules\aimp_menu32.dll"
${GetParent} "$4" "$4"
  MessageBox MB_OK "$4" IDOK
${GetParent} "$4" "$4"
  MessageBox MB_OK "$4" IDOK


wolkow70 26-01-2012 05:59 1844637

Цитата:

Цитата kotkovets
при первом GetParent будет --> C:\AIMP3\Modules
при втором GetParent будет --> C:\AIMP3 , и затем нужно удалить папку проги »

У меня так и сделано, только с большим количеством переменных:

ReadRegStr $1 HKLM "SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}\InprocServer32" ""
StrCpy $R1 $1
regdll "$R1" ContextMenuAddonUnregister


${If} ${FileExists} "$PROGRAMFILES\AIMP3\AIMP3.exe"
RMDir /r "$PROGRAMFILES\AIMP3"
${Else}
${GetParent} "$R1" $2
StrCpy "$R2" $2
${GetParent} "$R2" $3
StrCpy "$R3" $3
RMDir /r "$R3"
${EndIf}

Цитата:

Цитата kotkovets
Зачем делать то, что можно делать ключами проги: легко и просто....смысла нет огород 0городить »

Для практики. И не доверяю я этим ключам. Кто его знает, что там написано.
Кстати, у меня применяется ключ, если программа установлена в директорию по умолчанию.
${If} ${FileExists} "$PROGRAMFILES\AIMP3\AIMP3.exe"
${AndIf} ${FileExists} "$PROGRAMFILES\AIMP3\Modules\aimp_menu32.dll"
ExecWait "$\"$PROGRAMFILES\AIMP3\AIMP3.exe$\" /REG=UALL"

kotkovets 26-01-2012 09:18 1844691

Цитата:

Цитата wolkow70
Для практики. И не доверяю я этим ключам. Кто его знает, что там написано »

не доверять AIMP3 ???
Вы проверьте, особенно ассоциации...
Цитата:

Цитата wolkow70
Все работает. Проблему наблюдаю только с регистрацией библиотеки
RegDLL "$INSTDIR\Modules\aimp_menu32.dll »

А регистрацию/разрегистрацию библиотеки тоже не верите? :)
Люди которые AIMP разработали далеко не дураки...и прекрасно понимают, что нужно пользователю.

wolkow70 26-01-2012 10:12 1844727

kotkovets,

Кажется такая конструкция (подсмотрел в справке) не совсем оптимальна, приходится дублировать код YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY

${If} ${RunningX64}
;========УСТАНОВКА НА 64-БИТНЫЕ СИСТЕМЫ==========
SetRegView 64
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
SetRegView 32
YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
${Else}
;=======УСТАНОВКА НА 32-БИТНЫЕ СИСТЕМЫ===========
YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
${EndIf}

kotkovets 26-01-2012 11:19 1844755

Цитата:

Цитата wolkow70
Кажется такая конструкция (подсмотрел в справке) не совсем оптимальна, приходится дублировать код »

SetRegView 32 в x64 нужно (по умолчанию) возвратить в большинстве случаев, поэтому
общие команды нужно писать вне конструкции - это очевидно.
Цитата:

Цитата wolkow70
приходится дублировать код »

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

wolkow70 26-01-2012 11:27 1844759

Цитата:

Цитата kotkovets
SetRegView 32 в x64 нужно (по умолчанию) возвратить в большинстве случаев, поэтому
общие команды нужно писать вне конструкции - это очевидно. »

Не совсем понял как это? В справке про это не написано...
То есть в начале ставить SetRegView 32, а после SetRegView 64?

Перед ReadRegStr тоже ставить SetRegView 64, если нужно прочесть значение из родного раздела на запущенной X64?

kotkovets 26-01-2012 12:29 1844801

Цитата:

Цитата wolkow70
Не совсем понял как это? В справке про это не написано... »

Справка - это как использовать инструмент.
Использование инструмента - дело опыта. В x64 большинство веток идентичны в х86,
Поэтому NSIS по умолчанию предоставляет 32-разрядный вид реестра, все зависит от
конкретно устанавливаемой и как требования предъявляет программа.
Для того - в основном инсталлятор служит - прогибаться под установку программы, а не наоборот.

wolkow70 26-01-2012 12:46 1844813

Цитата:

Цитата kotkovets
Поэтому NSIS по умолчанию предоставляет 32-разрядный вид реестра »

Эксперементально в этом убедился.
Цитата:

Цитата wolkow70
Перед ReadRegStr тоже ставить SetRegView 64, если нужно прочесть значение из родного раздела на запущенной X64? »

Тоже эксперементально убедился, что нужно.

Paval 26-01-2012 12:50 1844818

Вот и спрашивай потом.)) Рассказали все то, что я и так уже знал и сделал. Вопрос был, можно ли узнать версию устанавливаемой программы ДО ее установки на компьютер и без хардкода.
Я же писал, что в сам скрипт версию руками писать нельзя. А мне потом выдают во это
Код:

!define version "1.1.3" ;исходно устанавлимая версия
.

P.S. Все оказалость проще. Билд машина параметром через командную строку передаст версию в мой скрипт.

funtykin 26-01-2012 13:59 1844857

Здравствуйте!
надо к уже имеющемуся инсталятору добавить возможность обновления.

при запуске я спокойно определяю что уже имеется ранее установленная версия ПО.
и если оно уже присутствует хотелось бы пропустить несколько стандартных окон таких как
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY

просто смысла нету их повторно показывать так как эти параметры не меняются.

как так сделать?

Заранее спасибо!

Paval 26-01-2012 16:31 1844976

Цитата:

Цитата funtykin
Здравствуйте!
надо к уже имеющемуся инсталятору добавить возможность обновления.
при запуске я спокойно определяю что уже имеется ранее установленная версия ПО.
и если оно уже присутствует хотелось бы пропустить несколько стандартных окон таких как
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
просто смысла нету их повторно показывать так как эти параметры не меняются.
как так сделать?
Заранее спасибо! »

http://stackoverflow.com/questions/2...ges-at-runtime
http://forums.winamp.com/showthread.php?t=203961

kotkovets 26-01-2012 19:01 1845088

Цитата:

Цитата funtykin
хотелось бы пропустить несколько стандартных окон таких как »

я делал как то так:
http://nsis.sourceforge.net/Go_to_a_NSIS_page
http://forum.ru-board.com/topic.cgi?...&limit=1&m=1#1
под свою задачу не трудно заточить.
Цитата:

Цитата Paval
http://stackoverflow.com/questions/2...ges-at-runtime
http://forums.winamp.com/showthread.php?t=203961 »

мутно...

diakov 29-01-2012 14:39 1846855

Доброго времени суток господа!kotkovets, такой вопрос модно ли сделать что б когда наводиш курсором на радиобутон впливал коментарий как html?

kotkovets 29-01-2012 22:37 1847205

Цитата:

Цитата diakov
такой вопрос модно ли сделать что б когда наводиш курсором на радиобутон впливал коментарий как html? »

как html врядли... пробЫвал не получалось, весьма трудоемко...
а вот есть ToolTips - всплывающие сообщения (тултипы)
Если нужно могу выложить рабочие варианты без плагина(без описания с примерами),
плагин не позволяет вставить в символ перевода строки, при длинном тексте это весьма раздражает.

diakov 30-01-2012 11:07 1847440

kotkovets, вот задался идеей сбацать репак Alcohol. Как мона сделать так что бы например сначала установился драйвер SPTD 1.80, потом перегрузка компа а потом старт инсталятора и уже установка самой программы...или еще как то моно подскажи! Спасибо!

kotkovets 30-01-2012 11:54 1847470

Цитата:

Цитата diakov
так что бы например сначала установился драйвер SPTD 1.80, »

Вам нужно сначала проверить установлен ли драйвер, по реестру или на определенный файл, где именно смотреть я не помню...
Если установлен драйвер, то устанавливать Alcohol.
Если не установлен драйвер, то установить драйвер и перезагрузиться обязательно.
Перед перезагрузкой прописать в реестр однократный запуск инсталлятора - для удобства.
Смотрите на 82 страничке темы, там такой похожий вопрос был.(812 сообщение)

diakov 30-01-2012 12:19 1847491

Сам драйвер расположен тут C:\Windows\System32\drivers sptd.sys

shtuceron 30-01-2012 15:08 1847618

nsis
 
Здравствуйте,

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

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

Спасибо.

Drongo 30-01-2012 15:13 1847623

.: NSIS - все вопросы :.

kotkovets 30-01-2012 17:35 1847724

Цитата:

Цитата diakov
Сам драйвер расположен тут C:\Windows\System32\drivers sptd.sys »

Можно примерно вот так:
читать дальше »
Код:

!include "logiclib.nsh"
;--
Section
 ${IfNot} ${FileExists} "$SYSDIR\drivers\sptd.sys" ;если нет этого файла, то...
      ;команды установки драйвера
      WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce" "AlcogolSoft" '"$EXEPATH"'
      MessageBox MB_OKCANCEL "Установка продолжится после перезагрузки!$\nПерезагрузить компьютер сейчас?" IDCANCEL +2
      Reboot ;перезагрузка
      Quit ;выход
 ${EndIf}
 ClearErrors
 ReadRegStr $0 HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce" "AlcogolSoft"
 IfErrors +3 ;если выше ключ существует, то ---
 MessageBox MB_OK "Для продолжения установки нужно перезагрузить компьютер" IDOK
 Quit
SectionEnd


shtuceron, в шапке темы --> документация

diakov 30-01-2012 18:05 1847743

kotkovets, а есть какое то универсальное средство чтобы отследить после установки программы все изменения в системе (файловой, реестр понятно, новые процессы, установленные драйверы и т.д.), а вот столкнулся с проблемой такой перепаковывал internet download manager все работает все, но не работает расширенная интеграция в браузеры когда ставлю свой репак, пишет что я заблокировал сетевой драйвер IDM и не включается ни в какую не могу найти что где не так, пробовал отследить обращение к файлу или ветку реестра с помощью Procmon.exe никак не могу понять чего не хватает! Тоесть никак не могу понять какие файли отвечают за интеграцию IDM в браузеры! :search:

kotkovets 30-01-2012 18:32 1847762

Цитата:

Цитата diakov
есть какое то универсальное средство чтобы отследить после установки программы все изменения в системе (файловой, реестр понятно, новые процессы, установленные драйверы и т.д.), »

нет, каждое средство индивидуально, здесь прогибаем установщик под конкретную задачу, а не наоборот.
В справке, в шапке темы, вы найдете все инструменты. За Вами только как правильно их применить
Цитата:

Цитата diakov
перепаковывал internet download manager все работает все, но не работает расширенная интеграция в браузеры когда ставлю свой репак, пишет что я заблокировал сетевой драйвер IDM и не включается ни в какую не могу найти что где не так, пробовал отследить обращение к файлу или ветку реестра с помощью Procmon.exe никак не могу понять чего не хватает! Тоесть никак не могу понять какие файли отвечают за интеграцию IDM в браузеры! »

Вопрос не по теме, спросите знатоков, я не пользуюсь этой прогой,
мне достаточно встроенного в браузер стандартной качалки.

diakov 31-01-2012 10:36 1848166

kotkovets, видел репак daemon tools на нсис в котором идет подхват sptd драйвера из папки разположеной рядом с установщиком...в папке два файла оригинальные SPTDinst-x64.exe и SPTDinst-x64.exe тоесть в сам инсталятор они не вшиваются, как такое провернуть?

kotkovets 31-01-2012 17:34 1848582

Цитата:

Цитата diakov
SPTDinst-x64.exe и SPTDinst-x64.exe тоесть в сам инсталятор они не вшиваются, как такое провернуть? »

Элементарно, переменная $EXEDIR возвращает текущую папку инсталлятора.
Примерно так:
Код:

!include "x64.nsh"

Section ""
  ${If} ${RunningX64}
      IfFileExists "$EXEDIR\sptd64\SPTDinst-x64.exe" 0 +2
      ExecWait "$EXEDIR\sptd64\SPTDinst-x64.exe" ;запуск установки лрайвера
  ${Else}
      IfFileExists "$EXEDIR\sptd\SPTDinst.exe" 0 +2
      ExecWait "$EXEDIR\sptd\SPTDinst.exe"
  ${EndIf}
SectionEnd

Если платформа х64, то подхватится файл SPTDinst-x64.exe из папки "$EXEDIR\sptd64"
Если платформа х32, то подхватится файл SPTDinst.exe из папки "$EXEDIR\sptd"

Painkiller 31-01-2012 19:01 1848655

kotkovets , подскажите пример скрипта для правильной установки приложение в $PROGRAMFILES64 и $PROGRAMFILES32 ???
Так не получается :
Код:

!include "x64.nsh"
.....
${If} ${RunningX64}
InstallDir "$PROGRAMFILES64\${PRODUCT_NAME}"
  ${Else}
InstallDir "$PROGRAMFILES\${PRODUCT_NAME}"
 ${EndIf}

Тогда как ?

kotkovets 31-01-2012 19:34 1848691

Painkiller, Все гораздо проще, чем вы думаете...
пишем вне секции, в начале скрипта, но после объявления константы ${PRODUCT_NAME}
Код:

InstallDir "$PROGRAMFILES64\${PRODUCT_NAME}"
Предопределенных констант несколько:
$PROGRAMFILES, $PROGRAMFILES32, $PROGRAMFILES64 — папка Program files. В 64разрядной системе констатация $PROGRAMFILES и $PROGRAMFILES32 представляют папку C:\Program Files (x86), а $PROGRAMFILES64 - C:\Program Files.
А значит 32разрядной системе $PROGRAMFILES64 — папка Program files. и Все!

diakov 01-02-2012 10:32 1849086

kotkovets, все таки не дает мне покоя IDM прочитав ети строки из idmtdi.inf и idmwfp.inf я понял что запускаются некие сервисы

Код:

Class                = NetService
ClassGuid        = {4d36e974-e325-11ce-bfc1-08002be10318}
CatalogFile        = idmtdi.cat

[DestinationDirs]
DriverFiles32        = 12        ; %windir%\system32\drivers
DriverFiles64        = 12        ; %windir%\system32\drivers

.............................
[IdmTdi.Service]
DisplayName        = %ServiceName%
Description        = %ServiceDesc%
ServiceBinary        = %12%\idmtdi.sys        ; %windir%\system32\drivers\idmtdi.sys
ServiceType        = 1                        ; SERVICE_KERNEL_DRIVER
StartType        = 1                        ; SERVICE_SYSTEM_START
ErrorControl        = 0                        ; SERVICE_ERROR_IGNORE
;Dependencies        = Tcpip
;LoadOrderGroup        = PNP_TDI

;
; Copy Files
;

[DriverFiles32]
idmtdi.sys,idmtdi32.sys,,0x04                ; COPYFLG_NOVERSIONCHECK

[DriverFiles64]
idmtdi.sys,idmtdi64.sys,,0x04                ; COPYFLG_NOVERSIONCHECK

[SourceDisksNames]
1 = %SourceDisk%

[SourceDisksFiles]
idmtdi32.sys        = 1
idmtdi64.sys        = 1

и

Код:

[DefaultInstall.NTx86]
CopyFiles        = DriverFiles32

[DefaultInstall.NTamd64]
CopyFiles        = DriverFiles64

[DefaultInstall.NTx86.Services]
AddService        = %ServiceName%,0,IdmTdi.Service

[DefaultInstall.NTamd64.Services]
AddService        = %ServiceName%,0,IdmTdi.Service

....................
[IdmTdi.Service]
DisplayName        = %ServiceName%
Description        = %ServiceDesc%
ServiceBinary        = %12%\idmtdi.sys        ; %windir%\system32\drivers\idmtdi.sys
ServiceType        = 1                        ; SERVICE_KERNEL_DRIVER
StartType        = 1                        ; SERVICE_SYSTEM_START
ErrorControl        = 0                        ; SERVICE_ERROR_IGNORE
;Dependencies        = Tcpip
;LoadOrderGroup        = PNP_TDI


в директории самой проги есть файлы idmtdi32.sys, idmtdi64.sys, idmwfp32.sys, idmwfp64.sys, idmtdi.cat, idmwfp.cat, тоесть при установке запускаются сетевый сервисы IdmTdi.Service и IdmWfp.Service как запустить такие сервисы средствами нсис? Спасибо!

kotkovets 01-02-2012 10:56 1849105

Цитата:

Цитата diakov
как запустить такие сервисы средствами нсис? »

Попробуйте плагинами http://forum.oszone.net/post-1508031-816.html

diakov 01-02-2012 11:03 1849111

буду пробовать!

vahe-91 01-02-2012 17:37 1849432

возможно начиная с какого-то момента полностью скрыть интерфейс установщика ?

kotkovets 01-02-2012 18:00 1849457

Цитата:

Цитата vahe-91
возможно начиная с какого-то момента полностью скрыть интерфейс установщика ? »

HideWindow, или через WinAPI

Paval 02-02-2012 17:27 1850185

Нужно установить ASP.NET веб приложение. Информации в интернете почти нет. Дайте ссылку кто-нибудь.

Donniblack 04-02-2012 22:13 1851934

Народ сижу и туплю уже сколь времени!!!!!НЕ могу просто догнать.......Даже если не могу создавать скрипты не дано просто ((((ну скачал скрипт уже готовый а дальше то что .....как создать сам ехе , чтоб в тихую ставить то ????Что нужно для тихой установки программы ????

kotkovets 04-02-2012 22:33 1851948

Цитата:

Цитата Donniblack
Народ сижу и туплю уже сколь времени!!!! »

Donniblack, Начните с шапки -->Документация-->Справочник по NSIS
Цитата:

Цитата Donniblack
как создать сам ехе »

Компилировать скрипт, а вы NSIS скачали или хотя бы удобный редактор HM NIS Edit ? :)
Цитата:

Цитата Donniblack
Что нужно для тихой установки программы ???? »

Запускать скомпилированный скрипт (exe) c ключом - /S
Или в начале скрипта, вне секции или функции, написать команду:
Код:

SilentInstall Silent

Donniblack 05-02-2012 07:27 1852086

kotkovets
Да я скачал готовый скрипт уже, потому как делать его похоже для меня сложно наверно. НАверно надо знать языки програмирования, но разобраться очень хотелось бы.
Просто что дальше делать с готовым скриптом.
Как сделать сборку программы, какие папки и что делать.
Спасибо что ответили на предыдущее письмо!!!!

kotkovets 05-02-2012 16:53 1852276

Цитата:

Цитата Donniblack
Да я скачал готовый скрипт уже »

А где скачали, ссылку
Цитата:

Цитата Donniblack
Как сделать сборку программы, какие папки и что делать »

Цитата:

Цитата Donniblack
Просто что дальше делать с готовым скриптом. »

Компилировать NSIS'ом и изучать справку.

BuZzOFF 06-02-2012 12:27 1852763

Тему до конца ещё не дочитал... (47 страница)
Мож было уже...
Не могли бы разжевать как пользоваться этим плагином?..
Что-то никак не соображу.

Надо сделать так, чтоб при объёме памяти меньше, чем 1 ГБ, установка не запускалась.

Потому как во время установки будет распаковываться архив 7z, на распаковку которого нужно не менее 1Гб RAM.

Да и ещё.
Можно сделать так чтоб не кракозябры были?


Там файлы копируются...

Код:

Section
 nsExec::ExecToLog '"cmd.exe" /C COPY /Y $\"${OutDir}\Папка1\*.*$\" $\"${OutDir}\Папка2$\"'
  Pop $0
  Pop $1
  DetailPrint "$1"
  DetailPrint "Возвращённое значение: $0"
SectionEnd

upd.
Хотя ладно...
Не буду так копировать - попробую CopyFiles.

Donniblack 06-02-2012 14:03 1852822

kotkovets
Готовый скрипт скачал сдесь на форуме, похоже он уже скомпилирован, просто я так понимаю дальше нужно сделать сборку exe, либо действительно надо сидеть и читать.......Просто хотелось бы сделать программы для само установки, потому как приходиться ставить клиентам, а потом просто менять версии а не создавать новыеЮ, поэтому просто и хочеться разобраться как делать это, потому как версии программ выходят все более новые.
Просто хочеться сделать WPI свою сборку, и не все проги могут ставиться через cmd ключи, на некоторые нужно писать скрипты, вот и хочу разобраться но пока это туго получается.....(((

Krinkels 06-02-2012 15:23 1852878

Цитата:

Цитата Donniblack
похоже он уже скомпилирован »

Как у тебя все туго. Файл NSIS скрипта имеет расширение .nsi. А скомпилированный файл будет с расширением .exe.

Цитата:

Цитата Donniblack
вот и хочу разобраться но пока это туго получается.....((( »

У NSIS своеобразный скриптовый язык, но чтоб им овладеть нужно знать минимум в программировании.

Donniblack 06-02-2012 15:47 1852891

Krinkels
Нет это понятно что нужно знать в програмировании,
Но в фотошопе тоже трудно, однако с помощью уроков можно понять что то,\
Я так пониаю лучше не заморачиваться с NSIS и качать сборки WPI и оттуда себе вытягивать проги и добавлять просто в свою сборку ((((((((
Обидно а хотелось бы понимать((((
Спасибо всем в помощи.....

Krinkels 06-02-2012 16:00 1852903

Donniblack
В шапке есть справочник на русском языке, в нем есть и описания функций и примеры. Я рекомендую начать с него. А вообще пиши код, если что то не получиться выкладывай, может и поможем :)

kotkovets 06-02-2012 18:45 1853014

Цитата:

Цитата Donniblack
Обидно а хотелось бы понимать(((( »

Если сильно захотеть...через месяцок Вы будете думать, что глупые вопросы задавал :)
Цитата:

Цитата BuZzOFF
Надо сделать так, чтоб при объёме памяти меньше, чем 1 ГБ, установка не запускалась. »

Иногда и такое, но редко такое условие возникает:
Код:

!include "MUI2.nsh"

ShowInstDetails show
OutFile Memory.exe

!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

Section
  System::Alloc 32 # (4+4+4+4+4+4+4+4=32 байта) # выделяем буфер
  Pop $1 # определяем адрес выделенного буфера
  System::Call "Kernel32::GlobalMemoryStatus(ir1)"
  System::Call "*$1(i,i,i.r0)" # считываем данные со структуры
  System::Free $1 # освобождаем буфер
  DetailPrint "Total physical memory: $0 byte"
  IntCmp $0 1073741842 +3 0 +3 ;сравниваем количество байт
  MessageBox MB_OK "память меньше 1 гигабайта " IDOK
  Abort ;прерыввание
SectionEnd


Krinkels 07-02-2012 08:19 1853336

Цитата:

Цитата kotkovets
Иногда и такое, но редко такое условие возникает: »

Ух, больно сложно. Наверняка можно сделать намного проще.

BuZzOFF 07-02-2012 08:57 1853358

kotkovets
Спасибо. Всё получилось :)

Ещё один вопрос...
При запуске инсталлятора в тихом режиме из командной строки, он (инсталлятор) выдаёт такое:

Благодаря чему можно узнать как прошла установка...

Можно как-то сделать чтоб это отображалось тут?


Пробовал примерно так:
Код:

nsExec::ExecToLog '"cmd.exe" START /WAIT setup.exe --mode=Silent --deploymentFile=install.xml'
  Pop $0
  Pop $1
  DetailPrint "$1"
  DetailPrint "Возвращенное значение: $0"

Но ничего не отображалось.
Пробовал запускать bat'ник таким же макаром. Но тоже глухо.

Копирование/удаление файлов через командную строку показывает, а Exit Code не хотит.

kotkovets 07-02-2012 14:16 1853554

Цитата:

Цитата Krinkels
Ух, больно сложно. Наверняка можно сделать намного проще. »

4 строчки кода - для выяснения объема физ. памяти! куда уж проще! :)
Цитата:

Цитата BuZzOFF
Но ничего не отображалось.
Пробовал запускать bat'ник таким же макаром. Но тоже глухо.
Копирование/удаление файлов через командную строку показывает, а Exit Code не хотит. »

cmd ничего не передал плагину, возможно из-за неверного пути к setup.exe
И чему равно, значение кода возврата, если оно не равно нулю, что то не то...
И вообще для запуска внешних приложений в режиме ожидания есть команда ExecWait:
Код:

ExecWait `"Путь к \setup.exe" --mode=Silent --deploymentFile=install.xml'` $0
DetailPrint "Возвращенное значение: $0"


BuZzOFF 07-02-2012 14:32 1853564

Цитата:

Цитата kotkovets
неверного пути к setup.exe »

Не в этом проблема :dont-know
Всё устанавливается.. Но не отображается.
Код:

nsExec::ExecToLog '"cmd.exe" /C CD $WINDIR&CD TEMP&CD ADBEAFETCS4_LS7&START /WAIT setup.exe --mode=Silent --deploymentFile=install.xml'
Пробовал даже так :laugh:
Отображаются команды CD, потом пустота (хотя приложение установилось) ну и далее удаление файлов...

Цитата:

Цитата kotkovets
И вообще для запуска внешних приложений в режиме ожидания есть команда ExecWait »

Да это я знаю.
Так и делал.
Просто хотелось бы чтоб код отображался. Потому как приложение может не установиться и не будешь знать куда копать.
А так глянул в LOG-файл. Ага Exit Code: 0. Значит всё Ok..
Exit Code: 7. Значит ниOk...

yyv 07-02-2012 15:17 1853597

Nsis и цифровая подпись.
Мы добавляем к нашему инсталеру цифровую подпись. Есть пхп скрипт который модифицирует файл инсталера.
Стали делать деинсталятор и увидели что файл деинсталятора по итогу остается не подписанным.
Подскажите пожалуйста, как можно подписать файл деинсталятора?

kotkovets 07-02-2012 15:42 1853611

Цитата:

Цитата BuZzOFF
А так глянул в LOG-файл. Ага Exit Code: 0. Значит всё Ok.. »

ну так я писал:
Цитата:

ExecWait `"Путь к \setup.exe" --mode=Silent --deploymentFile=install.xml'` $0
DetailPrint "Возвращенное значение: $0"
Если переменная $0 = 0 - то все в порядке
Что бы отобразить окно деталей `сразу` пишем вне секции или функции:
Код:

ShowInstDetails show
Цитата:

Цитата yyv
Есть пхп скрипт который модифицирует файл инсталера.
Подскажите пожалуйста, как можно подписать файл деинсталятора?
»

я не подписывал деинсталляторы, но наверно так же, после создания (по скрипту) деинсталлятора.

yyv 07-02-2012 18:38 1853717

Цитата:

Цитата kotkovets
я не подписывал деинсталляторы, но наверно так же, после создания (по скрипту) деинсталлятора. »

но как я могу это сделать? Ведь инсталер создается у меня локально, а файл деинсталятора инсталер создает на машине пользователя?

kotkovets 07-02-2012 19:42 1853763

Цитата:

Цитата yyv
но как я могу это сделать? »

можно упаковать подписанный готовый инсталер(который будет выполнять функции деинсталера) в основной установщик.

BuZzOFF 08-02-2012 08:32 1853987

Цитата:

Цитата kotkovets
Если переменная $0 = 0 - то все в порядке »

Оно всегда ноль. Даже если установилось с ошибками.
Если только процесс убить. Тогда будет не ноль...

Цитата:

Цитата kotkovets
Что бы отобразить окно деталей »

По скрину видно что у меня это написано.

Ладно проехали... Либо Вы меня не так поняли, либо это невозможно.
Спасибо за помощь.

kotkovets 08-02-2012 09:13 1853997

Цитата:

Цитата BuZzOFF
Оно всегда ноль. Даже если установилось с ошибками »

Может быть проблема запускаемого сетапа,
который не транслирует лог установки и соответственно...

BuZzOFF 08-02-2012 09:33 1854002

kotkovets, Да ладно. Не так критично :) просто хотелось как лучше...

Другой теперь вопрос. Про установку на x64.
В справочнике не нашёл. Может плохо искал...

Если так делать:
Код:

InstallDir "$PROGRAMFILES\прога"
То в x64 показывает Program Files (x86).
Как сделать чтоб в x86 и x64 показывал Program Files.

И как сделать чтоб запускался msi нужной разрядности?

Кто-то тут уже приводил пример кода. Потерялось у меня...
Как-то так вроде было.
Код:

Section
SetOutPath "$TEMP"
 ExecWait '"msiexec.exe" /i $\"${OutDir}\прога.msi$\" /qb INSTALLDIR=$\"$INSTDIR$\"'
  ${If} ${RunningX64}
 ExecWait '"msiexec.exe" /i $\"${OutDir}\прога_x64.msi$\" /qb INSTALLDIR=$\"$INSTDIR$\"'
  ${EndIf}
SectionEnd

Что не правильно?
У меня ошибку выдаёт...
Код:

!insertmacro: _If
!insertmacro: macro "_If" requires 4 parameter(s), passed 2!
Error in script "H:\package\W7M.nsi" on line 70 -- aborting creation process


kotkovets 08-02-2012 09:55 1854008

Цитата:

Цитата BuZzOFF
То в x64 показывает Program Files (x86).
Как сделать чтоб в x86 и x64 показывал Program Files. »

кстати цитата из справки:
http://forum.oszone.net/post-1848691-2264.html
Цитата:

Цитата BuZzOFF
И как сделать чтоб запускался msi нужной разрядности?
Кто-то тут уже приводил пример кода »

ну здесь только я отвечаю в основном :)
Код:

!include "x64.nsh"
;---
Section
  SetOutPath "$TEMP"
  ${If} ${RunningX64}
    ExecWait "msiexec /i $\"$OutDir\прога_x64.msi$\" /qb INSTALLDIR=$\"$INSTDIR$\""
  ${Else}
    ExecWait "msiexec /i $\"$OutDir\прога.msi$\" /qb INSTALLDIR=$\"$INSTDIR$\""
  ${EndIf}
SectionEnd


Krinkels 08-02-2012 13:01 1854108

Цитата:

Цитата kotkovets
ну здесь только я отвечаю в основном »

Потому что других гуру здесь нету :)

kotkovets 08-02-2012 16:23 1854256

Krinkels, льстишь... :)

Paval 09-02-2012 13:55 1854787

Вот что здесь может быть неправильного?
Код:

   
    IfFileExists ${pkgdir_x64}\*.* 0 NoFiles
    File /r /x *.pdb "${pkgdir_x64}\"
    Goto Packed
NoFiles:
    File /r /x *.pdb "${pkgdir}\"
Packed:


wolkow70 09-02-2012 15:22 1854849

kotkovets,

Подскажите как проверить наличие ключа на наличие, при внесении в реестр записей.
Хочу руссифицировать контекстное меню MPC -HC для типов файлов после установки K-Lite. Примерно так:

если существует ключ HKLM SOFTWARE\Classes\mplayerc.avi , то
WriteRegStr HKLM "SOFTWARE\Classes\mplayerc.avi\shell\Open" "" "&Воспроизвести в MPC-HC"
WriteRegStr HKLM "SOFTWARE\Classes\mplayerc.avi\shell\Enqueue" "" "Добавить в плейлист MPC-HC"
иначе перейти к следующему типу и т.д.

wolkow70 09-02-2012 15:54 1854870

Как вариант сделал пока так:

!macro ContextLocalization extenstion
Push $0
StrCpy $ClassName "mplayerc.${extenstion}"
;
ReadRegStr $0 HKLM "SOFTWARE\Classes\$ClassName\shell\Open" ""
StrCmp $0 "&Play with MPC" 0 +5
DeleteRegValue HKLM "SOFTWARE\Classes\$ClassName\shell\Open" ""
DeleteRegValue HKLM "SOFTWARE\Classes\$ClassName\shell\Enqueue" ""
WriteRegStr HKLM "SOFTWARE\Classes\$ClassName\shell\Open" "" "&Воспроизвести в MPC-HC"
WriteRegStr HKLM "SOFTWARE\Classes\$ClassName\shell\Enqueue" "" "Добавить в плейлист MPC-HC"
Pop $0
!macroend

!insertmacro ContextLocalization "AVI"

kotkovets 09-02-2012 16:59 1854914

Цитата:

Цитата wolkow70
Подскажите как проверить наличие ключа »

удобно из справочника использовать библиотеку RegistryFunc.nsh
Код:

${If} ${KeyExists} "${HKCU}\Software\7-zip"
  # здесь выполняются команды, если ключ существует
  DetailPrint "Ключ есть!"
${Else}
  # здесь выполняются команды, если ключа не существует
  DetailPrint "Ключа не существует!"
${EndIf}

Цитата:

Цитата Paval
Вот что здесь может быть неправильного? »

IfFileExists ${pkgdir_x64}\*.* 0 NoFiles
IfFileExists - команда времени инсталляции, вы же пытаетесь всунуть папку
определенную времени компиляции, что для команды file подходит успешно - время компиляции.

wolkow70 09-02-2012 17:11 1854921

Цитата:

Цитата kotkovets
удобно из справочника использовать библиотеку RegistryFunc.nsh »

Там есть только Registry.nsh

kotkovets 09-02-2012 17:22 1854927

wolkow70, читайте » Работа с реестром с помощью NSIS
пример конструкции не учитывает значение ключа, только наличие ключа в реестре.

wolkow70 09-02-2012 17:28 1854937

kotkovets,
Я еще пользуюсь DelRegKey.nsh. Как они соотносятся с RegistryFunc.nsh?

kotkovets 09-02-2012 17:34 1854941

Цитата:

Цитата wolkow70
Я еще пользуюсь DelRegKey.nsh. Как они соотносятся с RegistryFunc.nsh? »

никак, RegistryFunc.nsh это расширенное на порядок продолжение DelRegKey.nsh
не требующая плагина Registry, библиотека написана на чистом API

BuZzOFF 10-02-2012 07:23 1855318

kotkovets, и снова здравствуйте :)
Ничего в языке NSIS не понимаю. и в англицком тоже...
Листаю тему, да леплю всякую "бяку" из нескольких примеров. И, что неудивительно, ничего не получается :laugh:

Хочу сделать поиск в файле hosts определённой строки...
читать дальше »
Код:

----------------------------------------------------------
!include "TextFunc.nsh"
!define ${LineFind}
----------------------------------------------------------
Section
${If} ${LineFind} "$SYSDIR\drivers\etc\hosts" "/NUL" "1:-1" "LineFindFunction"
  ExecWait '$\"${OutDir}\setup.exe$\" --mode=Silent'
${Else}
  ExecWait '$\"${OutDir}\medicine\hosts.exe$\"'
  ExecWait '$\"${OutDir}\setup.exe$\" --mode=Silent'
${EndIf}
SectionEnd

Function "LineFindFunction"
 StrCpy $R0 "$R9" 11
 StrCmp $R0 "127.0.0.1 activate.adobe.com" 0 nofind
 StrCpy $R1 "$R9" "" 12
        Push "StopLineFind"
 nofind:
        Push $0
FunctionEnd



Но при компиляции ошибка:
читать дальше »
Код:

!insertmacro: _If
!insertmacro: macro "_If" requires 4 parameter(s), passed 7!
Error in script "H:\package\MyScript.nsi" on line 116 -- aborting creation process



Интересно, но нифига непонятно :teeth:

Krinkels 10-02-2012 09:18 1855384

BuZzOFF
Дык сначала нужно было хоть справочник из шапки почитать, вот пример логической конструкции:
Код:

Section
StrCpy $0 11
${If} $0 == 11
  MessageBox MB_OK $$0=11
${ElseIf} $0 == 12
  MessageBox MB_OK $$0=12
${Else}
  MessageBox MB_OK "прочие значения $$0"
${EndIf}
SectionEnd


BuZzOFF 10-02-2012 09:29 1855390

Цитата:

Цитата Krinkels
Дык сначала нужно было хоть справочник »

Дык я читал.. Но невсё. Многое не понятно.
Так же как и в Вашей этой самой логической конструкции.

Если бы на конкретном примеру поглядеть, то мож чего и сообразил.
А так эти цифры мне ничего не говорят :teeth:

Тонкий намёк на помощь.. :)

kotkovets 10-02-2012 09:51 1855400

BuZzOFF, Чем обусловлено применение жесткой константы ${OutDiR} ?
Если рядом с установщиком сетап, то переменная $exedir - возвращает текущую папку инсталлятора.
Цитата:

Цитата BuZzOFF
Хочу сделать поиск в файле hosts определённой строки... »

Здесь нужно учитывать знак каретки - окончания/начало строки.
Код:

!include "MUI2.nsh"
!include "textfunc.nsh"

!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

ShowInstDetails show
OutFile "aap.exe"
var int

Function "LineFindFunction"
 ${If} $R9 == "127.0.0.1 activate.adobe.com$\r$\n"
 ${OrIf} $R9 == "127.0.0.1 activate.adobe.com"
    StrCpy $R1 "$R9" "" 12
    StrCpy $int 1 ;если найдена строка, то делаем значение $int = 1
    Push "StopLineFind"
 ${EndIf}
 Push $0
FunctionEnd

Section
StrCpy $int 0
${LineFind} "$SYSDIR\drivers\etc\hosts" "/NUL" "1:-1" "LineFindFunction"
${If} $int == 1
  ;ExecWait '"${OutDir}\setup.exe" --mode=Silent'
${Else}
  ;ExecWait "${OutDir}\medicine\hosts.exe"
  ;ExecWait '"${OutDir}\setup.exe" --mode=Silent'
${EndIf}
SectionEnd

Мне не понятна применение команды в коде
Код:

StrCpy $R1 "$R9" "" 12
я не вижу в функции LineFindFunction дальнейшие работы с переменной $R1, куда скидывается 12 символов строки.

BuZzOFF 10-02-2012 10:08 1855408

Цитата:

Цитата kotkovets
Чем обусловлено применение жесткой константы ${OutDiR} ? »

Код:

!define OutDir "$WINDIR\Temp\ADBEAFETCS4_LS7"
Это чтоб путь к папке менять удобней было. В одном месте исправил и всё...
Или Вы не это имели ввиду? :)

Цитата:

Цитата kotkovets
Мне не понятна применение команды в коде »

Мне тоже. Я это тут увидал => #1212

Спасибо за помощь.

А Вы это на x64 проверяли? У меня не работает.. Сразу выскакивает сообщение, что памяти не хватает. Говорит что -1 byte. Да и на x64 думаю можно отключить. Там всё равно по-любому больше 1ГБ будет...

kotkovets 10-02-2012 10:26 1855419

Цитата:

Цитата BuZzOFF
Чем обусловлено применение жесткой константы ${OutDiR} ? » »

теперь ясно, я думал ваш сетап будет рядом с установщиком.
Цитата:

Цитата BuZzOFF
Мне тоже. Я это тут увидал => #1212 »

Теперь понятно....из строки берется n символов, для поиска нужного выражения
Код:

Function "LineFindFunction"
;здесь вам нужно отсекать нуженое количество символов в начале строки
;чтобы получить выражения
;127.0.0.1 activate.adobe.com$\r$\n или 127.0.0.1 activate.adobe.com
 StrCpy $R0 "$R9" "" 12
 ;;;;;
 ${If} $R0 == "127.0.0.1 activate.adobe.com$\r$\n"
 ${OrIf} $R0 == "127.0.0.1 activate.adobe.com"
    StrCpy $int 1 ;если найдена строка, то делаем значение $int = 1
    Push "StopLineFind"
 ${EndIf}
 Push $0
FunctionEnd

Цитата:

Цитата BuZzOFF
А Вы это на x64 проверяли? »

нет, вы правильно заметили, что нет смысла, и я написал, что это нужно сверхредко...
!include "x64.nsh"
;--
${IfNot} ${RunningX64}
;команды опр. физ памяти
${Endif}

diakov 11-02-2012 09:53 1856072

kotkovets, такой вопрос когда пишу код в скрипте
Код:

CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\PotPlayerMini.exe"
в свойствах якрлыка получаю
Код:

"C:\Program Files\DAUM\PotPlayer\PotPlayerMini.exe"
как сделать что бы в свойствах ярлыка получить
Код:

"C:\Program Files\DAUM\PotPlayer\PotPlayerMini.exe" /RegisterAll
пробовал так

Код:

CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" '"$INSTDIR\PotPlayerMini.exe" /RegisterAll'
не получается...

kotkovets 11-02-2012 12:11 1856140

diakov, в справочнике все расписано, введите в указателе - CreateShortCut
Код:

CreateShortCut "Расположение_ярлыка.lnk" "Путь_до_файла.exe" "параметры_запуска" "Файл_иконки" "Индекс_иконки" "Тип_окна" "Горячая_клавиша" "Описание_ярлыка"

diakov 13-02-2012 17:19 1857823

kotkovets, вот такая ситуация, есть 5 чекбоксов, для 3 надо сделать так чтобы выбирался только один из них (языки установки).

kotkovets 13-02-2012 17:51 1857851

Насколько я понял, имеются в виду радиобутоны на своей страничке
http://nsis.sourceforge.net/NsDialogs_FAQ
Объединяем чебоксы в "свои" группы переключений:
читать дальше »
Код:

!include "MUI2.nsh"

OutFile "radio"
ShowInstDetails Show

Page custom CreatePage
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

Section ""
SectionEnd

var dlg
var radiobox1
var radiobox2
var radiobox3
var radiobox4
var radiobox5

Function CreatePage
    nsDialogs::Create 1018
    Pop $dlg
    ${NSD_CreateRadioButton} 0u 0u 120u 12u "RadioButton1"
    Pop $radiobox1
    ${NSD_CreateRadioButton} 0u 15u 120u 12u "RadioButton2"
    Pop $radiobox2
    ${NSD_SetState} $radiobox1 1
    ${NSD_AddStyle} $radiobox1 ${WS_GROUP}
    ;----
    ${NSD_CreateRadioButton} 0u 40u 120u 12u "RadioButton3"
    Pop $radiobox3
    ${NSD_CreateRadioButton} 0u 55u 120u 12u "RadioButton4"
    Pop $radiobox4
    ${NSD_CreateRadioButton} 0u 70u 120u 12u "RadioButton5"
    Pop $radiobox5
    ${NSD_SetState} $radiobox3 1
    ${NSD_AddStyle} $radiobox3 ${WS_GROUP}
    nsDialogs::Show
FunctionEnd


diakov 13-02-2012 18:08 1857869

Ага тоесть оперировать, именно радиобутонами...ато я хотел так

kotkovets 13-02-2012 18:34 1857884

Цитата:

Цитата diakov
...ато я хотел так »

большая куча кода и много потеряного времени...

diakov 13-02-2012 18:45 1857892

будем пробовать...

BuZzOFF 17-02-2012 13:28 1860792

kotkovets,
Опять я с поиском в файле :)
Есть файл "Adobe After Effects CS5*.log" (* - это дата).
Нужно найти строчку "Exit Code:", начинать искать с 27 строчки.
И чтоб когда нашлось вылазило окно "Exit Code: и то что после этого написано" "Ok" ( к примеру "Exit Code: 0 - No error")
Но при этом нужно оставить ещё вот это.

kotkovets 17-02-2012 15:06 1860864

Цитата:

Цитата BuZzOFF
Нужно найти строчку "Exit Code:", начинать искать с 27 строчки.
И чтоб когда нашлось вылазило окно "Exit Code: и то что после этого написано" "Ok" ( к примеру "Exit Code: 0 - No error") »

Макрос позваляет читать файл с нужной строки, заданный интервал строк
Код:

;27 - прочитать только 27 строку сначала файла
;-27 - прочитать только 27 строку с конца файла
;5:9 - прочитать с 5 по 9 строку включительно
;27:-1 - прочитать с 27 строки до конца

${LineFind} "txt.txt" "/NUL" "27:-1" "LineFind"

Function "LineFind"
  ;в переменную $R0 помещаем первые 10 символов строки
  StrCpy $R0 $R9 10
  ;Exit Code: --> 10 символов
  ${If} $R0 == "Exit Code:"
      MessageBox MB_OK "$R9" IDOK
      ;StrCpy $0 StopLineFind ;если нужно делаем прерывание чтения
  ${EndIf}
  Push $0
FunctionEnd


diakov 18-02-2012 15:46 1861427

kotkovets, такой вопрос

Код:

Section "Установить надстройку"
  ${If} $Check5 == 1
    CreateDirectory "$PROGRAMFILES\Minilyrics"
    SetOutPath "$PROGRAMFILES\Minilyrics"
    File /r "D:\Aimp\MiniLyric\*.*"
    CreateDirectory "$APPDATA\MiniLyrics"
  SetOutPath "$APPDATA\MiniLyrics"
    File /r "D:\Aimp\MiniLyrics\*.*"
    ${If} ${RunningX64}
    SetOutPath "$INSTDIR\Plugins"
    File /r "D:\Aimp\gen_MiniLyrics.dll"
    File /r "D:\ystanovka\MLPlugin.ini"
    ${Else}
    SetOutPath "$INSTDIR\Plugins"
    File /r "D:\Aimp\MLPlugin.ini"
    File /r "D:\Aimp\gen_MiniLyrics.dll"
    ${EndIf}
        SetShellVarContext all
    WriteRegStr HKCU "MUI_LANGDLL_REGISTRY_KEY" "MUI_LANGDLL_REGISTRY_VALUENAME" "1033"
    WriteRegStr HKCU "Software\MiniLyrics" "InstallerLanguage" "1033"
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Запустить Minilyrics.lnk" "$PROGRAMFILES\Minilyrics\Minilyrics.exe"
  ${EndIf}
SectionEnd

Не создает папку $APPDATA\MiniLyrics и не копирует туда D:\Aimp\MiniLyrics\*.* что тут не так?

kotkovets 18-02-2012 17:02 1861469

Цитата:

такой вопрос
Правильнее так:
читать дальше »
Код:

Section "Установить надстройку"
 
SetShellVarContext all
 
${If} $Check5 == 1
     
SetOutPath "$PROGRAMFILES\Minilyrics"
     
File /r "D:\Aimp\MiniLyric\*.*"
     
SetOutPath "$APPDATA\MiniLyrics"
     
File /r "D:\Aimp\MiniLyrics\*.*"
     
${If} ${RunningX64}
         
SetOutPath "$INSTDIR\Plugins"
         
File "D:\Aimp\gen_MiniLyrics.dll"
         
File "D:\ystanovka\MLPlugin.ini"
     
${Else}
         
SetOutPath "$INSTDIR\Plugins"
         
File "D:\Aimp\MLPlugin.ini"
         
File "D:\Aimp\gen_MiniLyrics.dll"
     
${EndIf}
     
WriteRegStr HKCU "MUI_LANGDLL_REGISTRY_KEY" "MUI_LANGDLL_REGISTRY_VALUENAME" "1033"
     
WriteRegStr HKCU "Software\MiniLyrics" "InstallerLanguage" "1033"
     
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Запустить Minilyrics.lnk" "$PROGRAMFILES\Minilyrics\Minilyrics.exe"
 
${EndIf}
SectionEnd


А может надо
Код:

SetShellVarContext current

diakov 18-02-2012 17:18 1861482

Счас попробую...

diakov 19-02-2012 12:38 1861915

kotkovets, все получилось именно с SetShellVarContext current! Спасибо!
Подскажи пожалуйста как организовать выбор языка самого установщика при его запуске? (допустим сделать его (украинским,английски и русским). И еще раз спасибо что ты есть!

kotkovets 19-02-2012 12:50 1861930

diakov,
cмотри в примерах Examples\Modern UI\MultiLanguage.nsi

kotkovets 19-02-2012 13:15 1861942

diakov, смотри еще здесь
http://forum.oszone.net/post-1553443-903.html

wolkow70 20-02-2012 16:14 1862820

Цитата:

Цитата kotkovets
Function .OnInit
ExpandEnvStrings $INSTDIR "%SYSTEMDRIVE%\App"
FunctionEnd
InstallDir "$INSTDIR" »

Сделал таким образом.
В результате директория установки нормально отображается в строке инсталлятора, но не работает ключ /D=путь установки.

Пробовал также так:

Var SysDrive

Function .OnInit
StrCpy $SysDrive $WINDIR 2
FunctionEnd

InstallDir "$SysDrive\app"

В строке не отражается буква диска, только папка (не красиво).
Мне нужно сделать, чтобы и в строке нормально отражалось, и ключ /D нормально работал.

Подмогнете?

kotkovets 20-02-2012 17:01 1862859

Цитата:

Цитата wolkow70
Мне нужно сделать, чтобы и в строке нормально отражалось, и ключ /D нормально работал. »

таким способом, нет, у вас всегда предопределяется условие
выбора пути установки в функции .OnInit

wolkow70 20-02-2012 17:23 1862874

Цитата:

Цитата kotkovets
таким способом, нет, у вас всегда предопределяется условие
выбора пути установки в функции .OnInit »

Если сделать так:
InstallDir "$SysDrive\app" ,
то не предопределяется, но почему-то букву диска не отображает, только саму папку. Может надо добавить что-то вроде того "$\ ?

diakov 21-02-2012 22:17 1863911

kotkovets, а как с помощью LangString задать текст описания радиобутонов и чекбоксов на кастомной страничке?

diakov 21-02-2012 22:43 1863933

Все разобрался тока не знеаю правильно ли но работает)) вот так вот

В самой функции кастомной странички пишу "$(RadioButton)"


Function PageInit
!insertmacro MUI_HEADER_TEXT "Выбор типа и компонентов установки" "..."
nsDialogs::Create 1018
Pop $dlg
${NSD_CreateLabel} 0u 0u 120u 12u "Пожалуйста, сделайте выбор:"
Pop $Label
;;
${NSD_CreateRadioButton} 0u 15u 150u 12u "$(RadioButton)"
Pop $RadioButton
${NSD_SetState} $RadioButton 1 ;делаем радиобутон отмеченным
${NSD_OnClick} $RadioButton RadioButton ;событие отметки радиобутона


а перед этим пишу

LangString RadioButton ${LANG_RUSSIAN} "значение"
LangString RadioButton ${LANG_ENGLISH} "значение"

diakov 21-02-2012 23:28 1863955

kotkovets, теперь такая загвоздка как на страничке лицензия указать файлы под конкретный язык, пробовал так:

Код:

!insertmacro MUI_PAGE_LICENSE "$(LICENSE)"
Код:

LangString LICENSE ${LANG_RUSSIAN} "${NSISDIR}\COPYING.rtf"
LangString LICENSE ${LANG_ENGLISH} "${NSISDIR}\COPYING1.rtf"
LangString LICENSE ${LANG_UKRAINIAN} "${NSISDIR}\COPYING2.rtf"

Не получается...вообще ничего не отображает на странице лицензии...

kotkovets 22-02-2012 00:26 1863993

diakov, не получится страничка лицензии, подгрузка файла в окно лицензии - это время компиляции,
а тебе нужно время установки - на подгрузку нужного файла в зависимости от языка установщика.
попробуй плагом: http://nsis.sourceforge.net/CustomLicense_plug-in
Код:

!addplugindir .

!include "MUI2.nsh"

Name "BigLicense-Test"
OutFile "biglictest.exe"


!insertmacro MUI_PAGE_WELCOME

  !define MUI_PAGE_CUSTOMFUNCTION_SHOW "LICENSE_SHOW" ;эту строку не перемещать!!!
!insertmacro MUI_PAGE_LICENSE "${NSISDIR}\COPYING" ;эту строку не менять!!!

!insertmacro MUI_PAGE_INSTFILES

!insertmacro MUI_LANGUAGE "russian"

Function LICENSE_SHOW
  InitPluginsDir
  ${If} $LANGUAGE == 1049 ;если русский язык установщику
      File "/oname=$PLUGINSDIR\info.rtf" "Text\info_ru.rtf"
  ${ElseIf} $LANGUAGE == 1033 ;если английский язык установщика
      File "/oname=$PLUGINSDIR\info.rtf" "Text\info_eng.rtf"
  ${EndIf}
 
  FindWindow $0 "#32770" "" $HWNDPARENT
  GetDlgItem $0 $0 1000
  CustomLicense::LoadFile "$PLUGINSDIR\info.rtf" $0
FunctionEnd

Section
SectionEnd


Sidril 25-02-2012 14:45 1866254

Добрый день.
Изучал справку NSIS, но к сожалению не нашёл ответа на интересующий меня вопрос. Если вас не затруднит, пожалуйста, подскажите как можно организовать реальный прогресс установки на странице инсталляции? Просто у меня на данный момент получается так, что инсталляция реально не завершена и на половину, а прогресс-бар заполняется уже на 90%.
Поискав плагины на эту тему, обнаружил что имеется NSIS Real Plugin (http://nsis.sourceforge.net/RealProgress_plug-in). Но моя криворукость не позволяет мне понять принцип работы данного плагина... Быть может в стандартных средствах NSIS есть более простой способ решения моей проблемы?
Спасибо!

kotkovets 25-02-2012 16:13 1866307

Цитата:

Цитата Sidril
Изучал справку NSIS, но к сожалению не нашёл ответа на интересующий меня вопрос. Если вас не затруднит, пожалуйста, подскажите как можно организовать реальный прогресс установки на странице инсталляции? Просто у меня на данный момент получается так, что инсталляция реально не завершена и на половину, а прогресс-бар заполняется уже на 90% »

Проблема в Вашем скрипте, может макросе, идет прерывание установки - ИМХО на 100% !
Ищите команды - abort, return - наверняка по неправильным условия срабатывают, а может и правильным...:)

Sidril 25-02-2012 16:40 1866325

kotkovets
Да нет, установка не прерывается. Дело в том что прогресс установки ориентируется на выполнение команд скрипта, т.е к примеру в скрипте 500 команд, если выполнено уже 450 строк, то прогресс-бар заполнится на 90%. Меня это не устраивает, мой инсталлятор построен на принципах запуска и ожидания конца работы внешних приложений, это всё прописано ближе к концу скрипта, поэтому и показывает прогресс 90%... Но работа внешних приложений длится приличное кол-во времени, а прогресс бар как за 5 секунд дошёл до 90% и потом уже не двигается. Установка продолжается - прогресс бар стоит.

Нужно как-то настраивать прогресс-бар... В справочнике по NSIS тоже увы нет примеров для этого. Как-то странно, вроде нормальный прогресс установки - элементарная вещь, а такие вот проблемы (

kotkovets 25-02-2012 18:06 1866379

Цитата:

Цитата Sidril
Установка продолжается - прогресс бар стоит »

Прогрecc бар двигается только по внутренним командам, сообщениям - но не запускам внешних приложений.
попробуйте между перед каждым запуском приложения прописать:
Код:

DetailPrint "Установка название приложения"
А ну последней командой в последней секции
Код:

DetailPrint "готово"
Можно конечно получить последними командами дескриптор прогресса, найти верхний предел и установить

Sidril 25-02-2012 22:25 1866585

На таких блоках поставлен запуск и ожидание внешних приложений:

SetDetailsPrint textonly
DetailPrint "Установка основных компонентов"
SetDetailsPrint listonly
SetOutPath "$INSTDIR"
ExecWait '"$INSTDIR\install_old.exe"'

SetDetailsPrint textonly
DetailPrint "Установка дополнительных компонентов"
SetDetailsPrint listonly
SetOutPath "$INSTDIR"
ExecWait '"$INSTDIR\install_new.exe"'

Задача передо мной стоит чтоб в тот момент когда идёт установка основных компонентов прогресс бар был на 30%, когда начинается установка дополнительных компонентов - на 40% и так далее... Но так понимаю в NSIS это архисложная задача (

kotkovets 25-02-2012 23:15 1866611

Пробуйте так, хотя думаю врядли, nsis тоже двигает прогресс
читать дальше »
Код:

!macro SETPOS position
  FindWindow $R9 "#32770" "" $HWNDPARENT
  GetDlgItem $R9 $R9 1004
  Intop $R8 300 * ${position}
  SendMessage $R9 0x402 $R8 0
!macroend

Section
  !insertmacro SETPOS 0 ;устанавливаем на 0%.
  SetDetailsPrint textonly
  DetailPrint "Установка основных компонентов"
  SetDetailsPrint listonly
  SetOutPath "$INSTDIR"
  ExecWait '"$INSTDIR\install_old.exe"'

  !insertmacro SETPOS 50 ;устанавливаем на 50%.
  SetDetailsPrint textonly
  DetailPrint "Установка дополнительных компонентов"
  SetDetailsPrint listonly
  SetOutPath "$INSTDIR"
  ExecWait '"$INSTDIR\install_new.exe"
  !insertmacro SETPOS 100 ;устанавливаем на 100%.
SectionEnd


Sidril 26-02-2012 00:02 1866645

Спасибо за вариант.
Жаль, но не помогает... Прогресс всё равно стремглав бежит вперёд, ориентируюясь на команды скрипта.
Нужно установить тотальный контроль за прогрессом...
Если вам не сложно, посмотрите что за зверь такой Real Progress plugin. Как его можно использовать в моём случае.
Думаю это не должно пройти за зря, т.к можно потом для пользователей отобразить пример в русской справке по NSIS.
Кстати, спасибо вам за этот справочник. Незаменимая вещь в хозяйстве. Надеюсь проект справки не заброшен и будет обновляться - это в качестве пожелания.
________________________________
Была у меня также мысль (подсмотрел в каком-то из установщиков) относительно того, чтобы когда начинают выполняться функции запуска и ожидания - в этот момент всплывает долнительный мини-прогресс бар где и показывался ход установки компонентов. Но опять же, нигде не нашёл примеров кода по прогрессу.

wolkow70 26-02-2012 13:31 1866892

kotkovets, Подскажите пожалуйста возможно ли сделать такое:

Есть группа секций "Установить Winamp Agent"

В одной из секций опция "Запустить WinampAgent после установки"

Exec "$INSTDIR\winampa.exe"

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

Если прописать в функцию Function .onInstSuccess, то как реализовать условие значения в секции?

kotkovets 26-02-2012 14:34 1866924

Цитата:

Цитата wolkow70
Есть группа секций "Установить Winamp Agent"
В одной из секций опция "Запустить WinampAgent после установки"
Exec "$INSTDIR\winampa.exe"
Как можно реализовать, что бы при установке галочки на чебоксе действительно агент запускался после успешной установки?
Если прописать в функцию Function .onInstSuccess, то как реализовать условие значения в секции? »

xex...:), проверяете, считываете состояние секции и наличие файлика собственно.
Код:

SectionGroup  /e "some stuff"

Section "install"
SectionEnd

Section "exec" SEC1
SectionEnd

SectionGroupEnd

Function .onInstSuccess
    ${If} ${SectionIsSelected} ${SEC1}
    ${AndIf} ${FileExists} "$INSTDIR\winampa.exe"
          Exec "$INSTDIR\winampa.exe"
    ${EndIf}
FunctionEnd

Цитата:

Цитата Sidril
Нужно установить тотальный контроль за прогрессом...
Если вам не сложно, посмотрите что за зверь такой Real Progress plugin. Как его можно использовать в моём случае. »

Да вроде бы элементарно...допустим у вас есть 5 блоков команд,
т.е после каждого блока команды двигаем на 20%
и так до 100%, т.е рассчитываете сколько у вас блоков однотипных команд и
сотню делите на кол-во блоков однотипных команд.
читать дальше »
Код:

Section
  RealProgress::FileProgress /NOUNLOAD 0
  Sleep 300    ;[блок команд]
  RealProgress::FileProgress /NOUNLOAD 20 ;установка прогресса на 20%.
  Sleep 300    ;[блок команд]
  RealProgress::FileProgress /NOUNLOAD 40
  Sleep 300    ;[блок команд]
  RealProgress::AddProgress /NOUNLOAD  60
  Sleep 300    ;[блок команд]
  RealProgress::AddProgress /NOUNLOAD  80
  Sleep 300    ;[блок команд]
  RealProgress::AddProgress /NOUNLOAD  100 ;установка прогресса на 100%.
  SectionEnd

## Unload the plugin so that it can be deleted!
Function .onGUIEnd
  RealProgress::Unload
FunctionEnd


Sidril 27-02-2012 00:19 1867311

Большое спасибо. вроде примерно понял.
Вы привели пример File Progress
Там также есть Detail и Gradual progress. Неплохо бы узнать чем они отличаются.

В моём установщике несколько компонентов, которые устанавливаются по желанию клиента. Т.е несколько секций в скрипте имеется... Как в этом случае сохранить адекватность продвижения прогресс бара, если заранее не известно будет ли клиент устанавливать тот или иной компонент или нет. Первая секция обязательна к установке остальные на выбор.
На примере двух секций.
;__________________________________________________
Section "Ключевые составляющие" Sec1
SectionIn RO
RealProgress::FileProgress /NOUNLOAD 0
Sleep 300 ;[блок команд]
RealProgress::FileProgress /NOUNLOAD 20 ;установка прогресса на 20%.
Sleep 300 ;[блок команд]
RealProgress::FileProgress /NOUNLOAD 40
Sleep 300 ;[блок команд]
RealProgress::AddProgress /NOUNLOAD 60
Sleep 300 ;[блок команд]
RealProgress::AddProgress /NOUNLOAD 80
Sleep 300 ;[блок команд]
RealProgress::AddProgress /NOUNLOAD 100 ;установка прогресса на 100%.
SectionEnd

Section "Авторские обновления" Sec2
Sleep 300 ;[блок команд]
RealProgress::AddProgress /NOUNLOAD ??? ;какой параметр прогресса должен быть?
SectionEnd

;__________________________________________________

Какой параметр прогресса должен быть в случае если клиент захочет установить "Авторские обновления"? По скрипту выходит что после выполнения первой секции прогресс-бар будет на 100%, а установка не завершится, т.к пойдёт выполнения следующей секции. С другой стороны - если клиент не захочет устанавливать "Авторские обновления", то тогда прогресс 100 в первой секции правильный... Довольно сумбурная схема... Как бы так сделать чтобы волков накормить, и овец сохранить?:)

kotkovets 27-02-2012 00:51 1867325

Sidril эксперементально,расчетом времени, кстати это уже не nsi'шный прогресс
Код:

RealProgress::GradualProgress /NOUNLOAD 1 5 25
Означает, что каждую секунду добавлять 5% до 25%, если второй раз прописать команду, то прогресс будет на 50%.
Можно делать скрытой секцией (последней), которая всегда выполняется - прописать на 100 %.
В любом случае завершение - это 100% индикатор
---
Точно, все равно не рассчитаете, ибо родной правильнее будет, потому что компилятор считает сколько команд будет
при разных условиях, еще есть команды из хедеров (!include *.nsh - тысячи команд),
устанавливает шаг изменения прогресса, тем меньше команд - больше шаг.

Sidril 27-02-2012 13:03 1867569

kotkovets. В очередной раз спасибо вам за помощь в разборе вопроса.
Так, GradualProgress не подходит... Т.к в моём случае рассчёт по времени неактуален, потому как время установки зависит от конфигурации компа клиента и от загруженности системы, т.е у всех будет разное время установки в примерных границах от 7 до 30 минут.
***
Собственно, говоря о трёх вариантах прогресса, которые предлагает плагин NSIS Real Rpogress, я понял следующее:

- GradualProgress представляет собой рассчёт процента прогресса исходя из времени (нужен рассчёт секунд).
- DetailProgress ориентирует процент прогресса на количество строк в скрипте секций (нужен рассчёт строк).
- FileProgress даёт возможность выставлять проценты прогресса на определённых этапах выполнения скрипта.

Как Вы сразу правильно предложили - File Progress наиболее оптимален для моего инсталлера.
***
Цитата:

Цитата kotkovets
Можно делать скрытой секцией (последней), которая всегда выполняется - прописать на 100 %.
В любом случае завершение - это 100% индикатор »

Это отличная идея. Посмотрел в справке пример скрытых секций.
Подскажите, в данной секции достаточно только прописать команду прогресса на 100%?
Т.е, такой вид скрытой секции будет?

Section "-Секция скрыта"
RealProgress::AddProgress /NOUNLOAD 100
SectionEnd
***
Цитата:

Цитата kotkovets
Точно, все равно не рассчитаете, ибо родной правильнее будет, потому что компилятор считает сколько команд будет
при разных условиях, еще есть команды из хедеров (!include *.nsh - тысячи команд),
устанавливает шаг изменения прогресса, тем меньше команд - больше шаг. »

Ну родной за 5 секунд выдаёт прогресс 90%, т.к скрипт уже выполнен настолько. Я не знаю как на это повлиять без плагина.

Sidril 28-02-2012 20:31 1868674

С прогрессом вроде всё ок. Спасибо kotkovets.

Новый вопрос. Хочу перед запуском инсталлятора чтобы появлялось приветственное изображение, и чтобы оно появлялось под сопровождение музыкального отрывка.
Не нашёл этого в справке. NSIS поддерживает такие функции?

Aster 28-02-2012 20:56 1868695

NewAdvSplash plug-in поможет.

brauni 29-02-2012 18:58 1869405

Уважаемые форумчане! Подскажите, как в NSIS "вынести" установочные файлы из инсталлятора в отдельные бинарники (с возможностью назначения их количества и размера) --> т.е. получить маленький (~100Kb) файл инсталятора и пару-тройку "привязанных" к нему больших файлов. До этого пользовался Smart Install Maker'ом, но он тупо "делит" большой инсталятор на равные части.

PS: Если ответ уже был - кинте, плз, ссылку на этот пост.

kotkovets 29-02-2012 19:40 1869448

brauni, нет, только можно внешним упаковщиком, например 7z, потом распаковывать консольной утилитой 7z.exe
Естественно придется таскать собой файлы 7z.dll и 7z.exe.
Установщик распаковывает в временную папку 7z.dll и 7z.exe и файлы архивов созданные 7z,
затем установщик заводит 7z.exe c ожиданием завершения (ключи запуска консоли, смотрите в справке 7z),
архивы распаковывается в указанную к ключе запуска 7z.exe, временная папка затем удаляется.

brauni 29-02-2012 19:57 1869459

Цитата:

Цитата kotkovets
brauni, нет, только можно внешним упаковщиком ...»

Жаль! Придецца разбираться в InnoSetup или ставить Install Creator Pro 2. Спасибо!

MKN 01-03-2012 09:24 1869814

Цитата:

Цитата kotkovets
Естественно придется таскать собой файлы 7z.dll и 7z.exe. »

А зачем их таскать, если вопрос ставится так , что
Цитата:

Цитата brauni
т.е. получить маленький (~100Kb) файл инсталятора и пару-тройку "привязанных" к нему больших файлов. »

Пусть в этот маленький инсталлятор входят 7z.dll и 7z.exe и скрипт описания что, куда и как распаковать(упаковать)

Sidril 01-03-2012 14:10 1870028

Ребята, подскажите, плиз как в программу внедрить опцию проверки наличия ключа в реестре при запуске инсталлятора? Т.е в момент когда клиент запускает инсталятор шла бы проверка наличия ключа. Если ключ найден то установка переходит сразу на стартовую страницу. Если не найден - предупреждение о том что следы программы не обнаружены, установка может пройти неправильно.
***

И ещё такой вопрос, на что влияет параметр XPStyle on? Какой стиль XP тут имеется ввиду и зачем вообще это нужно.
Спасибо!

kotkovets 01-03-2012 15:20 1870068

Цитата:

Цитата Sidril
Ребята, подскажите, плиз как в программу внедрить опцию проверки наличия ключа в реестре при запуске инсталлятора? Т.е в момент когда клиент запускает инсталятор шла бы проверка наличия ключа. Если ключ найден то установка переходит сразу на стартовую страницу. Если не найден - предупреждение о том что следы программы не обнаружены, установка может пройти неправильно. »

В функции .OnInit проверяем ключ, к примеру параметр ключа по умолчанию,
значение параметра тоже проверяется(если не пустое):
Код:

!include "logiclib.nsh"
;--
Function  .OnInit
  ClearErrors
  ReadRegStr $8 HKLM "Software\nsis" ""
  ${If} ${Errors}
  ${OrIf} $8 == ""
      MessageBox MB_OK "следы программы не обнаружены, установка может пройти неправильно"
  ${EndIf}
FunctionEnd

Цитата:

Цитата Sidril
И ещё такой вопрос, на что влияет параметр XPStyle on? »

А вы скомпильте такой пример и все увидете:
Код:

OutFile "setup.exe"
page instfiles
Section
    MessageBox MB_OK "install" IDOK
SectionEnd

Сделали?
добавьте команду в начале скрипта -- XPStyle on,
затем найдите 10 отличий :biggrin:

Sidril 01-03-2012 15:55 1870101

Цитата:

Цитата kotkovets
Сделали?
добавьте команду в начале скрипта -- XPStyle on,
затем найдите 10 отличий »

Собственно ничем не отличающиеся инсталляшки получились.
Я уже и в своём скрипте добавлял - изменений не видел, по этому и спросил смысл этой опции. Может как-то влияет что у меня у самого Win XP.

kotkovets 01-03-2012 16:46 1870155

Цитата:

Цитата Sidril
Собственно ничем не отличающиеся инсталляшки получились. »

эээ.... это команда "одевает" инсталлятор в тему оформления Windows, очевидно у вас классика,
ну что бы не заметить... :cool: особенно прогресс

Sidril 01-03-2012 21:36 1870393

На зрение не жалуюсь)
Цитата:

Цитата kotkovets
это команда "одевает" инсталлятор в тему оформления Windows »

Ну вот как это понять... А без этой команды тогда инсталлятор во что одевается?:)
Стоит у меня классическая тема оформления. Что с командой, что нет - тема та же самая. В чём принцип так и не понял.

kotkovets 01-03-2012 21:55 1870415

Sidril, а Вы смените тему оформления Windows на не классическую...и смотрите разницу
с примером, который я приводил: с XPstyle on и c XPstyle off :lol:

Sidril 01-03-2012 22:33 1870441

Цитата:

Цитата kotkovets
Sidril, а Вы смените тему оформления Windows на не классическую...и смотрите разницу »

Сменил тему. Сравнил ваши примеры с командой и без - Прогресс и кнопки изменились.

Вставил "XPstyle on" в свой скрипт. сравнил результат с командой и без. всё то же самое. и с командой и без - стиль хп показывается. Опять не догнал в чём смысл команды))
играет она какую-то роль, если подключен MUI?)

BuZzOFF 02-03-2012 06:34 1870579

kotkovets, почитал в справочнике про определение ОС. и чё-то всё равно не понял как можно сделать...
Нужно определить ОС. И если это один из Server'ов, то выполнить одно действо. Если не Server, то другое...

kotkovets 02-03-2012 09:33 1870635

Цитата:

Цитата BuZzOFF
И если это один из Server'ов, то выполнить одно действо. Если не Server, то другое.. »

Этого достаточно, серверное имя узнать, если переменная $0 пуста - это не сервер.
Код:

!include "WinVer2.nsh"
;---
${WinServerName} $0
${IfNot} $0 == ""
  ;---
  ;это сервер
  MessageBox MB_ICONINFORMATION|MB_OK "$0"
  ;---
${Else}
  ;---
  ;это не сервер
  ;---
${EndIf}

Ну чего уж проще...

Begin2Fly 02-03-2012 18:50 1871033

Товарищи, добрый вечер. Буду очень благодарен, если подскажете как впихнуть изображение на кастомную страницу при помощи плагина nsisSlideshow.
Надо просто вставить PNG-изображение (справа вверху), а не размазать его по всему окну, как этот плагин делает по умолчанию...

kotkovets 02-03-2012 19:21 1871055

Begin2Fly, на кастомную никак, плаг для этого не предназначен.

Begin2Fly 02-03-2012 22:36 1871210

Цитата:

Цитата kotkovets
Begin2Fly, на кастомную никак, плаг для этого не предназначен. »

Быть может, есть другой способ? EBanner можно не предлагать.

kotkovets 02-03-2012 22:55 1871220

Цитата:

Цитата Begin2Fly
Надо просто вставить PNG-изображение (справа вверху) »

на всех страничках установщика, в начале скрипта, вне секции и функции:
Код:

!define MUI_HEADERIMAGE
!define MUI_HEADERIMAGE_RIGHT
!define MUI_HEADERIMAGE_BITMAP "Моя картинка.bmp"

для чисто кастомной странички можно повесить bmp, jpg и gif
Естественно через nsDialogs (определить координаты CreateBitmap), если в "самом верху",
то через nsDialogs::Create 1044
http://nsis.sourceforge.net/NsDialogs_SetImageOLE
Как рисовать и т.д в шапке - справочник по NSIS

Begin2Fly 02-03-2012 23:28 1871239

kotkovets, та это всё я уже перепробовал. Стандартные средства, к сожалению, не позволяют вставить PNG с прозрачностью. А нужна именно прозрачность, для того, чтобы пользователи с нестандартными темами оформления не видели монотонный квадрат вокруг изображения.

kotkovets 02-03-2012 23:56 1871252

Begin2Fly, bmp и фотошоп, или др. программы
позволяющие задавать "прозрачный "(прозрачный цвет, Windows - как его воспринимает) слой картинке,
не раз так сам проделывал...только bmp

Begin2Fly 03-03-2012 00:07 1871261

kotkovets, благодарю, уже этим и воспользовался, хотя эдак с полгода назад ничего не получилось. Спасибо за отзывчивость!

Sidril 04-03-2012 00:46 1871861

kotkovets.
Если позволите, ещё пара простых для Вас вопросов:

Про проверку наличия ключа в реестре при запуске инсталлера я понял. Подскажите пожалуйста как прописать проверку определённого запущенного процесса на компе у клиента. Т.е также при запуске инсталлера проверяется запущен ли процесс, если запущен - то нельзя продолжить установку.

И ещё такая тема заитересовала меня... Хотелось бы, чтобы готовый дистрибутив инсталлятора ничем нельзя было распаковать. Всегда думал, что инсталляторы созданные в NSIS ни один архиватор распознать не может. Отчасти это правда, судя по информации в титульном сообщении. Но там также есть и оговорка:
Цитата:

Цитата hb860
....Есть, однако, внешние инструментальные средства, которые позволяют это сделать. 7-zip поддерживает частичную распаковку NSIS инсталляторов с алгоритмом сжатия lzma или bzip. Так же существует мульти-архивный плагин для TotalCommander.
Небольшая заметка для разработчиков: используйте DCryptDll, если хотите скрыть некоторые файлы в вашей инсталляции. »

Какие нужно выставить параметры сжатия, чтобы и могучий 7-zip оказался полностью бессилен в распаковке инсталлятора. И если не трудно, не могли бы подробнее рассказать о то что такое DCryptDll и как его использовать для защиты файлов.
Большое спасибо.

kotkovets 04-03-2012 15:31 1872098

Цитата:

Цитата Sidril
Подскажите пожалуйста как прописать проверку определённого запущенного процесса на компе у клиента. Т.е также при запуске инсталлера проверяется запущен ли процесс, если запущен - то нельзя продолжить установку »

Читайте в справочнике в шапке(примеры кодов):
1. » Предотвращение множественности запуска.
2. » Работа с процессами с помощью NSIS (Process).
Цитата:

Цитата Sidril
Какие нужно выставить параметры сжатия, чтобы и могучий 7-zip оказался полностью бессилен в распаковке инсталлятора »

никакие, разрабы прикрыли лавочку начиная, где то с 2.00 ???, пощите в сети: nsis_hide.exe

wolkow70 05-03-2012 10:54 1872701

kotkovets, подскажите пожалуйста как все-таки лучше установить службу:
В дистрибутиве есть файл DfSdkS.exe (служба дефрагментации дисков ashampoo)

В принципе запускается и устанавливается такой коммандой DfSdkS.exe -install
Запускается с консольным окном. Потом приходится запускать DfSdkS.exe -stats для определения списка дисков и записи в реестр, и тоже с консольным окном.
Родной Inno инсталлятор как-то запускает все сразу и без окон. Причем родительским процессом является service.exe, а если запускать как я делаю, то родитель - инсталлятор.

diakov 05-03-2012 13:59 1872795

kotkovets, такой вопрос вот есть в теле скрипта коды

Код:

Section "-Распаковка фул"
  ${If} $Radio3 == 1
  SetOutPath "$INSTDIR"
File /r "D:\ystanovka\XnView\portfull\*.*"
    ${EndIf}
SectionEnd

Section "-Распаковка стандарт"
  ${If} $Radio4 == 1
  SetOutPath "$INSTDIR"
File /r "D:\ystanovka\XnView\portstandart\*.*"
    ${EndIf}
SectionEnd

Section "-Распаковка стандарт"
  ${If} $Radio5 == 1
  SetOutPath "$INSTDIR"
File /r "D:\ystanovka\XnView\portsmall\*.*"
    ${EndIf}
SectionEnd

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

kotkovets 05-03-2012 14:07 1872798

wolkow70, смотрите скрипт Inno и ключи запуска приложения.
Цитата:

Цитата wolkow70
устанавливается такой коммандой DfSdkS.exe -install
Запускается с консольным окном. Потом приходится запускать DfSdkS.exe -stats »

Цитата:

Цитата wolkow70
Запускается с консольным окном »

nsexec - для скрытного запуска консоли, или читайте
» Работа с процессами с помощью NSIS (Process).
Цитата:

Цитата diakov
При отметке Radio5 ничего не происходит, сразу страница завершения... »

Вот и смотрите события в своем скрипте по дескриптору контрола ,
кстати вера, что ли не дает, проверить состояние $Radio5
например отдельной, самой первой секцией, или при закрытии кастомной странички,
после определения статусов контрола:
Код:

Section
MessageBox MB_OK "$$Radio5 = $Radio5" IDOK
SectionEnd

;дальше ниже по скрипту другие секции

diakov 05-03-2012 14:41 1872815

нашел в PageDestroy случайно стер n тоесть было $RadioButto6 $Radio6

однако вчера думал лоб розшибу :lol:

wolkow70 05-03-2012 15:25 1872844

Цитата:

Цитата kotkovets
wolkow70, смотрите скрипт Inno и ключи запуска приложения. »

Нет их там. Вообще из скрипта не понятно как устанавливается служба.

В Process monitor вот, что видно:

Путь: E:\WINDOWS\system32\services.exe
Командная строка: E:\WINDOWS\system32\services.exe

Класс события: Процесс
Операция: Process Create
Результат: SUCCESS
Путь: E:\Program Files\Ashampoo\Ashampoo WinOptimizer 9\DfSdkS.exe
TID: 1364
Длительность: 0.0000000
PID: 3928
Command line: "E:\Program Files\Ashampoo\Ashampoo WinOptimizer 9\DfSdkS.exe"

пока сделал так:

nsExec::Exec '"$INSTDIR\DfSdkS.exe" -install'

Ну это только установка службы, а последующего автозапуска не происходит.

diakov 05-03-2012 16:13 1872882

wolkow70, а если попробовать с помощью NsSCM plug-in

Код:

  ; Service (auto starting)
  nsSCM::Install /NOUNLOAD "XXX" "XXX service" 16 2 \
                          "$PROGRAMFILES\${PRJ_NAME}\XXX.exe" "" "" "" ""

не получится?

wolkow70 05-03-2012 16:29 1872893

Цитата:

Цитата diakov
не получится? »

То же чего то не работает.

wolkow70 06-03-2012 08:59 1873317

Сделал так:
nsExec::ExecToLog '"$INSTDIR\DfSdkS.exe" -install'
Pop $0
nsSCM::Start /NOUNLOAD "DfSdkS"
Pop $0

wolkow70 06-03-2012 11:25 1873386

Товарищи, реально ли для деинсталлятора сделать такие же комманды интефейса:

!define MUI_WELCOMEPAGE_TITLE "Добро пожаловать! Вас приветствует мастер установки MyApp"

!define MUI_FINISHPAGE_NOAUTOCLOSE ????

Всяко пробовал. не получается...

Paval 06-03-2012 13:01 1873438

Задача из скрипта nsis запустить другую инсталяцию в пассивном режиме и прописать путь установки. Реально ли это вообще.
Когда устанавливал подобным образом .NET Framework Писал так:
Код:

ExecWait "$INSTDIR\vcredist_x64.exe /passive"
Но там то путь прописывать не нужно было.
Рылся в инете в поисках параметров командной строки, так ничего и не нашел. Подскажите, если кто сталкивался.

kotkovets 06-03-2012 14:19 1873487

wolkow70, от чего уж, реально...
Код:

!define MUI_UNTEXT_WELCOME_INFO_TITLE "????"
!define MUI_UNFINISHPAGE_NOAUTOCLOSE

Цитата:

Цитата Paval
Рылся в инете в поисках параметров командной строки, так ничего и не нашел. Подскажите, если кто сталкивался. »

Вот одно понять не могу, причем здесь nsis, если вопрос касается установщика windows (пакетов msi)

wolkow70 06-03-2012 14:45 1873507

!define MUI_UNTEXT_WELCOME_INFO_TITLE "????"
ЭТО РАБОТАЕТ!

К сожалению, !define MUI_UNFINISHPAGE_NOAUTOCLOSE - это нет.
Может, потому, что у меня так:

!define MUI_UNTEXT_WELCOME_INFO_TITLE "Добро пожаловать! Вас приветствует мастер удаления MyApp"
!insertmacro MUI_UNPAGE_WELCOME
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_COMPONENTS
!insertmacro MUI_UNPAGE_INSTFILES
UninstPage custom un.INSTFILES_LEAVE
!define MUI_UNFINISHPAGE_NOAUTOCLOSE
!insertmacro MUI_UNPAGE_FINISH

Paval 06-03-2012 15:15 1873524

Цитата:

Цитата kotkovets
Вот одно понять не могу, причем здесь nsis, если вопрос касается установщика windows (пакетов msi) »

Пишу инсталяцию на nsis. В дополнение к основному продукту нужно еще поставить пару отдельных программ. Я их упаковываю в свой инсталятор. И прописываю на исполнение ExecWait.

Вроде объяснил понятно. Теперь, как их вызвать в пассивном режиме и прописать путь для установки.

Gnast 06-03-2012 15:32 1873540

Добрый день.

Подскажите пожалуйста следующее...
Имеем:
menu.ini
Код:

; Ini file generated by the HM NIS Edit IO designer.
[Settings]
NumFields=10

[Field 1]
Type=RadioButton
Text=Полная установка (рекомендуется)
Left=6
Right=143
Top=0
Bottom=11

[Field 2]
Type=Label
Text=Установить Программу включая все компоненты
Left=20
Right=214
Top=10
Bottom=18

[Field 3]
Type=RadioButton
Text=Настройка параметров
Left=6
Right=105
Top=29
Bottom=39

[Field 4]
Type=Checkbox
Text=Компонент 1
Left=20
Right=119
Top=44
Bottom=54

[Field 5]
Type=Checkbox
Text=Компонент 2 (большое и длинное описание, которое не помещается в одну строку)
Left=20
Right=207
Top=60
Bottom=77

[Field 6]
Type=Label
Text=Еще какой-то текст
Left=6
Right=135
Top=99
Bottom=107

[Field 7]
Type=Checkbox
Text=Компонент 3
Left=20
Right=216
Top=84
Bottom=95

[Field 8]
Type=Label
Text=Устанавливая и используя данное ПО, вы соглашаетесь
Left=6
Right=204
Top=115
Bottom=123

[Field 9]
Type=Link
Text=Лицензионного соглашения
Left=50
Right=145
Top=124
Bottom=132

[Field 10]
Type=Label
Text=с условиями
Left=6
Right=50
Top=124
Bottom=132


и
prog.nsi
Код:

!include "MUI.nsh"
SetCompress off

!insertmacro MUI_PAGE_WELCOME
Page custom fnCustomInit fnCustomDestroy
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "Russian"

Name "Программа"
OutFile "proga.exe"
ShowInstDetails show

Function fnCustomInit
!insertmacro INSTALLOPTIONS_EXTRACT "menu.ini"

!insertmacro MUI_HEADER_TEXT "Установка программы" "Выберите желаемый способ установки"
       
!insertmacro MUI_INSTALLOPTIONS_DISPLAY "menu.ini"

FunctionEnd


Function fnCustomDestroy
FunctionEnd

Section
DetailPrint "Хелло.."
SetAutoClose false
SectionEnd


Подскажите как сделать чтобы пока выбран первый RadioButton, активным остается только второй RadioButton, Checkbox все выбраны и неактивны. Если выбрать второй RadioButton, Checkbox становятся активными и все выбраны, первый RadioButton становится неактивным.

Aster 06-03-2012 20:20 1873799

Цитата:

Цитата Sidril
Большое спасибо. вроде примерно понял.
Вы привели пример File Progress
Там также есть Detail и Gradual progress. Неплохо бы узнать чем они отличаются.
В моём установщике несколько компонентов, которые устанавливаются по желанию клиента. Т.е несколько секций в скрипте имеется... Как в этом случае сохранить адекватность продвижения прогресс бара, если заранее не известно будет ли клиент устанавливать тот или иной компонент или нет. Первая секция обязательна к установке остальные на выбор.
На примере двух секций.
читать дальше »
;__________________________________________________
Section "Ключевые составляющие" Sec1
SectionIn RO
RealProgress::FileProgress /NOUNLOAD 0
Sleep 300 ;[блок команд]
RealProgress::FileProgress /NOUNLOAD 20 ;установка прогресса на 20%.
Sleep 300 ;[блок команд]
RealProgress::FileProgress /NOUNLOAD 40
Sleep 300 ;[блок команд]
RealProgress::AddProgress /NOUNLOAD 60
Sleep 300 ;[блок команд]
RealProgress::AddProgress /NOUNLOAD 80
Sleep 300 ;[блок команд]
RealProgress::AddProgress /NOUNLOAD 100 ;установка прогресса на 100%.
SectionEnd
Section "Авторские обновления" Sec2
Sleep 300 ;[блок команд]
RealProgress::AddProgress /NOUNLOAD ??? ;какой параметр прогресса должен быть?
SectionEnd
;__________________________________________________
Какой параметр прогресса должен быть в случае если клиент захочет установить "Авторские обновления"? По скрипту выходит что после выполнения первой секции прогресс-бар будет на 100%, а установка не завершится, т.к пойдёт выполнения следующей секции. С другой стороны - если клиент не захочет устанавливать "Авторские обновления", то тогда прогресс 100 в первой секции правильный... Довольно сумбурная схема... Как бы так сделать чтобы волков накормить, и овец сохранить? »

Решил вот тоже побаловаться с этим плагинчиком для реального прогресса. По командам Вашего примера выходит, что на команде RealProgress::AddProgress /NOUNLOAD 60 прогресс уже будет на 100%, ибо:

Могу Вам сказать, что команда RealProgress::AddProgress /NOUNLOAD XX отвечает не за установление прогресса на определённом проценте, а за добавление процентов прогресса.
Т.е Вы ставите скажем RealProgress::AddProgress /NOUNLOAD 20 (где 20 - прибавляемый процент). Далее ставите RealProgress::AddProgress /NOUNLOAD 40, прогресс-бар будет на уровне 60%, а не 40%, т.к стартовую величину задала предыдущая команда. 20+40=60.

Команда же RealProgress::FileProgress XX ориентируется на постепенное продвижение до заданного параметра (XX - процент продвижения до которого двигается прогресс бар). Т.е скажем вы установили RealProgress::FileProgress 20. В момент установки (в зависимости от ваших команд) идёт извлечение файла, пока идёт это извлечение - индикатор прогресса постепенно продвигается до 20%.

А за установление прогресса на определённом проценте отвечает команда RealProgress::SetProgress /NOUNLOAD 10 (где 10 - процент прогресса). На любом этапе установки Вы можете выставить эту команду и прогресс бар будет заполнен на указанный вами процент.

Рекомендую грамотно смешивать эти возможности.
Если продуманно подойти, то прогресс-бар будет максимально реальным.
Ну а автору плагина (Afrow UK) большой респект.

Sidril 06-03-2012 20:45 1873813

Aster, да, теперь всё окончательно понятно. спасибо
RealProgress::SetProgress /NOUNLOAD вот что нужно было юзать мне

Lisabon 06-03-2012 21:56 1873865

Paval,
Цитата:

Цитата Paval
Пишу инсталяцию на nsis. В дополнение к основному продукту нужно еще поставить пару отдельных программ. Я их упаковываю в свой инсталятор. И прописываю на исполнение ExecWait.
Вроде объяснил понятно. Теперь, как их вызвать в пассивном режиме и прописать путь для установки. »

Код:

ExecWait '"$INSTDIR\VCRedist_x64.exe" /q:a /c:"msiexec /i VCRedist.msi /qn"'
или

Код:

ExecWait '"$INSTDIR\VCRedist_x64.exe" /q:a /c:"msiexec /i VC_Red.msi /qn"'

wolkow70 07-03-2012 18:05 1874364

Товарищи подскажите оптимальное решение таких задач:

1. Нужно скопировать (распаковать) файл в системную папку, при соблюдении условия, если в ней нет одноименного файла более новой версии.

2. Соответсвенно при деинсталляции комманда на удаление этого файла, если он имеет определенную версию (файл новой версии не должен удаляться).

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

kotkovets 07-03-2012 18:36 1874385

wolkow70, Получать версию файла умеете?
ну так сравните исходно устанавливаемую версию с полученной версией файла, при наличии файла,
иначе ставим файл какой есть в установщике.
читать дальше »
Код:

!include "filefunc.nsh"
!include "WordFunc.nsh"
!define VERSION_FILE "3.7.61b" ;(исходная) версия файла в скрипте, которая будет "ставится"

${If} ${FileExists} "$WINDIR\notepad.exe"
    ${GetFileVersion} "$WINDIR\notepad.exe" "$0"
    ;конвертируем версию в "циферки" при наличии указанных символов
    ${VersionConvert} "$0" "abcdefghijklmnopqrstuvwxyz+" "$0"
    ;конвертируем версию файла в установщике
    ${VersionConvert} "${VERSION_FILE}" "abcdefghijklmnopqrstuvwxyz+" "$1"
    ;сравниваем исходно полученную и исходно устанавливаемую версии файлов
    ;-----------------------------------------------------
    ;${VersionCompare} "[Version1]" "[Version2]" $var
    ;-----------------------------------------------------
    ;"[Version1]"        ; первая версия
    ;"[Version2]"        ; вторая версия
    ;$var                ; результат:
                        ;$var=0  версии равны
                        ;$var=1  первая версия новее второй
                        ;$var=2  вторая версия новее первой
    ;-----------------------------------------------------
    ${VersionCompare} "$0" "$1" $2
    ${If} $2 == 0
        MessageBox MB_OK "Версии равны!$\n$0 = $1" IDOK
    ${ElseIf} $2 == 1
        MessageBox MB_OK "Полученная версия новее исходной(устанавливаемой)$\n$\t  $0 > $1" IDOK
    ${ElseIf} $2 == 2
        MessageBox MB_OK "Исходная(устанавливаемая)версия новее полученной$\n$\t  $0 < $1" IDOK
    ${EndIf}
${Else}
;тут всегда ставим, файла нету!!!
${EndIf}


Здесь легко потренироваться, подставляя циферки в константу

BuZzOFF 08-03-2012 11:40 1874736

kotkovets, не могу понять как сделать проверку выбран ли пункт в SectionGroup или нет...
И в зависимости от того выбран он или нет выполнить в другой Section (не в SectionGroup) то или иное действие.
Всяко разно извращаюсь, но так и не получается :(
И как всегда всё окажется проще простого :D

kotkovets 08-03-2012 12:42 1874773

BuZzOFF, секционная группа имеет. если не ошибаюсь, 5 состояний:
1. группа вся выбрана - т.е все секции в группе выбраны
2. группа частично выбрана - т.е секция выбрана, а другие не выбраны, не важно количество выбр. или не выбр. секций
3. группа не выбрана - т.е все секции в группе не отмечены.
4. группа свернута - секции спрятаны в группе
5. группа развернута - т.е видны все секции в группе.
Если нужно найти определенную секцию - отмечена или нет, то группа по барабану.
Если нужно, проверить состояние группы, здесь надо учитывать флаг еще: развернута группа или нет.
почитайте в справке: » SectionGetFlags: получаем статус секции, там мало букафф.
что не поймете - пишите.
кстати я всегда снимаю состояние секций в функции закрытия странички компонентов, очень удобно,
ибо я уже знаю, на страничке установки какие секции отмечены или нет, с любой отмеченной секции,
на страничке установки, ведь код будет выполняться, только, если секция отмечена :)

BuZzOFF 08-03-2012 12:46 1874780

Цитата:

Цитата kotkovets
нужно найти определенную секцию - отмечена или нет »

Вот это надо :)
Ушёл читать.
Спасибо.

BuZzOFF 09-03-2012 07:48 1875296

kotkovets, что не получается...

Выбираю оригинал (пофиг тихая/не тихая) запускается обычная установка.
Выбираю mod (пофиг тихая/не тихая) запускается mod в тихом режиме.
Такие вот пироги...
Вот часть скрипта:
читать дальше »
Код:

SectionGroup /e "Тип установки"
Section /o "Обычная" secNormal
SectionEnd

Section "Тихая" secSilent
SectionEnd
SectionGroupEnd

Section "Оригинал" secOriginal
 SectionGetFlags ${secNormal} $0
 ${If} $0 == 1
  ExecWait '$\"${OutDir}\setup.exe$\" /pSKIPPRODUCTCHECK=1'
 ${Else}
  ExecWait '$\"${OutDir}\setup.exe$\" /pSKIPPRODUCTCHECK=1 /qn'
 ${EndIf}
SectionEnd

Section /o "Mod" secMod
 SectionGetFlags ${secNormal} $0
 ${If} $0 == 1
  ExecWait '$\"${OutDir}\setup.exe$\" /pSKIPPRODUCTCHECK=1 /v"TRANSFORMS=ksospc.ru.mst"'
 ${Else}
  ExecWait '$\"${OutDir}\setup.exe$\" /pSKIPPRODUCTCHECK=1 /v"TRANSFORMS=ksospc.ru.mst /qn"'
 ${EndIf}
SectionEnd

Function .onSelChange
  !insertmacro StartRadioButtons $1
    !insertmacro RadioButton ${secNormal}
    !insertmacro RadioButton ${secSilent}
  !insertmacro EndRadioButtons

  !insertmacro StartRadioButtons $2
    !insertmacro RadioButton ${secOriginal}
    !insertmacro RadioButton ${secMod}
  !insertmacro EndRadioButtons
FunctionEnd

Function .OnInit
 StrCpy $1 ${secSilent}
 StrCpy $2 ${secOriginal}
FunctionEnd



"Рожденный ползать - летать не может!"
Видать несудьба мне с этим NSIS :teeth:

wolkow70 09-03-2012 08:45 1875304

kotkovets,
Помогите разобраться с автозакрытием программ
Нужно перед установкой Орбита закрыть браузеры

В скрипте:

!include WinMessages.nsh

Function CloseProgram
Exch $1
Push $0
loop:
FindWindow $0 $1
IntCmp $0 0 done
#SendMessage $0 ${WM_DESTROY} 0 0
SendMessage $0 ${WM_CLOSE} 0 0
Sleep 100
Goto loop
done:
Pop $0
Pop $1
FunctionEnd


Function .onInit
;
loop:
FindWindow $0 "IEFrame"
IntCmp $0 0 done
IsWindow $0 0 done
System::Call 'user32::PostMessageA(i,i,i,i) i($0,${WM_CLOSE},0,0)'
Sleep 100
Goto loop
done:
;
Push "MozillaWindowClass"
Call CloseProgram

Push "OperaWindowClass"
Call CloseProgram
;
FunctionEnd

IE закрывается , а FireFox и Opera нет.
Классы заголовков смотрел в Win32Spy.

BuZzOFF 09-03-2012 08:56 1875305

Цитата:

Цитата wolkow70
закрыть браузеры »

Я конечно очень не спец...
А если искать процессы по имени и "убивать"? Не канает?

Справочник по NSIS => Примеры кодов => Process.

Цитата:

Цитата kotkovets
извращенная логика »

Спасибо :teeth:

wolkow70 09-03-2012 09:31 1875313

Цитата:

Цитата BuZzOFF
А если искать процессы по имени и "убивать"? Не канает? »

Канает. Так и было. Только это не "хороший тон", хочу красиво сделать.

kotkovets 09-03-2012 12:54 1875411

BuZzOFF, Чет у вас извращенная логика, проще-проще, вот на кой черт нужно еще:
silent mode и normal mode && silent original и normal original?
Не проще сделать всего лишь: silent mode && silent original, при оболочке - выбор, че ставить,
при тихом режиме заводить ключом ком.строки: silent mode или silent original
Хозяин барин:
читать дальше »
Код:

SectionGroup /e "Тип установки"
Section /o "Обычная" secNormal
SectionEnd

Section "Тихая" secSilent
SectionEnd
SectionGroupEnd

Section "Оригинал" secOriginal
 ${If} ${SectionIsSelected} ${secSilent}
      MessageBox MB_OK "Original [Silent]" IDOK
 ${Else}
      MessageBox MB_OK "Original [Normal]" IDOK
 ${EndIf}
SectionEnd

Section /o "Mod" secMod
 ${If} ${SectionIsSelected} ${secNormal}
      MessageBox MB_OK "Mod [Normal]" IDOK
 ${Else}
      MessageBox MB_OK "Mod [Silent]" IDOK
 ${EndIf}
SectionEnd

Function .onSelChange
  !insertmacro StartRadioButtons $1
    !insertmacro RadioButton ${secNormal}
    !insertmacro RadioButton ${secSilent}
  !insertmacro EndRadioButtons

  !insertmacro StartRadioButtons $2
    !insertmacro RadioButton ${secOriginal}
    !insertmacro RadioButton ${secMod}
  !insertmacro EndRadioButtons
FunctionEnd

Function .OnInit
 StrCpy $1 ${secSilent}
 StrCpy $2 ${secOriginal}
FunctionEnd


wolkow70, скрипт какой-то древний китайский, покрыт несвежей пылью(но рабочий):
Если браузер найдется появится сообщение(для отладки добавил).
Вообще пускай юзер думает, че ему надо-то, поэтому лучше при запущенном браузере, сообщение
о запущенном браузере и выход из установщика - на мой взгляд оптимальный вариант.
читать дальше »
Код:

!macro CloseProgram NameProgramm
  ${Do}
      Sleep 200
      FindWindow $0 "${NameProgramm}"
      ${IfThen} $0 == 0 ${|}${Break}${|}
      MessageBox MB_OK "Окошко -${NameProgramm}-" IDOK
      SendMessage $0 ${WM_CLOSE} 0 0 ;послать окну сообщение WM_CLOSE
      SendMessage $0 ${WM_DESTROY} 0 0 ;разрушить окно
  ${Loop}
!macroend
Function CloseProgram
  System::Store S
  ${Do}
      Sleep 200
      FindWindow $0 "IEFrame"
      ${IfThen} $0 == 0 ${|}${Break}${|}
      ;послать сообщение немедленно, вне очереди cообщений оконной поцедуры
      MessageBox MB_OK "ослика окошко найдено" IDOK
      System::Call "user32::PostMessage(ir0,i${WM_CLOSE},i0,i0)"
  ${Loop}
  !insertmacro CloseProgram "OperaWindowClass"
  !insertmacro CloseProgram "MozillaWindowClass"
  System::Store L
FunctionEnd

Function .onInit
  Call CloseProgram
FunctionEnd


wolkow70 09-03-2012 14:19 1875471

Цитата:

Цитата kotkovets
wolkow70, скрипт какой-то древний китайский, покрыт несвежей пылью(но рабочий):
Если браузер найдется появится сообщение(для отладки добавил). »

Нормально работает. Почему-то окно Mozilla три раза подряд появляется.

kotkovets 09-03-2012 14:34 1875490

wolkow70, Это нормально, пробуйте так, более надежно и быстрее.
FindWindow вызывается в каждом цикле 50 раз с задержкой 2мс, при найденном окне - прерывание цикла.
Код:

!macro CloseProgram NameProgramm
  ${For} $1 1 50
    FindWindow $0 "${NameProgramm}"
    ${If} $0 != 0
        MessageBox MB_OK "Окошко -${NameProgramm}-" IDOK
        System::Call "user32::PostMessage(ir0,i${WM_CLOSE},i0,i0)"
        ${Break}
    ${EndIf}
    Sleep 2
  ${Next}
!macroend
Function CloseProgram
  System::Store S
  !insertmacro CloseProgram "IEFrame"
  !insertmacro CloseProgram "OperaWindowClass"
  !insertmacro CloseProgram "MozillaWindowClass"
  System::Store L
FunctionEnd

т.е при не найденных окнах - окошко установщика появится где то через 300 мс (если сообщение убрать)
При желании оттачивания надежности, время задержки можно увеличить и количество вызовов FindWindow

wolkow70 09-03-2012 14:54 1875509

kotkovets,
Насколько подобная процедура применима к процессу деинсталляции программы? То есть, при удалении программы тоже надо закрывать браузеры.

wolkow70 09-03-2012 15:21 1875522

kotkovets,
В последнем варианте Mozilla не гасится. В предложенном ранее варианте закрывалась надежно.

kotkovets 09-03-2012 15:32 1875527

Цитата:

Цитата wolkow70
В последнем варианте Mozilla не гасится. В предложенном ранее варианте закрывалась надежно. »

Потому что, у браузера куча окон (скрытых, дочерних, модальных), - Почему-то окно Mozilla три раза подряд появляется
Второй вариант предназначен на одно окно.
кстати во 2 варианте попробуйте убрать макрос - ${Break}
Цитата:

Цитата wolkow70
Насколько подобная процедура применима к процессу деинсталляции программы? То есть, при удалении программы тоже надо закрывать браузеры. »

Насколько оно Вам надо то, не забудьте в деинсталляторе вызов функции через приставку - un

wolkow70 09-03-2012 16:05 1875547

Цитата:

Цитата kotkovets
кстати во 2 варианте попробуйте убрать макрос - ${Break} »

Не помогает.
Вернулся к первоначальному варианту. Надежно закрывает пять запущенных копий Мозиллы (больше копий запускать не пробовал :)).

wolkow70 10-03-2012 10:32 1876024

Не могу решить одну задачку. Нужно внести при установке программы регистрационные данные из рег-файла.
На 32-битной системе все получается. На 64-битной чего только не шаманил, данные вносятся, но только в раздел HKLM32, а нужно в HKLM64

В скрипте так:

IfFileExists "$EXEDIR\reg.reg" 0 Done
${If} ${RunningX64}
execwait '$windir\SysWOW64\regedit.exe /s "$EXEDIR\reg.reg"'
${Else}
execwait '$windir\regedit.exe /s "$EXEDIR\reg.reg"'
${EndIf}
Done:

В рег-файле:

REGEDIT4

[HKEY_LOCAL_MACHINE\SOFTWARE\Ashampoo\Ashampoo UnInstaller 4]
"HLRegKEY"="xxxxxxx-xxxxxxx-xxxxxxxx"

diakov 10-03-2012 17:30 1876255

kotkovets, как в MUI2.nsh реализовать такое

Код:

Function WelcomePageSetupLinkPre
  !insertmacro MUI_INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Type" Button # тип
  !insertmacro MUI_INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Text" "Краткая информация об этом скрипте"
  !insertmacro MUI_INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "State" "$EXEDIR\checks.bmp"
  !insertmacro MUI_INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Left" 120 # отступ слева!
  !insertmacro MUI_INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Right" 300 # длина вправо!  268
  !insertmacro MUI_INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Top" 125 # отступ от верха!
  !insertmacro MUI_INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Bottom" 146 # высота строки! 143
FunctionEnd


kotkovets 10-03-2012 20:15 1876369

Цитата:

Цитата diakov
kotkovets, как в MUI2.nsh реализовать такое »

читать дальше »
Код:

!include "MUI2.nsh"
outfile file.exe
page custom pagevelcom
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

var dlg
var btn

Function pagevelcom
  nsDialogs::create 1018
  pop $dlg
  ${NSD_CreateButton} 120u 120u 180u 20u "Краткая информация об этом скрипте"
  pop $btn
  ${NSD_OnClick} $btn ClickButton
  nsDialogs::show
FunctionEnd

Function ClickButton
  pop $btn
  ExecShell open "${NSISDIR}\Contrib\Graphics\Wizard\orange.bmp"
FunctionEnd

Section
SectionEnd


wolkow70 11-03-2012 18:41 1877015

Уважаемый kotkovets, не подскажите в чем может быть загвоздка:

В сборке XnView регистрирую библиотеку:

${If} ${RunningX64}
ExecWait 'regsvr32 /s "$INSTDIR\ShellEx\XnViewShellExt64.dll"'
${Else}
ExecWait 'regsvr32 /s "$INSTDIR\ShellEx\XnViewShellExt.dll"'
${EndIf}

На 32-битной системе контексное меню появляется сразу, а на 64-битной системе появляется после перезагрузки. Хотя в RegDllView видно, что библиотека зарегистрировалась. Подозреваю, что так не должно быть.

Еще прошу помочь в решении проблемки описанной в посте
http://forum.oszone.net/post-1876024-2401.html

Gnast 11-03-2012 19:31 1877036

Вложений: 1
Подскажите, пожалуйста, как решить такую задачку
http://forum.oszone.net/post-1873540-2380.html

Буду рад ссылкам, где можно найти подробное описание как работать со статусами флажков в NSIS

kotkovets 11-03-2012 20:11 1877055

Gnast, рисуйте лучше через nsDialogs (MUI2.nsh),
подобных примеров в этой теме я очень много приводил.
справки есть здесь и на офф. сайте.
Цитата:

Цитата wolkow70
На 32-битной системе контексное меню появляется сразу, а на 64-битной системе появляется после перезагрузки. Хотя в RegDllView видно, что библиотека зарегистрировалась. Подозреваю, что так не должно быть. »

у меня все сразу появляется
Цитата:

Цитата wolkow70
Еще прошу помочь в решении проблемки описанной в посте
http://forum.oszone.net/post-1876024-2401.html »

вы пробуйте сначала добавлять без нсис,
смотрите еще макросы в х64.nsh -DisableX64FSRedirection и EnableX64FSRedirection

wolkow70 12-03-2012 09:28 1877475

Цитата:

Цитата kotkovets
вы пробуйте сначала добавлять без нсис »

Простой запуск рег-файла на живой системе вносит данные куда нужно.
Цитата:

Цитата kotkovets
смотрите еще макросы в х64.nsh -DisableX64FSRedirection и EnableX64FSRedirection »

так не работает:

${If} ${RunningX64}
${EnableX64FSRedirection}
execwait '$windir\regedit.exe /s "$EXEDIR\reg.reg"'
${DisableX64FSRedirection}
${Else}
execwait '$windir\regedit.exe /s "$EXEDIR\reg.reg"'
${EndIf}

Данные вносятся в HKLM32

kotkovets 12-03-2012 12:14 1877568

Цитата:

Цитата wolkow70
так не работает: »

Я затрудняюсь ответить:
Код:

${If} ${RunningX64}
          ${EnableX64FSRedirection}
          MessageBox MB_OK "Enable) $windir\regedit.exe"
          ${DisableX64FSRedirection}
          MessageBox MB_OK "Disable) $windir\regedit.exe"
 ${EndIf}

А еще меня терзают смутные сомнения, что при таком способе добавления рег.данных,
процесс установщика должен быть 64-разрядным, что по сути невозможно, установщика процесс всегда - 32.
Кстати пробуйте плагом Registry

wolkow70 12-03-2012 14:31 1877647

Цитата:

Цитата kotkovets
Я затрудняюсь ответить: »

Попробовал так:

${If} ${RunningX64}
${EnableX64FSRedirection}
MessageBox MB_OK "Enable) $windir\regedit.exe"
execwait '$windir\regedit.exe /s "$EXEDIR\reg.reg"'
${DisableX64FSRedirection}
MessageBox MB_OK "Disable) $windir\regedit.exe"
${Else}
execwait '$windir\regedit.exe /s "$EXEDIR\reg.reg"'
${EndIf}

В обоих сообщениях было WINDOWS\regedit.exe

Цитата:

Цитата kotkovets
Кстати пробуйте плагом Registry »

Это не понял как...

kotkovets 12-03-2012 15:11 1877687

wolkow70, ну быстрей соображайте, какой это путь и че вы указываете:
1.X:\Windows\SysWOW64\regedit.exe
2. X:\Windows\regedit.exe

wolkow70 12-03-2012 15:15 1877691

Цитата:

Цитата kotkovets
ну быстрей соображайте, какой это путь и че вы указываете:

1.X:\Windows\SysWOW64\regedit.exe - путь к regedit.exe -x64
2. X:\Windows\regedit.exe - путь к regedit.exe -x32
»

Цитата:

Цитата kotkovets
ну быстрей соображайте, какой это путь и че вы указываете:
1.X:\Windows\SysWOW64\regedit.exe
2. X:\Windows\regedit.exe »


1.X:\Windows\SysWOW64\regedit.exe - путь к regedit.exe -x64
2. X:\Windows\regedit.exe - путь к regedit.exe -x32

kotkovets 12-03-2012 15:31 1877711

wolkow70,
X:\Windows\SysWOW64\regedit.exe - это же $SYSDIR\regedit.exe c редиректом в x64 ${EnableX64FSRedirection} :)

wolkow70 12-03-2012 15:45 1877723

Что-то я запутался совсем.

Так не работает.
execwait '$windir\SysWOW64\regedit.exe /s "$EXEDIR\reg.reg"'

Так не работает.
${EnableX64FSRedirection}
execwait '$windir\regedit.exe /s "$EXEDIR\reg.reg"'

Получается, что нужно так?
${EnableX64FSRedirection}
execwait '$windir\SysWOW64\regedit.exe /s "$EXEDIR\reg.reg"'

Lisabon 12-03-2012 21:08 1877922

wolkow70,

Код:

!include "MUI2.nsh"
!include "x64.nsh"
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"
OutFile Test.exe
ShowInstDetails show
 
Section
${If} ${RunningX64}
  ; в 32-х битный реестр
          ${EnableX64FSRedirection}
                  execwait '$windir\regedit.exe /s "$EXEDIR\reg.reg"'
          MessageBox MB_OK "Enable) $windir\regedit.exe"
  ; в 64-х битный реестр
          ${DisableX64FSRedirection}
                  execwait '$windir\regedit.exe /s "$EXEDIR\reg.reg"'
          MessageBox MB_OK "Disable) $windir\regedit.exe"
 ${EndIf}
SectionEnd


wolkow70 13-03-2012 11:09 1878193

Цитата:

Цитата Lisabon
Section
${If} ${RunningX64}
; в 32-х битный реестр
${EnableX64FSRedirection}
execwait '$windir\regedit.exe /s "$EXEDIR\reg.reg"'
MessageBox MB_OK "Enable) $windir\regedit.exe"
; в 64-х битный реестр
${DisableX64FSRedirection}
execwait '$windir\regedit.exe /s "$EXEDIR\reg.reg"'
MessageBox MB_OK "Disable) $windir\regedit.exe"
${EndIf}
SectionEnd »

Да, так работает. Мне нужно было поменять местами ${EnableX64FSRedirection} и ${DisableX64FSRedirection}. Я исходил из разрядности установщика и думал, что EnableX64FSRedirection подключает 64-битный реестр. Оказалось, что наоборот и исходить нужно было из разрядности системы. Всем спасибо.

wolkow70 18-03-2012 10:24 1881631

kotkovets, добрый день.

Пытаюсь разобраться в вопросе определения ключей реестра

Нашел в справке вот что:

${If} ${KeyExists} "${HKCU}\Software\7-zip"
# здесь выполняются команды, если ключ существует
DetailPrint "Ключ есть!"
${Else}
# здесь выполняются команды, если ключа не существует
DetailPrint "Ключа не существует!"
${EndIf}

Но это не вовсем то, что требуется.

Пытаюсь сделать обновленный более гибкий макрос файловых ассоциаций

Алгоритм нужен такой:

1. Если существует ключ;
2. И если не присвоено значение по умолчанию;
3. Или значение имеет нулевую длину
- то переход бо безусловной метке.
Иначе выполняются комманды бэкапа и перезаписи асооциаций.

У самого получилось пока вот что:

Код:

!macro RegisterExtension extenstion
Push $1
Push $2       
;
StrCpy $ClassName "Winamp.File.${extenstion}"
;
ReadRegStr $1 HKCU "Software\Classes\.${extenstion}" ""    ; Читаем сначала в HKCU
StrCmp "$1" "" NoAssocHKCU        ;если значение по умолчанию не присвоено не пишем ассоциацию в HKCU
StrCmp "$1" "$ClassName" NoBackupHKCU  ;если совпадает тип файла не бэкапим
WriteRegStr HKCU "Software\Classes\.${extenstion}" "Winamp_Back" "$1" ;иначе бэкапим

NoBackupHKCU:

WriteRegStr HKCU "Software\Classes\.${extenstion}" "" "$ClassName"  ;пишем ассоциацию

NoAssocHKCU:
;
ReadRegStr $1 HKCU "Software\Classes\.${extenstion}" ""  ; заново читаем значение в HKCU
StrCmp "$1" "$ClassName" NoAssocHKLM    ;если применена ассоциация в HKCU пропускаем переход в HKLM
;
DeleteRegValue HKCU "Software\Classes\.${extenstion}" ""  ; удаляем значение пустого ключа в HKCU  на случай нулевой длины (бывает например в ключах созданных AIMP)
;
ReadRegStr $2 HKLM "SOFTWARE\Classes\.${extenstion}" ""  ;читаем значение в HKLM
StrCmp "$2" "" NoBackupHKLM                            ;если нет значения по умолчанию не бэкапим
StrCmp "$2" "$ClassName" NoBackupHKLM        ;если тип совпадает - не бэкапим
WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "Winamp_Back" "$2" ;иначе бэкапим

NoBackupHKLM:

WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "" "$ClassName" ;пишем ассоциацию

NoAssocHKLM:

Pop $1
Pop $2
!macroend

Тут смысл повторить логику внесения асооциаций оригинального Winamp. Если есть значение по умолчанию в HKCU , то ассоциация пишется и бэкапится в HKCU, если ассоциация в HKCU не прописана, то вносится и бэкапится в HKLM. В принципе так и должно быть в нормальной программе.

diakov 19-03-2012 17:37 1882547

kotkovets, а как включить orange.bmp в сам exe шник что бы на другом компе работало


Код:

!include "MUI2.nsh"
outfile file.exe
page custom pagevelcom
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

var dlg
var btn

Function pagevelcom
  nsDialogs::create 1018
  pop $dlg
  ${NSD_CreateButton} 120u 120u 180u 20u "Краткая информация об этом скрипте"
  pop $btn
  ${NSD_OnClick} $btn ClickButton
  nsDialogs::show
FunctionEnd

Function ClickButton
  pop $btn
  ExecShell open "${NSISDIR}\Contrib\Graphics\Wizard\orange.bmp"
FunctionEnd

Section
SectionEnd


kotkovets 19-03-2012 21:12 1882718

Цитата:

Цитата diakov
что бы на другом компе работало »

Код:

Function ClickButton
  pop $btn
  InitPluginsDir
  File "/oname=$PLUGINSDIR\image.bmp" "Абсолютный(относительный)_путь_к_картинке\***.bmp"
  ExecShell open "$PLUGINSDIR\image.bmp"
FunctionEnd


Olef2387 22-03-2012 15:41 1884705

Здравствуйте.
Подскажите, Как в нсис убрать кнопку "детали" при установке?

kotkovets 22-03-2012 15:46 1884707

Цитата:

Цитата Olef2387
Подскажите, Как в нсис убрать кнопку "детали" при установке? »

4.8.1.34 ShowInstDetails
hide|show|nevershow

---
В начале скрипта вне секции или функции:
Код:

ShowInstDetails nevershow

Olef2387 22-03-2012 15:54 1884714

kotkovets. Вот это оперативность. Огромное спасибо.

Valdise 23-03-2012 18:16 1885425

Почтенные ГУРУ подскажите пожалуйста как вместо ярлыка *.lnk [параметры "http:/ тру-ля-ля"] вставить значение *.url - Ярлыка интернета с прописанным адресом страницы. Именно значение, а не .lnk ссылку на таковой ярлык
Цитата:

CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Сайт ${PRODUCT_NAME}.lnk" "${PRODUCT_WEB_SITE}" "" "" "" "" "" "${PRODUCT_NAME} в Интерненте"
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Сайт ${PRODUCT_NAME}.url" "" "" "" "" "" "" ""
Как вставить InternetShortcut ?
Заранее Спасибо

kotkovets 23-03-2012 23:40 1885571

Valdise, а чем плох обычный ярлык, который ссылается на адрес в сети:
Код:

CreateShortCut  "$EXEDIR\aimp.lnk" "http://wwww.aimp.ru"  "" "shell32.dll" 220
а url делается так:
Код:

WriteINIStr "$EXEDIR\aimp.url" "InternetShortcut" "URL" "http://wwww.aimp.ru"
но мне лично первый вариант куда лучше...

K.A.V. 24-03-2012 13:02 1885754

kotkovets, по хорошему, нужно делать и первый и второй вариант
Почему второй вариант нужен?
Например для Portable программ, будет очень хорошо зайдя в папку с программой, "ткнуть" на url файл и перейти на домашнюю страничку

Valdise 25-03-2012 10:20 1886199

Цитата:

Цитата kotkovets
а чем плох обычный ярлык, который ссылается на адрес в сети: »

Цитата:

Цитата K.A.V.
Почему второй вариант нужен? »

Обычно так и делаю - *.lnk.
Иногда делаю перепаки полных русских версий, чтобы в два клика, а не париться программа, русификатор, регистрация\кряки. В одной из программ, в авторской сборке, в ярлыках именно URL а не LNK вот и заинтересовало, захотел сделать так-же, как в Авторском оригинале, правда он собран ISetup, а мне он совершенно не нравится.
Цитата:

Цитата kotkovets
WriteINIStr "$EXEDIR\aimp.url" "InternetShortcut" "URL" "http://wwww.aimp.ru" »

Растолкуйте чайнику, плиз - всё это строка, так-же как "CreateShortCut", или это всё-же ini-команда, которая создаст в папке программы "$EXEDIR\aimp.url"? Дело в том, что в оригинале url файл только в папке ярлыков, т.е его нет в $INSTDIR, а тут"$EXEDIR\aimp.url"???
ВОПРОС: К слову, а для NSIS путь $EXEDIR и $INSTDIR равны и имеют одинаковое значение?

kotkovets 25-03-2012 11:02 1886220

Valdise, url это обычный текстовый конфигурационный файл - ярлык Интернета
Цитата:

Цитата Valdise
Дело в том, что в оригинале url файл именно в папке ярлыков, а не в програмфайл »

так и укажите в скрипте, где создавать url.

Valdise 25-03-2012 11:55 1886244

Цитата:

Цитата kotkovets
так и укажите в скрипте, где создавать url. »

Растолкуйте, пожалуйста что и в каком порядке написать в скрипте, для создания такого ярлыка:
WriteINIStr "$SMPROGRAMS\${PRODUCT_NAME}\Сайт ${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}"
Верно? Только почему-то NSIS ругается, говорит ошибка...
Сообразил, всё получилось, ОГРОМНОЕ спасибо :Beer:
P.S Не сразу сообразил и заметил чего NSIS требовал - Error in script WriteINIStr expects 4 parameters, got 8, т.к оставил 8 кавычек, как в обычном *.lnk

ВОПРОС: К слову, а для NSIS путь $EXEDIR и $INSTDIR равны и имеют одинаковое значение?

kotkovets 25-03-2012 13:49 1886311

Valdise, все вопросы в шапке темы в справочнике, хотите гадать на кофейной гуще - дело ваше.

MKN 25-03-2012 16:34 1886402

Подскажите пожалуйста , как решить такую задачу :

Нужно, чтобы последовательность из 5 команд "${WordReplace} и т.д.", выполнилась N раз подряд, причём значение переменной $R1 в каждой команде , с каждым следующим "проходом", должно увеличиваться на 1.
N - берётся из переменной $1

Пытался организовать цикл ${For} с счётчиком, но команды ${WordReplace} внутри него не срабатывают...

Если нельзя организовать 5 командную последовательность, то как организовать вышеназванные действия для одной команды ${WordReplace}?

kotkovets 25-03-2012 17:03 1886424

Цитата:

Цитата MKN
Нужно, чтобы последовательность из 5 команд "${WordReplace} и т.д.", выполнилась N раз подряд, причём значение переменной $R1 в каждой команде , с каждым следующим "проходом", должно увеличиваться на 1. »

ну так для этого есть цикл For, тут важно, сколько этих циклов нужно делать, или другой признак выхода из цикла.
Код:

${for} $1 1 10
    MessageBox MB_OK "$1" IDOK
${next}

здесь цикл начнется, отсчет $1=1, до $1=10 - условие выхода из цикла
можно организовать цикл и так:
Код:

  ${Do}
    IntOp $1 $1 + 1
    MessageBox MB_OK "$1" IDOK
  ${LoopUntil} $1 == 10

здесь условие выхода из цикла, если $1=10,
любой цикл можно прервать макросом - ${Break}

MKN 25-03-2012 17:15 1886435

Цитата:

Цитата kotkovets
здесь цикл начнется, отсчет $1=1, до $1=10 - условие выхода из цикла »

Вроде как, так и делал...
Может я не правильно использую код для замены...
Делаю так :
Код:

Section
  ${LineFind} "a.txt" "" "1:-1" "Replace"
  IfErrors 0 +2
  MessageBox MB_ICONSTOP|MB_OK "Файл не найден!"
SectionEnd

Function Replace
 ${For} $R1 $R0 3
  IntOp $R2 $R0 + 1
 ${WordReplace} '$R9' '=$R0' '=$R2' "+" '$R9'
 Push $0
 ${Next}
 FunctionEnd

Всё время - "Файл не найден"
И с ${ForEach} , что как мне кажется лучше, ничего не выходит...

kotkovets 25-03-2012 17:52 1886454

MKN, а зачем здесь цикл в функции чтения файла :o , здесь и так цикл работает в функции Replace
до конца файла, в голову не приходила мысль откуда берутся строки в $R9 до конца файла?
это получается, один цикл функции на три цикла вложенного цикла фор, с каждым циклом, то переменная $R9 разная,
причем не известно условие выхода из внутреннего цикла:
IntOp $R2 $R0 + 1 - что это? :o
Код:

${For} $R1 $R0 3
$R1 - c каждым циклом и так увеличивается на единицу, причем отсчет начнется от величины значения $R0,
выход из внутреннего цикла, если $R1 = 3, а если $R0 > 3 (начало отсчета), что будет проверял?
ну месаджексы проставь, проследи за значениями переменных $R1 и $R0

MKN 25-03-2012 18:08 1886467

kotkovets,
Нужно в таком файле :
Код:

count=5
a1
b1
c1
d1
e1
a2
b2
c2
d2
e2
a3
b3
c3
d3
e3
a4
b4
c4
d4
e4
a5
b5
c5
d5
e5

где количество пронумерованных групп (a...e), записанное в значение count (т.е. равное кол-ву групп) и состав групп - всегда разные.
В этот файл нужно, записывать ещё одну группу, номер которой будет также произвольным (от 1 до count+1)
При этом вся последующая нумерация групп, после "вставки" новой группы, смещается на 1.
Я и хочу заменять нумерацию значений "от" и "до", (по сути смещение значений на 1) - в зависимости от значения count и местоположения новой группы.

Valdise 25-03-2012 21:10 1886586

Цитата:

Цитата kotkovets
все вопросы в шапке темы в справочнике, хотите гадать на кофейной гуще - дело ваше. »

На новости раздела я подписан, за русский Help поблагодарил сразу после его выхода
P.S I думаю что Ваш ответ "ДА" - "НЕТ", или "+" "-" был-бы более приемлемым
P.S II ещё раз ОГРОМНОЕ спасибо за помощь!

kotkovets 25-03-2012 21:36 1886607

Цитата:

Цитата Valdise
P.S I думаю что Ваш ответ "ДА" - "НЕТ", или "+" "-" был-бы более приемлемым »

достаточно прочитать в справке про (предопределенные)переменные - минут 5 и все вопросы будут исчерпаны...

Valdise 25-03-2012 22:15 1886650

Если чем-то оскорбил - пардону просим (+ см ЛС)
Можно новый вопрос?
Почему на некоторых системах WinX32 бинарные значения при установке упорно не желают прописываться?
Из 113 установок 28 почему-то "взбрыкнули" (за статистику спасибо пользователям ru-board-a)
Конкретно - крякунутый PhotoInstrument 5.5 на большинстве систем молча кушает прописываемые значения в Реестр, а на некоторых упирается рогом и при первом запуске программа успевает нацарапать своё "Купить"

Olef2387 26-03-2012 14:06 1887043

kotkovets. Привет.
Возник вопрос изменения ресурсов... На странице установки хочу опустить прогресс бар чуть пониже и небольшую картинку на этой же странице разместить (хотелось бы это сделать без плагинов). а то пробовал как-то плагин, картинка работала только на хп, а на висте и семёрке не отображалась.

kotkovets 26-03-2012 15:07 1887075

Цитата:

Цитата Olef2387
Возник вопрос изменения ресурсов... На странице установки хочу опустить прогресс бар чуть пониже »

NSIS\Contrib\UIs\modern.exe --> 106 диалог, элемент 1004 - прогресс бар.
Цитата:

Цитата Olef2387
небольшую картинку на этой же странице разместить (хотелось бы это сделать без плагинов) »

можно, но много букафф через апи функцию
CreateWindowEx
если апи не знаете, то код приводить бессмысленно

MKN 27-03-2012 10:56 1887618

kotkovets,
То, что отсчёт будет происходить от и до, понятно, (но видно только при "служебных сообшениях") :
Код:

${for} $1 1 10
    MessageBox MB_OK "$1" IDOK
${next}

А каким образом записать последовательность значений отсчёта
а - в файл ?
b - в переменные (чего очень хотелось бы !), где каждое значение (от 1 до 10 в данном примере), "прирощенное" в каждом отсчёте цикла, записывается в свою переменную ? Т.е. небходимы 10 переменных. Ну, очень...

kotkovets 27-03-2012 11:15 1887628

MKN, StrCpy не пробЫвал, работу со строкой, брать 1 символ строки или последний один символ, кидать в свою переменную,
если строка имеет вид: a1, то
Код:

StrCpy $count $R9 "" 1
$count = 1$\r$\n или $count = 1, если
Код:

StrCpy $count1 $R9  1
то, $count1 = a
дальше логика И-ИЛИ, метод сравнения, ведь в одном цикле прохода $R9 неизменна.

MKN 27-03-2012 11:24 1887639

Всё равно не ясно, как перенумеровывать значения, находящиеся в середине текста строк (ещё и в разных местах), в не предсказуемом кол-ве строк...

kotkovets 27-03-2012 11:27 1887641

MKN, давай полный пример, а то ты меня уже достал своей непонятностью :)

MKN 27-03-2012 11:36 1887652

kotkovets,
Да, чувствую что достал... Но кроме тебя, никто на белом свете, не откликается так развёрнуто, с помощью по NSIS заморочкам... :)
Задача такая - в файле Default.bar, в котором определяется расположение и содержание кнопок на тулбаре в ТotalCommаnder_e :
Код:

[Buttonbar]
Buttoncount=5
button1=%COMMANDER_PATH%\WCMICONS.DLL,15
cmd1=%COMMANDER_PATH%\Bar2.bar
iconic1=0
button2=
iconic2=0
button3=%COMMANDER_PATH%\Dop\TCPlugman\Plugman.exe
cmd3=%COMMANDER_PATH%\Dop\TCPlugman\Plugman.exe
path3=%COMMANDER_PATH%\Dop\TCPlugman\
iconic3=0
menu3=Plugman
button4=%COMMANDER_PATH%\Dop\myuninst\myuninst.exe
cmd4=%COMMANDER_PATH%\Dop\myuninst\myuninst.exe
path4=%COMMANDER_PATH%\Dop\myuninst\
iconic4=0
menu4=myuninst
button5=wcmicons.dll,79
cmd5=cm_SwitchHidSys
iconic5=0

необходимо при добавлении новой кнопки в произвольное место, прописать её парметры с присвоенной нумерацией и перенумеровать параметры имеющихся кнопок, относительно вставленной новой кнопки.

Например, вставляем кнопку первой на тулбар. Следовательно бывшая первая кнопка станет второй , вторая третьей и т.д. Такая же нумерация со смещением в + единицу, будет и укаждого параметра этих кнопок.
Параметров для разных кнопок может быть от 2 до 5.

kotkovets 27-03-2012 12:32 1887682

MKN, насколько я понял:
Код:


 var Buttoncount
 
 ClearErrors
 ReadIniStr $Buttoncount "$EXEDIR\Default.bar" "Buttonbar" "Buttoncount"
 ClearErrors
 IntOp $Buttoncount $Buttoncount + 1
 WriteIniStr "$EXEDIR\Default.bar" "Buttonbar" "Buttoncount" "$Buttoncount"
 
 WriteIniStr "$EXEDIR\Default.bar" "Buttonbar" "button$Buttoncount" "%COMMANDER_PATH%\WCMICONS.DLL,15"
 WriteIniStr "$EXEDIR\Default.bar" "Buttonbar" "cmd$Buttoncount" "%COMMANDER_PATH%\Bar2.bar"
 WriteIniStr "$EXEDIR\Default.bar" "Buttonbar" "iconic$Buttoncount" "%COMMANDER_PATH%\Bar2.bar"
 WriteIniStr "$EXEDIR\Default.bar" "Buttonbar" "path$Buttoncount" "path"
 WriteIniStr "$EXEDIR\Default.bar" "Buttonbar" "menu$Buttoncount" "Plugman"


MKN 27-03-2012 12:41 1887687

kotkovets,
Это понятно, самое простое для вставки одной кнопки в конец тулбара. А надо вставить кнопку в середину или в начало.
Т.е. надо управлять нумерацией всех остальных параметров других кнопок.

kotkovets 27-03-2012 12:48 1887691

MKN, я тебя уже поставил на правильный путь, если тебе это уже понятно, так почему ты задаешь
Цитата:

Цитата MKN
А надо вставить кнопку в середину или в начало. »

ты ведь получаешь значение, количество кнопок в $Buttoncount, ты можешь уменьшать на единицу, увеличивать на единицу, складывать и умножать, а writeinistr перепишет все как нужно.

MKN 27-03-2012 12:50 1887692

kotkovets,
Приведи пожалуйста пример для вставки первой кнопки.

kotkovets 27-03-2012 13:14 1887701

Цитата:

Цитата MKN
Приведи пожалуйста пример для вставки первой кнопки. »

для вставки изменения 3 кнопки:
Код:

ClearErrors
 ReadIniStr $Buttoncount "$EXEDIR\Default.bar" "Buttonbar" "Buttoncount"
 ClearErrors
 IntOp $0 $Buttoncount - 3
 IntOp $1 $Buttoncount - $0
 ${If} $1 == 3
  WriteIniStr "$EXEDIR\Default.bar" "Buttonbar" "button$1" "bla...bla..."
  WriteIniStr "$EXEDIR\Default.bar" "Buttonbar" "cmd$1" "bla...bla..."
  WriteIniStr "$EXEDIR\Default.bar" "Buttonbar" "iconic$1" "bla...bla..."
  WriteIniStr "$EXEDIR\Default.bar" "Buttonbar" "path$1" "bla...bla..."
  WriteIniStr "$EXEDIR\Default.bar" "Buttonbar" "menu$1" "bla...bla..."
${EndIf}

допустим у нас 11 кнопок в $Buttoncount, нам нужно изменить 3 кнопку,
следовательно, 11-3=9, находим разницу между 11 и 9 = 3, ну ставим условие только 3 кнопка
математика 3 класса, ей богу!

MKN 27-03-2012 13:23 1887708

kotkovets,
А как же с перезаписью номеров следующих за 1ой кнопкой , параметров остальных кнопок ? Вот что не понятно... Перезаписать надо ведь только нумерацию, но не сами команды "bla...bla...". Или именно так и произойдёт ? Я ведь не заменяю кнопку, а добавляю...

kotkovets 27-03-2012 14:00 1887735

MKN, я уже сказал и показал, вот что мешает прочитать предыдущее значение в переменную, и записать вычитая или отнимая единичку.

K.A.V. 27-03-2012 14:42 1887768

MKN
Как-то так...

Код:


Function SortInINI_Section
var /Global NumToAdd
var /Global Buttoncount
StrCpy $NumToAdd "3" ; Какой порядковый номер добавляем
ReadIniStr $Buttoncount "$EXEDIR\Default.bar" "Buttonbar" "Buttoncount"

StrCmp $NumToAdd "1" 0 +3 ; Если добавляем 1-ый пункт, то это сделает функция FirstAdd
call FirstAdd
goto end
StrCmp $NumToAdd "$Buttoncount" 0 +3
call EndAdd ; Если добавляем последний, то это сделает функция EndAdd
goto end

; Здесь идёт код, который добавляет ваш пункт в середину
CopyFiles /silent "$EXEDIR\Default.bar" "$EXEDIR\tmp.bar" ; Копируем файл, чтобы сохранить предыдущие пункты и не перетасовывать их
IntOp $0 $NumToAdd - 1
StrCpy $1 $NumToAdd
start:
IntOp $0 $0 + 1
IntOp $1 $1 + 1

clearerrors
ReadINIStr $3 "$EXEDIR\Default.bar" "Buttonbar" "button$0"
IfErrors endFunc
; Уберите строку StrCmp $3 "" +2 0 чтобы записывать пустые значения
StrCmp $3 "" +2 0
  WriteIniStr "$EXEDIR\tmp.bar" "Buttonbar" "button$1" "$3"
ReadINIStr $3 "$EXEDIR\Default.bar" "Buttonbar" "cmd$0"
StrCmp $3 "" +2 0
  WriteIniStr "$EXEDIR\tmp.bar" "Buttonbar" "cmd$1" "$3"
ReadINIStr $3 "$EXEDIR\Default.bar" "Buttonbar" "iconic$0"
StrCmp $3 "" +2 0
  WriteIniStr "$EXEDIR\tmp.bar" "Buttonbar" "iconic$1" "$3"
ReadINIStr $3 "$EXEDIR\Default.bar" "Buttonbar" "path$0"
StrCmp $3 "" +2 0
  WriteIniStr "$EXEDIR\tmp.bar" "Buttonbar" "path$1" "$3"
ReadINIStr $3 "$EXEDIR\Default.bar" "Buttonbar" "menu$0"
StrCmp $3 "" +2 0
  WriteIniStr "$EXEDIR\tmp.bar" "Buttonbar" "menu$1" "$3"
goto start
endFunc:

; Добавляемый пункт, за место ... вставляем добавляемые данные
 WriteIniStr "$EXEDIR\tmp.bar" "Buttonbar" "button$NumToAdd" "..."
 WriteIniStr "$EXEDIR\tmp.bar" "Buttonbar" "cmd$NumToAdd" "..."
 WriteIniStr "$EXEDIR\tmp.bar" "Buttonbar" "iconic$NumToAdd" "..."
 WriteIniStr "$EXEDIR\tmp.bar" "Buttonbar" "path$NumToAdd" "..."
 WriteIniStr "$EXEDIR\tmp.bar" "Buttonbar" "menu$NumToAdd" "..."
Delete "$EXEDIR\Default.bar"
Rename "$EXEDIR\tmp.bar" "$EXEDIR\Default.bar"
end:
FunctionEnd




Function FirstAdd
; Добавляемый пункт, за место ... вставляем добавляемые данные
 WriteIniStr "$EXEDIR\tmp.bar" "Buttonbar" "button1" "..."
 WriteIniStr "$EXEDIR\tmp.bar" "Buttonbar" "cmd1" "..."
 WriteIniStr "$EXEDIR\tmp.bar" "Buttonbar" "iconic1" "..."
 WriteIniStr "$EXEDIR\tmp.bar" "Buttonbar" "path1" "..."
 WriteIniStr "$EXEDIR\tmp.bar" "Buttonbar" "menu1" "..."
StrCpy $0 0
start:
IntOp $0 $0 + 1
StrCmp $0 "1" 0 +3
StrCpy $1 2
goto +2
IntOp $1 $1 + 1
clearerrors
ReadINIStr $3 "$EXEDIR\Default.bar" "Buttonbar" "button$0"
IfErrors endFunc
; Уберите строку StrCmp $3 "" +2 0 чтобы записывать пустые значения
StrCmp $3 "" +2 0
  WriteIniStr "$EXEDIR\tmp.bar" "Buttonbar" "button$1" "$3"
ReadINIStr $3 "$EXEDIR\Default.bar" "Buttonbar" "cmd$0"
StrCmp $3 "" +2 0
  WriteIniStr "$EXEDIR\tmp.bar" "Buttonbar" "cmd$1" "$3"
ReadINIStr $3 "$EXEDIR\Default.bar" "Buttonbar" "iconic$0"
StrCmp $3 "" +2 0
  WriteIniStr "$EXEDIR\tmp.bar" "Buttonbar" "iconic$1" "$3"
ReadINIStr $3 "$EXEDIR\Default.bar" "Buttonbar" "path$0"
StrCmp $3 "" +2 0
  WriteIniStr "$EXEDIR\tmp.bar" "Buttonbar" "path$1" "$3"
ReadINIStr $3 "$EXEDIR\Default.bar" "Buttonbar" "menu$0"
StrCmp $3 "" +2 0
  WriteIniStr "$EXEDIR\tmp.bar" "Buttonbar" "menu$1" "$3"
goto start
endFunc:
Delete "$EXEDIR\Default.bar"
Rename "$EXEDIR\tmp.bar" "$EXEDIR\Default.bar"
FunctionEnd



Function EndAdd
StrCpy $0 $NumToAdd
IntOp $1 $NumToAdd + 1
; Уберите строку StrCmp $3 "" +2 0 чтобы записывать пустые значения
ReadINIStr $3 "$EXEDIR\Default.bar" "Buttonbar" "button$0"
StrCmp $3 "" +2 0
  WriteIniStr "$EXEDIR\Default.bar" "Buttonbar" "button$1" "$3"
ReadINIStr $3 "$EXEDIR\Default.bar" "Buttonbar" "cmd$0"
StrCmp $3 "" +2 0
  WriteIniStr "$EXEDIR\Default.bar" "Buttonbar" "cmd$1" "$3"
ReadINIStr $3 "$EXEDIR\Default.bar" "Buttonbar" "iconic$0"
StrCmp $3 "" +2 0
  WriteIniStr "$EXEDIR\Default.bar" "Buttonbar" "iconic$1" "$3"
ReadINIStr $3 "$EXEDIR\Default.bar" "Buttonbar" "path$0"
StrCmp $3 "" +2 0
  WriteIniStr "$EXEDIR\Default.bar" "Buttonbar" "path$1" "$3"
ReadINIStr $3 "$EXEDIR\Default.bar" "Buttonbar" "menu$0"
StrCmp $3 "" +2 0
  WriteIniStr "$EXEDIR\Default.bar" "Buttonbar" "menu$1" "$3"

; Добавляемый пункт, за место ... вставляем добавляемые данные
 WriteIniStr "$EXEDIR\Default.bar" "Buttonbar" "button$0" "..."
 WriteIniStr "$EXEDIR\Default.bar" "Buttonbar" "cmd$0" "..."
 WriteIniStr "$EXEDIR\Default.bar" "Buttonbar" "iconic$0" "..."
 WriteIniStr "$EXEDIR\Default.bar" "Buttonbar" "path$0" "..."
 WriteIniStr "$EXEDIR\Default.bar" "Buttonbar" "menu$0" "..."
FunctionEnd


MKN 27-03-2012 15:21 1887802

kotkovets, K.A.V., - спасибо за помощь и терпение... :)

Но всё же не даёт мне покоя, как из цикла извлекать значения каждого прохода (в файл ли или в переменные) ?
В поисках информации, которой нет, наткнулся на такой код :

Программа, выводящая песню о пиве (beer.nsi) ; Beer song. Written by Evgeny Stepanischev
Дело конечно не в песне, а в наглядности возможностей NSIS. Так вот - возможно ли из такого рода кода извлечь текст песни не DetailPrint_ом, а в обычный файл ? Как это сделать ?
Код:


Caption "Beer song"
OutFile "beer99.exe"
BrandingText "Beer song (Evgeny Stepanischev)"
ShowInstDetails show

!macro c
    StrCpy $2 ""
    Call PrintBeer
!macroend

Function PrintBeer
    IntCmp $1 0 no "" ""
    StrCpy $2 "$2$1"
    Goto +2
no:
    StrCpy $2 "$2No"
    StrCpy $2 "$2 bottle"
    IntCmp $1 1 nos "" ""
    StrCpy $2 "$2s"
nos:
    StrCpy $2 "$2 of beer"
FunctionEnd

Section ""
    StrCpy $1 99

loop:
    !insertmacro c
    StrCpy $2 "$2 on the wall, "
    Call PrintBeer
    DetailPrint "$2."
    DetailPrint "Take one and pass around,"
    IntOp $1 $1 - 1

    !insertmacro c
    DetailPrint "$2 on the wall."
    DetailPrint ""
    IntCmp $1 0 "" loop loop

    DetailPrint "No more bottles of beer..."
    DetailPrint "Go to the store and buy some more..."
    DetailPrint "99 bottles of beer."

SectionEnd


K.A.V. 27-03-2012 16:18 1887828

MKN, что мешает заменить команду DetailPrint командой FileWrite?


Код:

Function .onInit
FileOpen $R0 "$EXEDIR\kav_song.txt" w
FileWrite $R0 "$\n$\r"
call test
FileClose $R0
quit
FunctionEnd

!macro c
    StrCpy $2 ""
    Call PrintBeer
!macroend

Function PrintBeer
    IntCmp $1 0 no "" ""
    StrCpy $2 "$2$1"
    Goto +2
no:
    StrCpy $2 "$2No"
    StrCpy $2 "$2 bottle"
    IntCmp $1 1 nos "" ""
    StrCpy $2 "$2s"
nos:
    StrCpy $2 "$2 of beer"
FunctionEnd

Function test
    StrCpy $1 99

loop:
    !insertmacro c
    StrCpy $2 "$2 on the wall, "
    Call PrintBeer
    FileWrite $R0 "$\n$2."
    FileWrite $R0 "$\nTake one and pass around,"
    IntOp $1 $1 - 1

    !insertmacro c
    FileWrite $R0 "$\n$2 on the wall."
    FileWrite $R0 "$\n"
    IntCmp $1 0 "" loop loop

    FileWrite $R0 "$\nNo more bottles of beer..."
    FileWrite $R0 "$\nGo to the store and buy some more..."
    FileWrite $R0 "$\n99 bottles of beer."

FunctionEnd


Цитата:

Цитата MKN
Но всё же не даёт мне покоя, как из цикла извлекать значения каждого прохода (в файл ли или в переменные) ? »

Поподробнее...Приведите пример цикла, можно же прибавлять просто к переменной, не? :)

MKN 27-03-2012 16:24 1887831

Цитата:

Цитата K.A.V.
пример цикла »

вот к примеру, упоминавшийся уже :
Код:

${for} $1 1 10
    MessageBox MB_OK "$1" IDOK
${next}

Каким образом записать последовательность значений отсчёта
а - в файл ?
b - в переменные , где каждое значение (от 1 до 10 в данном примере), "прирощенное" в каждом отсчёте цикла, записывается в свою переменную ? Т.е. небходимы 10 переменных.

K.A.V. 27-03-2012 16:50 1887853

MKN
а - в файл, либо методом WriteINIStr, чтобы сохранить значение каждого цыкла в разный параметр
Либо из примера б запишите одной строкой и возьмите как указано в том же примере

Код:

${for} $1 1 10
WriteINIStr "$TEMP\test.ini" "test" "test" "Цикл №$1" "Значение цикла"
    MessageBox MB_OK "$1" IDOK
${next}


Или насчет б я бы зделал так:
Создал переменную, и в ней уже проделывал все манипуляции
Скажем, создал переменную и могу хранить в ней значение 10 других "переменных"

Код:

Function .onInit
var /global MyVar
StrCpy $MyVar "/1=0 /2=0 /3=0 /4=0 /5=0 /6=0 /7=0 /8=0 /9=0 /10=0"
; Заполним "переменные нулевыми значениями, чтобы потом можно было их заменить"

call test

${for} $1 1 10
${GetOptions} "$MyVar" "/$1=" $R0
; Здесь мы получаем значение каждой "переменной"
    MessageBox MB_OK "/$1=$R0" IDOK
${next}

quit
FunctionEnd


Function test
${for} $1 1 10

${GetOptions} "$MyVar" "/$1=" $R0
intop $2 $1 + 10
${StrRep} $MyVar "$MyVar" "/$1=$R0" "/$1=$2"
; Заменяем в нашей переменной значение каждой "подпеременной" плюсуя к значению 10

    MessageBox MB_OK "/$1=$R0" IDOK
${next}

FunctionEnd


BigBoo 28-03-2012 19:10 1888723

Существует ли в NSIS ключ, наподобие ключа из InnoSetup /silent, но не /verysilent, чтобы процесс установки не был скрыт, как ключём /S, а шёл автоматически, без возможности отмены, но видимо?

alert30 28-03-2012 20:37 1888781

BigBoo, Типы инсталляторов

diakov 28-03-2012 20:43 1888788

kotkovets скажи пожалуйста, вот на счет описанного тобой плагина InvokeShellVerb Plugin for NSIS и хедера InvokeShellVerb.nsh вот если делать так ${PinToPusk} "$WINDIR\notepad.exe" то название закрепленного ярлыка так и есть notepad.exe как то не эстетично, возможно как то задать иное название?

BigBoo 28-03-2012 20:54 1888797

Цитата:

Цитата alert30
BigBoo, Типы инсталляторов »

Там говорится только о ключе /S и /D, то есть хотите сказать, что кроме этих других ключей не существует?

alert30 28-03-2012 21:01 1888804

Цитата:

Цитата BigBoo
Там говорится только о ключе /S и /D, то есть хотите сказать, что кроме этих других ключей не существует? »

Других ключей больше нету. Попробуйте погуглить и Вы увидите те же самые ключи /S /D.

kotkovets 28-03-2012 21:40 1888835

Цитата:

Цитата BigBoo
Существует ли в NSIS ключ, наподобие ключа из InnoSetup /silent, но не /verysilent, чтобы процесс установки не был скрыт, как ключём /S, а шёл автоматически, без возможности отмены, но видимо? »

не существует, но легко их сделать самому, и применить свойство прыжкам по страничкам.
читать дальше »
Код:

!include "MUI2.nsh"
!include "FileFunc.nsh"

!define MUI_CUSTOMFUNCTION_GUIINIT MUIGUIInit
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "Russian"

OutFile "proga.exe"
ShowInstDetails show

InstallDir $EXEDIR
var vSilent

Function MUIGUIInit
  ClearErrors
  ${GetOptions} "$CMDLINE" "/silent" $R0
  StrCpy $vSilent 0
  IfErrors +3
  StrCpy $vSilent 1
  SendMessage $HWNDPARENT 0x408 3 0 ;прыжок на 3 страничку установки.
FunctionEnd


Section "install_section"
    MessageBox MB_ICONINFORMATION|MB_OK "$INSTDIR" IDOK
SectionEnd


Section
 StrCmp $vSilent 1 0 +2
 Quit
SectionEnd


Запуск с ключом /silent - заставляет установщик перенестись на страничку установки.
Почему на 3 страничку, стандартных страничек приветствия и финиша в нсис нет!, значит их не учитываем,
остается только по скрипту 3 странички:
1 выбор директории
2 выбор компонентов
3 страничка установки - на страничку эту и ведем счет.
создаем "последнюю" секцию по скрипту, что бы не показывалась страничка финиша.
Цитата:

Цитата diakov
kotkovets скажи пожалуйста, вот на счет описанного тобой плагина InvokeShellVerb Plugin for NSIS и хедера InvokeShellVerb.nsh вот если делать так ${PinToPusk} "$WINDIR\notepad.exe" то название закрепленного ярлыка так и есть notepad.exe как то не эстетично, возможно как то задать иное название? »

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

Olef2387 29-03-2012 04:36 1888977

kotkovets
Здравствуйте! Читал в теме, вы давали советы для лучшего сжатия файлов установщика. Это ,конечно хорошо когда всё жмётся по самые пельмени. Но вот когда инсталлер весит больше гигабайта - то распаковывается это дело жутко долго... Ещё вначале "veryfuing installer" вылезает и долго грузится.
Как можно обеспечить более быструю распаковку? Пожалуйста, посоветуйте наиболее оптимальные параметры в соотношении "сжатие - скорость распаковки".
Готов пожертвовать размером установщика (ибо щас это не принципиально, почти у всех безлимитки на хороших скоростях).

Спасибо!

MKN 29-03-2012 09:50 1889061

K.A.V., kotkovets,
Позвольте испытать ещё раз ваше терпение ... :) помочь с вот такой головоломкой :
Опять те же кнопки, те же пронумерованные параметры...

Есть последовательность из 10 чекбоксов для 10 секций с параметрами кнопок.
Отметка чекбокса устанавливает кнопку на тулбар и при этом нумеруются параметры.

Нужно учитывать последовательность отметки и снятия отметки чекбоксов так, чтобы последовательность установки кнопок(а значит и нумерация параметров) - всегда соответствовала последовательности действий с отметками чекбоксов.

Например - первым отметили 10й чекбокс - кнопка будет установлена .
Вторым отметили 7й чекбокс - кнопка установится по счёту.
Третьим отметили 1й чекбокс - кнопка установится по счёту.

1 2 3 4 5 6 7 8 9 10
3

И т.д.

Потом решили снять отметку с 10ого чекбокса (который устанавливал 1ую кнопку) - при этом 1ой кнопкой стала 2ая, а 2ой - 1ая

1 2 3 4 5 6 7 8 9 10
2

Далее сняли отметку с 1ого чекбокса - 1ая кнопки осталась на месте

1 2 3 4 5 6 7 8 9 10
1

И так для любых комбинаций снятий-отметок чекбоксов.

зы В примерах по несколько цифер под рядом 1...10 поместить в сообщении не получается. Пост как то странно форматируется..

K.A.V. 29-03-2012 12:00 1889157

Цитата:

Цитата Olef2387
"veryfuing installer" вылезает и долго грузится. »

Отключите SOLID сжатие и не будет вам этого окошка

Цитата:

Цитата Olef2387
Как можно обеспечить более быструю распаковку? Пожалуйста, посоветуйте наиболее оптимальные параметры в соотношении "сжатие - скорость распаковки". »

ZLIB - высокая скорость, низкая степень сжатия
BZIP2 - всё по "средне"
LZMA - низкая скорость, высокая степень сжатия

Уже не раз обсужждалось, можете использовать внешние упаковщики типа RAR и создавать многотомные архивы...Читайте в теме ранее уже раз 100 обсуждали это

MKN, ну прям вынос мозга :)
Сейчас голова не соображает, но может потребуется создать пару отдельных переменных и хранить там какой пункт отметили и из него вычитать...
Позже подумаю, если kotkovets раньше не реализует =)


P.S.
Нужно в справочник добавлять страничку "Часто задаваемые вопросы"
Первым делом добавить инфу по поводу создания многотомных архивов

kotkovets 29-03-2012 12:19 1889177

Цитата:

Цитата Olef2387
когда инсталлер весит больше гигабайта - то распаковывается это дело жутко долго... »

ну, уж в таком случае наверно будет лучший вариант делать установщик в роли распаковщика архивов, которые
рядом с установщиком, т.е таскать собой файлы архиватора 7z: 7z.dll и 7z.exe(консольную версию)
Код:

Function .onInit
  InitPluginsDir
  File `/oname=$PLUGINSDIR\7z.dll` `путь_к\7z.dll`
  File `/oname=$PLUGINSDIR\7z.exe` `путь_к\7z.exe`
FunctionEnd

Section
  nsExec::ExecToLog `"$PLUGINSDIR\7z.exe" x "путь_к архиву" -o"куда_распаковать" -y`
  pop `$5`
  pop `$3`
  DetailPrint `$5`
  DetailPrint "Возвращенное значение 7z: $3"
SectionEnd

или воспользоваться плагином 7z: Nsis7z plug-in
Цитата:

Цитата K.A.V.
Позже подумаю, если kotkovets раньше не реализует »

да уж, работа с массивами назревает...и плаг есть: http://nsis.sourceforge.net/Arrays_in_NSIS
Цитата:

Цитата K.A.V.
Нужно в справочник добавлять страничку "Часто задаваемые вопросы"
Первым делом добавить инфу по поводу создания многотомных архивов »

сделаем :)

K.A.V. 29-03-2012 13:50 1889258

Вложений: 1
MKN, возьмите на тест...
Если я правильно понял задачу, то вроде работает =)

Там в папке с EXE в INI файл будет записываться значение чекбоксов, при отметке и при снятии отметки в 2 параметра

P.S.
Вы там взялись за написание софта с помощью NSIS как я? :)
Такие головоломки прям)))

MKN 29-03-2012 15:11 1889318

Цитата:

Цитата K.A.V.
взялись за написание софта с помощью NSIS как я? »

Куда мне до тебя и kotkovets... :) Задумок много, с реализацией проблема. Точнее со знаниями как и что...

Test делает прямо то, что надо !


ps А можно оформить этот код как .nsh или плагин (приобщив туда же предыдущие изыскания с вставкой кнопки в произволное место последовательности) ? Это я так спросил... :)

K.A.V. 29-03-2012 16:17 1889391

Вложений: 1
Цитата:

Цитата MKN
с вставкой кнопки в произволное место последовательности »

Не понял :dont-know

Заменить текстовые поля на кнопки? =)

Вообщем вот смотрите...Если чего не поймёте - спрашивайте

MKN 29-03-2012 16:35 1889399

K.A.V.,
Благодарю за код. Буду изучать.

ps Я имел ввиду объединение кода с предыдущим моим вопросом, о вставки кнопки в произвольное место ряда, когда уже имеется ряд кнопок. Но наверное не нужно смешивать задачи...

K.A.V. 29-03-2012 16:50 1889411

Цитата:

Цитата MKN
Но наверное не нужно смешивать задачи... »

Добавить отдельную функцию и вызывать её, в которой будет "сдвиг" пунктов...

Сделаю позже ;)
Изучайте пока то что уже есть :tongue:

Olef2387 29-03-2012 21:05 1889573

K.A.V. и kotkovets, спасибо.

Цитата:

Цитата K.A.V.
Отключите SOLID сжатие и не будет вам этого окошка »

А что это за проверка вообще "verifying installer". Для чего нужна она?

Цитата:

Цитата K.A.V.
ZLIB - высокая скорость, низкая степень сжатия
BZIP2 - всё по "средне"
LZMA - низкая скорость, высокая степень сжатия »

Ну это понятно... А дополнительные парметры?
SetCompressorDictSize 64
SetDatablockOptimize on
Они на что влияют?

Цитата:

Цитата kotkovets
ну, уж в таком случае наверно будет лучший вариант делать установщик в роли распаковщика архивов, которые
рядом с установщиком, т.е таскать собой файлы архиватора 7z: 7z.dll и 7z.exe(консольную версию) »

Не. Не хочу заморачиваться с распаковывающимися архивами.

kotkovets 29-03-2012 21:25 1889584

Цитата:

Цитата Olef2387
Ну это понятно... А дополнительные парметры?
SetCompressorDictSize 64
SetDatablockOptimize on
Они на что влияют? »

SetCompressorDictSize - Устанавливает размер словаря в мегабайтах (Мбайт), компрессором LZMA (значение по умолчанию составляет 8 Мбайт). Т.е сколько нужно оперативной памяти для сжатия или расжатия
--
SetDatablockOptimize - оптимизирует блоки данных сжатия. разработчики рекомендуют включать его (on)
--
SetCompressor -Это команда устанавливает алгоритм сжатия файлов/данных в инсталляторе.
Поддерживаются три метода сжатия: ZLIB, BZIP2 и LZMA.
ZLIB (значение по умолчанию) это - быстрый и простой метод. С заданным по умолчанию уровнем сжатия он использует приблизительно 300 Кбайт памяти.
BZIP2 дает лучшую степень сжатия чем ZLIB, но он немного медленнее и использует больше памяти. С заданными по умолчанию уровнем сжатия он использует приблизительно 4 Мбайта памяти.
--
LZMA - метод сжатия, который дает хорошую степень сжатия. Скорость распаковки высокая (10-20 МБ/сек на процессоре в 2 ГГц), а скорость сжатия ниже. Размер памяти, который будет использоваться для распаковки, равен размеру словаря плюс несколько Кбайт, значение по умолчанию составляет 8 Мбайт.
Если используется команда с /FINAL, то последующие запросы в SetCompressor будут проигнорированы.
Если используется команда с /SOLID, то все данные инсталлятора будут сжаты в одном блоке. Это приводит к большому степени сжатия.
Цитата:

Цитата Olef2387
Не. Не хочу заморачиваться с распаковывающимися архивами. »

а че там заморачиваться, создал архив(хоть запароленный), установщиком расжал в нужное место, при минимальных размерах установщика,
т.е скорость распаковки в основном зависит от ресурсов компьютера.

K.A.V. 30-03-2012 00:22 1889693

MKN
Цитата:

Цитата MKN
о вставки кнопки в произвольное место ряда, когда уже имеется ряд кнопок »

Не понятно, что делать с кнопкой, которая идёт следом за добавляемым пунктом... :dont-know
Вот смотрите:

У нас заполнено уже 5 первых кнопок например (для простоты примера кнопка = попытка)
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5

вот...ну добавляю я кнопку с попыткой 6 на место 4 кнопки, ну понятно, значение 4 меняем 6 (ну мы же меняем у чекбокса попытку?) и становится так:

1 = 1
2 = 2
3 = 3
4 = 6
5 = 5

и что дальше?? куда девать 4 попытку? Что, заполнять "случайную" кнопку которая будет пустой при пересчёте или как?? Или заменять 5 на 4?
Даже если мы заменим 5 на 4, то у нас будет "дыра", "пятёрочка" просто исчезнет =)
Вообщем что-то здесь не складывается)))

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

kotkovets 30-03-2012 00:25 1889695

Цитата:

Цитата K.A.V.
Вообщем пойду спать »

утро вечера мудрее :biggrin:

MKN 30-03-2012 08:50 1889789

K.A.V.,
Чёрт с ней со вставкой. Наверное я перемудрил и зря тебя озадачил...
А мысль была такая : :)
Мы ведь рассматривали вариант, когда устанавливали кнопки на "девственный" тулбар без кнопок, сохраняя последовательность установки кнопок сообразно последовательности выбора чекбоксов.

А если на тулбаре уже есть сколько то кнопок ?

Вот тогда и предполагалось, что новые кнопки (1, 2 или все 10) вставлялись бы и в любое место в уже имеющийся ряд кнопок и, в то же время, сохранялась последовательность установки новых кнопок, как уже было рассмотрено ранее. Вот такая загогулина...
Цитата:

что делать с кнопкой, которая идёт следом за добавляемым пунктом...
последовательность нумерации должна сохраняться "дважды" - для ряда "старых" кнопок и для ряда "новых".

Т.е. "вклинивание" новых кнопок в ряд старых, смещает имеющуюся последовательность старых кнопок (как было в предыдущей задаче).
И в то же время, как бы мы не тасовали новые кнопки, сохранялась бы последовательность их установки сообразно последовательности их выбора чекбоксами (как в последней задаче).

diakov 30-03-2012 11:57 1889910

kotkovets, такой вопрос вот в KMPlayer '"$INSTDIR\KMPlayer.exe" -install' такой ключ устанавливает ассоциации, в PotPlayer '"$INSTDIR\PotPlayerMini64.exe" /RegisterAll' такой ключ устанавливает ассоциации там WinRAR еще какойто не помню. Есть ли возможность узнать как то эти ключи исходя из самого exe-шника? Спасибо.

kotkovets 30-03-2012 12:44 1889955

Цитата:

Цитата diakov
Есть ли возможность узнать как то эти ключи исходя из самого exe-шника? Спасибо. »

причем здесь nsis? у разрабов спрашивай!

Olef2387 01-04-2012 00:26 1891078

Цитата:

Цитата kotkovets
SetCompressorDictSize - Устанавливает размер словаря в мегабайтах (Мбайт), компрессором LZMA (значение по умолчанию составляет 8 Мбайт). Т.е сколько нужно оперативной памяти для сжатия или расжатия »

А если можно, пожалуйста, подробнее рассказать. Если скажем у пользователя имеется 512 мб оперативки, то сколько мне надо поставить в значении SetCompressorDictSize?

kotkovets 01-04-2012 11:27 1891191

Olef2387, сами смотрите...
кстати, настройки архиватора 7z по умолчанию соответствуют балансу между уровнем сжатия и скоростью,
т.е размер словаря по умолчанию 64 Мбайт, в NSIS (?) размер словаря больше, чем 163 Мбайт не поставите,
почему не знаю.

Olef2387 01-04-2012 14:21 1891280

в 7зип Размер словаря по умолчанию 16 mb стоит...


kotkovets 01-04-2012 14:59 1891303

Olef2387, я имел ввиду при уровне сжатия "ультра"

wolkow70 03-04-2012 14:10 1892538

Цитата:

Цитата diakov
Есть ли возможность узнать как то эти ключи исходя из самого exe-шника? »

Иногда удается узнать с помощью Process monitor. Но там нужно много записей перелопатить, и не всегда удача ждет.

kotkovets,
Подскажите как конвертировать комманду с консольным окном
ExecWait "$INSTDIR\vlc-cache-gen.exe $INSTDIR\plugins"
в вариант со скрытым запуском.
Попробовал так, не запускается:
nsExec::Exec '"$INSTDIR\vlc-cache-gen.exe $INSTDIR\plugins"'

kotkovets 03-04-2012 14:25 1892549

wolkow70, пробуйте так:
Код:

SetOutpath "$INSTDIR"
nsExec::Exec `"$INSTDIR\vlc-cache-gen.exe" "$INSTDIR\plugins"`
pop $0
MessageBox MB_OK "$0"

Если $0 равно нулю, утилитка отработала.

diakov 04-04-2012 16:31 1893392

kotkovets, что бы не отображалась кнопка детали можно написать

Код:

ShowinstDetails nevershow
ShowuninstDetails nevershow

А возможно ли избавится от статусной строки?


kotkovets 04-04-2012 16:58 1893413

Цитата:

Цитата diakov
А возможно ли избавится от статусной строки? »

---
SetDetailsPrint
none|listonly|textonly|both|lastused
---
Код:

Section Uninstall
    SetDetailsPrint listonly
    delete "C:\Users\Public\Desktop\CDBurnerXP.lnk"
SectionEnd


Olef2387 05-04-2012 20:26 1894252

kotkovets. Здравствуйте.

Можно ли изменять заголовок для всплывающих мессажбоксов? Ну например чтобы был заголовок "Ошибка!". А так пока заголовок такой же как заголовок окна инсталлятора.

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

спасибо!

kotkovets 05-04-2012 22:04 1894309

Цитата:

Цитата Olef2387
Можно ли изменять заголовок для всплывающих мессажбоксов? Ну например чтобы был заголовок "Ошибка!". А так пока заголовок такой же как заголовок окна инсталлятора.
И ещё один вопрос. В силу специфики моей установки - у меня временные файлы копируются на системный диск пользователя. Не знаете как можно было бы проверить количество свободного места на системном диске? Если нехватает - сообщение что нужно место освободить! »

Код:

  System::Call `kernel32::GetDiskFreeSpaceEx(t'C:\', *l.R3, *l.R4, *l)`
  Math::Script "R3 = R3 / 1048576; R4 = R4 / 1048576"
  MessageBox MB_OK "Всего: $R4 МБ$\nСвободно: $R3 МБ" IDOK
  IntCmp $R3 200 +3 0 +3 ;если на диске С: места меньше, чем 200 МБ
  System::Call "user32::MessageBox(i$HWNDPARENT, t'Недостаточно места на диске', t'nsis_error', i0x10)"
  Abort


Olef2387 06-04-2012 02:32 1894426

kotkovets. благодарю за код! (откуда только Вы всё знаете...)
А не могли бы дополнить... Я вот имел ввиду именно системный диск (ну там где Виндоус поставлен), просто не у всех диск С - системный. Можно ли как-нибудь сперва определить где стоит операционка и потом определять уже свободное место на этом диске?

Krinkels 06-04-2012 10:02 1894511

Цитата:

Цитата Olef2387
откуда только Вы всё знаете... »

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

kotkovets 06-04-2012 11:03 1894546

Цитата:

Цитата Olef2387
просто не у всех диск С - системный. Можно ли как-нибудь сперва определить где стоит операционка и потом определять уже свободное место на этом диске? »

Можно подставить предопределенную переменную $WINDIR
первый символ переменной всегда возвратит букву системного раздела
Код:

System::Call `kernel32::GetDiskFreeSpaceEx(t'$WINDIR', *l.R3, *l.R4, *l)`
--
--


Olef2387 06-04-2012 15:53 1894706

Цитата:

Цитата Krinkels
Потому что сам во всем старался разобраться, а не задавал глупых вопросов, как некоторые... Есть же справка, куча примеров, можно любой код состряпать. »

Это больше для позитива было сказано. Но коли уж в штыки воспринято, то позволю парировать Ваш выпад...

Аргумент номер один: Данная тема существует для общения, для вопросов и для ответов - посмотрите хотя бы на название. Какие вопросы глупые, а какие нет - решать не Вам.
Аргумент номер два: есть справка и что? Справка - это понятие растяжимое, и всего в ней невозможно предусмотреть. Поэтому, если есть какие-то конкретные претензии к моим вопросам в частности - говорите четко и ясно, кашу по тарелке размазывать не надо!
Аргумент номер три: нужно уметь уважительно относиться к людям. Тем более к неопытным пользователям. Я никого не обидел ни прямо, ни косвенно. Веду нормальное общение - спрашиваю, интересуюсь. И между прочим kotkovets, как отзывчивый человек - отвечает, помогает, советует.

MKN 06-04-2012 16:19 1894726

Цитата:

Цитата Krinkels
Потому что сам во всем старался разобраться, а не задавал глупых вопросов, как некоторые... »

Пооффтопим... :) Во-первых, в контексте темы, глупых вопросов не бывает. Быают одни и те же вопросы и одни и те же грабли. Виноват ли сам "наступающий" на эти грабли ? По разному бывает. В случае с посылом вопрошающего "в справку" - скорее нет чем да. Потому, что штатная справка NSIS крайне отвратительно написана, и к тому же, на английском языке, что напрочь отворачивает многих пользователей от изучения NSIS.

Но на помощь пришли "гуру" NSIS и сделали справочник на русском языке. Но на то они и гуру, что имея опыт программирования пишут и говорят вроде бы по-русски, но ничего не понятно из-за специфики материала... То, что понятно и ясно им, вовсе не означает понимание материала неискушенным пользователем. Это уже чисто педагогический момент - изъясняться так, чтобы у читателя-ученика, не было разнотолков и недоумения в глазах. :)
А с этим пока проблематично... Как выход - подкрепление теории, примерами. Примеры конечно есть, но и примеры без внятных и развёрнутых комментариев - часто не понятны.
Без примеров - NSIS не изучить и не постичь. Начинающим пользователям - точно. И не надо их за это винить и ругать. :)
Больше примеров и Макаренского терпения... :)

K.A.V. 06-04-2012 19:08 1894807

АВТОР ТЕМЫ, ПОПРАВЬТЕ ШАПКУ И НА ПЕРВУЮ СТРОЧКУ ПОМЕСТИТЕ ССЫЛКУ НА СПРАВОЧНИК

Из моих постов "прошлых лет" вытаскиваю самое главное
http://forum.oszone.net/post-1301660-235.html
http://forum.oszone.net/post-1334031-371.html
http://forum.oszone.net/post-1335270-375.html

Цитата:

Цитата K.A.V.
Знаете, когда я начал изучать NSIS (это было где-то года 3 назад), я начинал именно с HM NIS EDIT, и его функция мастера сценариев мне очень помогла, к тому же, я не знал английского языка (да и сейчас не знаю ), и к тому же, у меня тогда не было интернета, открывал пару раз файл справки, было очень страшно там же всё по английскому написано...НО там есть примеры всех команд, и разобраться не так уж и сложно окозалось...главное необходимо желание, и...усиленные тесты! »

Цитата:

Цитата K.A.V.
Просто было большое желание и очень много тестов
Не скажу, что всё получалось сразу, даже сейчас не всё получается с первого раза, но усилия, которые прилагаются для реализации нужной возможности не оказываются напрасными, просто нужно запастись побольше терпением и желанием »

Цитата:

Цитата K.A.V.
Сначала команды изучаются по отдельности методом тестов естественно, затем включаем устройство под названием мозг и посылаем ему команду на выявление возможных связок команд в функции, т.е. что можно сделать с использованием нескольких команд, вот тогда и рождаются функции.. »

Цитата:

Цитата K.A.V.
А зачем вообще нужна справка по NSIS? И не нужно говорить, что там всё написано на английском языке, я начал изучать NSIS в лет 16-17 не зная английского языка (и сейчас не знаю) и никакого языка программирования, с использованием справки и примеров в папки NSIS\Examples
Это так сложно? Ввести в "указатель" в файле справки нужную вам команду и прочитать её описание? Там на все команды написаны подробнейшие примеры
Этими словами я не обращаюсь к кому-то конкретно и не хочу сказать, что лично я не собираюсь отвечать/помогать в разрешении вопросов, но посмотрите, как называется наша тема? NSIS - все вопросы, а не NSIS - скажите, что вам нужно, а мы напишем за вас готовый код »


Что мы видим СЕЙЧАС:
У вас всех есть то самое золото, которого не было ни у меня и ни у кого - Справка NSIS на русском языке, и, как мне кажется, в которой довольно-таки грамотно описаны все ньюансы

И теперь скажите, мне, лично вы Olef2387
Цитата:

Цитата Olef2387
знаете как можно было бы проверить количество свободного места на системном диске? Если нехватает - сообщение что нужно место освободить! »

Что вам помешало прочитать нашу справку по NSIS???
Я могу ответить за вас, ЛЕНЬ или просто не хотение "возиться с кодом", как я и процитировал сам себя в этом сообщении "NSIS - все вопросы, а не NSIS - скажите, что вам нужно, а мы напишем за вас готовый код"

В файле справке есть информация, КАК определить системный диск, КАК определить свободное место на диске, ВСЁ это там есть

Любой кто здесь напишет опять же "я не знаю английского" уже не отговорка (я тоже его не знаю и никогда не знал) т.к. уже есть не плохой справочник на русском
Почему я, будучи ещё ребёнком (16-17 лет) начал изучать NSIS с 0, без знания английского, без интернета и пришел к тому, что создал справочник для начинающих программеров?
Просто было огромное желание учиться, повторюсь, ничего с первого раза не получалось

Мне никто ни в чем не помагал


А вы здесь "беспомощные" задаёте одни и те же вопросы, ответы на которые уже давно есть в нашей справке
Я просто недоумеваю...
Если вы не хотите в этом разбираться (мол, лучше зайду-ка задам вопрос и получу готовый код) и банально прочитать уже справку на родном языке для вас затруднительно, то бросайте вообще программирование на NSIS и вообще не беритесь за любое программирование

K.A.V. 07-04-2012 10:23 1895014

Цитата:

Цитата kotkovets
потому есть смысл, донести администратору, модератору о смене куратора темы »

Ну так...написали бы сами, раз такое дело и вы знали об этом, берите шапку темы под свой контроль :yes:

Цитата:

Цитата kotkovets
на их усмотрение. »

Дааа мы тут сами разберёмся ха :)
Я вас назначаю куратором темы, только нужно обратиться к властям :lol:

Aster 08-04-2012 18:14 1895809

Власти поддержали инициативу.
Поздравляем Вячеслава (kotkovets) с назначением на кураторство сей полезной темы! :)

hb860 08-04-2012 20:35 1895875

Поздравляем, чо :)

Olef2387 08-04-2012 23:36 1895920

kotkovets, тоже поздравляю вас. :)

Но я уже тут боюсь что-то спрашивать. K.A.V. выпрыгнет и отправит справочник читать) А сам справочник будет ли ещё обновляться ?

kotkovets 08-04-2012 23:42 1895922

Цитата:

Цитата Olef2387
kotkovets, тоже поздравляю вас. »

спасибо!
Цитата:

Цитата Olef2387
А сам справочник будет ли ещё обновляться ? »

будет, когда точно, не знаю...

K.A.V. 09-04-2012 07:33 1896030

Цитата:

Цитата Olef2387
Но я уже тут боюсь что-то спрашивать. K.A.V. выпрыгнет и отправит справочник читать »

Прочитайте его внимательно и не задавайте вопросов, ответы на которые есть в справочнике
Если после прочтения всё равно остались вопросы по какой-то команде - это другое дело, мы хотя бы будем знать, что вы нашли ответ, но у вас что-то не получилось, мы поможем в любом случае

Цитата:

Цитата Aster
Поздравляем Вячеслава (kotkovets) с назначением на кураторство сей полезной темы! »

Поздравляем :yes:

wolkow70 09-04-2012 12:44 1896167

kotkovets,
Нашел в справке ваш хедер ProcessFunc.nsh
Подскажите правильно ли я его понял и применяю, в таком случае: ?

${FindProcessName} "opera.exe" $0
StrCmp $0 none NotProcess
MessageBox MB_YESNO|MB_ICONINFORMATION|MB_TOPMOST "ВНИМАНИЕ!$\n\
$\nВ настоящее время программа ${PRODUCT_NAME} запущена!"
$\nПри нажатии кнопки 'Да' программа будет принудительно закрыта и удалена. \
$\nПри нажатии кнопки 'Нет' будет выполнен выход из программы удаления. \
$\nВы хотите продолжить удаление программы ${PRODUCT_NAME} ?" /SD IDYES IDYES close IDNO cancel
cancel:
abort
close:
${KillProcess} "opera.exe" $0
${ProcessWait} "opera.exe" "2000" $0
NotProcess:

kotkovets 09-04-2012 13:06 1896177

Цитата:

Цитата wolkow70
Нашел в справке ваш хедер ProcessFunc.nsh
Подскажите правильно ли я его понял и применяю, в таком случае: ? »

Много лишнего...а еще лучше логической конструкцией:
Код:

${If} ${ProcessExists} "opera.exe"
  MessageBox MB_YESNO|MB_ICONINFORMATION|MB_TOPMOST "ВНИМАНИЕ! $\n\
  настоящее время программа ${PRODUCT_NAME} запущена! $\n\
  При нажатии кнопки 'Да' программа будет принудительно закрыта и удалена $\n\
  При нажатии кнопки 'Нет' будет выполнен выход из программы удаления. $\n\
  Вы хотите продолжить удаление программы ${PRODUCT_NAME} ?" /SD IDYES IDYES +2
  abort
  ${KillProcess} "opera.exe" $0
  ${ProcessWait} "opera.exe" "2000" $0
${EndIf}


DruOleg 09-04-2012 17:28 1896436

Привет всем.
Не как не могу разобраться с разбором строк...
Из реестра считывается строка вида:
Provider=SQLOLEDB;Data Source=W2K3SP2\SQLEXPRESS;Initial Catalog=user_db;Persist Security Info=True;User ID=user;Password=user;Min Pool Size=5;
либо
Provider=LCPI.IBProvider;Data Source=localhost:C:\Program Files\user\DB\user_db.gdb;ctype=win1251;auto_commit=true;auto_commit_level=0x1000;User ID=user;Password=user;

По значению "Provider=" планирую определять тип продукта.
Как видите - используется разделитель - ";", как бы с его помощью разбить строку на переменные?
Спасибо!

MKN 09-04-2012 18:24 1896472

DruOleg,
Можно для начала так :
Код:

!include "WordFunc.nsh"

OutFile Provider.exe

Section
 ${WordFind} "Provider=SQLOLEDB;Data Source=W2K3SP2\SQLEXPRESS;Initial Catalog=user_db;Persist Security Info=True;User ID=user;Password=user;" ";" "+1" $R0
MessageBox MB_OK "$R0"
SectionEnd

В $R0 будет "Provider=SQLOLEDB"
Потом отсекаем "Provider="

kotkovets 09-04-2012 22:38 1896648

DruOleg, MKN, так будет работать, если подстрока Provider= - в начале строки,
иначе нужен цикл, к примеру в переменную $2 получаем строку из реестра:
Код:

  StrCpy $2 "Provider=LCPI.IBProvider;Data Source=localhost:C:\Program Files\user\DB"
  ${WordFind} "$2" ";" "+1" "$3" ;получаем подстроку до первого символа ' ; '
  Strlen $1 "Provider="                  ;вычисляем длину отсекаемой части
  StrCpy $2 "$3" "" $1                  ;отсекаем
  MessageBox MB_OK "$2" IDOK


K.A.V. 09-04-2012 22:58 1896658

Дайте мне хоть слово сказать :clapping:

А можно и воть так:
Код:

!include "StrFunc.nsh"
!include "FileFunc.nsh"

${StrStrAdv}

Function TEST
StrCpy $0 "Provider=SQLOLEDB;Data Source=W2K3SP2\SQLEXPRESS;Initial Catalog=user_db;Persist Security Info=True;User ID=user;Password=user;"
;  В переменную $0 помещаем всю строку

StrCpy $1 "Password="
;  В переменную $1 помещаем ключ, значение которого будем определять

${GetOptions} "$0" "$1" $2
${StrStrAdv} $2 "$2" ";" ">" "<" "0" "0" "1"

MessageBox MB_OK "$2"
;  В переменной $2 результат
FunctionEnd

3 переменных для наглядности, так-то если жалко :lol: можно везде $2 заменить на $1 и результат в однёрочке будет

Вроде работает :yes:

Цитата:

Цитата kotkovets
не работает из-за ${GetOptions}... »

Поправил пост, там инклуд ещё один, простииите :cry:

MKN 10-04-2012 08:51 1896851

K.A.V.,
Расскажи подробнее про ${StrStrAdv}. Когда, как и зачем... :)

ps Хорошо бы в справочнике рассказать про ВСЕ "штучки" ${} используемые в различных Function Header и логических конструкциях. С примерами...

K.A.V. 10-04-2012 09:11 1896863

Цитата:

Цитата MKN
K.A.V.,
Расскажи подробнее про ${StrStrAdv}. Когда, как и зачем... »

Не поверишь, но я сам не знаю по какому принципу работает эта команда :biggrin:

Я с ней не работал и не разбирал её, первый раз я с ней столкнулся в этой теме, когда у одного из участника возник похожий вопрос "Как получить значения в строке" (в справочнике это страничка Примеры кодов => Работа со строками => Фильтр символа "|": Разбивка значений)

Вот тогда я методом "тыка" получил результат

В StrFunc.nsi есть пример работы этой команды, я в ней не разбирался, но там какие-то сложные логические действия :)

На данный момент в работе со строками у меня проблем не возникает, и, собственно, в чем-то разбираться пока нет необходимости :drug:

Вот здесь возникла проблема у человека, мы её решили и я успокоился :tongue:

MKN 10-04-2012 10:16 1896885

Оказывается есть описание StrStrAdv : http://nsis.sourceforge.net/StrStrAdv
как и некоторые, перечисленные в StrFunc.nsi
Подставляем в http://nsis.sourceforge.net/нужное и ищем...
А я искал в доке... Получается в доке, тоже далеко не всё есть...

kotkovets 10-04-2012 11:01 1896906

Цитата:

Цитата MKN
рассказать про ВСЕ "штучки" ${} »

это простое объявление константы препроцессором NSIS,
причем константу, можно заключать макросы и функции, что очень удобно.
Код:

!define msgbox "!insertmacro _msgbox"
!macro _msgbox text
    MessageBox MB_OK "${text}" IDOK
!macroend

Section
  ${msgbox} MKN
SectionEnd

Причем константа ${text} (значение константы) объявляется в пределах макроса (при вызове) _msgbox,
затем разрушается, что очень удобно, в отличии от глобальной константы ${msgbox}, где значение
этой константы можем поменять - только в функции иницилизации установщика (.OnInit)

MKN 10-04-2012 11:38 1896931

kotkovets,
Я не совсем это (простое объявление констант) имел ввиду. А разбор конкретных ( ${StrCase} ${StrClb} ${StrIOToNSIS} ${StrLoc} ${StrNSISToIO} ${StrRep} ${StrStr} ${StrStrAdv} ${StrTok} ${StrTrimNewLines} ${StrSort} и т.д. и для разных хедеров (не только для StrFunc) ) с примерами и комментами... Хотя бы тех, что не вошли пока в справочник.

Например, сделать пример работы, скажем наугад, - ${StrCase} так :
Сначала указываем Syntax : ${StrCase} "ResultVar" "String" "Case"
Потом код примера :

Код:

!include "StrFunc.nsh"
${StrCase}


Name "StrCase"
OutFile "StrCase.exe"

Section
MessageBox MB_OK "        Преобразуем строку\
$\r$\n Папа у Васи работает в ФСБ\
$\r$\n используя различные ключи"

${StrCase} $0 "Папа у Васи работает в ФСБ" "L"
MessageBox MB_OK "Когда используем ключ L, то строка преобразуется так :\
$\r$\n                        $0"

${StrCase} $0 "Папа у Васи работает в ФСБ" "U"
MessageBox MB_OK "Когда используем ключ U, то строка преобразуется так :\
$\r$\n                        $0"

${StrCase} $0 "Папа у Васи работает в ФСБ" "T"
MessageBox MB_OK "Когда используем ключ T, то строка преобразуется так :\
$\r$\n                        $0"

${StrCase} $0 "Папа у Васи работает в ФСБ" "S"
MessageBox MB_OK "Когда используем ключ S, то строка преобразуется так :\
$\r$\n                        $0"

${StrCase} $0 "Папа у Васи работает в ФСБ" "<>"
MessageBox MB_OK "Когда используем ключ <>, то строка преобразуется так : \
$\r$\n                      $0"
SectionEnd

Пользователь просто скомпилит код - и сразу наглядно понятно для чего нужен и что делает ${StrCase}

И так для всего прочего. Хлопотно конечно и справочник разбухнет, но оно того стОит.

Для примеров оформления страниц и для примеров всевозможных вариаций переключения кнопок-чекбоксов , самое лучшее это GIF-анимашки.
Ежели сделаешь в коде так, то смотри как это будет выглядеть и главное, как работать, а если так то смотри далее...

И если уж после таких примеров будут вопросы.... :)

kotkovets 10-04-2012 15:08 1897029

MKN, открывай публикацию своих тестов и "новых неизвестных народу макросов" :)
а мы добавим в справочник.
Цитата:

Цитата MKN
И если уж после таких примеров будут вопросы.... »

будут, не заржавеет...

K.A.V. 10-04-2012 16:20 1897062

Цитата:

Цитата kotkovets
MKN, открывай публикацию своих тестов и "новых неизвестных народу макросов" »

MKN, зря пример выложил :lol:
Цитата:

Цитата kotkovets
а мы добавим в справочник. »

Ну а если говорить серьёзно, то лично я английского не знаю и сложно изучать техническую документацию, тем более когда речь идёт о программировании, думаю все знают, как программы-переводчики справляются с переводом таких текстов :biggrin:

На это опять же, нужно убить колосальное количество времени, сюда я не отношу такие простые команды как ${GetOptions} например, это всё просто (или взять те же команды, которые я уже перевёл из справки, там всё легко), говорю о сложных манипуляциях со строками как например эта же команда ${StrStrAdv}, на страничке документации по ней информации не мало и, нужно сесть, и хорошенько напрячь извилины :)

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

MKN 10-04-2012 17:10 1897083

Цитата:

Цитата K.A.V.
${StrStrAdv}, на страничке документации по ней информации не мало и, нужно сесть, и хорошенько напрячь извилины »

Вот ещё пример использования ${StrStrAdv} , для тех кто не хочет напрягаться (я и сам такой :) ) :

Синтаксис : ${StrStrAdv} "ResultVar" "String" "SubString" "SearchDirection" "StrInclusionDirection" "IncludeSubString" "Loops" "CaseSensitive"

Код:

!include "StrFunc.nsh"
${StrStrAdv}

OutFile "StrStrAdv.exe"

Section
MessageBox MB_OK "                                              Преобразуем строку:\
$\r$\n Раз пошли на дело я и Рабинович. Рабинович выпить захотел. Эх, Рабинович !\
$\r$\n                                          используя различные ключи"

StrCpy $0 "Раз пошли на дело я и Рабинович. Рабинович выпить захотел. Эх, Рабинович !"

MessageBox MB_OK 'Например, оставим всё, что находится СЛЕВА от слова "Рабинович". Искать будем с НАЧАЛА строки\
$\r$\n                                                          Для этого устанавливаем :\
$\r$\n SubString: "Рабинович"\
$\r$\n SearchDirection: ">"\
$\r$\n StrInclusionDirection: "<"'

${StrStrAdv} $1 "$0" "Рабинович" ">" "<" "0" "0" "0"

MessageBox MB_OK "Получаем в переменной :\
$\r$\n            $1"

MessageBox MB_OK 'Ищем "Рабинович" 2 раза с НАЧАЛА. (Т.е. пропускаем, оставляем 2х Рабиновичей)\
$\r$\n                                                  "Loops" установим "2"'

${StrStrAdv} $2 "$0" "Рабинович" ">" "<" "0" "2" "0"

MessageBox MB_OK "Получаем в переменной :\
$\r$\n            $2"

MessageBox MB_OK 'Снова, оставим всё, что находится СЛЕВА от слова "Рабинович". Но искать  будем с КОНЦА строки\
$\r$\n                                                              Для этого устанавливаем :\
$\r$\n SubString: "Рабинович"\
$\r$\n SearchDirection: "<"  (сменили направление поиска)\
$\r$\n StrInclusionDirection: "<"'

${StrStrAdv} $3 "$0" "Рабинович" "<" "<" "0" "0" "0"

MessageBox MB_OK "Получаем в переменной :\
$\r$\n            $3"

MessageBox MB_OK 'Ищем "Рабинович" с КОНЦА 2 раза. Т.е. "Loops" установим "2"'

${StrStrAdv} $4 "$0" "Рабинович" "<" "<" "0" "2" "0"

MessageBox MB_OK "Получаем в переменной :\
$\r$\n            $4"
SectionEnd

От значения IncludeSubString - 0 или 1 , зависит, будет ли SubString (это то, указанное в строке слово(сочетание), "от которго пляшем" - слева или справа от которого оставляем нужное нам) добавлено к результирующему значению.
******************
(По этому же принципу работает и ${StrStr}, только с ограничением - оставляется только то, что находится справа от SubString плюс сам SubString . ${StrStr} "ResultVar" "String" "SubString")
${StrStrAdv} - это ${StrStr} Advanced
******************
Значение "CaseSensitive" - 0 или 1 - учитывать регистр или нет.

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

wolkow70 10-04-2012 17:59 1897117

Товарищи, как прописать в скрипте команду на запись параметра: ?

Opera.HTML тип параметра REG_NONE

Экспорт в рег-файл дает:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.htm\OpenWithProgIDs]
"Opera.HTML"=hex(0):

Первый раз с таким сталкиваюсь....

MKN 10-04-2012 18:06 1897120

wolkow70,
Это умеет Registry plug-in http://nsis.sourceforge.net/Registry_plug-in

wolkow70 10-04-2012 18:20 1897129

Так правильно будет?

${registry::Write} "HKLM "SOFTWARE\Classes\.htm\OpenWithProgIDs" "Opera.HTML" "" "REG_NONE"

MKN 10-04-2012 18:28 1897137

wolkow70,
где то так :
Код:

!include "Registry.nsh"

Section
${registry::Write} "HKLM\SOFTWARE\Classes\.htm\OpenWithProgIDs" "Opera.HTML" "" "REG_NONE" $R0
SectionEnd


K.A.V. 10-04-2012 18:32 1897139

wolkow70
Справочник по NSIS => Описания плагинов => Registry: Работа с реестром

wolkow70 10-04-2012 18:33 1897143

${registry::Write} "HKLM "SOFTWARE\Classes\.htm\OpenWithProgIDs" "Opera.HTML" "" "REG_NONE" $R0


!insertmacro: macro "registry::Write" requires 5 parameter(s), passed 6!

K.A.V. 10-04-2012 18:38 1897146

wolkow70, смысл того, что вы здесь спрашиваете, вы ответ от MKN выше прочитали вообще??

Цитата:

Цитата MKN
${registry::Write} "HKLM\SOFTWARE\Classes\.htm\OpenWithProgIDs" »

а у вас...
Цитата:

Цитата wolkow70
${registry::Write} "HKLM "SOFTWARE\Classes\.htm\OpenWithProgIDs" »


wolkow70 11-04-2012 13:16 1897593

Товарищи, реально ли средствами NSIS в файле opera_install_log.xml все пути C:\Program Files\Opera поменять на путь прописанный в $INSTDIR или нет?

K.A.V. 11-04-2012 13:27 1897603

Цитата:

Цитата wolkow70
Товарищи, рельно ли средствами NSIS в файле opera_install_log.xml все пути C:\Program Files\Opera поменять на путь прописанный в $INSTDIR или нет? »

Реально :yes:

MKN 11-04-2012 13:30 1897608

Возвращаясь к вышеразбираемому вопросу с определением Provider=* в длинющей строке :

Можно и так :
Код:

Section

;Provider= может находится и в начале
;StrCpy $0 "Provider=SQLOLEDB;Data Source=W2K3SP2\SQLEXPRESS;Initial Catalog=user_db;Persist Security Info=True;User ID=user;Password=user;"

; и  в середине строки

StrCpy $0 "Data Source=W2K3SP2\SQLEXPRESS;Initial Catalog=user_db;Provider=SQLOLEDB;Persist Security Info=True;User ID=user;Password=user;"

${WordFind2X} "$0" "Provider=" ";" "+1" $1

MessageBox MB_OK "$1" 
; В $1 будет SQLOLEDB

SectionEnd

Для сокращения кода строку можно и не заносить в переменную... Хотя может это и дурной тон... :)

wolkow70 11-04-2012 13:44 1897620

Цитата:

Цитата K.A.V.
Реально »

Обнадеживает. Где можно почитать на счет этого. Это же не простой текстовый файл, а .xml ?

kotkovets 11-04-2012 14:09 1897640

wolkow70, в шапке пример парсинга xml
или макросами Word* в папке примеров - большая куча примеров.

K.A.V. 11-04-2012 14:16 1897642

Цитата:

Цитата wolkow70
Обнадеживает »

Как спросили, так и ответил :biggrin:

Цитата:

Цитата wolkow70
Это же не простой текстовый файл, а .xml ? »

Откройте его блокнотом - обычный текстовый файл со множеством строк

Кстати я хотел добавить в справочник пример данного кода (недавно реализовывал для одного проекта)
Чуть причесал и вот сюда выкладываю

Скрипт построчно читает в текстовом файле строки и заменяет определённый текст в строке на ваш
читать дальше »

В начале кода:
Код:

!include "StrFunc.nsh"
!include "WinMessages.nsh"
${StrRep}

Функция поиска и замены фразы в текстовом файле
Код:

Function ReplaceLinesInFile
  Banner::show /NOUNLOAD ""
  Banner::getWindow /NOUNLOAD
        Pop $1
    GetDlgItem $2 $1 1030
; Создаём баннер, чтобы видеть прогресс (для наглядности)

Var /Global _FindInFile ; В эту переменную поместим полный путь к файлу, в котором будем производить замену
Var /Global _LineReplace ; В эту переменную поместим строку, которую будем искать и заменять
Var /Global _LineToInsert ; В эту переменную поместим строку, НА которую мы будем заменять искомую строку
Var /Global _CurLineNumber ; В этой переменной храним номер обрабатываемой строки
Var /Global _CurLine ; В этой переменной храним строку, с которой в данный момент сверяем
Var /Global _LineNumbers ; В этой переменной храним количество строк в искомом файле

StrCpy $_FindInFile '$EXEDIR\opera_install_log.xml' ; Заменяем строки в этом файле
StrCpy $_LineReplace 'C:\Program Files\Opera' ; Ищем и заменяем ЭТУ строку
StrCpy $_LineToInsert '$EXEDIR' ; На что будем заменять

${LineSum} "$_FindInFile" $_LineNumbers ; Подсчитываем количество строк
strcpy $_CurLineNumber 0
startLineRead:
intop $_CurLineNumber $_CurLineNumber + 1

    SendMessage $2 ${WM_SETTEXT} 0 "STR:Обработка строки $_CurLineNumber [Всего: $_LineNumbers]" ; Смотрим прогресс обработки строк =)

IntCmp $_CurLineNumber $_LineNumbers 0 0 endFunc ; Если номер текущей строки больше количества строк в файле - поиск завершен

${LineRead} "$_FindInFile" "$_CurLineNumber" $_CurLine ; Читаем строку по номеру текущей строки
${WordFind} '$_CurLine' "$_LineReplace" "E+1{" $R0 ; Ищем в строке нужный текст

StrCmp $R0 "1" startLineRead 0 ; Если в строке присутствует искомый текст, выполняем код ниже
${LineFind} "$_FindInFile" "" "" "Insert_Line" ; Вызываем функцию Insert_Line, которая произведёт замену
goto startLineRead
endFunc:

  Banner::destroy ; Уничтожаем баннер
FunctionEnd


Function Insert_Line
StrCmp $R8 "$_CurLineNumber" 0 push
        ${StrRep} $_CurLine "$_CurLine" "$_LineReplace" "$_LineToInsert"
        FileWrite $R4 "$_CurLine"
        StrCpy $0 SkipWrite
        push:
        Push $0
FunctionEnd


wolkow70 11-04-2012 14:31 1897661

Цитата:

Цитата kotkovets
wolkow70, в шапке пример парсинга xml
или макросами Word* в папке примеров - большая куча примеров. »


Примерно так, да?

!include "XML.nsh"

SetOutPath "$INSTDIR"
${xml::LoadFile} "$INSTDIR\opera_install_log.xml" $0
${xml::GotoPath} "C:\Program Files\Opera" $0
${xml::SetAttribute} "pathPrefix" "$INSTDIR\" $0
${xml::SaveFile} "" $0
${xml::Unload}

DruOleg 11-04-2012 16:07 1897726

Спасибо все за рецепты, сделал так:)
Код:

;Тип СУБД
StrCpy $DB_type "$connect_string" ;присваиваем строку подключения
${WordFind} "$DB_type" ";" "+1" "$3" ;получаем подстроку до первого символа ' ; '
Strlen $1 "Provider="                  ;вычисляем длину отсекаемой части
StrCpy $DB_type "$3" "" $1                  ;отсекаем

;Сервер БД
StrCpy $DB_server "$connect_string" ;присваиваем строку подключения
${WordFind} "$DB_server" ";" "+2" "$3" ;получаем подстроку до первого символа ' ; '
Strlen $1 "Data Source="                  ;вычисляем длину отсекаемой части
StrCpy $DB_server "$3" "" $1                  ;отсекаем

;Имя БД
StrCpy $DB_name "$connect_string" ;присваиваем строку подключения
${WordFind} "$DB_name" ";" "+3" "$3" ;получаем подстроку до первого символа ' ; '
Strlen $1 "Initial Catalog="                  ;вычисляем длину отсекаемой части
StrCpy $DB_name "$3" "" $1                  ;отсекаем

;Логин пользователя БД
StrCpy $DB_user "$connect_string" ;присваиваем строку подключения
${WordFind} "$DB_user" ";" "+5" "$3" ;получаем подстроку до первого символа ' ; '
Strlen $1 "User ID="                  ;вычисляем длину отсекаемой части
StrCpy $DB_user "$3" "" $1                  ;отсекаем

;Пароль пользователя БД
StrCpy $DB_password "$connect_string" ;присваиваем строку подключения
${WordFind} "$DB_password" ";" "+6" "$3" ;получаем подстроку до первого символа ' ; '
Strlen $1 "Password="                  ;вычисляем длину отсекаемой части
StrCpy $DB_password "$3" "" $1                  ;отсекаем

;Определяем тип СУБД: MS SQL или Firebird
${If} $DB_type == "SQLOLEDB"
  StrCpy $DB_type "MS SQL"
  ExecWait "sqlcmd.exe -S $DB_server -d $DB_name -U $DB_user -P $DB_password -i get_version.sql"
${ElseIf} $DB_type == "LCPI.IBProvider"
  StrCpy $DB_type "Firebird"
${Else}
  MessageBox MB_OK "Не удалось определить тип СУБД!!!"
  ;Abort
${EndIf}

Хотел еще спросить как присвоить значение переменной:
ExecWait "sqlcmd.exe -S $DB_server -d $DB_name -U $DB_user -P $DB_password -i get_version.sql"

Запрос:
SELECT REV FROM VERSN - возвращает обычное число... Его и нужно сравнить с числом 14525.

wolkow70 11-04-2012 16:29 1897749

K.A.V.,
Попробовал применить приведенную вами функцию. Все работает.

Возникло два вопроса:

1. Если нужно заменить еще значение - назначать новую функцию?
2. Что закомментировать, что бы не было баннера в режиме тихой установки?

K.A.V. 11-04-2012 16:56 1897767

wolkow70, сделайте так:

В начале кода
Код:

Var _FindInFile ; В эту переменную поместим полный путь к файлу, в котором будем производить замену
Var _LineReplace ; В эту переменную поместим строку, которую будем искать и заменять
Var _LineToInsert ; В эту переменную поместим строку, НА которую мы будем заменять искомую строку
Var _CurLineNumber ; В этой переменной храним номер обрабатываемой строки
Var _CurLine ; В этой переменной храним строку, с которой в данный момент сверяем
Var _LineNumbers ; В этой переменной храним количество строк в искомом файле

!include "StrFunc.nsh"
${StrRep}


В любой секции или функции вызываем функцию сколько угодно раз, только перед новой заменой, если данные отличаются (в каком файле и что заменить) назначайте переменным новые значения
Код:


Section /o "Моя секция"
StrCpy $_FindInFile '$EXEDIR\opera_install_log.xml' ; Заменяем строки в этом файле
StrCpy $_LineReplace 'C:\Program Files\Opera' ; Ищем и заменяем ЭТУ строку
StrCpy $_LineToInsert '$EXEDIR' ; На что будем заменять
call ReplaceLinesInFile
SectionEnd

Function ReplaceLinesInFile
${LineSum} "$_FindInFile" $_LineNumbers ; Подсчитываем количество строк
strcpy $_CurLineNumber 0
startLineRead:
intop $_CurLineNumber $_CurLineNumber + 1
IntCmp $_CurLineNumber $_LineNumbers 0 0 endFunc ; Если номер текущей строки больше количества строк в файле - поиск завершен
${LineRead} "$_FindInFile" "$_CurLineNumber" $_CurLine ; Читаем строку по номеру текущей строки
${WordFind} '$_CurLine' "$_LineReplace" "E+1{" $R0 ; Ищем в строке нужный текст
StrCmp $R0 "1" startLineRead 0 ; Если в строке присутствует искомый текст, выполняем код ниже
${LineFind} "$_FindInFile" "" "" "Insert_Line" ; Вызываем функцию Insert_Line, которая произведёт замену
goto startLineRead
endFunc:
FunctionEnd

Function Insert_Line
StrCmp $R8 "$_CurLineNumber" 0 push
        ${StrRep} $_CurLine "$_CurLine" "$_LineReplace" "$_LineToInsert"
        FileWrite $R4 "$_CurLine"
        StrCpy $0 SkipWrite
        push:
        Push $0
FunctionEnd


MKN 11-04-2012 18:15 1897806

Напомните пожалуйста, каким образом средствами NSIS манипулировать (удалять, заменять, разрегистрировать) "занятые" системой файлы и ключи реестра.
Например, надо разрегистрировать и удалить файлы Adobe Acrobat Reader_а (надо подчистить "хвосты" после неудачного удаления ПО, перед последующей установкой. Такое часто необходимо.) :

\Program Files\Common Files\Adobe\Acrobat\ActiveX\AcroIEHelper.dll и удалить записи его ключей в реестре и др. подобные файлы...
"классически" разрегистрировать и удалить этот файл не возможно...
(Куча ручных действий с выставлением прав - ессно не годится.)

Помнится был способ с назначением системных прав с полным доступом к файлу и рестартом оболочек (Эксплорера или Тотала) Не нахожу никак эту инфу... Желательно без сторонних средств (в смысле, без доп. утилит и дремучих досовских команд). Интересует способ для любых версий ОС.

kotkovets, наверняка решил бы эту проблему средствами API... :)

DruOleg 11-04-2012 19:01 1897825

Помогите, пожалуйста, с запросом к БД.
Нужно сделать запрос к 2 БД: Firebird 2.1 и MS SQL 2005 и выше.
Почти готов инсталлятор, осталось лишь сделать запрос и сравнить результат с числом...

kotkovets 12-04-2012 01:17 1898004

Цитата:

Цитата MKN
Напомните пожалуйста, каким образом средствами NSIS манипулировать (удалять, заменять, разрегистрировать) "занятые" системой файлы и ключи реестра. »

если файл не удаляется, то пишем команду:
Код:

Delete /Rebootok "File"
этот флаг заставит файл удалится при следущей перезагрузке.
Цитата:

Цитата MKN
Желательно без сторонних средств (в смысле, без доп. утилит и дремучих досовских команд). Интересует способ для любых версий ОС. »

можно удалить файл, но не всегда!, если перезагрузить проводник, а точнее правильнее будет,
УЗНАТЬ какой процесс держит файл и грохать процесс.
читай в справке: » Работа с процессами с помощью NSIS

wolkow70 12-04-2012 06:04 1898030

Цитата:

Цитата MKN
Напомните пожалуйста, каким образом средствами NSIS манипулировать (удалять, заменять, разрегистрировать) "занятые" системой файлы и ключи реестра. »

Так делаю :

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

ExecWait 'taskkill /F /IM explorer.exe' $0
DetailPrint "taskkill exit: [ $0 ]"
Sleep 500
StrCmp $0 0 0 +2
Exec "explorer.exe"

Delete "$INSTDIR\menu.dll"

${If} ${FileExists} "$INSTDIR\menu.dll"
Delete /REBOOTOK "$INSTDIR\menu.dll"
SetRebootFlag true
${Else}
SetRebootFlag false
${EndIf}

MKN 12-04-2012 09:11 1898085

kotkovets, wolkow70,
Вы наверное, не так меня поняли или я не точно выразился...

То что вы сказали , зто понятные рядовые ситуации.

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

Интересует , что можно предпринять в таких случаях средствами NSIS ?
Т.е. каким образом организовать назначение системных прав и полного доступа к файлу и ключу реестра, при чём без сторонних утилит (типа Cacls.exe , SubInACL.exe и т.п. )
Почему я и помянул API, т.к. видел инфу как раз по этому поводу с упоминание MoveFileEx с флагом MOVEFILE_DELAY_UNTIL_REBOOT
Только я в API ни черта не понимаю.

kotkovets 12-04-2012 11:00 1898156

Цитата:

Цитата MKN
Почему я и помянул API, т.к. видел инфу как раз по этому поводу с упоминание MoveFileEx с флагом MOVEFILE_DELAY_UNTIL_REBOOT »

это тоже самое, что:
Код:

Delete /Rebootok "File"
или
Rename /Rebootok "File"  "New_File"

Цитата:

Если параметр dwFlags устанавливает MOVEFILE_DELAY_UNTIL_REBOOT, параметр lpNewFileName - ПУСТО (NULL), функция MoveFileEx регистрирует файл параметра lpExistingFileName для удаления, когда система перезагружается. Если параметр lpExistingFileName относится к каталогу, система удаляет при перезагрузке каталог, только в том случае, если каталог пуст
http://www.vsokovikov.narod.ru/New_M...movefileex.htm

wolkow70 12-04-2012 11:07 1898161

Товарищи, не пойму почему

IntOp $0 ${SF_SELECTED} | ${SF_RO}
SectionSetFlags ${Install} $0

ТАК РАБОТАЕТ!

IntOp $0 ${SF_SELECTED} | ${SF_RO} | ${SF_BOLD}
SectionSetFlags ${Install} $0

ТАК НЕ РАБОТАЕТ!

MKN 12-04-2012 11:12 1898165

kotkovets,
Так как быть то с удалением таких файлов и ключей реестра ?
Delete /Rebootok "File" - файл не удаляет. Что делать с ключами - не ясно...

wolkow70 12-04-2012 11:12 1898166

Еще такую задачку не знаю как проще решить:

InstallDir "$PROGRAMFILES\${PRODUCT_NAME}"

Если директория установки не отличается от C:\Program Files\Opera прописанной в файле opera_install_log.xml то менять значение в файле не нужно, если директория установки выбрана другая, то вызвать функцию Call ReplaceLinesInFile. То есть тут проверка нужна не только на $PROGRAMFILES\${PRODUCT_NAME} , но и с учетом буквы диска.

MKN

В этом разделе не пробовали удалять предварительно ключи?

DeleteRegValue HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\SharedDlls" "$SYSDIR\px.dll"

wolkow70 12-04-2012 11:28 1898175

Цитата:

Цитата MKN
Так как быть то с удалением таких файлов и ключей реестра ? »

Попробуйте еще Library.nsh

!include "Library.nsh"

Код:

Name "Library Test"
OutFile "Library Test.exe"

InstallDir "$TEMP\Library Test"

Page directory
Page instfiles

XPStyle on

RequestExecutionLevel user

!define TestDLL '"${NSISDIR}\Plugins\LangDLL.dll"'
!define TestEXE '"${NSISDIR}\Contrib\UIs\default.exe"'

Section

!insertmacro InstallLib DLL      NOTSHARED REBOOT_PROTECTED      ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib DLL      NOTSHARED NOREBOOT_PROTECTED    ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib DLL      NOTSHARED REBOOT_NOTPROTECTED  ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib DLL      NOTSHARED NOREBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR

!insertmacro InstallLib REGDLL    NOTSHARED REBOOT_PROTECTED      ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib REGDLL    NOTSHARED NOREBOOT_PROTECTED    ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib REGDLL    NOTSHARED REBOOT_NOTPROTECTED  ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib REGDLL    NOTSHARED NOREBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR

!insertmacro InstallLib TLB      NOTSHARED REBOOT_PROTECTED      ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib TLB      NOTSHARED NOREBOOT_PROTECTED    ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib TLB      NOTSHARED REBOOT_NOTPROTECTED  ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib TLB      NOTSHARED NOREBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR

!insertmacro InstallLib REGDLLTLB NOTSHARED REBOOT_PROTECTED      ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib REGDLLTLB NOTSHARED NOREBOOT_PROTECTED    ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib REGDLLTLB NOTSHARED REBOOT_NOTPROTECTED  ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib REGDLLTLB NOTSHARED NOREBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR

!insertmacro InstallLib DLL      $0        REBOOT_PROTECTED      ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib DLL      $0        NOREBOOT_PROTECTED    ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib DLL      $0        REBOOT_NOTPROTECTED  ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib DLL      $0        NOREBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR

!insertmacro InstallLib REGDLL    $0        REBOOT_PROTECTED      ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib REGDLL    $0        NOREBOOT_PROTECTED    ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib REGDLL    $0        REBOOT_NOTPROTECTED  ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib REGDLL    $0        NOREBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR

!insertmacro InstallLib TLB      $0        REBOOT_PROTECTED      ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib TLB      $0        NOREBOOT_PROTECTED    ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib TLB      $0        REBOOT_NOTPROTECTED  ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib TLB      $0        NOREBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR

!insertmacro InstallLib REGDLLTLB $0        REBOOT_PROTECTED      ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib REGDLLTLB $0        NOREBOOT_PROTECTED    ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib REGDLLTLB $0        REBOOT_NOTPROTECTED  ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib REGDLLTLB $0        NOREBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR

!insertmacro InstallLib REGEXE    $0        REBOOT_PROTECTED      ${TestEXE} $INSTDIR\test.exe $INSTDIR
!insertmacro InstallLib REGEXE    $0        NOREBOOT_PROTECTED    ${TestEXE} $INSTDIR\test.exe $INSTDIR
!insertmacro InstallLib REGEXE    $0        REBOOT_NOTPROTECTED  ${TestEXE} $INSTDIR\test.exe $INSTDIR
!insertmacro InstallLib REGEXE    $0        NOREBOOT_NOTPROTECTED ${TestEXE} $INSTDIR\test.exe $INSTDIR

WriteUninstaller $INSTDIR\uninstall.exe

SectionEnd

Section uninstall

!insertmacro UninstallLib DLL      NOTSHARED NOREMOVE              $INSTDIR\test.dll
!insertmacro UninstallLib DLL      NOTSHARED REBOOT_PROTECTED      $INSTDIR\test.dll
!insertmacro UninstallLib DLL      NOTSHARED NOREBOOT_PROTECTED    $INSTDIR\test.dll
!insertmacro UninstallLib DLL      NOTSHARED REBOOT_NOTPROTECTED    $INSTDIR\test.dll
!insertmacro UninstallLib DLL      NOTSHARED NOREBOOT_NOTPROTECTED  $INSTDIR\test.dll

!insertmacro UninstallLib REGDLL    NOTSHARED NOREMOVE              $INSTDIR\test.dll
!insertmacro UninstallLib REGDLL    NOTSHARED REBOOT_PROTECTED      $INSTDIR\test.dll
!insertmacro UninstallLib REGDLL    NOTSHARED NOREBOOT_PROTECTED    $INSTDIR\test.dll
!insertmacro UninstallLib REGDLL    NOTSHARED REBOOT_NOTPROTECTED    $INSTDIR\test.dll
!insertmacro UninstallLib REGDLL    NOTSHARED NOREBOOT_NOTPROTECTED  $INSTDIR\test.dll

!insertmacro UninstallLib TLB      NOTSHARED NOREMOVE              $INSTDIR\test.dll
!insertmacro UninstallLib TLB      NOTSHARED REBOOT_PROTECTED      $INSTDIR\test.dll
!insertmacro UninstallLib TLB      NOTSHARED NOREBOOT_PROTECTED    $INSTDIR\test.dll
!insertmacro UninstallLib TLB      NOTSHARED REBOOT_NOTPROTECTED    $INSTDIR\test.dll
!insertmacro UninstallLib TLB      NOTSHARED NOREBOOT_NOTPROTECTED  $INSTDIR\test.dll

!insertmacro UninstallLib REGDLLTLB NOTSHARED NOREMOVE              $INSTDIR\test.dll
!insertmacro UninstallLib REGDLLTLB NOTSHARED REBOOT_PROTECTED      $INSTDIR\test.dll
!insertmacro UninstallLib REGDLLTLB NOTSHARED NOREBOOT_PROTECTED    $INSTDIR\test.dll
!insertmacro UninstallLib REGDLLTLB NOTSHARED REBOOT_NOTPROTECTED    $INSTDIR\test.dll
!insertmacro UninstallLib REGDLLTLB NOTSHARED NOREBOOT_NOTPROTECTED  $INSTDIR\test.dll

!insertmacro UninstallLib DLL      SHARED    NOREMOVE              $INSTDIR\test.dll
!insertmacro UninstallLib DLL      SHARED    REBOOT_PROTECTED      $INSTDIR\test.dll
!insertmacro UninstallLib DLL      SHARED    NOREBOOT_PROTECTED    $INSTDIR\test.dll
!insertmacro UninstallLib DLL      SHARED    REBOOT_NOTPROTECTED    $INSTDIR\test.dll
!insertmacro UninstallLib DLL      SHARED    NOREBOOT_NOTPROTECTED  $INSTDIR\test.dll

!insertmacro UninstallLib REGDLL    SHARED    NOREMOVE              $INSTDIR\test.dll
!insertmacro UninstallLib REGDLL    SHARED    REBOOT_PROTECTED      $INSTDIR\test.dll
!insertmacro UninstallLib REGDLL    SHARED    NOREBOOT_PROTECTED    $INSTDIR\test.dll
!insertmacro UninstallLib REGDLL    SHARED    REBOOT_NOTPROTECTED    $INSTDIR\test.dll
!insertmacro UninstallLib REGDLL    SHARED    NOREBOOT_NOTPROTECTED  $INSTDIR\test.dll

!insertmacro UninstallLib TLB      SHARED    NOREMOVE              $INSTDIR\test.dll
!insertmacro UninstallLib TLB      SHARED    REBOOT_PROTECTED      $INSTDIR\test.dll
!insertmacro UninstallLib TLB      SHARED    NOREBOOT_PROTECTED    $INSTDIR\test.dll
!insertmacro UninstallLib TLB      SHARED    REBOOT_NOTPROTECTED    $INSTDIR\test.dll
!insertmacro UninstallLib TLB      SHARED    NOREBOOT_NOTPROTECTED  $INSTDIR\test.dll

!insertmacro UninstallLib REGDLLTLB SHARED    NOREMOVE              $INSTDIR\test.dll
!insertmacro UninstallLib REGDLLTLB SHARED    REBOOT_PROTECTED      $INSTDIR\test.dll
!insertmacro UninstallLib REGDLLTLB SHARED    NOREBOOT_PROTECTED    $INSTDIR\test.dll
!insertmacro UninstallLib REGDLLTLB SHARED    REBOOT_NOTPROTECTED    $INSTDIR\test.dll
!insertmacro UninstallLib REGDLLTLB SHARED    NOREBOOT_NOTPROTECTED  $INSTDIR\test.dll

!insertmacro UninstallLib REGEXE    SHARED    NOREMOVE              $INSTDIR\test.exe
!insertmacro UninstallLib REGEXE    SHARED    REBOOT_PROTECTED      $INSTDIR\test.exe
!insertmacro UninstallLib REGEXE    SHARED    NOREBOOT_PROTECTED    $INSTDIR\test.exe
!insertmacro UninstallLib REGEXE    SHARED    REBOOT_NOTPROTECTED    $INSTDIR\test.exe
!insertmacro UninstallLib REGEXE    SHARED    NOREBOOT_NOTPROTECTED  $INSTDIR\test.exe

SectionEnd


MKN 12-04-2012 11:33 1898177

wolkow70,
Без прав и доступа к файлу - ничего не сделать. Об этом и речь.

kotkovets 12-04-2012 11:33 1898178

wolkow70, складывать флаги нужно:
Код:

  intop $R0 ${SF_RO} + ${SF_BOLD}
  intop $R0 $R0 + ${SF_SELECTED}
  SectionSetFlags ${Install} "$R0"

или так:
Код:

intop $R0 ${SF_RO} | ${SF_BOLD}
  intop $R0 $R0 | ${SF_SELECTED}
  SectionSetFlags ${Install} "$R0"

Цитата:

Цитата MKN
Без прав и доступа к файлу - ничего не сделать. Об этом и речь. »

http://forum.oszone.net/showpost.php?p=1128494

MKN 12-04-2012 11:51 1898192

kotkovets,
Это я знаю. Но это командная громозда с cmd.exe и т.д. , которой хотелось бы избежать. Неужели нет иных способов ?

kotkovets 12-04-2012 12:21 1898210

Цитата:

Цитата MKN
Это я знаю. Но это командная громозда с cmd.exe и т.д. , которой хотелось бы избежать. Неужели нет иных способов ? »

причем здесь cmd? когда takeown, или nsExec - все скрытно
а че такие вопросы задаешь, думай как - вот тебе подсказка,
где можно при следущей перезагрузке прописать, что угодно
http://forum.oszone.net/post-1795270-1898.html

MKN 12-04-2012 12:46 1898221

kotkovets,
takeown.exe - в XP нет, уже не удобство..
в RunOnce я команду удаления тоже прописывал - никакого эффекта...

wolkow70 12-04-2012 12:54 1898229

Над своей задачкой подумал и набросал так:

!include "FileFunc.nsh"
${GetRoot}

InstallDir "$PROGRAMFILES\${PRODUCT_NAME}"

Section "${PRODUCT_NAME} (установка программы)" Install
;
StrCmp $INSTDIR "$PROGRAMFILES\${PRODUCT_NAME}" CheckDisc ParsingXML
CheckDisc:
${GetRoot} "$PROGRAMFILES\${PRODUCT_NAME}" $R0
StrCmp $R0 "C:" NoParsing ParsingXML
ParsingXML:
StrCpy $_FindInFile '$INSTDIR\opera_install_log.xml' ; Заменяем строки в этом файле
StrCpy $_LineReplace 'C:\Program Files\Opera' ; Ищем и заменяем ЭТУ строку
StrCpy $_LineToInsert '$INSTDIR' ; На что будем заменять
Call ReplaceLinesInFile
NoParsing:
SectionEnd

kotkovets 12-04-2012 13:25 1898240

wolkow70, а вы мастер! с завидной упертостью наступать на одни и те же грабли с метками :)
Код:

StrCmp $INSTDIR "$PROGRAMFILES\${PRODUCT_NAME}" 0 ParsingXML
 ${GetRoot} "$PROGRAMFILES\${PRODUCT_NAME}" $R0
 StrCmp $R0 "C:" NoParsing 0
 ParsingXML:
 StrCpy $_FindInFile '$INSTDIR\opera_install_log.xml'
 StrCpy $_LineReplace 'C:\Program Files\Opera'
 StrCpy $_LineToInsert '$INSTDIR'
 Call ReplaceLinesInFile
 NoParsing:

а вот почему диск C: ?, а вот у меня системный диск D: - где папка с программами
Код:

StrCmp $R0 "C:" NoParsing 0
и че тут вытекает, если я на диск С: ставлю - то не парсится, а у меня системный диск D...
какой то киноляп....

wolkow70 12-04-2012 13:48 1898251

Цитата:

Цитата kotkovets
наступать на одни и те же грабли с метками »

Почему грабли? Просто вместо 0 применяю безусловную метку, все же работает :).
Ну сомневаюсь я , что можно в StrCmp ставить рядом условные и безусловные метки. По моему или то или другое (поскольку в справке нет иных примеров).
Вы мне подскажите такую весчь:
ReadRegStr $R6 HKLM "SOFTWARE\Classes\Applications\Opera.exe\shell\open\command" ""

получаем "C:\Program Files\Opera\Opera.exe" "%1"

далее

${GetParent} "$R6" "$R7"

получаем "C:\Program Files\Opera

RMDir /r "$R7"

Папка не удаляется. Потому, что кавычки не закрыты. Надо из этого ключа взять папку установки для удаления при переустановке.

kotkovets 12-04-2012 14:11 1898265

Цитата:

Цитата wolkow70
Ну сомневаюсь я , что можно в StrCmp ставить рядом условные и безусловные метки. »

:) вы читайте до раз 50 про условные метки и безусловные, там четко прописано
Определяя метки для различных команд, помните, что 0 или пустое значение, означает переход к следующей команде.
Цитата:

Цитата wolkow70
получаем "C:\Program Files\Opera »

то как Вы удалите, если у вас лишний символ? ну так избавьтесь от лишнего первого символа командой StrCpy - в справке

wolkow70 12-04-2012 14:51 1898289

Цитата:

Цитата kotkovets
избавьтесь от лишнего первого символа командой StrCpy - в справке »

Так сделал:

Push $R6
Push $R7
Push $R8
ReadRegStr $R6 HKLM "SOFTWARE\Classes\Applications\Opera.exe\shell\open\command" ""
${GetParent} "$R6" "$R7"
StrCpy $R8 "$R7" "" 1
RMDir /r "$R8"
Pop $R8
Pop $R7
Pop $R6

Цитата:

Цитата kotkovets
если я на диск С: ставлю - то не парсится »

А зачем ему парсится если C:\Program Files\Opera есть в эталонном файле, и там около 2000 строк. Долго парсится. Поэтому парсится только во всех остальных случаях.
Мне не совсем ясно из каких соображений можно имея системный диск D; ставить программу в C:\Program Files\

kotkovets 12-04-2012 15:15 1898304

wolkow70, проще и эффективнее и главное удаляет любой указанный символ,
в начале и в конце строки - независимо от количества символов
Код:

ReadRegStr `$R6` HKLM "SOFTWARE\Classes\Applications\Opera.exe\shell\open\command" ""
${GetParent} `$R6` `$R6`
System::Call 'shlwapi::StrTrim(tR6R6, t""")'
MessageBox MB_OK "$R6" IDOK

Цитата:

Цитата wolkow70
Мне не совсем ясно из каких соображений можно имея системный диск D; ставить программу в C:\Program Files\ »

вот и вы подумайте, то парсить нужно, если ставиться не в системные папки ($PROGRAMFILES)
а у вас тупо диск С поставлен. то будет при другом раскладе ставлю прогу на диск С в любую папку - не парсится.
ставлю в другой системный раздел отличным от диска С, то парсится.... смысл ????

wolkow70 12-04-2012 16:21 1898343

Цитата:

Цитата kotkovets
то парсить нужно, если ставиться не в системные папки ($PROGRAMFILES) »

Или в системные ($PROGRAMFILES), но расположенные на диске отличном от С: , поскольку в эталонном фале указан абсолютный путь C:\Program Files\Opera для файлов и ключей реестра и он прописывается оригинальным инсталлятором. Хотя можно сделать оригинальную установку с другим путем и использовать другой файл как эталонный.
Цитата:

Цитата kotkovets
ставлю прогу на диск С в любую папку - не парсится »

Как раз парсится. На парсится только при полном совпадении $INSTDIR c C:\Program Files\Opera.
Поэтому проверяется как переменная пути установки , так и буква диска.
Цитата:

Цитата kotkovets
смысл ???? »

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

MKN 13-04-2012 11:48 1898774

${StrSort}

${StrSort} "ResultVar" "String" "LeftMarkerSubString" "SubString" "RightMarkerSubString" "IncludeLeftMarkerSubString" "IncludeSubString" \
"IncludeRightMarkerSubString"


В зависимости от выбора установки "SubString" и маркеров "LeftMarkerSubString" и "RightMarkerSubString" - будет "тасоваться" содержимое строки

Характерные примеры использования :

Код:

!include "StrFunc.nsh"
${StrSort}

Name "StrSort"
OutFile "StrSort.exe"

;${StrSort} "ResultVar" "String" "LeftMarkerSubString" "SubString" "RightMarkerSubString" "IncludeLeftMarkerSubString" "IncludeSubString" "IncludeRightMarkerSubString"

Section

MessageBox MB_OK "                      Преобразуем строку:\
$\r$\nПрилетит вдруг волшебник в голубом вертолёте\
$\r$\n        используя различные ключи-параметры"

StrCpy $0 "Прилетит вдруг волшебник в голубом вертолёте"

MessageBox MB_OK 'Исключим из строки слово - "волшебник". \
$\r$\nДля этого устанавливаем :\
$\r$\n"String" "" "волшебник" "" "0" "0" "0"'

${StrSort} $1 "$0" "" "волшебник" "" "0" "0" "0"
MessageBox MB_OK "Получаем в переменной : $1"

MessageBox MB_OK 'Оставляем в строки всё, что находится слева-направо ПЕРЕД словом "волшебник". \
$\r$\nДля этого устанавливаем :\
$\r$\n"String" "" "" "волшебник" "0" "0" "0"'

${StrSort} $2 "$0" "" "" "волшебник" "0" "0" "0"
MessageBox MB_OK "Получаем в переменной : $2"

MessageBox MB_OK 'Оставляем в строки всё, что находится ЗА словом "волшебник" . \
$\r$\nДля этого устанавливаем :\
$\r$\n"String" "вдруг" "волшебник" "" "0" "0" "0"'

${StrSort} $3 "$0" "вдруг" "волшебник" "" "0" "0" "0"
MessageBox MB_OK "Получаем в переменной : $3"

MessageBox MB_OK 'Оставляем в строки всё, что находится ЗА словом "волшебник" + слово "волшебник" . \
$\r$\nДля этого устанавливаем :\
$\r$\n"String" "вдруг" "волшебник" "" "1" "1" "0"'

${StrSort} $3 "$0" "вдруг" "волшебник" "" "0" "1" "0"
MessageBox MB_OK "Получаем в переменной : $3"

MessageBox MB_OK 'Оставляем в строке только слово "волшебник" . \
$\r$\nДля этого устанавливаем :\
$\r$\n"String" "вдруг" "волшебник" "в" "0" "1" "0"'

${StrSort} $3 "$0" "вдруг" "волшебник" "в" "0" "1" "0"
MessageBox MB_OK "Получаем в переменной : $3"

MessageBox MB_OK 'Оставляем в строке только слово "волшебник" и по одному маркерному слову перед и после слова "волшебник". \
$\r$\nДля этого устанавливаем :\
$\r$\n"String" "вдруг" "волшебник" "в" "1" "1" "1"'

${StrSort} $3 "$0" "вдруг" "волшебник" "в" "1" "1" "1"
MessageBox MB_OK "Получаем в переменной : $3"

SectionEnd


MKN 13-04-2012 16:52 1898948

Нужно было организовать вызов MessageBox с последующим его автозакрытием черех n время.
Реализовал c помощью штатного плагина "Banner" так :
Код:

!include "WinMessages.nsh"
!include "MUI2.nsh"
!insertmacro MUI_LANGUAGE "English"

Name "Banner test"
OutFile "Banner Test.exe"

Section
MessageBox MB_OK "Сейчас будет вызвано сообщение, заданное в Function Mess1"
Call Mess1
SectionEnd

Function Mess1
        Banner::show /set 76 "Сообщение длительностью=Sleep" "Здесь вторая строка сообщения"
        Banner::getWindow
        Pop $1
        again:
                IntOp $0 $0 + 1
                Sleep 30
                StrCmp $0 100 0 again
        GetDlgItem $2 $1 1030
        SendMessage $2 ${WM_SETTEXT} 0 "STR:Сообщение закрывается."
        again2:
                IntOp $0 $0 + 1
                Sleep 5
                StrCmp $0 200 0 again2
        Banner::destroy
FunctionEnd

Section
SectionEnd

Есть ли иные, более изящные способы ?

K.A.V. 13-04-2012 17:00 1898959

Цитата:

Цитата MKN
Нужно было организовать вызов MessageBox с последующим его автозакрытием черех n время. »

Не получится через NSIS, т.к. сообщение же ждёт пока пользователь нажмёт на кнопку :)
1. Либо вызывать из внешней DLL функцию показа кнопки
2. Либо взять и изменить плагин Banner (ResHacker'ом), отредактировать диалог и вызывать его уже со всеми заданными данными
Вот как в SFX Creator'e диалог "О программе", только там я какой то другой плагин изменял

P.S.
В баннере нет ресурса :D
Это другой плагин "баннера", посмотрю как он называется

MKN 13-04-2012 17:06 1898963

Цитата:

Цитата K.A.V.
Не получится через NSIS, т.к. сообщение же ждёт пока пользователь нажмёт на кнопку »

Можно автозакрывать "собственные" сообщения, как я уже показал выше (может и не совсем "культяписто", но работает :) ).
А вот с штатными, нужно поизгиляться, определяя параметры окна сообщения и вызывая автонажатие кнопки (кнопок) или , если возможно, сразу закрытие нужного окна.
Только это довольно-таки сложно и в коде, громоздко... И для сообщений будет уж очень нецелесообразно...

kotkovets 13-04-2012 17:48 1898980

Цитата:

Цитата MKN
Нужно было организовать вызов MessageBox с последующим его автозакрытием черех n время »

максимум штатными средствами можно и так:
Код:

!define MsgBoxTimeout "!insertmacro  macro__MsgBoxTimeout"
!macro macro__MsgBoxTimeout text caption_text time
  System::Call "user32::MessageBoxTimeout(i$HWNDPARENT, t`${text}`, t`${caption_text}`,i0,i0, i${time})"
!macroend

Section
${MsgBoxTimeout} "Сообщение закроется через 2 секунды" "MessageBoxTimeout" 2000
SectionEnd


wolkow70 14-04-2012 16:36 1899573

Товарищи, подскажите как можно вычислить путь к папке плагинов FireFox
При установке 11-ой версии прописывается так.

HKEY_LOCAL_MACHINE "SOFTWARE\Mozilla\Mozilla Firefox 11.0\extensions" "Plugins" "$PROGRAMFILES\Mozilla Firefox\plugins"


Но мы не знаем заранее какая версия установлена (9,10,11 или другая....)
В общем нужно как-то записать в переменную значение параметра "Plugins" , чтобы скопировать плагин в эту папку.

kotkovets 14-04-2012 17:15 1899600

wolkow70, макрос ${RegFind} из справки.
Код:

Section
  ${RegFind} "${HKLM}\SOFTWARE\Mozilla" "/T=REG_SZ /V=1" EnumReg
    MessageBox MB_OK "$5" IDOK
SectionEnd

Function EnumReg
  StrCpy $5 "$1" "" -10
  ${If} $5 == "extensions"
      DetailPrint "$1"
      DetailPrint "имя параметра: $2"
      DetailPrint "значение параметра: $3"
      StrCpy "$5" "$3"
      StrCpy $0 StopRegFind
  ${EndIf}
FunctionEnd


wolkow70 14-04-2012 17:53 1899622

Цитата:

Цитата kotkovets
wolkow70, макрос ${RegFind} из справки. »

Не получается, макрос нашел вот какой путь у меня:


[HKEY_LOCAL_MACHINE\SOFTWARE\Mozilla\Thunderbird\Extensions]
"{eea12ec4-729d-4703-bc37-106ce9879ce2}"="E:\\Program Files\\Kaspersky Lab\\Kaspersky Internet Security 2011\\THBExt"
Тут нужно исключить ключ Thunderbird и Value должно быть "Plugins"

Можно еще найти путь к экзешнику, но это еще геморнее.

[HKEY_LOCAL_MACHINE\SOFTWARE\Mozilla\Mozilla Firefox 11.0\bin]
"PathToExe"="E:\\Program Files\\Mozilla Firefox\\firefox.exe"

bugmenotagain 14-04-2012 21:21 1899745

Обязательно программу распаковывать в TEMP? Хочу как обычно, чтоб прямо из setup.exe устанавливать. Зачем ее куда то копировать.

А вот какие файлы подлежат распаковке, определяет команда File:


File"${pkgdir}\opera\1049.MST"
File"${pkgdir}\opera\opera installer.msi"
в учебнике написано. У меня вообще другая программа. Ну запускаю Opera там целая куча этих файлов и нет нужных.

kotkovets 14-04-2012 22:28 1899809

Цитата:

Цитата bugmenotagain
Обязательно программу распаковывать в TEMP? »

нет! куда распаковать команда - SetOutPath
КОНСТАНТА pkgdir, точнее ее значение говорит скрипту во время компиляции, откуда файлы(с какой папки) будем брать.
Код:

SetOutPath "D:\opera"
File"${pkgdir}\opera\1049.MST"
File"${pkgdir}\opera\opera installer.msi"


bugmenotagain 14-04-2012 22:45 1899832

kotkovets, а можно сразу из setup.exe файлы брать? подскажите скрипт как должен выглядеть.

kotkovets 14-04-2012 23:33 1899863

bugmenotagain, справка в шапке, глупые вопросы при внимательном чтении букафф резко отпадут.

bugmenotagain 14-04-2012 23:44 1899867

kotkovets, процитируйте, пожалуйста, это место.

K.A.V. 14-04-2012 23:54 1899872

bugmenotagain, пожалуйста, имейте совесть :read:
Скачайте справочник по NSIS на русском языке, ссылка в шапке темы

Народ, вы что-то совсем наглеете... :o

wolkow70 15-04-2012 05:38 1899938

bugmenotagain,

Распаковывваете оригинальный дистрибутив в 7z FM или в Universal Extractor.

SetOutPath "$INSTDIR"
;
File "${pkgdir}\Opera11\c3nform.vxml"
File "${pkgdir}\Opera11\encoding.bin"
File "${pkgdir}\Opera11\files.sig"
File "${pkgdir}\Opera11\files_list"
File "${pkgdir}\Opera11\files_old.sig"
File "${pkgdir}\Opera11\html5_entity_init.dat"
File "${pkgdir}\Opera11\html40_entities.dtd"
File "${pkgdir}\Opera11\lngcode.txt"
File "${pkgdir}\Opera11\mathml.dtd"
File "${pkgdir}\Opera11\opera.dll"
File "${pkgdir}\Opera11\opera.exe"
File "${pkgdir}\Opera11\operaprefs_default.ini"
File "${pkgdir}\Opera11\pubsuffix.xml"

File "${pkgdir}\Opera11\opera_install_log.xml"
;
File /r "${pkgdir}\Opera11\defaults"
File /r "${pkgdir}\Opera11\extra"
File /r "${pkgdir}\Opera11\gstreamer"
File /r "${pkgdir}\Opera11\locale"
File /r "${pkgdir}\Opera11\program"
File /r "${pkgdir}\Opera11\region"
File /r "${pkgdir}\Opera11\skin"
File /r "${pkgdir}\Opera11\styles"
File /r "${pkgdir}\Opera11\ui"
File /r "${pkgdir}\Opera11\unite"

Файл Opera11\opera_install_log.xml берется отдельно уже из установленного дистрибутива и правится.
Без файла opera_install_log.xml Opera не устанавливается на Windows 7 как браузер по умолчанию и в расширенных настройках не работает вкладка Программы\Настройки.
С пустым opera_install_log.xml Opera не устанавливается на Windows 7 как браузер по умолчанию, но при этом вкладка Программы\Настройки работает
Если в install_log.xml пропарсить пути установки на реально используемые в "$INSTDIR" Opera устанавливается на Windows 7 как браузер по умолчанию, и вкладка Программы\Настройки работает.

wolkow70 15-04-2012 08:09 1899954

kotkovets,
Вот так сделал, работает:

Function EnumReg
StrCpy $5 "$1" "" -10
${If} $5 == "extensions"
${AndIf} $2 == "Plugins"
${AndIfNot} $1 == "SOFTWARE\Mozilla\Thunderbird\Extensions"
;
DetailPrint "Раздел реестра: $1"
DetailPrint "Имя параметра: $2"
DetailPrint "Тип параметра: $4"
DetailPrint "Значение параметра: $3"
StrCpy "$5" "$3"
StrCpy $0 StopRegFind
${EndIf}
FunctionEnd

Section "Интеграция в браузер Firefox" Firefox
${RegFind} "${HKLM}\SOFTWARE\Mozilla" "/T=REG_SZ /V=1" EnumReg
CopyFiles /silent "$INSTDIR\npdm.dll" "$5"
SectionEnd

MKN 15-04-2012 12:51 1900042

Подскажите, каким образом в стандартных и кастомных страницах, запретить действие кнопок "Next" и "Install".
Не скрыть эти кнопки , а именно запретить, при их нажатии (и, что важнее - клике на "Enter") , дальнейшее действие.

K.A.V. 15-04-2012 14:48 1900099

Цитата:

Цитата MKN
Не скрыть эти кнопки , а именно запретить, при их нажатии (и, что важнее - клике на "Enter") , дальнейшее действие. »

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

Но отловить событие нажатия кнопки "Далее" и возвратиться на предыдущую страничку можно, вот так я бы сделал на стандартных страничках, добавив между страничками свою функцию:

Код:

!insertmacro MUI_PAGE_WELCOME
Page Custom MyCustomPage
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH

Код:

Function MyCustomPage
MessageBox MB_OK|MB_ICONINFORMATION "Нажата кнопка Далее$\n$\nВозврат на страничку Приветствия"
GetDlgItem $0 $HWNDPARENT 3
SendMessage $0 ${BM_CLICK} 0 0
# 1 - кнопка Далее
# 2 - кнопка Отмена
# 3 - кнопка Назад
FunctionEnd


P.S.
А вообще не понятно, зачем их блокировать??

bugmenotagain 15-04-2012 17:54 1900194

Я спрашивал программа должна распаковаться потом устанавливаться? а сразу она не может устанавливать? зачем мне стандартный установщик Я делаю свой собственный. что так она не может программа сама не может понять какие ей нужны файлы для установки?

kotkovets 15-04-2012 19:27 1900228

Цитата:

Цитата MKN
при их нажатии (и, что важнее - клике на "Enter") , дальнейшее действие »

по умолчанию фокус стоит на кнопке "далее"(установить) поэтому достаточно установить при открытии(создании) странички на
на другой элемент окна
Код:

${NSD_SetFocus} "описатель(хэндл) элемента"

bugmenotagain 15-04-2012 21:50 1900305

глухая тема

K.A.V. 15-04-2012 22:07 1900320

Цитата:

Цитата bugmenotagain
глухая тема »

:laugh:

Согласен с вами, 2500+ сообщений в теме...совсем тихо здесь как в тайге :biggrin:
Да и люди здесь, какие-то не отзывчивые, не помагают ничем :lol:

Как найдёте на просторах рунета более "подвижную" тему в которой обсуждают язык NSIS, сообщите сюда пожалуйста :drug:

bugmenotagain 15-04-2012 22:46 1900339

K.A.V., вам наверно 15 лет, столько смайликов понаставили

kotkovets 15-04-2012 22:59 1900348

bugmenotagain, хорош оффтопить, все претензии в личной переписке высказываете

celovec 16-04-2012 00:07 1900391

NSIS замена файлов
 
Когда появляется новая версия моей программы. Люди ее инсталлирую поверх старой программы.
Возможно ли NSIS заставить не перезаписывать некоторые файлы?
Тоесть есть файл settings.ini в нем хранятся настройки. И его не нужно перезаписывать (не нужно заменять на исходный который есть в инсталляторе).
Спасибо.

K.A.V. 16-04-2012 00:53 1900411

celovec, .: NSIS - все вопросы :.
В шапке темы - Справочник по NSIS

Изучаем

celovec 16-04-2012 01:17 1900420

К сожалению я там не нашел ответ на свой вопрос.

K.A.V. 16-04-2012 08:27 1900471

celovec, Посмотрите страничку в справке на всякий случай "Перевод справки NSIS => File"

А вообще чтобы НЕ перезаписывать файл, нужно перед командой распаковки (File) прописать команду SetOverwrite off

Вот так:
Код:

SetOverwrite off ; Отключаем перезапись файла
File settings.ini ; Распаковка вашего файла
SetOverwrite on ; Включаем обратно перезапись файлов

Либо можно проверять наличие файла в директории, куда происходит установка, это можно сделать вот так:
Код:

IfFileExists "$INSTDIR\settings.ini" +2 0 ; Проверяем, есть ли файл в каталоге, куда происходит установка
File settings.ini  ; Распаковка вашего файла


MKN 16-04-2012 08:50 1900489

Цитата:

Цитата K.A.V.
А вообще не понятно, зачем их блокировать?? »

Например, на кастомной странице есть элементы выбора поведения установки, выбор папки\файлов и т.д. Имеется собственная кнопка начала установки. Далее идут команды установки (команды могут продолжаться и на следующей странице).
Если после запуска скрипта, случайно или как, кликнуть на Enter, то начинается выполнение команд. Совершенно не нужное и бестолковое, вплоть до сообщений об ошибках, хотя ничего ещё не выбрано и не отмечено.
Поэтому и надо блокировать Enter.

MKN 16-04-2012 09:11 1900499

bugmenotagain,
По моему, недоумение и разночтение вызывает не внятно поставленная тобой задача и не ясные конечные цели. Т.е. в целом - весь твой вопрос.
Вот ты пишешь :
Цитата:

Цитата bugmenotagain
Обязательно программу распаковывать в TEMP? Хочу как обычно, чтоб прямо из setup.exe устанавливать. Зачем ее куда то копировать. »

Не обязательно, и файлы устанавливаются-распаковываются (и запускаются "вложенные" в скрипт исполняемые файлы) , как правило непосредственно из setup.exe , но иногда, ИСХОДЯ ИЗ ПОСТАВЛЕННОЙ ЗАДАЧИ И СИТУАЦИИ, "вспомогательные" нужные для установки компоненты ( те же устанвщики MSI и т.д.), предварительно копируются во временную папку и уже оттуда запускаются-устанавливаются).

kotkovets 16-04-2012 12:05 1900591

MKN, кнопки ты не заблокирушь так просто, событие обрабатывает nsis, поимимо твоего кода со скрипта, добавляется еще куча
сдужебных и необходимых команд.
конечно можно блокирнуть, перехватывать событие кнопки и ставить хук, но тока через внешнюю dll - много возни, поверь.

MKN 16-04-2012 12:27 1900604

Цитата:

Цитата kotkovets
много возни, поверь. »

Конечно верю :) А как быть ?

kotkovets 16-04-2012 12:47 1900621

Цитата:

Цитата MKN
А как быть ? »

Во время создания странички заблокировать кнопку командой EnableWindow,
перенести фокус на кастомную кнопку странички, при нажатии кнопки кастомной(после необходимых манипуляций),
разблокировать кнопку командой EnableWindow и через SendMessage передать событие нажатия кнопки,
${BM_CLICK} - как то так, что ли...

K.A.V. 16-04-2012 13:29 1900652

Цитата:

Цитата kotkovets
Во время создания странички заблокировать кнопку командой EnableWindow »

Я не особо вникал во "внутренности" граф. интерфейса NSIS, но где это прописывать? (если не учитывать факт создания кастомной странички)
Я смотрел макросы например MUI_WELCOM в System.nsh (на него ссылается MUI.nsh), но там по сути, нигде не отрабатывает команда EnableWindow на кнопку Далее

Даже если добавлять функцию как я написал ранее, перед самой страничкой с командой EnableWindow, она тоже не делает кнопку не активной :dont-know

Единственный способ как мне кажется, это проверять в функции (как опять же я выше написал) свои "потребности "и нажимать на кнопку "Назад", если что-то не так...

Если кто узнает другой способ, пишите :)

kotkovets 16-04-2012 14:27 1900706

Цитата:

Цитата K.A.V.
Даже если добавлять функцию как я написал ранее, перед самой страничкой с командой EnableWindow, она тоже не делает кнопку не активной »

пример на кастомной страничке:
читать дальше »
Код:

!include MUI2.nsh
Page custom nsDialogsPage
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

OutFile "Example.exe"

var dlg
var btn
var next

Function nsDialogsPage
    nsDialogs::Create 1018
    pop $dlg
    GetDlgItem $next $HWNDPARENT 1
    EnableWindow $next ${SW_HIDE}
    ${NSD_CreateButton} 100u 14u 50u 14u "Button"
    pop $btn
    ${NSD_OnClick} $btn BtnClick
    nsDialogs::Show
FunctionEnd

Function BtnClick
  pop $btn
  EnableWindow $next ${SW_SHOW}
  SendMessage $next ${BM_CLICK} 0 0
FunctionEnd

Section
SectionEnd


nsis предоставляет к стандартным страничкам 3 функции
1. перед открытием странички
2. когда страничка открыта
3. когда страничка закрывается
пример на стандартной страничке:
читать дальше »
Код:

!include MUI.nsh
!insertmacro MUI_PAGE_WELCOME
  !define MUI_PAGE_CUSTOMFUNCTION_SHOW COMPONENTS_SHOW
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

outfile test.exe
OutFile "Example.exe"

var next

Function COMPONENTS_SHOW
  GetDlgItem $next $HWNDPARENT 1
  EnableWindow $next 0
FunctionEnd

Section /o test TEST_SEC

SectionEnd

Function .OnSelChange
    SectionGetFlags ${TEST_SEC} $0
    StrCmp $0 1 0 +2
    EnableWindow $next ${SW_SHOW}
    StrCmp $0 0 0 +2
    EnableWindow $next ${SW_HIDE}
FunctionEnd


XCV 17-04-2012 13:36 1901237

маленький вопросик, какой командой можно прекратить установку nsis? тоесть есть в скрипте проверка на существование ключа в реестре, если он есть установка продолжается, а вот если нет инсталяция должна прекратится...

MKN 17-04-2012 13:41 1901239

XCV,
При не соответствии условию - Quit

wolkow70 18-04-2012 12:26 1901783

kotkovets,
посоветуйте в таком вопросе:

!insertmacro MUI_PAGE_STARTMENU Application $MENU

Section "Создать группу ярлыков в меню Пуск" StartMenu

!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
;
SetShellVarContext all
CreateDirectory "$SMPROGRAMS\$MENU"
CreateShortCut "$SMPROGRAMS\$MENU\${PRODUCT_NAME}.lnk" "$INSTDIR\USBSafelyRemove.exe"
CreateShortCut "$SMPROGRAMS\$MENU\Справка ${PRODUCT_NAME}.lnk" "$INSTDIR\USBSafelyRemoveRu.chm"
CreateShortCut "$SMPROGRAMS\$MENU\Удалить ${PRODUCT_NAME}.lnk" "$INSTDIR\uninstall.exe"
;
!insertmacro CreateInternetShortcut \
"$SMPROGRAMS\$MENU\Веб-сайт ${PRODUCT_NAME}" \
"${PRODUCT_WEB_SITE}" \
"$INSTDIR\USBsrURL.ico" "0"
;
!insertmacro MUI_STARTMENU_WRITE_END
SectionEnd
Все нормально папка с ярлыками создается, где указано.

В деинсталляторе прописал:

Section Uninstall
;
SetShellVarContext all
RMDir /r "$SMPROGRAMS\$MENU"

при удалении на XP снесло почти все меню Пуск. пришлось восстанавливать систему. Что тут может быть не так?

kotkovets 18-04-2012 14:02 1901845

wolkow70, Тысячу раз говорил:
значения переменных из секций инсталлятора не переносятся в секции деинсталлятора!!!
---
поэтому значение переменной $MENU в деинсталляторе может быть, какое угодно!
примеров стартменю великое множество!

wolkow70 18-04-2012 14:22 1901858

Цитата:

Цитата kotkovets
значения переменных из секций инсталлятора не переносятся в секции деинсталлятора!!! »

Это я уже понял на горьком опыте. Тогда как прописать удаление то? Деинсталлятор же не знает в какую папку я поместил ярлыки. У меня они пишутся в Программы-Утилиты-USB Safely Remove (но у другого пользователя может отличаться...

Переменную я объявлял как в справке написано:
Var MENU #объявляем нашу переменную

K.A.V. 18-04-2012 15:21 1901888

Цитата:

Цитата wolkow70
Это я уже понял на горьком опыте. Тогда как прописать удаление то? »

Вроде бы всё правильно!
Попробуйте в секцию Uninstall добавить первой строкой
Код:

!insertmacro MUI_STARTMENU_GETFOLDER "Application" $MENU
И смотрите, не могло просто так
Цитата:

Цитата wolkow70
снесло почти все меню Пуск »

может у вас в коде ранее что-то отрабатывает

wolkow70 18-04-2012 15:55 1901912

Цитата:

Цитата K.A.V.
может у вас в коде ранее что-то отрабатывает »

Нет, закоментировал :
;RMDir /r "$SMPROGRAMS\$MENU"
и перестало сносить.

Отдельно комманды прописываю, не удаляет.
Похоже не понимает переменную.
Delete "$SMPROGRAMS\$MENU\${PRODUCT_NAME}.lnk"

Попробую сделать как вы подсказали.

Константин_Кокухов@vk 18-04-2012 16:07 1901917

Привет.
После прочтения вашего справочника по NSIS, сваялся маленький скриптик, с использованием RegistryFunc.nsh v2.0. Вот только незадача в том, что при попытке выдернуть из справочника саму библиотеку она выдергивается без форматирования. Мощности устройства head не хватает что бы красиво ее отформатировать и сделать так, что бы она нормально заработала. Сам файл библиотеки мне найти не удалось. Можете кинуть ссылочку откуда можно скачать эту библиотеку в нормально виде.

Спасибо.

wolkow70 18-04-2012 16:08 1901919

Сделал так:

Section Uninstall
SectionIn 1 RO
;
!insertmacro MUI_STARTMENU_GETFOLDER "Application" $MENU
SetShellVarContext all
RMDir /r "$SMPROGRAMS\$MENU"

Сносить меню перестало, но и удалять папку не удаляет.

K.A.V. 18-04-2012 16:08 1901920

Цитата:

Цитата wolkow70
закоментировал :
;RMDir /r "$SMPROGRAMS\$MENU" »

Значит переменная $MENU пустой выходит

Что мешает, тогда, сохранить её значение в реестр при установке??
Вы же создаёте деинсталлятор, запишите в ветку "Uninstall" своей программы значение этой переменной, и читайте значение параметра в эту переменную во время запуска деинсталлятора....

Цитата:

Цитата Константин_Кокухов@vk
Можете кинуть ссылочку откуда можно скачать эту библиотеку в нормально виде. »

Все плагины можно скачать отсюда => http://nsis.sourceforge.net/Category:Plugins


kotkovets, внеси в шапку ссылку на плагины, либо я её не вижу, либо её там реально нет :)

Константин_Кокухов@vk 18-04-2012 16:18 1901929

Цитата:

Цитата K.A.V.
Цитата Константин_Кокухов@vk:
Можете кинуть ссылочку откуда можно скачать эту библиотеку в нормально виде. »
Все плагины можно скачать отсюда => http://nsis.sourceforge.net/Category:Plugins »

Спасибо, но я говорил про библиотеку которую написал kotkovets и которая не использует плагины.

wolkow70 18-04-2012 16:20 1901933

Из содержания хедера StartMenu.nsh похоже, что значение переменной само в реестр прописывается и читаться должно макросом. Как его вызвать не пойму.

Цитата:

Цитата Константин_Кокухов@vk
Спасибо, но я говорил про библиотеку которую написал kotkovets и которая не использует плагины. »

Я сейчас ее только для пробы Оперой скачал. Нужно сохранять, а не пытаться открыть.

K.A.V. 18-04-2012 16:25 1901940

Вложений: 1
Цитата:

Цитата Константин_Кокухов@vk
Спасибо, но я говорил про библиотеку которую написал kotkovets и которая не использует плагины. »

Нормально всё сохраняется из справочника

Цитата:

Цитата wolkow70
Как его вызвать не пойму. »

Ну вы ей богу! :)
Берёте прописываете свою команду на запись в реестр и сохраняете значение этой переменной во время установки:

В секции установки:
Код:

WriteRegStr "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" "MyCustom" "$MENU"
В первую строчку секции Uninstall пропишите чтение из этого параметра:
Код:

ReadRegStr $MENU "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" "MyCustom"
Попробуйте так...

Константин_Кокухов@vk 18-04-2012 16:27 1901942

Цитата:

Цитата K.A.V.
Попробуйте так... »

Большое спасибо.

wolkow70 18-04-2012 16:28 1901943

Цитата:

Цитата K.A.V.
Берёте прописываете свою команду на запись в реестр и сохраняете значение этой переменной во время установки: »

Я знаю , что так можно сделать, я не пойму зачем это делать, когда MUI2 сам должен это уметь.

Вот же там есть:

!macro MUI_STARTMENU_GETFOLDER ID VAR

!verbose push
!verbose ${MUI_VERBOSE}

;Get Start Menu folder from registry
;Can be called from the script in the uninstaller

!ifdef MUI_STARTMENUPAGE_${ID}_REGISTRY_ROOT & MUI_STARTMENUPAGE_${ID}_REGISTRY_KEY & MUI_STARTMENUPAGE_${ID}_REGISTRY_VALUENAME

ReadRegStr $mui.StartMenuPage.RegistryLocation "${MUI_STARTMENUPAGE_${ID}_REGISTRY_ROOT}" "${MUI_STARTMENUPAGE_${ID}_REGISTRY_KEY}" "${MUI_STARTMENUPAGE_${ID}_REGISTRY_VALUENAME}"

${if} $mui.StartMenuPage.RegistryLocation != ""
StrCpy "${VAR}" $mui.StartMenuPage.RegistryLocation
${else}
StrCpy "${VAR}" "${MUI_STARTMENUPAGE_${ID}_DEFAULTFOLDER}"
${endif}

!else

StrCpy "${VAR}" "${MUI_STARTMENUPAGE_${ID}_DEFAULTFOLDER}"

!endif

!verbose pop

!macroend

K.A.V. 18-04-2012 16:34 1901949

wolkow70, у вас
Код:

!define MUI_STARTMENUPAGE_DEFAULTFOLDER
прописано? (может пустое значение пишет в реестр?)
Значение записывается вообще в реестр или нет?? Вы проверяли?
Где именно ошибка, может даже и запись в реестр не происходит, а мы тут читать пытаемся :drug:

wolkow70 18-04-2012 16:40 1901954

Вот как прописано:

Var MENU

!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE "${pkgdir}\USB Safely Remove\License.txt"
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_STARTMENU Application $MENU
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH

Section "Создать группу ярлыков в меню Пуск" StartMenu
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
SetShellVarContext all
CreateDirectory "$SMPROGRAMS\$MENU"
CreateShortCut "$SMPROGRAMS\$MENU\${PRODUCT_NAME}.lnk" "$INSTDIR\USBSafelyRemove.exe"
CreateShortCut "$SMPROGRAMS\$MENU\Справка ${PRODUCT_NAME}.lnk" "$INSTDIR\USBSafelyRemoveRu.chm"
CreateShortCut "$SMPROGRAMS\$MENU\Удалить ${PRODUCT_NAME}.lnk" "$INSTDIR\uninstall.exe"

!insertmacro MUI_STARTMENU_WRITE_END
SectionEnd

В деинсталляторе:

!insertmacro MUI_STARTMENU_GETFOLDER "Application" $MENU
SetShellVarContext all
RMDir /r "$SMPROGRAMS\$MENU"

K.A.V. 18-04-2012 16:44 1901955

Цитата:

Цитата wolkow70
Var MENU
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE "${pkgdir}\USB Safely Remove\License.txt"
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_STARTMENU Application $MENU
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH »

....
Вы мне скажите, у вас значение записывает в реестр?? Сами откройте редактор реестра и посмотрите!
На рабочем столе папка создаётся с именем в меню пуск??

У меня код рабочий...
Попробуйте вот так написать...

Код:

Var MENU

!define MUI_STARTMENUPAGE_DEFAULTFOLDER "Моя программа"

!insertmacro MUI_PAGE_WELCOME
 !insertmacro MUI_PAGE_LICENSE "${pkgdir}\USB Safely Remove\License.txt"
 !insertmacro MUI_PAGE_DIRECTORY
 !insertmacro MUI_PAGE_COMPONENTS
 !insertmacro MUI_PAGE_STARTMENU Application $MENU
 !insertmacro MUI_PAGE_INSTFILES
 !insertmacro MUI_PAGE_FINISH

у меня кстати MUI подключается, а не MUI2, может из-за этого работает, не знаю

wolkow70 18-04-2012 16:44 1901956

Да, прописывается в реестр

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MenuOrder\Start Menu2\Programs\Утилиты\USB Safely Remove]
"Order"=hex:08(большое значение).

K.A.V. 18-04-2012 16:54 1901959

Цитата:

Цитата wolkow70
"Order"=hex:08(большое значение). »

Что-то у вас не сходится...
Записывается в реестр как будто это тип ключа REB_BINARY или REG_EXPAND_SZ

По умолчанию должно прописывать в:
Код:

Software\Microsoft\Windows\CurrentVersion\Uninstall
Смотрите значит ваш код, вы видно сами там что-то прописывали

wolkow70 18-04-2012 17:03 1901970

В Software\Microsoft\Windows\CurrentVersion\Uninstall создается запись деинсталляции

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\USB Safely Remove (но там пути создания ярлыков нет, только то, что прописано в секции создания деинсталлятора.).

Еще заметил, если создавать ярлыки в самом StartMenu, то стало удаляться, а если поместить в подгруппу "Утилиты" , то не удаляется. Значит $MENU не пустое.

K.A.V. 18-04-2012 17:12 1901974

wolkow70, пропишите в скрипт запись значения $MENU при установке и при вызове деинсталлятора во внешний файл, чтобы понять, что у вас там назначается этой переменной...

wolkow70 18-04-2012 17:21 1901978

Сделал так:

Section Uninstall
!insertmacro MUI_STARTMENU_GETFOLDER "Application" $MENU
MessageBox MB_OK "$MENU" IDOK
SetShellVarContext all
RMDir /r "$SMPROGRAMS\$MENU"

Пробовал ставить непосредственно в "Программы" - мессадж - в "$MENU" USB Safely Remove (при этом все нормально удаляется).
Ставлю в "Программы\Утилиты" - мессадж - тоже в "$MENU" USB Safely Remove (но при этом не удяляется). То есть, полный путь (относительно "Программы") не прописывается в "$MENU". Только сама папка.

Еще сделал проверку при установке:

Section "Создать группу ярлыков в меню Пуск" StartMenu

!insertmacro MUI_STARTMENU_WRITE_BEGIN Application

MessageBox MB_OK "$MENU" IDOK

;
SetShellVarContext all
CreateDirectory "$SMPROGRAMS\$MENU"

Все нормально в мессаджах записывается.

В первом случае:
USB Safely Remove

Во втором случае:
Утилиты\USB Safely Remove

kotkovets 18-04-2012 17:48 1901994

Цитата:

Цитата K.A.V.
kotkovets, внеси в шапку ссылку на плагины, либо я её не вижу, либо её там реально нет »

внес в: Расширение функциональности -> Плагины и полезности к NSIS
wolkow70, классический пример:
читать дальше »
Код:

!include "MUI2.nsh"
  Name "Modern UI Test"
  OutFile "StartMenu.exe"
  InstallDir "$EXEDIR\Modern UI Test"

  Var StartMenuFolder

  !define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKCU"
  !define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\Modern UI Test"
  !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder"
  !insertmacro MUI_PAGE_STARTMENU Application $StartMenuFolder
  !insertmacro MUI_PAGE_INSTFILES
 
  !insertmacro MUI_UNPAGE_CONFIRM
  !insertmacro MUI_UNPAGE_INSTFILES
  !insertmacro MUI_LANGUAGE "English"

Section "Dummy Section"
  SetOutPath "$INSTDIR"
  WriteUninstaller "$INSTDIR\Uninstall.exe"
  SetShellVarContext all
  !insertmacro MUI_STARTMENU_WRITE_BEGIN Application
    CreateDirectory "$SMPROGRAMS\$StartMenuFolder"
    CreateShortCut "$SMPROGRAMS\$StartMenuFolder\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
  !insertmacro MUI_STARTMENU_WRITE_END
SectionEnd

Section "Uninstall"
  !insertmacro MUI_STARTMENU_GETFOLDER Application $StartMenuFolder
    SetShellVarContext all
    MessageBox MB_OK "$SMPROGRAMS\$StartMenuFolder" IDOK
  DeleteRegKey HKCU "Software\Modern UI Test"
  Delete "$SMPROGRAMS\$StartMenuFolder\Uninstall.lnk"
  RMDir /r "$SMPROGRAMS\$StartMenuFolder"
  RMDir /r "$INSTDIR"
SectionEnd


wolkow70 18-04-2012 18:01 1902000

kotkovets,

Ваш пример сработал на 100%.
В вашем примере в реестре специально создается параметр для хранения значения переменной.

С такими строками у меня тоже все заработало.

!define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKCU"
!define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\SafelyRemove"
!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder"

Только я подозреваю, что макросы MUI2 сами это должны делать, используя специальные значения реестра Windows. Не должно быть так, чтобы специально их прописывать.

wolkow70 23-04-2012 13:52 1904480

Товарищи, подскажите по такому вопросу:

Process Monitor показывает выполнение :
rundll32.exe aimp_menu32.dll,ContextMenuAddonRegister

Делаю cmd файл в папке с aimp_menu32.dll
rundll32.exe aimp_menu32.dll,ContextMenuAddonRegister
При этом все работает.

В скрипте NSIS пишу :
ExecWait '"rundll32.exe $INSTDIR\Modules\aimp_menu32.dll,ContextMenuAddonRegister"'

Комманда не работает.

K.A.V. 23-04-2012 14:48 1904506

Цитата:

Цитата wolkow70
ExecWait '"rundll32.exe $INSTDIR\Modules\aimp_menu32.dll,ContextMenuAddonRegister"' »

попробуйте в кавычки заключить начиная не с места перед rundll32, а перед переменной $INSTDIR

kotkovets 23-04-2012 16:07 1904557

wolkow70, а вы маньяк, по тысячу раз на одни и те же грабли наступать...:)
http://forum.oszone.net/post-1821953-2142.html
или как то так...
Код:

ExecWait 'rundll32.exe "$INSTDIR\Modules\aimp_menu32.dll", ContextMenuAddonRegister' $0
MessageBox MB_OK "$0"

По идее, если все нормально, то $0 обычно равен нулю, т.е смотреть, что возвращает rundll32 при успехе.

wolkow70 23-04-2012 16:17 1904565

Цитата:

Цитата K.A.V.
попробуйте в кавычки заключить начиная не с места перед rundll32, а перед переменной $INSTDIR »

Сделал так:
ExecWait 'rundll32.exe "$INSTDIR\Modules\aimp_menu32.dll,ContextMenuAddonRegister"'

Process Monitor показывает выполнение :

rundll32.exe "E:\Program Files\AIMP3\Modules\aimp_menu32.dll,ContextMenuAddonRegister"
Но при этом регистрации библиотеки не происходит.
В то время как батником регистрируется. Видимо дело в длинном пути к файлу.

Цитата:

Цитата kotkovets
wolkow70, а вы маньяк, по тысячу раз на одни и те же грабли наступать...
http://forum.oszone.net/post-1821953-2142.html »

Этот способ я знаю и у меня ранее в скрипте так и было
RegDLL "$INSTDIR\Modules\aimp_menu32.dll" ContextMenuAddonRegister.

Но, при оригинальной инсталляции процесс регистрации происходит не через рег-сервер, а через выполнение rundll32.exe aimp_menu32.dll,ContextMenuAddonRegister
В чем отличие затрудняюсь прокомментировать.

K.A.V. 23-04-2012 16:25 1904569

Цитата:

Цитата wolkow70
В то время как батником регистрируется. Видимо дело в длинном пути к файлу. »

Попробуйте указать путь к rundll32, т.е. $SYSDIR\rundll32.exe

kotkovets 23-04-2012 16:27 1904571

Цитата:

Цитата wolkow70
Этот способ я знаю и у меня ранее так и было. Но при оригинальной инсталляции процесс регистрации происходит не через рег-сервер, а через выполнение rundll32.exe aimp_menu32.dll,ContextMenuAddonRegister
В чем отличие затрудняюсь прокомментировать. »

Это тоже самая регистрация, но точка входа нестандартная(ContextMenuAddonRegister)
В предыдущем сообщении, у меня все отработало в двух вариантах на 100%,
ЧИТАЙТЕ ВНИМАТЕЛЬНО, что вам пишут!!!

wolkow70 23-04-2012 16:36 1904575

Сделал так:
ExecWait 'rundll32.exe "$INSTDIR\Modules\aimp_menu32.dll",ContextMenuAddonRegister' $0
MessageBox MB_OK "$0"
Возврат 0
Все зарегистрировалось. Всем спасибо.

Вот еще обратил внимание, что при оригинальной деинсталляции AIMP aimp_menu32.dll как то тихо удаляется без всякой перезагрузки и перезапуска эксплорера. Вот бы также сделать.

wolkow70 24-04-2012 11:21 1904943

kotkovets,

Возник ряд вопросов по логическим конструкциям, может подскажите:

1. Возможно ли использовать логическую конструкцию в составе макроса с подставляемой переменной?
2. Возможно ли при этом сравнивать не только числовые, но и иные значения хранящиеся в переменных?
3. Возможно ли совпадение условию использовать для исключения выполнения комманды по отношению к условию Else?

Пример к вопросу - фрагмент макроса:

Var ClassName
!macro UnRegisterExtension extenstion
StrCpy $ClassName "AIMP.${extenstion}"
;
; тут разное
;
${If} ${AtLeastWinVista}
ReadRegStr $7 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "Progid"
ReadRegStr $8 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "AIMP.Backup"
${If} $7 == "$ClassName"
${OrIf} $7 == "Applications\AIMP3.exe"
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice"
${If} $8 == ""
${OrIf} $8 == "$ClassName"
${OrIf} $8 == "Applications\AIMP3.exe"
${Else}
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "Progid" "$8"
${EndIf}
${EndIf}
${EndIf}

!macroend

kotkovets 24-04-2012 12:32 1904980

Цитата:

Цитата wolkow70
1. Возможно ли использовать логическую конструкцию в составе макроса с подставляемой переменной? »

конечно.
Цитата:

Цитата wolkow70
Возможно ли при этом сравнивать не только числовые, но и иные значения хранящиеся в переменных? »

Цитата:

Цитата wolkow70
${OrIf} $7 == "Applications\AIMP3.exe" »

так вы здесь, не числа то, сравниваете.
Цитата:

Цитата wolkow70
Возможно ли совпадение условию использовать для исключения выполнения комманды по отношению к условию Else? »

А, что обязательно включать, конструкцию ${Else} включать, вовсе нет!
Код:

${IfNot} $8 == ""
 ${OrIfNot} $8 == "$ClassName"
 ${OrIfNot} $8 == "Applications\AIMP3.exe"
        WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "Progid" "$8"
 ${EndIf}

И здесь постановка условия ИЛИ, т.е всегда будет срабатывать, если одно из условий сработает.
условие И, сработает, если $8 не равно пустому значению и не равно $ClassName и не равно Applications\AIMP3.exe:
Код:

${IfNot} $8 == ""
 ${AndIfNot} $8 == "$ClassName"
 ${AndIfNot} $8 == "Applications\AIMP3.exe"
        WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "Progid" "$8"
 ${EndIf}

wolkow70, сколько раз говорил, код в тег заключать(выделяем код, жмем кнопочку #), противно читать...

wolkow70 24-04-2012 12:53 1904989

Цитата:

Цитата kotkovets
wolkow70, сколько раз говорил, код в тег заключать(выделяем код, жмем кнопочку #), противно читать... »

Да знаю я, мне в тегах неудобно читать.

Код:

${If} $8 == ""
 ${OrIf} $8 == "$ClassName"
 ${OrIf} $8 == "Applications\AIMP3.exe"
 ${Else}
 WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "Progid" "$8"

В том и дело, что тут, наоборот, при восстановлении ассоциаций, параметр реестра должен прописываться, если $8 не равна:
1. "" - пустому значению
2. значению "$ClassName" (текущему значению)
3. значению "Applications\AIMP3.exe" (назначению приложения)
Поэтому и разделил ${Else}. Может как-то по другому можно сформулировать?

kotkovets 24-04-2012 13:17 1904994

Цитата:

Цитата wolkow70
В том и дело, что тут, наоборот, при восстановлении ассоциаций, параметр реестра должен прописываться, если $8 не равна: »

Код:

${Select} $8
  ${Case3} "" "$ClassName" "Applications\AIMP3.exe"
  ${CaseElse}
        MessageBox MB_OK "$8" IDOK
${EndSelect}

Вот это согласно поставленному условию

wolkow70 24-04-2012 13:41 1905003

Из справки:
Здесь макрос ${Case} может срабатывать до пяти значений переменной $0
Имеется в виду в один ${Case} можно включать до пяти значений?
Самих ${Case} может быть множество?
Почему в примере присвоено 3 ${Case3} - потому, что три значения, или любую нумерацию можно поставить?
Обладает ли такая формула преимуществами перед тем, что я написал?

kotkovets 24-04-2012 13:56 1905014

Цитата:

Цитата wolkow70
Здесь макрос ${Case} может срабатывать до пяти значений переменной $0
Имеется в виду в один ${Case} можно включать до пяти значений? »

до 5 идин Case, правкой хедера можно и больше.. а можно и так:
Код:

----
  ${Case3} "" "$ClassName" "Applications\AIMP3.exe"
  ${Case5} "1" "---" "test" "nsis" "yyy"
----

Цитата:

Цитата wolkow70
Почему в примере присвоено 3 ${Case3} - потому, что три значения, или любую нумерацию можно поставить? »

потому что, 3 значения одной переменной сравниваются.
Цитата:

Цитата wolkow70
Обладает ли такая формула преимуществами перед тем, что я написал? »

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

wolkow70 24-04-2012 14:33 1905043

kotkovets,

При совместном применении в макросе ${Select} и ${Switch} ${extenstion} скрипт не компилируется.

Код:

!macro RegisterExtension extenstion
Push $1
Push $2               
StrCpy $ClassName "AIMP.${extenstion}"
;
ReadRegStr $1 HKCU "Software\Classes\.${extenstion}" ""
${Select} $1
${Case2} "" "$ClassName"
${CaseElse}
WriteRegStr HKCU "Software\Classes\.${extenstion}" "AIMP.Backup" "$1"
${EndSelect}
;
WriteRegStr HKCU "Software\Classes\.${extenstion}" "" "$ClassName"
WriteRegStr HKCU "Software\Classes\$ClassName\shell\open\command" "" "$OpenCommand"
WriteRegStr HKCU "Software\Classes\$ClassName\shell\open\DropTarget" "CLSID" "{0041494D-5033-4472-6F70-546172676574}"
WriteRegStr HKCU "Software\Classes\$ClassName\CLSID" "" "{0041494D-5033-4472-6F70-546172676574}"
;
DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "Progid"
DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "Application"
WriteRegBin HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\OpenWithProgids" "$ClassName" ""
;
${If} ${AtLeastWinVista}
ReadRegStr $2 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "Progid"
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "Progid" "$ClassName"
${Select} $2
${Case2} "" "$ClassName"
${CaseElse}
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "AIMP.Backup" "$2"
${EndIf}
;
${Switch} ${extenstion}       
${Case} "AAC"
StrCpy $IconIndex 0
WriteRegStr HKCU "Software\Classes\$ClassName" "" "AIMP3: Advanced Audio Codec"
${Break}

${EndSwitch}
WriteRegStr HKCU "Software\Classes\$ClassName\DefaultIcon" "" "$IconFile,$IconIndex"       
 Pop $2
 Pop $1
!macroend


kotkovets 24-04-2012 15:26 1905081

Цитата:

Цитата wolkow70
${Select} $2
${Case2} "" "$ClassName"
${CaseElse} »

не закрыт этот макрос перед ${EndIf}, читайте до дыр предыдущее мое сообщение

wolkow70 24-04-2012 17:26 1905135

Цитата:

Цитата kotkovets
не закрыт этот макрос »

Подправил. Все работает отлично. Сборку обновил.

wolkow70 25-04-2012 16:26 1905740

kotkovets,

Использую ваш хедер "RegistryFunc.nsh" , но не могу в нем найти функцию определения пустого ключа.

Станадартная функция из справки
DeleteRegKey /ifempty HKLM "Software\A key that might have subkeys"
несколько раз подводила.

Еще вот нашел такое:

Код:

ClearErrors
EnumRegValue $R0 HKLM "${RegistryKey}" 0
IfErrors +1 +2
DetailPrint "(Registry Key Error: ${RegistryKey})" ; Put your error handling here.
StrCmp $R0 "" +1 +3
DeleteRegKey HKLM "${RegistryKey}" ; This will delete the key if there are no more values...
DetailPrint "Removing Registry Key: ${RegistryKey}"
  ;;Continue your stuff here.

Подскажите как лучше реализовать проверку ключа, и если он пуст, то удалить.
Интересует и возможная логическая конструкция для такого случая.

Пока сам сделал так, но думаю не идеальный вариант...

Код:

ReadRegStr $6 HKCU "Software\Classes\.${extenstion}" ""
${If} $6 == ""
DeleteRegKey HKCU "Software\Classes\.${extenstion}" ""
${EndIf}


kotkovets 25-04-2012 19:42 1905816

Цитата:

Цитата wolkow70
Пока сам сделал так, но думаю не идеальный вариант... »

это бред, удалять пустой параметр ключа по умолчанию, здесь удаление ключа раздела(подраздела),
если он пуст и нет параметров.
Цитата:

Если прочитать данные невозможно, то в переменную user_var будет записано пустое значение - будет установлен флаг ошибки.
то можно и так, для ключа по умолчанию, если он пуст:
Код:

ClearErrors
ReadRegStr $6 HKCU "Software\Classes\.${extenstion}" ""
${If} ${Errors}
  MessageBox MB_OK "ключ пуст"
${Else}
  MessageBox MB_OK "$6"
${EndIf}


wolkow70 26-04-2012 12:46 1906128

kotkovets,
Я так понимаю, что такая конструкция проверит и удалит ключ если он не содержит вообще никаких параметров.

Код:

${If} ${KeyExists} "${HKCU}\Software\Classes\.${extenstion}"
ClearErrors
EnumRegValue $3 HKCU "Software\Classes\.${extenstion}" 0
IfErrors +1 +2
DetailPrint "Ключ не содержит параметров: HKCU Software\Classes\.${extenstion}"
StrCmp $3 "" +1 +3
DeleteRegKey HKCU "Software\Classes\.${extenstion}" ""
DetailPrint "Удаление пустого ключа реестра: HKCU Software\Classes\.${extenstion}"
${EndIf}

http://nsis.sourceforge.net/How_to_d..._has_no_values

А такая конструкция удалит ключ, если нет параметра по умолчанию

Код:

ClearErrors
ReadRegStr $3 HKCU "Software\Classes\.${extenstion}" ""
${If} ${Errors}
DeleteRegKey HKCU "Software\Classes\.${extenstion}" ""
${EndIf}

Или я чего-то не понял?

dix75 26-04-2012 15:28 1906212

добрый день!

Почему может не срабатывает условие
!define DISPLAY_NAME "COOL"

ReadRegStr $0 HKCU "Software\Microsoft\" "var"

!if $0 == ${DISPLAY_NAME}
MessageBox MB_OK|MB_ICONQUESTION|MB_TOPMOST "IS... $0"
Quit
!endif

MessageBox MB_OK|MB_ICONQUESTION|MB_TOPMOST "It'S $0 ${DISPLAY_NAME}"

Заноситься строка и считывается нормально, визуально условие должно сработать так как они равны

kotkovets 26-04-2012 16:12 1906239

dix75,
Цитата:

!if !endif - это команды времени компиляции, а не выполнения программы.
Сранивать эначения можно и нужно так:
Код:

!include "MUI2.nsh"
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

ShowInstDetails show
OutFile "setup.exe"

!define DISPLAY_NAME "COOL"

Section
  ReadRegStr $0 HKCU "Software\Microsoft\" "var"
  ${If} $0 == ${DISPLAY_NAME}
    MessageBox MB_OK|MB_ICONQUESTION|MB_TOPMOST "IS... $0"
    Quit
  ${EndIf}
SectionEnd

или так:
Код:

  StrCmp $0 ${DISPLAY_NAME} 0 +3
  MessageBox MB_OK|MB_ICONQUESTION|MB_TOPMOST "IS... $0"
  Quit


dix75 26-04-2012 16:37 1906261

Спасибо.

А как можно переименовать ветку реестра?

wolkow70 26-04-2012 17:00 1906283

Так и не соображу как более рациональнее сделать.
Нужно соблюдение условий:

Код:

${If}

1. Если ключ реестра HKCU "Software\Classes\.${extenstion}" существует
    (как то так: ${If} ${KeyExists} "${HKCU}\Software\Classes\.${extenstion}")

2. И имеет присвоенное значение по умолчанию (задана ассоциация)

ReadRegStr $1 HKCU "Software\Classes\.${extenstion}" ""
WriteRegStr HKCU "Software\Classes\.${extenstion}" "" "$ClassName"
WriteRegStr HKCU "Software\Classes\.${extenstion}" "DaumLiveBackup.bak" "$1"
(перезапись ассоциации в HKCU "Software\Classes\.${extenstion}")

${Else}
WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "" "$ClassName"
(запись ассоциации в  HKLM "Software\Classes\.${extenstion}" 
${EndIf}


K.A.V. 26-04-2012 17:32 1906308

dix75, в шапке темы прочитайте

Цитата:

Цитата kotkovets
ВНИМАНИЕ! прежде, чем задать вопрос, почитайте, где Вы найдете ответы на большинство вопросов:
Справочник по NSIS - создан силами нашего сообщества. »

Качаем справочник и изучаем

wolkow70 27-04-2012 14:34 1906726

Цитата:

Цитата wolkow70
Так и не соображу как более рациональнее сделать. »

Да так и сделал (упрощенно):

Код:

ReadRegStr $4 HKCU "Software\Classes\.${extenstion}" ""
${If} ${Errors}
WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "" "$ClassName"
${Else}
WriteRegStr HKCU "Software\Classes\.${extenstion}" "" "$ClassName"
${EndIf}

А можно перестраховаться и сделать так:

Код:

${If} ${KeyExists} "${HKCU}\Software\Classes\.${extenstion}"
ClearErrors
ReadRegStr $4 HKCU "Software\Classes\.${extenstion}" ""
${If} ${Errors}
WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "" "$ClassName"
${Else}
WriteRegStr HKCU "Software\Classes\.${extenstion}" "" "$ClassName"
${EndIf}
${Else}
WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "" "$ClassName"
${EndIf}


dix75 28-04-2012 12:29 1907233

Что здесь не так
Код:

${StrRep} $folder $folder "/" "\"
Код:

!insertmacro: macro "FUNCTION_STRING_StrRep" requires 0 parameter(s), passed 4!
Решено. Спасибо

dix75 28-04-2012 13:16 1907263

Подскажите как экранировать "

K.A.V. 28-04-2012 13:21 1907267

Цитата:

Цитата dix75
Подскажите как экранировать " »

Используйте одинарную кавычку ' (буква Э на английской раскладке)
Либо знак ` (буква Ё)

Например:
Код:

'  "Двойные кавычки"  '
или
Код:

`    "Двойные кавычки" 'Одинарные кавычки'  `

dix75 28-04-2012 13:47 1907282

Спасиб.

dix75 28-04-2012 16:19 1907357

Возможно ли такое

Имеется JSON строка неопределенного размера

{"hello":"bla-bla"}
Как изменить bla-bla на что нить другое

K.A.V. 28-04-2012 17:34 1907389

Цитата:

Цитата dix75
Возможно ли такое »

А возможно ли такое, что вы возьмёте, прочтёте наш справочник, и найдёте там свой ответ?
В шапке темы уже и красным жирным шрифтом выделили, а вы забегаете и быстрей сообщение писать

Изучите наш справочник и не задавайте вопрсов, на которые уже есть ответ в справочнике
Справочник по NSIS

dix75 28-04-2012 17:56 1907396

K.A.V.,
В доль и поперек его изучил плюс изучил все функции http://nsis.sourceforge.net/Category:String_Functions
ничего нет и близко.

K.A.V. 28-04-2012 18:01 1907398

Цитата:

Цитата dix75
ничего нет и близко. »

Читайте справочник ещё раз!
Там есть описание функции, которая позволяет заменять в строках слова, я сам добавлял описание и знаю, что там есть, а чего нет
Описание нужной вам команды там есть

Там кода - 1 строка, 1 команда, но я из принципа её сюда не буду писать

dix75 28-04-2012 18:28 1907410

K.A.V.,
Блин неправильно задание написал.
Имеется JSON строка вида

{"hello":"bla-bla"}
Как изменить bla-bla на что нить другое, известно только слово "hello"
"bla-bla" неизвестно.
такой кусок может располагаться в любом месте строки кол-во пробелов между : неограничено или может вообще отсутствовать.
Поэтому
${WordReplace} не подходит, да практически все что просмотрел.

Regex того что нужно
Код:

/^.*\"hello\"\s*:\s*\"([^\"])+\"$/

kotkovets 28-04-2012 18:44 1907414

Цитата:

Цитата dix75
В доль и поперек его изучил плюс изучил все функции »

Цитата:

Цитата dix75
${WordReplace} не подходит, да практически все что просмотрел. »

хреново смотрели, аль лень думать?
Код:

  ${WordReplace} '{"hello":"bla-bla"}' 'bla-bla' 'kettle dix75' "+" '$0'
  MessageBox MB_OK "$0" IDOK


K.A.V. 28-04-2012 20:46 1907478

Цитата:

Цитата dix75
Блин неправильно задание написал. »

ага, мы тут сидим домашнюю работу делаем, нам приходят, задают что нужно сделать, а мы сидим и решаем задания

Цитата:

Цитата kotkovets
хреново смотрели, аль лень думать? »

1+2

dix75 28-04-2012 20:55 1907481

kotkovets,
Я же ясно написал что
Цитата:

Цитата dix75
"bla-bla" неизвестно. »

известно только hello
вместо bla-bla может быть что угодно.
Заранее не известное
т.е мне нужно найти то, что идет за hello в двойных кавычках
При этом не известно через сколько символов начинаются двойные кавычки

kotkovets 28-04-2012 21:37 1907500

Цитата:

Цитата dix75
известно только hello
вместо bla-bla может быть что угодно. »

Strlen и StrCpy

K.A.V. 28-04-2012 21:45 1907504

dix75, пару страничек назад в этой теме, мы обсуждали, как в строке получить значение после определённого символа, вот сидите разбирайтесь

C помощью команды ${StrStrAdv} - #2504
C помощью команды ${WordFind2X} - #2522

Olef2387 29-04-2012 11:30 1907689

Добрый день!
Для описания Read me в rtf-файле использовал шрифт Consolas.
Узнал что этого шрифта нет по умолчанию в WinXP.
Т.е получается чтобы текст у всех правильно отображался, надо этот шриф включать в инсталлер. Вопрос, как это правильно сделать? Ведь он же ещё установиться должен, как я понял сразу при запуске инсталлера, наверно. Чтобы когда юзер дойдёт до страницы ридми шрифт уже был в системе.
Нарыл плагин вроде на эту тему. Но разобраться не смог в нём
http://nsis.sourceforge.net/Advanced_Font_Installation

Aster 30-04-2012 13:53 1908240

Вопрос про шрифты интересный.
Я бы тоже не прочь использовать в установщике не стандартные шрифты.
А если бы вместо rtf, NSIS поддерживал бы интеграцию из html-страниц - была бы вообще песня)

Olef2387, к сожалению напрямую в Вашем вопросе помочь не могу.
Могу лишь посоветовать альтернативу Consolas'у.
Используйте шрифт Trebuchet MS, он входит в состав дефолтных шрифтов как минимум начиная c Win XP.
Похож на Consolas и выглядит вполне себе приятно (лучше применять к нему курсив и размер 10-11).

K.A.V. 30-04-2012 16:13 1908307

Цитата:

Цитата Olef2387
Нарыл плагин вроде на эту тему. Но разобраться не смог в нём »

Там вроде как 2 макроса предназначены для установки шрифта...Или может просто увидели большой код и испугались? ;)
Попозже посмотрю, если kotkovets раньше ответ не даст


Цитата:

Цитата Aster
А если бы вместо rtf, NSIS поддерживал бы интеграцию из html-страниц - была бы вообще песня) »

NsWeb plug-in прекрасно справится с задачей отображения HTML странички в инсталляторе ;)

K.A.V. 30-04-2012 16:39 1908322

Вложений: 1
Olef2387
Быстрый набросок...

Olef2387 30-04-2012 21:40 1908487

Цитата:

Цитата Aster
Используйте шрифт Trebuchet MS, он входит в состав дефолтных шрифтов как минимум начиная c Win XP.
Похож на Consolas и выглядит вполне себе приятно (лучше применять к нему курсив и размер 10-11). »

Спасибо хорошая замена консолосу. Консолас тоже просто шрифт стандартный, но идёт начиная с Вин Виста.

Цитата:

Цитата K.A.V.
Olef2387
Быстрый набросок... »

Благодарю! Но не компилируется...
nvalid command: FontName::Name
Error in macro FontName on macroline 3
Error in macro InstallTTF on macroline 43

K.A.V. 30-04-2012 21:46 1908492

Цитата:

Цитата Olef2387
nvalid command: FontName::Name »

http://nsis.sourceforge.net/FontName_plug-in
установите себе этот плагин, у вас библиотеки нет

kotkovets 30-04-2012 23:18 1908547

Вложений: 1
Olef2387, Возможно и так упрощенным вариантом без плагина.

Olef2387 01-05-2012 09:03 1908616

kotkovets. Супер! Во всех тонкостях разбираетесь, парни. Респект!
Как пожеланье - материал по установки своих шрифтов в инсталлер можно включить в обновлённый справочник NSIS,шрифты - очень полезная вещь для креатива :)

K.A.V. 01-05-2012 10:10 1908634

Цитата:

Цитата Olef2387
Как пожеланье - материал по установки своих шрифтов в инсталлер можно включить в обновлённый справочник NSIS,шрифты - очень полезная вещь для креатива »

Как пожелание, оставляйте свои пожелания к справочнику в соответствующей теме - Справочник по NSIS

Вот в той теме и описывайте, что хотите видеть в справочнике
А в этой теме мы обсуждаем только вопросы по коду, давайте будем писать там, где нужно ;)

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

Olef2387 02-05-2012 12:00 1909122

K.A.V., ok.

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

2. У меня в скрипте выбран русский язык. Почему вот это сообщение с ошибкой у пользователей появляется на инглише?

Хотелось бы исправить.
Спасибо!

dix75 02-05-2012 12:47 1909143

K.A.V.,
Спасибо

dix75 02-05-2012 13:22 1909158

Добрый день!
Такой вопрос имеется база данных SQLite.
Есть ли модули позволяющие получить доступ к бд и выполнить запрос?

K.A.V. 02-05-2012 20:27 1909386

Цитата:

Цитата Olef2387
1. Можно ли как-нибудь сделать так чтобы в NSIS при подрузке текста из rtf, не показывался мерцающий курсор... Это немного раздражает... »

Не задавался этим вопросом и ничего по этому поводу сказать не могу

Цитата:

Цитата Olef2387
2. У меня в скрипте выбран русский язык. Почему вот это сообщение с ошибкой у пользователей появляется на инглише? »

Это системное сообщение NSIS и оно не зависит от выбранного вами языка

Цитата:

Цитата dix75
Есть ли модули позволяющие получить доступ к бд и выполнить запрос? »

MSSQL OLEDB plug-in

dix75 03-05-2012 12:32 1909739

Цитата:

Цитата K.A.V.
MSSQL OLEDB plug-in »

так это MSSQL а не SQLite

MKN 03-05-2012 13:09 1909771

dix75,
Где то видел использование совместно с NSIS - sqlite3.exe (http://sqlite.org/download.html)
здесь - http://forums.winamp.com/showthread.php?t=339375

Olef2387 03-05-2012 21:11 1910046

Всем привет.
_______

Цитата:

Цитата K.A.V.
Это системное сообщение NSIS и оно не зависит от выбранного вами языка »

Спасибо. А где текст этого сообщения не знаете? Чтобы вручную изменить его.



И ещё Вопрос... Как переместить файл, если известно только его расширение?
То есть как при перемещении файлов использовать маску файлов например *.dll

Так не работает...
Rename $DOCUMENTS\Dock\*.dll $DOCUMENTS\Dock2\*.dll

K.A.V. 03-05-2012 21:26 1910056

Цитата:

Цитата Olef2387
Спасибо. А где текст этого сообщения не знаете? Чтобы вручную изменить его. »

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

Цитата:

Цитата Olef2387
Так не работает...
Rename $DOCUMENTS\Dock\*.dll $DOCUMENTS\Dock2\*.dll »

И не должно....

Смотрите в справочнике команду "Перевод справки NSIS => FindFirst"
Делайте переименование при перечислении файлов

Olef2387 03-05-2012 21:40 1910065

K.A.V., я дико извиняюсь, знаю, что вы скажите что Вас опять просят прислать готовый код, а сами думать не хотят... Но тем не менее... Маленький примерчик не могли бы мне показать.

P\s: Нужно не переименовать, а переместить

K.A.V. 03-05-2012 21:49 1910073

Цитата:

Цитата Справочник по NSIS
FindFirst $0 $1 $WINDIR\*.exe
loop:
StrCmp $1 "" done
MessageBox MB_OK|MB_ICONINFORMATION "$1"
FindNext $0 $1
Goto loop
done:
FindClose $0


--


Код:

FindFirst $0 $1 "$DOCUMENTS\Dock\*.dll"
loop:
StrCmp $1 "" done

Rename "$DOCUMENTS\Dock\$1"  "$DOCUMENTS\Dock2\$1"

FindNext $0 $1
Goto loop
done:
FindClose $0


Olef2387 03-05-2012 21:56 1910078

K.A.V.
Моё почтение.
Просто не знал после чего добавить команду перемещения в скрипт перечисления.
-----------------
А по ошибке... Я скачал исходники NSIS...
В каком файле искать текст с ошибкой и как потом компилировать сборку?
У меня народ не понимает что от них хотят, когда видятэтот текст на буржуйском языке)
А сборку я для всех потом выложу :)

K.A.V. 03-05-2012 22:01 1910083

Цитата:

Цитата Olef2387
Просто не знал после чего добавить команду перемещения в скрипт перечисления. »

Ну там же в примере кода, стоит команда на показ сообщения пользователю...Туда и нужно было вставлять ;)

Цитата:

Цитата Olef2387
В каком файле искать текст с ошибкой »

Я не помнююю, я искал этот текст года 3-4 назад, просто помню что задавался этим вопросом
Возьмите, к примеру, Total Commander и произведите поиск фразы в файлах, ищите фразу со ссылкой на страницу "NSIS_Error"

Цитата:

Цитата Olef2387
и как потом компилировать сборку? »

Не знаю :)
Смотрите страницу "Building NSIS" в оригинальной справке NSIS

Olef2387 03-05-2012 22:10 1910092

Код:

FindFirst $0 $1 "$DOCUMENTS\Dock\*.dll"
loop:
StrCmp $1 "" done
Rename "$DOCUMENTS\Dock\$1" "$DOCUMENTS\Dock2\$1"
FindNext $0 $1
Goto loop
done:
FindClose $0

К сожалению не срабатывает тоже... :(

K.A.V. 03-05-2012 22:16 1910102

Цитата:

Цитата Olef2387
К сожалению не срабатывает тоже... »

Ну как это не срабатывает, если он рабочий???
У меня всё работает...
Может, у вас конечной директории не существует??

Olef2387 03-05-2012 22:23 1910110

K.A.V., да, действительно. Я рассчитывал что эта директория автоматически создастся...
Теперь к коду ещё надо создание директории прописывать?...

А также в дополнении, если файлы не только dll-разрешения нужно переместить но ещё и *sys допустим? Как это в коде добавить? или заново писать?

FindFirst $0 $1 "$DOCUMENTS\Dock\*.sys"
loop:
StrCmp $1 "" done
Rename "$DOCUMENTS\Dock\$1" "$DOCUMENTS\Dock2\$1"
FindNext $0 $1
Goto loop
done:
FindClose $0

K.A.V. 03-05-2012 22:31 1910116

Цитата:

Цитата Olef2387
Теперь к коду ещё надо создание директории прописывать?... »

Ну конечно надо!
Как вы съедите мандаринку, если её у вас нет? ;)
Нужно создать мандаринку, а только потом её скушать :)

Цитата:

Цитата Olef2387
или заново писать? »

Можете добавить ещё кусок кода, но с sys расширением

Либо запустить перечисление всех файлов, а уже при определении отсекать 3 символа с конца строки, которая содержит имя файла, и сравнивать, если DLL или SYS расширение у файла, перемещать...


Код:

FindFirst $0 $1 "$DESKTOP\1\*.*"
 loop:
 StrCmp $1 "" done
 
 StrCpy $2 "$1" "" -3 ; Отсчитываем 3 символа с конца имени файла
 StrCmp $2 "dll" +2 0 ; DLL? - перемещаем!
 StrCmp $2 "sys" 0 FindNext ; SYS? - перемещаем! Нет? - пропускаем

 Rename "$DESKTOP\1\$1" "$DESKTOP\2\$1"

 FindNext:
 FindNext $0 $1
 Goto loop
 done:
 FindClose $0


Olef2387 03-05-2012 22:39 1910123

SetOutPath "$INSTDIR\primer\"
File "failo\olef.txt"
вот при такой команде папка primer создаётся автоматически...

K.A.V.
большое спасибо за помощь. У меня серьёзный цейтнот. Подскажите, пожалуйста, где в справочнике смотреть команду для создания папки?

K.A.V. 03-05-2012 22:42 1910126

Цитата:

Цитата Olef2387
Посдкажите, пожалуйста, где в справочнике смотреть команду для создания папки? »

А я такие простые команды в справочник не добавлял :tongue:

Код:

CreateDirectory "$INSTDIR\Моя папка"

kotkovets 03-05-2012 23:13 1910154

Цитата:

Цитата Olef2387
А по ошибке... Я скачал исходники NSIS...
В каком файле искать текст с ошибкой и как потом компилировать сборку? »

ого, ТАКИЕ ПЛАНЫ! А почему такие, ламерские(в этом случае уместно) задаете?

Olef2387 04-05-2012 12:42 1910375

Цитата:

Цитата kotkovets
ого, ТАКИЕ ПЛАНЫ! А почему такие, ламерские(в этом случае уместно) задаете? »

Ну а что если никто из мастеров ранее этот вопрос не решил... Если есть что сказать по изменению текста этой ошибки - велкам :)
Пока надо найти откуда выводится текст... Перерыл исходники - не обнаружил текста (но это может из-за того что я слепошарый ламер). А может текст как-то кодируется\ генерируется - я ламер, сложно разобраться. :)
погуглил - буржуи пишут что правда надо менять в исходных кодах текст. Но какой файл отвечает за это не указывают.
http://stackoverflow.com/questions/1...about-crccheck

K.A.V. 04-05-2012 15:18 1910490

Вложений: 1
Olef2387, поиск фразы занял 3 секунды на моём слабеньком процессоре
Если вы даже не в состоянии найти текст в файле, то...бросайте эту задумку, да не в обиду будет сказано

wolkow70 06-05-2012 20:45 1911612

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

!define MUI_UNFINISHPAGE_NOAUTOCLOSE

И если так не правильно , то как тогда правильно сделать?
Мне нужна возможность в деталях просматривать процесс деинсталяции.

wolkow70 07-05-2012 10:48 1911804

Цитата:

Цитата wolkow70
Может кто-нибудь подсказать почему не работает вот это в деинсталляторе?

!define MUI_UNFINISHPAGE_NOAUTOCLOSE »

Выяснил сам. Оказывается, что работает, нужно только в секции деинсталлятора убрать

SetAutoClose true

wolkow70 07-05-2012 13:11 1911878

Товарищи, подскажите как в
MB_USERICON подставить другую иконку, а не инсталлятора?

kotkovets 07-05-2012 14:55 1911926

Цитата:

Цитата wolkow70
Товарищи, подскажите как в
MB_USERICON подставить другую иконку, а не инсталлятора? »

Элементарно....
Код:

${MessageBoxEx}  "путь к файлу ресурсу, где иконка" "текст надписи" "текст заголовка" "стиль сообщения" "индекс иконки" "код возврата"
читать дальше »
Код:

!include "MUI2.nsh"
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE Russian
OutFile "msgbox-setup.exe"

!ifndef MB_OK
  !define MB_OK                      0x00000000
  !define MB_OKCANCEL                0x00000001
  !define MB_ABORTRETRYIGNORE        0x00000002
  !define MB_YESNOCANCEL              0x00000003
  !define MB_YESNO                    0x00000004
  !define MB_RETRYCANCEL              0x00000005
  !define MB_CANCELTRYCONTINUE        0x00000006
  !define MB_ICONHAND                0x00000010
  !define MB_ICONQUESTION            0x00000020
  !define MB_ICONEXCLAMATION          0x00000030
  !define MB_ICONASTERISK            0x00000040
  !define MB_USERICON                0x00000080
  !define MB_ICONWARNING              ${MB_ICONEXCLAMATION}
  !define MB_ICONERROR                ${MB_ICONHAND}
  !define MB_ICONINFORMATION          ${MB_ICONASTERISK}
  !define MB_ICONSTOP                ${MB_ICONHAND}
  !define MB_DEFBUTTON1              0x00000000
  !define MB_DEFBUTTON2              0x00000100
  !define MB_DEFBUTTON3              0x00000200
  !define MB_DEFBUTTON4              0x00000300
  !define MB_APPLMODAL                0x00000000
  !define MB_SYSTEMMODAL              0x00001000
  !define MB_TASKMODAL                0x00002000
  !define MB_HELP                    0x00004000
  !define MB_NOFOCUS                  0x00008000
  !define MB_SETFOREGROUND            0x00010000
  !define MB_DEFAULT_DESKTOP_ONLY    0x00020000
  !define MB_TOPMOST                  0x00040000
  !define MB_RIGHT                    0x00080000
  !define MB_RTLREADING              0x00100000
  !define IDABORT    3
  !define IDCANCEL  2
  !define IDCONTINUE 11
  !define IDIGNORE  5
  !define IDNO      7
  !define IDOK      1
  !define IDRETRY    4
  !define IDTRYAGAIN 10
  !define IDYES      6
!endif
!define MessageBoxEx "!insertmacro macro_MessageBoxIndirect"
!macro macro_MessageBoxIndirect Library lpszText lpszCaption dwStyle lpszIcon ExitCode
  Push `${lpszText}`
  Push `${lpszCaption}`
  Push `${Library}`
  Push `${dwStyle}`
  Push `${lpszIcon}`
  System::Store Sr1r2r3r4r5
  System::Call 'kernel32::LoadLibrary(tr3)i.r0'
  StrCmp $0 0 +5
  System::Call '*(&l4, i$HWNDPARENT, ir0, tr5, tr4, i$2|${MB_USERICON}, ir1, i,k,i)i.r5'
  System::Call 'user32::MessageBoxIndirect(ir5) i.s'
  System::Call "kernel32::FreeLibrary(ir0)"
  System::Free $5
  StrCmp $0 0 0 +2
  Push "error"
  System::Store L
  Pop `${ExitCode}`
!macroend

Section
  ${MessageBoxEx} "$SYSDIR\shell32.dll" "lpszText" "lpszCaption" "${MB_YESNOCANCEL}" "194" $1
  ${If} $1 == ${IDYES}
      MessageBox MB_OK "Нажали кнопку `Да`"
  ${ElseIf} $1 == ${IDNO}
      MessageBox MB_OK "Нажали кнопку `Heт`"
  ${ElseIf} $1 == ${IDCANCEL}
      MessageBox MB_OK "Нажали кнопку `Отмена`"
  ${Else}
      MessageBox MB_OK "$$1 = $1"
  ${EndIf}
SectionEnd


wolkow70 07-05-2012 15:22 1911941

Цитата:

Цитата kotkovets
Элементарно.... »

Кому как. Мне с этим вряд ли разобраться.

Мне надо в сообщении типа этого просто иконку другую указать.

MessageBox MB_YESNO|MB_USERICON|MB_TOPMOST "Внимание!$\n\
$\nЕсли у вас открыты окна браузеров Internet Explorer, Mozilla Firefox,$\nOpera, Google Chrome закройте их перед продолжением установки. \
$\nВ противном случае, они будут закрыты принудительно! \
$\nЭто избавит от конфликтов интеграции программы. \
$\nПродолжить установку ${PRODUCT_NAME} ?" /SD IDYES IDYES continue IDNO close
;
close:
Abort
continue:

kotkovets 07-05-2012 16:28 1911988

Цитата:

Цитата wolkow70
Кому как. Мне с этим вряд ли разобраться.
Мне надо в сообщении типа этого просто иконку другую указать. »

ну так и указываете, хоть с исполняемого файла оперы.
Код:

  ${IfNot} ${Silent}
    ${MessageBoxEx} "$SYSDIR\shell32.dll" "lpszText" "lpszCaption" "${MB_YESNO}|${MB_TOPMOST}" "512" $1
  ${Else}
    StrCpy $1 ${IDYES}
  ${EndIf}
  ${If} $1 == ${IDYES}
      MessageBox MB_OK "Нажали кнопку `Да`"
  ${ElseIf} $1 == ${IDNO}
      MessageBox MB_OK "Нажали кнопку `Heт`"
  ${EndIf}


wolkow70 10-05-2012 13:42 1913398

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

В функции вот что:

Код:

Function fnCustomInit
nsDialogs::Create 1018
Pop $Dialog
${NSD_CreateLabel} 0 0 100% 12u "Вы можете ознакомиться с информацией об устанавливаемой программе"
        Pop $Label
${NSD_CreateText} 0 13u 100% -13u "${pkgdir}\FlylinkDC++\readme_ru-RU.rtf"
        Pop $Text
nsDialogs::Show
FunctionEnd


kotkovets 10-05-2012 15:04 1913451

Цитата:

Цитата wolkow70
как на собственную страницу поместить просмотр текстового документа? »

Вот так:
читать дальше »
Код:

!include "MUI2.nsh"
!include "FileFunc.nsh"

 Page custom  Help
 !insertmacro MUI_PAGE_INSTFILES
 !insertmacro MUI_LANGUAGE "Russian"

 InstallDir "$PROGRAMFILES\LICENSE"
 OutFile "Basic.exe"

 Var TextPage
 Var Dialog
 Var Label
 
!define LoadRTF "!insertmacro macro_LoadRTFfunc"
!define __NSD_RichEdit_CLASS "RichEdit20A"
!define __NSD_RichEdit_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${WS_VSCROLL}|${ES_AUTOHSCROLL}|${ES_MULTILINE}|${ES_WANTRETURN}
!define __NSD_RichEdit_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE}
!insertmacro __NSD_DefineControl RichEdit
!macro macro_LoadRTFfunc file hwnd
    Push `${file}`
    Push ${hwnd}
    System::Store Sr0r1
    SendMessage $0 1077 0 0x7fffffff
    System::Get "(i, i.R0, i.R1, i.R2) iss"
    Pop $2
    System::Call "*(i 0, i 0, k r2) i .r3"
    System::Call "user32::SendMessage(ir0, i1097, i2, ir3)i.s"
    Pop $4
    Push $4
    ClearErrors
    FileOpen $1 "$1" r
    ${Do}
        Pop $0
        ${IfThen} "$0" != "$4" ${|}${Break}${|}
        System::Call "kernel32::ReadFile(ir1, iR0, iR1, iR2, i0)"
        Push 0
        System::Call "$2"
    ${Loop}
    FileClose $1
    System::Free $3
    System::Free $2
    System::Store L
!macroend

Function Help
  nsDialogs::Create 1018
  Pop $Dialog
  ${NSD_CreateLabel} 0 0 100% 12u "Вы можете ознакомиться с информацией об устанавливаемой программе"
  Pop $Label
  ${NSD_CreateRichEdit} 0 13u 100% 100% ""
  Pop $TextPage
  ${LoadRTF} "$EXEDIR\test.rtf" $TextPage
  nsDialogs::Show
 FunctionEnd

 Section "Main"
 SectionEnd


wolkow70 10-05-2012 15:38 1913476

kotkovets, Работает вариант, но не думал, что так сложно. Исходил из предположения, что в NSIS есть механизм чтения RTF - файлов (ведь текст лицензии он прокручивает).

wolkow70 10-05-2012 17:25 1913543

kotkovets, Откопал на Ру-борде ваш старенький скрипт, который мне весьма помог:

http://forum.ru-board.com/topic.cgi?...&limit=1&m=1#1

Для меня полезным оказалось !insertmacro MUI_HEADER_TEXT_PAGE
Не мог понять как вставить заголовки на костомную страницу. Этот вариант сработал.

MKN 11-05-2012 17:31 1914115

Набрёл случайно на вопрос, суть которого такова - "Как сделать так, чтобы кликнув на хелп-кнопочке (обозначенной знаком вопроса), рядом с каким либо элементом или надписью на странице - появлялось окно с сопроводительным текстом и, если надо, элементами управления ? Есть ли для этого какой либо плагин ?"
Оказывается есть такой (но его почему то нет в списке http://nsis.sourceforge.net/Category:Plugins)
Называется плагин nsWindows и живёт здесь :
http://forums.winamp.com/showthread....ight=nswindows
Только нагорожено в нём изрядно, а примеры мутные... Ежели бы этот плагин кто из специалистов "причесал" и упростил для поставленной задачи, то наверное была бы польза...

kotkovets 11-05-2012 19:46 1914171

Цитата:

Цитата MKN
Только нагорожено в нём изрядно, а примеры мутные... »

этот плаг модифицированный nsDialogs - достойное и верное продолжение nsWindows.
но неинтересно ковыряться абсолютно!

wolkow70 12-05-2012 14:33 1914573

kotkovets, может посоветуете как справиться с задачкой:

!define MUI_STARTMENUPAGE_DEFAULTFOLDER "MyApp"
!define MUI_STARTMENUPAGE_REGISTRY_ROOT ${PRODUCT_UNINST_ROOT_KEY}
!define MUI_STARTMENUPAGE_REGISTRY_KEY "${PRODUCT_UNINST_KEY}"
!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Icon Group"

На x86 все нормально. На системе X64 запись деинсталляции как и нужно создается в 64-битном реестре (через SetRegView 64), а значение "Icon Group" прописыается в 32-битный реестр. И как тут лучше сделать, учитывая, что путь к параметру задается через !define ?

kotkovets 12-05-2012 15:15 1914586

wolkow70, обычной записью в реестре и чтением значение параметра деинсталятором.

wolkow70 12-05-2012 15:48 1914608

Цитата:

Цитата kotkovets
wolkow70, обычной записью в реестре и чтением значение параметра деинсталятором. »

Тогда мне непонятно, как это будет выглядеть в контексте работы макроса

!insertmacro MUI_PAGE_STARTMENU Application $StartMenuFolder

!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
CreateDirectory "$SMPROGRAMS\$StartMenuFolder"

И в деинсталляторе:

!insertmacro MUI_STARTMENU_GETFOLDER Application $StartMenuFolder

Можно ли переназначать

!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"

в зависимости от разрядности системы, может в Function .onInit как то ?

kotkovets 12-05-2012 18:49 1914723

Цитата:

Цитата wolkow70
Можно ли переназначать
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"
в зависимости от разрядности системы, может в Function .onInit как то ? »

константы нет - это время компиляции. Для этого есть переменные - в любом месте кода.

wolkow70 13-05-2012 09:55 1914974

Цитата:

Цитата kotkovets
Для этого есть переменные - в любом месте кода. »

Не получается:

Код:

Function .onInit
${If} ${RunningX64}
SetRegView 64
StrCpy $PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
StrCpy $PRODUCT_UNINST_ROOT_KEY "HKLM"
SetRegView 32
${Else}
StrCpy $PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
StrCpy $PRODUCT_UNINST_ROOT_KEY "HKLM"
${EndIf}
FunctionEnd

при этом закоментировал:
;!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
;!define PRODUCT_UNINST_ROOT_KEY "HKLM"

При копиляции ошибка в строках:

Код:

Usage: ReadRegStr $(user_var: output) rootkey subkey entry
  root_key=(HKCR|HKLM|HKCU|HKU|HKCC|HKDD|HKPD|SHCTX)
Error in macro MUI_FUNCTION_STARTMENUPAGE on macroline 12
Error in macro MUI_PAGEDECLARATION_STARTMENU on macroline 30
Error in macro MUI_PAGE_STARTMENU on macroline 6


kotkovets 13-05-2012 10:31 1914989

wolkow70,
Цитата:

Цитата wolkow70
StrCpy $PRODUCT_UNINST_ROOT_KEY "HKLM" »

и не принимают команды работы с реестром: переменную как ветку :confused:
а зачем трогать, коль ветка неизменна и значения переменных не изменяются, тупо!
да еще в функции .OnInit сразу переключаться в 32-разряд :)
я же говорил, непосредственно перед записью самым обычным способом, переключать вид реестра.

wolkow70 13-05-2012 11:13 1915007

Цитата:

Цитата kotkovets
я же говорил, непосредственно перед записью самым обычным способом, переключать вид реестра. »

Перед какой записью то? Запись идет подключением макроса:

Код:

Section "Создать ярлыки в меню Пуск" StartMenu
SetShellVarContext all
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
CreateDirectory "$SMPROGRAMS\$StartMenuFolder"
CreateShortCut "$SMPROGRAMS\$StartMenuFolder\${PRODUCT_NAME}.lnk" "$INSTDIR\MyApp.exe"
!insertmacro MUI_STARTMENU_WRITE_END
SectionEnd

И значение $StartMenuFolder заведомо не известно.
Перед макросом что-ли ставить SetRegView 64 ?

kotkovets 13-05-2012 11:29 1915010

wolkow70, вроде бы по русскому говорю...

Цитата:

Цитата wolkow70
Перед макросом что-ли ставить SetRegView 64 ? »

ну тут же очевидно, идет запись в реестр, сам макрос MUI_STARTMENU_WRITE_END
Код:

!macro MUI_STARTMENU_WRITE_END

  !verbose push
  !verbose ${MUI_VERBOSE}

    !ifdef MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_ROOT & MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_KEY & MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_VALUENAME
      ;Write folder to registry
      WriteRegStr "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_ROOT}" "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_KEY}" "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_VALUENAME}" "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_VARIABLE}"
    !endif

  ${endif}

  !undef MUI_STARTMENUPAGE_CURRENT_ID

  !verbose pop

!macroend


wolkow70 13-05-2012 11:44 1915017

Цитата:

Цитата kotkovets
вроде бы по русскому говорю... »

Не "по русскому", а "по русски" :).
А сделал я все ориентируясь на пример из справки.

wolkow70 13-05-2012 13:42 1915065

Цитата:

Цитата kotkovets
ну тут же очевидно, идет запись в реестр, сам макрос MUI_STARTMENU_WRITE_END »

Я так сделал, все работает как надо.

Код:

Section "Создать ярлыки в меню Пуск" StartMenu
${If} ${RunningX64}
SetRegView 64
SetShellVarContext all
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
CreateDirectory "$SMPROGRAMS\$StartMenuFolder"
CreateShortCut "$SMPROGRAMS\$StartMenuFolder\Удалить ${PRODUCT_NAME}.lnk" "$INSTDIR\Uninstall.exe" 0
CreateShortCut "$SMPROGRAMS\$StartMenuFolder\${PRODUCT_NAME}.lnk" "$INSTDIR\MyApp.exe"
!insertmacro MUI_STARTMENU_WRITE_END
SetRegView 32
${Else}
SetShellVarContext all
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
CreateDirectory "$SMPROGRAMS\$StartMenuFolder"
CreateShortCut "$SMPROGRAMS\$StartMenuFolder\Удалить ${PRODUCT_NAME}.lnk" "$INSTDIR\Uninstall.exe" 0
CreateShortCut "$SMPROGRAMS\$StartMenuFolder\${PRODUCT_NAME}.lnk" "$INSTDIR\MyApp.exe"
!insertmacro MUI_STARTMENU_WRITE_END
${EndIf}
SectionEnd


kotkovets 13-05-2012 14:08 1915083

wolkow70, можно проще, зачем повторно прописывать команды?
Код:

Section "Создать ярлыки в меню Пуск" StartMenu
        ${IfThen} ${RunningX64} ${|}SetRegView 64${|}
        SetShellVarContext all
        !insertmacro MUI_STARTMENU_WRITE_BEGIN Application
        CreateDirectory "$SMPROGRAMS\$StartMenuFolder"
        CreateShortCut "$SMPROGRAMS\$StartMenuFolder\Удалить ${PRODUCT_NAME}.lnk" "$INSTDIR\Uninstall.exe" 0
        CreateShortCut "$SMPROGRAMS\$StartMenuFolder\${PRODUCT_NAME}.lnk" "$INSTDIR\MyApp.exe"
        !insertmacro MUI_STARTMENU_WRITE_END
        ${IfThen} ${RunningX64} ${|}SetRegView 32${|}
SectionEnd


Olef2387 13-05-2012 23:07 1915408

Привет.

Продолжаю изучение NSIS... Задачка

Есть 20 компонентов. При установке юзер должен выбрать 1 из этих 20.
На эту тему нашёл информацию в справке. И всё работает.
Пример на 6 компонентах

читать дальше »
Код:

Section /o "Компонент №1" ID_1
SectionEnd

Section /o "Компонент №2" ID_2
SectionEnd

Section /o "Компонент №3" ID_3
SectionEnd

Section /o "Компонент №4" ID_4
SectionEnd

Section /o "Компонент №5" ID_5
SectionEnd

Section /o "Компонент №6" ID_6
SectionEnd

Function .onSelChange

!insertmacro StartRadioButtons $1
    !insertmacro RadioButton ${ID_1}
    !insertmacro RadioButton ${ID_2}
    !insertmacro RadioButton ${ID_3}
 !insertmacro RadioButton ${ID_4}
!insertmacro RadioButton ${ID_5}
    !insertmacro RadioButton ${ID_6}
  !insertmacro EndRadioButtons

FunctionEnd



Нужно дополнить...
1. Чтобы кнопка ДАЛЕЕ была неактивна пока не будет выбран 1 из компонентов.
2. Так как компонентов много, хотелось бы их объединить в группу... Команда SectionGroup объединяет их в группу, но там если галочку нажать - выбираются сразу все компоненты в группе... А у меня в данном случае только 1 компонент должен быть выбран.

Вот так. Извиняюсь, если опять что-то наиэлементарнейшее спросил :)

kotkovets 14-05-2012 14:23 1915688

Цитата:

Цитата Olef2387
1. Чтобы кнопка ДАЛЕЕ была неактивна пока не будет выбран 1 из компонентов.
2. Так как компонентов много, хотелось бы их объединить в группу... Команда SectionGroup объединяет их в группу, но там если галочку нажать - выбираются сразу все компоненты в группе... А у меня в данном случае только 1 компонент должен быть выбран »

ну можно как-то так на скорую руку:
читать дальше »
Код:

OutFile "example.exe"

var hInst

!include "MUI2.nsh"

!insertmacro MUI_PAGE_WELCOME
  ;функция во время открытия странички компонентов
  !define MUI_PAGE_CUSTOMFUNCTION_SHOW COMPONENTS_SHOW
  ;---------------------------------------------------
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE Russian

;макрос проверки секций, если одна из секций отмечена возврат - 1, иначе - 0;
;в intsec - указываем количество секций в скрипте
!macro CheckSection intsec ret
  Push ${intsec}
  System::Store SR2
  ${For} $R0 1 $R2
      SectionGetFlags $R0 $R1
      ${IfThen} $R1 == 1 ${|}${Break}${|}
  ${Next}
  Push $R1
  System::Store L
  Pop ${ret}
!macroend


SubSection /e test IDS_1

Section  /o "Компонент №1" ID_1
SectionEnd

Section /o "Компонент №2" ID_2
SectionEnd

Section /o "Компонент №3" ID_3
SectionEnd

Section /o "Компонент №4" ID_4
SectionEnd

Section /o "Компонент №5" ID_5
SectionEnd

Section /o "Компонент №6" ID_6
SectionEnd

SubSectionEnd

Function .onSelChange
!insertmacro StartRadioButtons $1
    !insertmacro RadioButton ${ID_1}
    !insertmacro RadioButton ${ID_2}
    !insertmacro RadioButton ${ID_3}
    !insertmacro RadioButton ${ID_4}
    !insertmacro RadioButton ${ID_5}
    !insertmacro RadioButton ${ID_6}
  !insertmacro EndRadioButtons
  !insertmacro CheckSection 6 $R0
  StrCmp $R0 0 0 +2
  EnableWindow $hInst ${SW_HIDE} ;отключаем кнопку "установить"
  StrCmp $R0 1 0 +2
  EnableWindow $hInst ${SW_SHOW} ;включаем кнопку "установить"
FunctionEnd

Function .OnInit
  StrCpy $1 ${ID_1}
  SectionSetFlags ${IDS_1} ${SECTION_OFF} ;фиктивно отключаем группу
FunctionEnd

Function COMPONENTS_SHOW
  GetDlgItem $hInst $HWNDPARENT 1 ;находим HWND кнопки "установить"
  !insertmacro CheckSection 6 $R0
  StrCmp $R0 0 0 +2
  EnableWindow $hInst ${SW_HIDE} ;отключаем кнопку "установить"
  StrCmp $R0 1 0 +2
  EnableWindow $hInst ${SW_SHOW} ;включаем кнопку "установить"
FunctionEnd


Olef2387 14-05-2012 14:43 1915699

Блестяще, что тут ещё сказать. Большое спасибо

Правда, компоненты в группе раскрыты, как можно сделать чтоб по умолчанию они были свёрнуты?
Команду SubSection /e test IDS_1
изменил на SubSection test IDS_1

всё равно раскрыты компоненты..

kotkovets 14-05-2012 15:58 1915743

Цитата:

Цитата Olef2387
всё равно раскрыты компоненты.. »

вместо:
Код:

SectionSetFlags ${IDS_1} ${SECTION_OFF}
прописать:
Код:

SectionSetFlags ${IDS_1} -290

wolkow70 19-05-2012 08:48 1918636

kotkovets,

Можете помочь в таком вопросе:

Работает такая конструкция:

ReadRegStr $R6 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Opera 11.64.1403" "InstallLocation"
RMDir /r "$R6"

Стоит задача найти директорию установки независимо от версии и удалить.

Пробую так:

Код:

Function EnumReg
${If} $5 == "Opera"
;
DetailPrint "Раздел реестра: $1"
DetailPrint "Имя параметра: $2"
DetailPrint "Тип параметра: $4"
DetailPrint "Значение параметра: $3"
StrCpy "$5" "$1"
StrCpy $0 StopRegFind
${EndIf}
FunctionEnd

Не срабатывает.


${RegFind} "${HKLM}\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" "/T=REG_SZ /V=1" EnumReg

kotkovets 19-05-2012 11:41 1918669

Цитата:

Цитата wolkow70
Не срабатывает.
${RegFind} "${HKLM}\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" "/T=REG_SZ /V=1" EnumReg »

А с какого перепугу????!!! нет же в реестре ключа -SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Opera
зато есть - SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Opera****
---
Читайте и изучайте - StrCpy - там все по полочкам с примерами расписано.
---
Код:

Section
  ${RegFind} "${HKLM}\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" "/T=REG_SZ /V=1" EnumReg
  MessageBox MB_OK "$5" IDOK
SectionEnd

Function EnumReg
  StrCpy $5 $1 5 52
  ${If} $5 == "Opera"
  ${AndIf} $2 == "InstallLocation"
    StrCpy $5 $3
    StrCpy $0 "StopRegFind"
  ${EndIf}
FunctionEnd


bugmenotagain 20-05-2012 00:48 1919049

Доброй ночи. Пожалуйста, помогите разобраться. Пытаюсь с помощью плагина AccessControl зачистить хвосты от драйвера:
Код:

  AccessControl::GrantOnRegKey \
  HKLM "SYSTEM\CurrentControlSet\Enum\Root\LEGACY_SIMPLE" "(BU)" "Delete"

Код работает, но только под XP, а надо бы конечно мультиплатформу. Желательно бы XP-Vista-7.

DruOleg 23-05-2012 18:07 1921174

Привет всем!
Прошу помочь с обработкой файла.
В ходе установки получаем файл - result.txt.
Файл содержит в себе:
Код:

STR               
--------------------
0400               

(обработано строк: 1)

Нужно узнать какое значение в нем стоит - 0400 или другое. (через сравнение)

kotkovets 23-05-2012 18:45 1921196

Цитата:

Цитата DruOleg
В ходе установки получаем файл - result.txt. »

а подробней, почему в какой-то файл(еще нужно прочитать и обработать), а не сразу в указанную переменную?

DruOleg 24-05-2012 10:41 1921575

Цитата:

Цитата kotkovets
а подробней, почему в какой-то файл(еще нужно прочитать и обработать), а не сразу в указанную переменную? »

Выполняю запрос к БД:
Код:

ExecWait '"sqlcmd" -S "$DB_server" -U "$DB_user" -P "$DB_password" -d "$DB_name" -i "$Temp\Fix_IIRF\get_revision.sql" -o "$Temp\Fix_IIRF\result.txt"'
Как полученный результат присвоить переменной не знаю.

kotkovets 24-05-2012 11:02 1921596

DruOleg, И как прочитать содержимое файла, тоже не знаете?
И что в переменную $0 возвращает?
Код:

ExecWait '"sqlcmd" -S "$DB_server" -U "$DB_user" -P "$DB_password" -d "$DB_name" -i "$Temp\Fix_IIRF\get_revision.sql" -o ' $0

DruOleg 24-05-2012 11:10 1921604

Цитата:

Цитата kotkovets
DruOleg, И как прочитать содержимое файла, тоже не знаете? »

Пробовал так:
Код:

ClearErrors
FileOpen $0 $INSTDIR\file.dat r
IfErrors done
FileRead $0 $1
DetailPrint $1
FileClose $0
done:

Прочитал только первую строку.

Цитата:

Цитата kotkovets
И что в переменную $0 возвращает? »

Возвращает - 0.
Если пароль неверно указать - возвращает - 1.

DruOleg 24-05-2012 11:42 1921624

Цитата:

Цитата DruOleg
Нужно узнать какое значение в нем стоит - 0400 или другое. (через сравнение) »

Коряво, но вроде реализовал...
Код:

Section

ClearErrors
FileOpen $0 "$Temp\NS_Fix_IIRF\result.txt" r
IfErrors done
FileRead $0 $1
FileRead $0 $1
FileRead $0 $1
StrCpy "$REV" $1
FileClose $0
done:

SectionEnd


wolkow70 24-05-2012 11:52 1921631

kotkovets,
Подскажите пожалуйста как в режиме генератора ответов избежать вывода некоторых страниц?

Код:

!define MUI_PAGE_CUSTOMFUNCTION_SHOW SHOWWELCOME
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE "${pkgdir}\Winamp\License.txt"
!define MUI_PAGE_CUSTOMFUNCTION_SHOW SHOWDIRECTORY
!insertmacro MUI_PAGE_DIRECTORY
!define MUI_PAGE_CUSTOMFUNCTION_SHOW SHOWCOMPONENTS
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_STARTMENU Application $StartMenuFolder
!define MUI_PAGE_CUSTOMFUNCTION_PRE PREINSTFILES
!insertmacro MUI_PAGE_INSTFILES
!define MUI_FINISHPAGE_RUN "$INSTDIR\winamp.exe"
!define MUI_FINISHPAGE_RUN_TEXT "Запустить Winamp"
!define MUI_FINISHPAGE_RUN_NOTCHECKED
!define MUI_FINISHPAGE_NOAUTOCLOSE
!define MUI_PAGE_CUSTOMFUNCTION_SHOW SHOWFINISH
!insertmacro MUI_PAGE_FINISH

Желательно бы не выводить страницу показа лицензии и выбора папки StartMenu
и не показывать на Finishpage опцию "запустить".

DruOleg 24-05-2012 12:13 1921649

Цитата:

Цитата DruOleg
Коряво, но вроде реализовал... »

У кого-нибудь есть примеры с циклами? Чтобы так не извращаться...

DruOleg 24-05-2012 12:34 1921666

Цитата:

Цитата DruOleg
У кого-нибудь есть примеры с циклами? Чтобы так не извращаться... »

Реализовал так:)
Код:

${While} $1 != "0400"
FileRead $0 $1
StrCpy "$1" "$1" 4
${EndWhile}
StrCpy "1""$REV" $1

Работает. Но если значение в файле нет такого значения - зацикливается:-(
Кто знает как поправить?

DruOleg 24-05-2012 16:17 1921779

Прошу помочь с ведением лога.

Код:


Section ;Вывод первичной информации

${If} $OS_type != "WinXP"
  MessageBox MB_OK "Данный фикc преднозначен только для ОС WindowsXP x32"
  DetailPrint "Неподдерживаемый тип ОС: $OS_type"
  ;Abort
${Else}
        DetailPrint "Тип ОС: $OS_type"
${EndIf}

${If} $Type != "МЕНЯ"
  MessageBox MB_OK "Данный фикc преднозначен только для МЕНЯ!"
  DetailPrint "Неподдерживаемый тип продукта: $Type"
  ;Abort
${EndIf}

${If} $Version != "7.10"
  MessageBox MB_OK "Данный фикc преднозначен только для МЕНЯ!"
  DetailPrint "Неподдерживаемый тип $Type: $Version"
  ;Abort
${Else}
        DetailPrint "Версия $Type: $Version"
${EndIf}
       
SectionEnd

Данные считываются в Function .onInit

Если падает на первой секции в лог не чего не пишется.
Лог подключил методом из FAQ.

kotkovets 24-05-2012 16:30 1921792

Цитата:

Цитата DruOleg
Чтобы так не извращаться... »

В справке в указателе вводим - LineFind
Код:

OutFile "example.exe"
!include "MUI2.nsh"
!include "TextFunc.nsh"
ShowInstDetails show
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE Russian

Section
 ${LineFind} "$EXEDIR\file.txt" "" "1:-1" "LineRead"
 IfErrors 0 +3
  MessageBox MB_OK "Файла не существует!" IDOK
  Abort

  MessageBox MB_OK "$R1" IDOK
SectionEnd

Function LineRead
  DetailPrint $R9
  StrCpy $R0 $R9 4
  ${IfThen} $R0 == 0400 ${|} StrCpy $R1 $R0 ${|}
  Push $0
FunctionEnd


wolkow70 25-05-2012 09:11 1922198

Сделал так:

Код:

!define MUI_PAGE_CUSTOMFUNCTION_PRE PRELICENSE
!define MUI_PAGE_CUSTOMFUNCTION_PRE PRESTARTMENU

Function PRELICENSE
${If} $GMODE = 1
Abort
${EndIf}
FunctionEnd

Function PRESTARTMENU
${If} $GMODE = 1
Abort
${EndIf}
FunctionEnd

Теперь думаю как сделать , чтобы при $GMODE = 1

на финишной странице не отображалось:
!define MUI_FINISHPAGE_RUN "$INSTDIR\winamp.exe"
!define MUI_FINISHPAGE_RUN_TEXT "Запустить Winamp"
!define MUI_FINISHPAGE_RUN_NOTCHECKED
и не выполнялось:
!define MUI_FINISHPAGE_NOAUTOCLOSE


При этом имеется функция :

Код:

Function SHOWFINISH
${If} $GMODE = 1
${NSD_SetText} $mui.FinishPage.Title "Завершение работы Мастера создания файла ответов."
${NSD_SetText} $mui.FinishPage.Text "Файл ответов готов!"
${EndIf}
FunctionEnd

Кто-нибудь подскажет?

kotkovets 25-05-2012 12:10 1922318

Цитата:

Цитата wolkow70
Кто-нибудь подскажет? »

Меняйте значение $GMODE и увидете разницу...
читать дальше »
Код:

OutFile "example.exe"
!include "MUI2.nsh"
ShowInstDetails show

var GMODE
!define MUI_FINISHPAGE_RUN "$EXEDIR\winamp.exe"
!define MUI_FINISHPAGE_RUN_TEXT "Запустить Winamp"
!define MUI_FINISHPAGE_RUN_NOTCHECKED
!define MUI_FINISHPAGE_NOAUTOCLOSE

!insertmacro MUI_PAGE_WELCOME
    !define MUI_PAGE_CUSTOMFUNCTION_LEAVE INSTFILESLEAVE
!insertmacro MUI_PAGE_INSTFILES
    !define MUI_PAGE_CUSTOMFUNCTION_SHOW SHOWFINISH
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE Russian

Section
  StrCpy $GMODE 1
SectionEnd

Function INSTFILESLEAVE
    StrCmp $GMODE 1 0 +2
    SetAutoclose true
FunctionEnd

Function SHOWFINISH
${If} $GMODE == 1
  ShowWindow $mui.FinishPage.Run ${SW_HIDE}
  ${NSD_SetText} $mui.FinishPage.Title "Завершение работы Мастера создания файла ответов."
  ${NSD_SetText} $mui.FinishPage.Text "Файл ответов готов!"
${EndIf}
FunctionEnd


wolkow70 25-05-2012 12:32 1922330

kotkovets,

Да, работает.

Я было пошел по другому пути, нашел где-то так:

Функция Show_PageFinish_custom

GetDlgItem $ R9 $ MUI_HWND 1203;

ShowWindow $ R9 $ {} SW_HIDE

MessageBox MB_OK $ R9

# MessageBox MB_OK $ MUI_HWND

FunctionEnd

Но нужно было узнать номер поля из ioSpecial.ini , но я у себя такого файла не нашел во временной папке NSIS.

kotkovets 25-05-2012 13:12 1922349

Цитата:

Цитата wolkow70
Но нужно было узнать номер поля из ioSpecial.ini , »

MUI2 (nsdialogs.dll) не использует ioSpecial.ini,
его использует MUI (InstallOptions.dll) - ИМХО ! устаревшая и неудобная вещь(плаг).

diakov 26-05-2012 11:59 1922914

kotkovets, подскажи

Код:

Section "-установка"
  ${If} $Check == 1
    ${If} $Radio == 1
    ${AndIf} ${RunningX64}
 CreateShortCut "$Desktop\${PRODUCT_NAME}.lnk" "$INSTDIR\TOTALCMD64.EXE"
 ${Else}
 CreateShortCut "$Desktop\${PRODUCT_NAME}.lnk" "$INSTDIR\TOTALCMD.EXE"
 ${EndIf}
  ${If} $Radio1 == 1
  CreateShortCut "$Desktop\${PRODUCT_NAME}.lnk" "$INSTDIR\TOTALCMD.EXE"
    ${EndIf}
      ${EndIf}
  SectionEnd

Вообщем надо что бы если отмечен чек и радиобутон то на системе х64 ярлык был TOTALCMD64.EXE а на х86 TOTALCMD.EXE, а если отмечен чек и радиобутон1 то на любой системе создавалсо TOTALCMD.EXE!

kotkovets 26-05-2012 13:30 1922938

Цитата:

Цитата diakov
kotkovets, подскажи »

Код:

  ${If} $Check == 1
  ${AndIf} $Radio == 1
      ${If} ${RunningX64}
          MessageBox MB_OK "TOTALCMD64.EXE"
      ${Else}
          MessageBox MB_OK "TOTALCMD.EXE"
      ${EndIf}
  ${EndIf}


diakov 26-05-2012 13:36 1922939

Эт я в курсе! Но надо чтобы еще если выбран другой радиобутон $Radio1 и этот же чекбокс и на х86 и на х64 создавался ярлык на файл TOTALCMD.EXE!

kotkovets 26-05-2012 13:42 1922942

Цитата:

Цитата diakov
Эт я в курсе! Но надо чтобы еще если выбран другой радиобутон $Radio1 »

Код:

 
  ${If} $Check == 1
  ${AndIf} $Radio == 1
        ${If} ${RunningX64}
              MessageBox MB_OK "TOTALCMD64.EXE"
        ${Else}
              MessageBox MB_OK "TOTALCMD.EXE"
        ${EndIf}
  ${ElseIf} $Radio1 == 1
  ${AndIf} $Check == 1
          MessageBox MB_OK "Radio1: TOTALCMD.EXE"
  ${EndIf}


diakov 27-05-2012 12:38 1923309

kotkovets, как сделать в nsDialogs такую рамку например вокруг групи чекбоксов?



kotkovets 27-05-2012 13:03 1923324

Цитата:

Цитата diakov
такую рамку например вокруг групи чекбоксов? »

${NSD_CreateGroupBox} — контейнер группы

Olef2387 27-05-2012 14:06 1923353

kotkovets, добрый день.
Вот здесь вы отвечали на мой вопрос о выборе одного компонента из группы секций
http://forum.oszone.net/showpost.php...postcount=2705

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

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

Код:

OutFile "example.exe"

var hInst

!include "MUI2.nsh"

!insertmacro MUI_PAGE_WELCOME
  ;функция во время открытия странички компонентов
  !define MUI_PAGE_CUSTOMFUNCTION_SHOW COMPONENTS_SHOW
  ;---------------------------------------------------
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE Russian

;макрос проверки секций, если одна из секций отмечена возврат - 1, иначе - 0;
;в intsec - указываем количество секций в скрипте
!macro CheckSection intsec ret
  Push ${intsec}
  System::Store SR2
  ${For} $R0 1 $R2
      SectionGetFlags $R0 $R1
      ${IfThen} $R1 == 1 ${|}${Break}${|}
  ${Next}
  Push $R1
  System::Store L
  Pop ${ret}
!macroend

Section  /o "Независящая секция" FREE
SectionEnd


SubSection /e test IDS_1

Section  /o "Компонент №1" ID_1
SectionEnd

Section /o "Компонент №2" ID_2
SectionEnd

Section /o "Компонент №3" ID_3
SectionEnd

Section /o "Компонент №4" ID_4
SectionEnd

Section /o "Компонент №5" ID_5
SectionEnd

Section /o "Компонент №6" ID_6
SectionEnd

SubSectionEnd

Function .onSelChange
!insertmacro StartRadioButtons $1
    !insertmacro RadioButton ${ID_1}
    !insertmacro RadioButton ${ID_2}
    !insertmacro RadioButton ${ID_3}
    !insertmacro RadioButton ${ID_4}
    !insertmacro RadioButton ${ID_5}
    !insertmacro RadioButton ${ID_6}
  !insertmacro EndRadioButtons
  !insertmacro CheckSection 6 $R0
  StrCmp $R0 0 0 +2
  EnableWindow $hInst ${SW_HIDE} ;отключаем кнопку "установить"
  StrCmp $R0 1 0 +2
  EnableWindow $hInst ${SW_SHOW} ;включаем кнопку "установить"
FunctionEnd

Function .OnInit
  StrCpy $1 ${ID_1}
  SectionSetFlags ${IDS_1} ${SECTION_OFF} ;фиктивно отключаем группу
FunctionEnd

Function COMPONENTS_SHOW
  GetDlgItem $hInst $HWNDPARENT 1 ;находим HWND кнопки "установить"
  !insertmacro CheckSection 6 $R0
  StrCmp $R0 0 0 +2
  EnableWindow $hInst ${SW_HIDE} ;отключаем кнопку "установить"
  StrCmp $R0 1 0 +2
  EnableWindow $hInst ${SW_SHOW} ;включаем кнопку "установить"
FunctionEnd


kotkovets 27-05-2012 15:38 1923388

Olef2387, ничего дальше путного, стандартными методами не получится...
для этого нужно плаг писать - нет желания.

Olef2387 27-05-2012 16:52 1923422

Хорошо, ну всё равно спасибо.
Подожду K.A.V'a, может быть он что-нибудь сообразит :)

dix75 28-05-2012 16:47 1923999

Добрый день!
подскажите как узнать есть ли у пользователя права администратора?
IsUserAdmin утверждается, что старый макрос
что испольщовать сейчас?

kotkovets 28-05-2012 17:52 1924041

Цитата:

Цитата dix75
IsUserAdmin утверждается, что старый макрос »

бред!
---
в справочнике --> UserInfo: Определение типа учетной записи и правами
по этому же движку работает плаг, тока удобнее пользоваться.

wolkow70 29-05-2012 14:40 1924494

kotkovets,
подскажите пожалуйста в чем допущена ошибка?
Сделал так:

Код:

Function Find
StrCpy $R0 $R8
StrCpy $R1 $R9
Push $0
FunctionEnd
;
Function .OnInit
StrCpy $WindowCaption "Установка CyberLink Decoder Pack 2012"
;
${Locate} "$PROGRAMFILES\CyberLink" "/L=F /M=PowerDVD* /S=" "Find"
;
IfErrors Next
MessageBox MB_OK "$$R0=$R0"
MessageBox MB_OK|MB_ICONEXCLAMATION|MB_TOPMOST "На этом компьютере установлен программый продукт CyberLink PowerDVD,$\nили имеются сохраненные файлы этого Приложения.$\nДанный пакет не предназначен для инсталляции в систему с установленной$\nпрограммой CyberLink PowerDVD.$\nУстановка CyberLink Decoder Pack 2012 будет прекращена"
Abort
Next:
FunctionEnd

В именах устанавливаемых файлов отсутствует PowerDVD, тем не менее сообщение выводится.
При деинсталляции и новой установке все нормально.
Реагирует на наличие любого файла в папке.
Сообщение выводится $R0=

kotkovets 29-05-2012 19:11 1924648

Цитата:

Цитата wolkow70
подскажите пожалуйста в чем допущена ошибка? »

ни в чем, вы неверно сами себе интерпретировали задачу, флаг ошибки возникает, если
указанной папки для поиска - не существует, а если папка пуста, то флага ошибки нет.
Соответственно в переменной $R0, после завершения работы макроса, оказывается последнее значение
(функция Find вызывается в макросе циклически, пока не будет найден последний файл), а если папка пуста ???!!!

wolkow70 29-05-2012 22:50 1924745

Цитата:

Цитата kotkovets
а если папка пуста, то флага ошибки нет »

Я старался по справке делать.

Код:

Section
    ${Locate} "C:\ftp" "/L=F /M=RPC DCOM.rar /S=1K" "Example1"
    ; Поиск 'RPC DCOM.rar' файла в папке 'C:\ftp' с размером 1 Kb или больше

    IfErrors 0 +2
    MessageBox MB_OK "Ошибка" IDOK +2
    MessageBox MB_OK "$$R0=$R0"
SectionEnd

Function Example1
    StrCpy $R0 $R9
    ; $R0="C:\ftp\files\RPC DCOM.rar"

    MessageBox MB_YESNO '$R0$\n$\nИскать дальше?' IDYES +2
    StrCpy $0 StopLocate

    Push $0
FunctionEnd

Задача таким образом поставлена, если в папке есть файлы в имени которых содержится PowerDVD, то установка прекращается.

kotkovets 29-05-2012 23:13 1924753

Цитата:

Цитата wolkow70
Задача таким образом поставлена, если в папке есть файлы в имени которых содержится PowerDVD, то установка прекращается »

Не видно и не пахнет такой задачей.
да еще размерам файлы равным 1024 байтам (/S=1K) ?
делается очень просто, если папка есть(или нет), но нет файлов нужных - $R0 = 0, иначе в $R0 количество найденных файлов
Код:

Function Find
  IntOp $R0 $R0 + 1
  Push $0
FunctionEnd

Section
  StrCpy $R0 0
  ClearErrors
  ${Locate} "C:\ftp" "/L=F /M=PowerDVD*" "Find"
  Iferrors 0 +2
  MessageBox MB_OK "Папки нет такой!" IDOK
  MessageBox MB_OK "$R0" IDOK
SectionEnd

Дальше банальное сравнение значения $R0 и вытекающими действиями.

wolkow70 30-05-2012 08:25 1924828

Цитата:

Цитата kotkovets
Не видно и не пахнет такой задачей.
да еще размерам файлы равным 1024 байтам (/S=1K) ? »

Это я привел пример из Справки, по которому изучал функцию.
У меня условие прописано: ${Locate} "$PROGRAMFILES\CyberLink" "/L=F /M=PowerDVD* /S=" "Find"

Цитата:

Цитата kotkovets
флаг ошибки возникает, если
указанной папки для поиска - не существует, а если папка пуста, то флага ошибки нет. »

В таком случае, было бы полезно дополнить Справку по функции Locate таким пояснением, так как в Справке условие появления ошибки не разъяснено, что и привело к неверной интерпретации в моем случае, ибо я предположил, что флаг ошибки устанавливается при отсутствии искомого файла.

wolkow70 30-05-2012 09:17 1924844

Сделал так:

Код:

Function Find
IntOp $R0 $R0 + 1
Push $0
FunctionEnd

Function .OnInit
StrCpy $R0 0
ClearErrors
${Locate} "$PROGRAMFILES\CyberLink" "/L=F /M=PowerDVD* /S=" "Find"
IfErrors Next
StrCmp $R0 "0" Next 0
MessageBox MB_OK "На этом компьютере установлен программый продукт CyberLink PowerDVD.$\nУстановка CyberLink Decoder Pack 2012 будет прекращена"
Abort
Next:
FunctionEnd


kotkovets 30-05-2012 09:59 1924868

wolkow70, Лучше и надежнее так, сравнение, когда $R0 > 0, работа с целочисленным типом.
Код:

Function Find
IntOp $R0 $R0 + 1
Push $0
FunctionEnd

Function .OnInit
StrCpy $R0 0
ClearErrors
${Locate} "$PROGRAMFILES\CyberLink" "/L=F /M=PowerDVD* /S=" "Find"
ClearErrors
IntCmp $R0 0 +3 0 0
    MessageBox MB_OK "На этом компьютере установлен программый продукт CyberLinkPowerDVD.$\n\
                      Установка CyberLink Decoder Pack 2012 будет прекращена"
    Abort
FunctionEnd


Vincent7 30-05-2012 22:13 1925228

Приветствую. Знающие люди, подскажите пожалуйста как реализовать следующие задачи:
1. Как сделать чтобы поле выбора папки установки было затемнено(неактивно)?
2. Как сделать чтобы инсталлятор брал файлы из той же папки где лежит он сам?

kotkovets 30-05-2012 22:38 1925254

Цитата:

Цитата Vincent7
1. Как сделать чтобы поле выбора папки установки было затемнено(неактивно)? »

Сразу вопрос, а зачем тогда вам папка выбора директории? исключите из скрипта страничку выбора директории.
Цитата:

Цитата Vincent7
2. Как сделать чтобы инсталлятор брал файлы из той же папки где лежит он сам? »

В шапке темы справочник по нсис.
ЗЫ.
че наверно за зря писал красным в шапке темы...

Vincent7 30-05-2012 23:28 1925288

kotkovets, ну просто захотелось сделать недоступной выбор папки без искючения из скрипта. Это возможно? А справку я читал, не нашел там ответа на свой вопрос, ткните носом где там это описано. Я с nsis'ом знаком всего пару дней, не ругайте сильно за нубство:-)

kotkovets 30-05-2012 23:50 1925297

Цитата:

Цитата Vincent7
захотелось сделать недоступной выбор папки без искючения из скрипта. Это возможно? »

Примеры кодов --> Оформление --> Интерфейс Modern --> » Стандартные функции
Код:

!include "MUI2.nsh"

!insertmacro MUI_PAGE_WELCOME
    !define MUI_PAGE_CUSTOMFUNCTION_SHOW DIRECTORY_SHOW
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES

!insertmacro MUI_LANGUAGE "Russian"

OutFile "test.exe"
ShowInstDetails show
InstallDir $EXEDIR

Function DIRECTORY_SHOW
  EnableWindow $mui.DirectoryPage.BrowseButton 0
  EnableWindow $mui.DirectoryPage.Directory 0
FunctionEnd

Section
  MessageBox MB_ICONINFORMATION|MB_OK "InstallDir = $EXEDIR" IDOK
SectionEnd


Vincent7 31-05-2012 21:42 1925734

kotkovets, спасибо, запрет выбора папки работает, но второе не то что мне нужно, мне не надо чтобы файлы устанавливались туда же, где запущен инсталлятор.
Мой путь installdir берется из реестра. Мне нужно вот что: в папке с инсталятором лежит файл, нужно в секции прописать чтобы этот файл всегда брался из директории где лежит инсталлятор. Через File "$EXEPATH\мой файл.txt" не выходит, ошибка файл не найден

kotkovets 31-05-2012 22:00 1925743

Vincent7, читайте до дыр команду - File

john_ylygovich_sora@vk 01-06-2012 17:03 1926212

Вложений: 1
Во первых хочу поделиться примером вызова функций из библиотеки dll, написанной на vb .net.
Во вторых - может кто знает, как написать плагин для nsis на визуал бейсике .net.

K.A.V. 01-06-2012 17:25 1926226

Цитата:

Цитата Olef2387
Подожду K.A.V'a, может быть он что-нибудь сообразит »

Я, честно говоря, не понял суть задачи
Вам нужно, чтобы при отметке отдельной секции (в примере "Независящая секция") не отмечалась секция в группе или что?

Цитата:

Цитата john_ylygovich_sora@vk
Во вторых - может кто знает, как написать плагин для nsis на визуал бейсике .net. »

Сомневаюсь, что здесь вам кто-то подскажет насчет написания плагинов на данном языке (разве что kotkovets может быть)
В основном же, плагины к NSIS написаны на С++ (ну а там впринципе ничего сложного для С программиста), возьмите поскачивайте плагины со странички http://nsis.sourceforge.net/Category:Plugins
Возможно, какой-либо плагин и написан на нужном вам языке, практически все плагины с исходниками
Либо задайте вопрос на англоязычном форуме в разделе NSIS :)

kotkovets 01-06-2012 19:42 1926271

john_ylygovich_sora@vk,
на бейсике жесткая привязка к платформе .NET - что не гоже, размер библиотеки 13.5 кб!!!
Да еще таскать собой CLR.dll ?????????????????? если, честно в топку!
куда лучше, гибче в тысячи раз писать на с (с++) - примеров очень много.
такой пример на си как минимум 5 кб, т.е ничего лишнего не пихается в код, чем на бейсике.

Olef2387 01-06-2012 19:53 1926277

Цитата:

Цитата K.A.V.
Я, честно говоря, не понял суть задачи
Вам нужно, чтобы при отметке отдельной секции (в примере "Независящая секция") не отмечалась секция в группе или что? »

Именно так, Вы правильно поняли

Vincent7 02-06-2012 13:29 1926654

kotkovets, изучил, все работает, спасибо. Теперь еще вопросы:
1. Можно ли увеличить окно выбора компонентов?
2. Как работать со строкой 'требуется на диске: ' как написать туда свое значение например при выборе одного компонента, приписывалось 2 mb, и к этому значению прибавлялись другие значения выбранных компонентов?

kotkovets 02-06-2012 13:51 1926666

Vincent7, справкой для начала научитесь пользоваться.

Vincent7 02-06-2012 14:56 1926696

А вам сложно ответить чтоли?

K.A.V. 02-06-2012 20:04 1926861

Цитата:

Цитата Vincent7
А вам сложно ответить чтоли? »

1. А вам сложно прочитать подробнейшую документацию на русском языке, чтобы решить вопрос, который вам необходим?
2. А мы что, попугаи, чтобы повторять одно и тоже и здесь, и в справочнике?
3. А для чего создан справочник? Чтобы такие как вы (задам быстренько вопрос и воспользуюсь Ctrl+C) смогли найти ответы на большинство вопросов
4. Ленивых мы не любим, так что если вы сами не хотите ни в чем разбираться, а хотите "всё готовенькое", то вы ошиблись форумом

Цитата:

Цитата Olef2387
Именно так, Вы правильно поняли »

Написал собственный "обработчик", который не даёт отметить несколько секций в группе, но он чисто для вашего скрипта, может кому и пригодится ещё
Возможно, можно будет его каким-то образом усовершенствовать для "универсальности", но пока что нет желания этим заниматься :)
Вроде бы, работает так как нужно ;)

Код:

OutFile "example.exe"

var hInst
var SecID

!include "MUI2.nsh"
!include "Sections.nsh"

#!insertmacro MUI_PAGE_WELCOME
  ;функция во время открытия странички компонентов
  !define MUI_PAGE_CUSTOMFUNCTION_SHOW COMPONENTS_SHOW
  ;---------------------------------------------------
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE Russian

;макрос проверки секций, если одна из секций отмечена возврат - 1, иначе - 0;
;в intsec - указываем количество секций в скрипте
!macro CheckSection intsec ret
  Push ${intsec}
  System::Store SR2
  ${For} $R0 1 $R2
      SectionGetFlags $R0 $R1
      ${IfThen} $R1 == 1 ${|}${Break}${|}
  ${Next}
  Push $R1
  System::Store L
  Pop ${ret}
!macroend

Section  /o "Независящая секция" FREE
SectionEnd

SubSection /e test IDS_1

Section  /o "Компонент №1" ID_1
SectionEnd

Section /o "Компонент №2" ID_2
SectionEnd

Section /o "Компонент №3" ID_3
SectionEnd

Section /o "Компонент №4" ID_4
SectionEnd

Section /o "Компонент №5" ID_5
SectionEnd

Section /o "Компонент №6" ID_6
SectionEnd

SubSectionEnd


Function .onSelChange
call GetSelectedSection
call UnSelectSections

  !insertmacro CheckSection 7 $R0
  StrCmp $R0 0 0 +2
  EnableWindow $hInst ${SW_HIDE} ;отключаем кнопку "установить"
  StrCmp $R0 1 0 +2
  EnableWindow $hInst ${SW_SHOW} ;включаем кнопку "установить"
FunctionEnd

Function .OnInit
  StrCpy $1 ${ID_1}
  SectionSetFlags ${IDS_1} ${SECTION_OFF} ;фиктивно отключаем группу
FunctionEnd


Function GetSelectedSection
StrCpy $R0 0
st:
IntOp $R0 $R0 + 1
StrCmp $R0 "1" st 0
StrCmp $R0 "8" end 0
SectionGetFlags $R0 $R1
StrCmp $R0 "$SecID" 0 +2
StrCpy $R1 0
StrCmp $R1 "1" 0 st
StrCpy $SecID "$R0"
end:
FunctionEnd

Function UnSelectSections
StrCpy $R1 0
st2:
IntOp $R1 $R1 + 1
StrCmp $R1 "1" st2 0
SectionSetFlags $R1 0
StrCmp $R1 "8" 0 st2
SectionSetFlags $SecID 1
FunctionEnd


Function COMPONENTS_SHOW
  GetDlgItem $hInst $HWNDPARENT 1 ;находим HWND кнопки "установить"
  !insertmacro CheckSection 7 $R0
  StrCmp $R0 0 0 +2
  EnableWindow $hInst ${SW_HIDE} ;отключаем кнопку "установить"
  StrCmp $R0 1 0 +2
  EnableWindow $hInst ${SW_SHOW} ;включаем кнопку "установить"
FunctionEnd


Vincent7 03-06-2012 02:01 1927027

K.A.V,
1. Подробнейшая документация как вы изволили выразится, вовсе не такая подробная, или я не прав?
2. Я говорил, что я знаком с nsis всего несколько дней, поэтому справке могу что либо непонять, поэтому и спрашиваю сдесь.
3. Какой смысл в форуме если есть 'подробнейшая документация' , напишите в шапке темы 'обратитесь к документации чтобы решить вопрос, который вам необходим' , и попугаями быть не придется.
Извините. Я вас понимаю, но и вы поймите меня, не просто брать ответы на вопрос новичку из документации в которой еще не все понимаешь.

K.A.V. 03-06-2012 09:16 1927107

Цитата:

Цитата Vincent7
1. Подробнейшая документация как вы изволили выразится, вовсе не такая подробная, или я не прав? »

Не правы конечно, документацию писал я и kotkovets, в ней мы как раз описываем всё так, чтобы было понятно начинающим кодерам на NSIS, для этого и создан справочник, для новичков, нам то он, зачем нужен? ;)

Цитата:

Цитата Vincent7
2. Я говорил, что я знаком с nsis всего несколько дней, поэтому справке могу что либо непонять, поэтому и спрашиваю сдесь. »

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

Цитата:

Цитата Vincent7
3. Какой смысл в форуме »

Смысл данной темы помогать в решении возникших вопросов/проблем у новичков в NSIS, поймите разницу, мы помогаем, а не делаем за вас, это огромная разница, когда вы что-то не понимаете и просите помощи или просите готовый код
Прочитайте эту тему, я уже не раз заводил разговор на эту тему, мы вам можем помочь на сколько у нас хватит знаний, но мы не желаем делать всё за вас, просто потому что вам просто напросто лень прочитать документацию на русском языке

Цитата:

Цитата Vincent7
не просто брать ответы на вопрос новичку из документации в которой еще не все понимаешь. »

А вы вообще даже не открывали эту документацию, раз задаёте вопросы, ответы на которые уже есть в справке


===
Цитата:

Цитата Vincent7
1. Можно ли увеличить окно выбора компонентов? »

Примеры кодов => Оформление => Интерфейс Modern => Страница выбора компонентов установки

Либо редактируйте с помощью ResHacker *.exe файл оболочки (по умолчанию modern.exe), диалог 104
Файлы оболочки находятся в папке
\NSIS\contrib\UIs


Цитата:

Цитата Vincent7
2. Как работать со строкой 'требуется на диске: ' как написать туда свое значение например при выборе одного компонента, приписывалось 2 mb, и к этому значению прибавлялись другие значения выбранных компонентов? »

Перевод справки NSIS => AddSize
Инсталлятор автоматически добавляет необходимое для файлов свободное место на диске при отметке секций, главное чтобы распаковка файлов была прописана в самой секции
Либо пользуйтесь командой AddSize в секции, чтобы добавить необходимое свободное место на диске для установки компонента

wolkow70 04-06-2012 10:05 1927636

Уточните пожалуйста разницу по справке:

Параметр /oname позволяет переименовать файл:

SetOutPath "$INSTDIR"
File /oname=файл.exe file.exe

Если хотим распаковать переименованный файл, к примеру в папку Windows, то пишем:
File /oname=$WINDIR\файл.exe "C:\Install\file.exe"

Если я пишу в скрипте:

SetOutPath "$LOCALAPPDATA\LightAlloy"
File /oname=$LOCALAPPDATA\LightAlloy\LA.xml "${pkgdir}\Light Alloy\LA1.xml"

Это ошибка или не рациональный код?

K.A.V. 04-06-2012 10:25 1927641

Цитата:

Цитата wolkow70
Если я пишу в скрипте:
SetOutPath "$LOCALAPPDATA\LightAlloy"
File /oname=$LOCALAPPDATA\LightAlloy\LA.xml "${pkgdir}\Light Alloy\LA1.xml" »

Строка с командой SetOutPath лишняя, т.к. данная строка не имеет смысла, если у команды File стоит параметр /oname в котором прописан путь назначения

wolkow70 04-06-2012 10:58 1927662

Цитата:

Цитата K.A.V.
Строка с командой SetOutPath лишняя, т.к. данная строка не имеет смысла, если у команды File стоит параметр /oname в котором прописан путь назначения »

Вот почему я и задал вопрос.
Получается, что команды идентичны:

File /oname=$LOCALAPPDATA\LightAlloy\LA.xml "${pkgdir}\Light Alloy\LA1.xml"

SetOutPath "$LOCALAPPDATA\LightAlloy"
File /oname=LA.xml "${pkgdir}\Light Alloy\LA1.xml"

И можно написать и так и сяк.

Olef2387 05-06-2012 00:35 1928217

Цитата:

Цитата K.A.V.
Написал собственный "обработчик", который не даёт отметить несколько секций в группе, но он чисто для вашего скрипта, может кому и пригодится ещё
Возможно, можно будет его каким-то образом усовершенствовать для "универсальности", но пока что нет желания этим заниматься
Вроде бы, работает так как нужно »

Спасибо Вам, Артём, выручили.
А Функция будет на всех системах работать или возможны ошибки?
ещё у меня также есть скрытая секция в скрипте, которая всегда работает и непоказывается в списке компонентов. Она никак не нарушит скрипт?

Ну и ещё по мелочи: если поставить галочку на "Независящей секции", то эта галочка никак не убирается пока не поставишь галочку на одной из секций в группе...

kotkovets 05-06-2012 00:49 1928222

Цитата:

Цитата Olef2387
ещё у меня также есть скрытая секция в скрипте, которая всегда работает и непоказывается в списке компонентов. Она никак не нарушит скрипт? »

нет, секция для порядка дожна быть "без идентификатора", как обычно пишут
Цитата:

Цитата Olef2387
А Функция будет на всех системах работать или возможны ошибки? »

ну разве тока на WINDOWS аля '98
Цитата:

Цитата Olef2387
Ну и ещё по мелочи: если поставить галочку на "Независящей секции", то эта галочка никак не убирается пока не поставишь галочку на одной из секций в группе... »

я вам говорил, что ничего путного дальше, ибо того же эффекта я достигал гораздо проще.

Olef2387 05-06-2012 01:08 1928235

Цитата:

Цитата kotkovets
я вам говорил, что ничего путного дальше, ибо того же эффекта я достигал гораздо проще. »

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

А у Артёма просто нельзя убрать галочку с независящей секции пока не поставишь галочку на секции в группе. Когда поставишь галочку на секции в группе, то галочку с независящей секции уже убрать можно и другую секцию в группе тоже можно выбрать .
з.ы Запутано, но всё так и есть. Наблюдал специально))

john_ylygovich_sora@vk 05-06-2012 08:50 1928327

Цитата:

на бейсике жесткая привязка к платформе .NET - что не гоже, размер библиотеки 13.5 кб!!! Да еще таскать собой CLR.dll ?????????????????? если, честно в топку! куда лучше, гибче в тысячи раз писать на с (с++) - примеров очень много. такой пример на си как минимум 5 кб, т.е ничего лишнего не пихается в код, чем на бейсике.
Ну это я понимаю, но вопрос всё-равно в силе. Может кто сможет перевести [delphi|c++] в [vb .net |c#].
Если проблемы с экспортом функций, то напишите, что экспортировать.

А clr.dll ни кто с собой таскать не будет :)

kotkovets 05-06-2012 09:16 1928337

Цитата:

Цитата john_ylygovich_sora@vk
Ну это я понимаю, но вопрос всё-равно в силе. Может кто сможет перевести [delphi|c++] в [vb .net |c#]. »

врятли, не напишите вы полноценного плага на бейсике, на шарпе еще можно, но лучше и удобно на си,
изучите си на примерах, я уверяю вы сами переведете, хотя врядли посчитаете это нужным :)

K.A.V. 05-06-2012 11:11 1928370

Цитата:

Цитата Olef2387
А у Артёма просто нельзя убрать галочку с независящей секции пока не поставишь галочку на секции в группе »

У Артёма теперь можно :)

Код:

OutFile "example.exe"

var hInst
var SecID
var SecFlag

!include "MUI2.nsh"
!include "Sections.nsh"

#!insertmacro MUI_PAGE_WELCOME
  ;функция во время открытия странички компонентов
  !define MUI_PAGE_CUSTOMFUNCTION_SHOW COMPONENTS_SHOW
  ;---------------------------------------------------
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE Russian

;макрос проверки секций, если одна из секций отмечена возврат - 1, иначе - 0;
;в intsec - указываем количество секций в скрипте
!macro CheckSection intsec ret
  Push ${intsec}
  System::Store SR2
  ${For} $R0 1 $R2
      SectionGetFlags $R0 $R1
      ${IfThen} $R1 == 1 ${|}${Break}${|}
  ${Next}
  Push $R1
  System::Store L
  Pop ${ret}
!macroend

Section  /o "Независящая секция" FREE
SectionEnd

SubSection /e test IDS_1

Section  /o "Компонент №1" ID_1
SectionEnd

Section /o "Компонент №2" ID_2
SectionEnd

Section /o "Компонент №3" ID_3
SectionEnd

Section /o "Компонент №4" ID_4
SectionEnd

Section /o "Компонент №5" ID_5
SectionEnd

Section /o "Компонент №6" ID_6
SectionEnd

SubSectionEnd


Function .onSelChange
call GetSelectedSection
call UnSelectSections

  !insertmacro CheckSection 7 $R0
  StrCmp $R0 0 0 +2
  EnableWindow $hInst ${SW_HIDE} ;отключаем кнопку "установить"
  StrCmp $R0 1 0 +2
  EnableWindow $hInst ${SW_SHOW} ;включаем кнопку "установить"
 
SectionGetFlags ${FREE} $R1
StrCmp $R0 "0" 0 end
  StrCmp $SecFlag "1" 0 end
  StrCmp $R1 "1" 0 +4
 SectionSetFlags ${FREE} 0
  StrCpy $SecFlag 0
 goto +3
 SectionSetFlags ${FREE} 1
  StrCpy $SecFlag 1
  goto end2
end:
StrCpy $SecFlag $R1
end2:
FunctionEnd

Function .OnInit
  StrCpy $1 ${ID_1}
  SectionSetFlags ${IDS_1} ${SECTION_OFF} ;фиктивно отключаем группу
FunctionEnd


Function GetSelectedSection
StrCpy $R0 0
st:
IntOp $R0 $R0 + 1
StrCmp $R0 "1" st 0
StrCmp $R0 "8" end 0
SectionGetFlags $R0 $R1
StrCmp $R0 "$SecID" 0 +2
StrCpy $R1 0
StrCmp $R1 "1" 0 st
StrCpy $SecID "$R0"
end:
FunctionEnd

Function UnSelectSections
StrCpy $R1 0
st2:
IntOp $R1 $R1 + 1
StrCmp $R1 "1" st2 0
SectionSetFlags $R1 0
StrCmp $R1 "7" 0 st2
SectionSetFlags $SecID 1
FunctionEnd


Function COMPONENTS_SHOW
  GetDlgItem $hInst $HWNDPARENT 1 ;находим HWND кнопки "установить"
  !insertmacro CheckSection 7 $R0
  StrCmp $R0 0 0 +2
  EnableWindow $hInst ${SW_HIDE} ;отключаем кнопку "установить"
  StrCmp $R0 1 0 +2
  EnableWindow $hInst ${SW_SHOW} ;включаем кнопку "установить"
FunctionEnd


Vincent7 15-06-2012 21:21 1934955

Приветствую. Нужна помощь, я использую плагин nsis7z для распаковки архивов, можно ли через функцию callback, сделать чтобы при распаковке было вот как на скрине http://upwap.ru/2552952

kotkovets 15-06-2012 22:19 1934973

Цитата:

Цитата Vincent7
Приветствую. Нужна помощь, я использую плагин nsis7z для распаковки архивов, можно ли через функцию callback, сделать чтобы при распаковке было вот как на скрине http://upwap.ru/2552952 »

нет, только размер архива и размер на момент распаковки архива, но не названия файлов в архиве.
Цитата:

Plugin now has two additional commands:

Nsis7z::ExtractWithDetails "Test.7z" "Installing package %s..."

Unpacks archive in details mode, with promt generated from second param, use
%s to insert unpack details like "10% (5 / 10 MB)"

GetFunctionAddress $R9 CallbackTest
Nsis7z::ExtractWithCallback "Test.7z" $R9

Unpacks archive in callback mode - plugin will animate progress bar, you can do
anything (like setting user prompt) in callback function
На скрине распаковка никак не относится к плагу, показываются какие файлы распаковываются "из инсталлятора"
достаточно прописать вне функции или секции:
Код:

ShowInstDetails show
и убрать компрессию одним блоком, т.е не применять команду в скрипте с флагом - /SOLID
Код:

SetCompressor /SOLID LZMA
это увеличивает размер инсталлятора

Vincent7 16-06-2012 00:22 1935022

Ясно. Спасибо за обьяснение. Теперь еще одно, как создать вот такую страницу: http://upwap.ru/2553232

alert30 16-06-2012 11:34 1935120

Vincent7, это Ваш инсталлятор или чужой?

kotkovets 16-06-2012 11:43 1935123

Цитата:

Цитата Vincent7
как создать вот такую страницу »

в теме масса примеров создания своих страниц + справочник, где описаны те или иные контролы.
Цитата:

Цитата alert30
это Ваш инсталлятор или чужой? »

чужой и так понятно

Ivn78 16-06-2012 12:01 1935127

Друзья, подскажите, как сделать CheckBox или RadioButton неактивными? В теме пишут, что примеры уже были, но найти не могу...

kotkovets 16-06-2012 12:24 1935144

Цитата:

Цитата Ivn78
как сделать CheckBox или RadioButton неактивными? »

Код:

EnableWindow [xэндл контрола] 0

Vincent7 16-06-2012 13:04 1935162

Да, инсталлятор не мой, но я хочу сделать подобный. kotkovets, у меня пока отключен интернет, пишу с мобильника, и искать примеры среди 278 страниц с него довольно сложно. Подскажите хотябы на каких страницах примеры. Еще вопрос - если есть плагин, но нет описания для него, можно узнать как им пользоватся?

Ivn78 16-06-2012 13:39 1935177

Еще ткните носом, в справочнике тоже не нашел - можно ли на MUI_PAGE_FINISH скрыть (сделать неактивной) кнопку "Назад"?
Проблема в том, что перед финишной страницей помещена пользовательская

wolkow70 16-06-2012 14:38 1935200

kotkovets,
Подскажите плиз как проще сделать ?

Код:

Function .OnInit
${If} ${RunningX64}
StrCpy $INSTDIR "$PROGRAMFILES64\WinRAR"
${Else}
StrCpy $INSTDIR "$PROGRAMFILES\WinRAR"
${EndIf}
FunctionEnd

Section "!${PRODUCT_NAME}" Install
SectionIn RO
;
${If} $GMODE = 0
${AndIf} ${Silent}
${AndIf} ${FileExists} "$INIFILE"
ClearErrors
ReadINIStr "$R0" "$INIFILE" "DIRECTORY" "INSTALLDIR"
${WordReplace} $R0 "%programfiles%" "$PROGRAMFILES" "+" $R1
${WordReplace} $R1 "%windir%" "$WINDIR" "+" $R0
${WordReplace} $R0 "%appdata%" "$APPDATA" "+" $R1
${WordReplace} $R1 "%systemdrive%" "$SysDrive" "+" $R0
StrCpy $INSTDIR $R0
${EndIf}
;
${If} $GMODE = 0
;
SetOutPath "$INSTDIR"

тут распаковка
 
${EndIf}
SectionEnd

При установке в силент- режиме на ОС x64 распаковка идет все равно в программную папку x86.

kotkovets 16-06-2012 16:26 1935237

Цитата:

Цитата Ivn78
можно ли на MUI_PAGE_FINISH скрыть (сделать неактивной) кнопку "Назад"?
Проблема в том, что перед финишной страницей помещена пользовательская »

Код:

   
      ;---
      ;---
    !define MUI_PAGE_CUSTOMFUNCTION_SHOW FINISH_SHOW
!insertmacro MUI_PAGE_FINISH
    ;---
    ;---
!insertmacro MUI_LANGUAGE "English"

Function FINISH_SHOW
  GetDlgItem $0 $HWNDPARENT 3
  EnableWindow $0 0
FunctionEnd

Цитата:

Цитата wolkow70
kotkovets,
Подскажите плиз »

почему условие не выполняется в тихом режиме ищите в скрипте
Код:

      ;---
      ;---
Function .OnInit
  StrCpy $INSTDIR "$PROGRAMFILES64"
FunctionEnd

Section
  SectionIn RO
  SetOutPath "$INSTDIR"
  MessageBox MB_ICONINFORMATION|MB_OK "$INSTDIR" IDOK
SectionEnd


wolkow70 16-06-2012 16:41 1935242

Цитата:

Цитата kotkovets
почему условие не выполняется в тихом режиме ищите в скрипте »

Подозреваю, что из-за этого:
${WordReplace} $R0 "%programfiles%" "$PROGRAMFILES" "+" $R1

wolkow70 16-06-2012 17:06 1935252

Если так сделать?

Код:

${If} ${RunningX64}
          ${If} $GMODE = 0
          ${AndIf} ${Silent}
          ${AndIf} ${FileExists} "$INIFILE"
          ClearErrors
          ReadINIStr "$R0" "$INIFILE" "DIRECTORY" "INSTALLDIR"
          ${WordReplace} $R0 "%programfiles%" "$PROGRAMFILES64" "+" $R1
          ${WordReplace} $R1 "%windir%" "$WINDIR" "+" $R0
          ${WordReplace} $R0 "%appdata%" "$APPDATA" "+" $R1
        ${WordReplace} $R1 "%systemdrive%" "$SysDrive" "+" $R0
        StrCpy $INSTDIR $R0
          ${EndIf}
${Else}
        ${If} $GMODE = 0
        ${AndIf} ${Silent}
        ${AndIf} ${FileExists} "$INIFILE"
        ClearErrors
        ReadINIStr "$R0" "$INIFILE" "DIRECTORY" "INSTALLDIR"
        ${WordReplace} $R0 "%programfiles%" "$PROGRAMFILES" "+" $R1
        ${WordReplace} $R1 "%windir%" "$WINDIR" "+" $R0
        ${WordReplace} $R0 "%appdata%" "$APPDATA" "+" $R1
        ${WordReplace} $R1 "%systemdrive%" "$SysDrive" "+" $R0
        StrCpy $INSTDIR $R0
        ${EndIf}
${EndIf}

Да, так работает.

wolkow70 17-06-2012 10:58 1935662

Цитата:

Цитата kotkovets
А значит 32разрядной системе $PROGRAMFILES64 — папка Program files. »

Прктически оно так и получается. Смущает то, что это не документировано в официальной справке:

$PROGRAMFILES, $PROGRAMFILES32, $PROGRAMFILES64

The program files directory (usually C:\Program Files but detected at runtime). On Windows x64, $PROGRAMFILES and $PROGRAMFILES32 point to C:\Program Files (x86) while $PROGRAMFILES64 points to C:\Program Files. Use $PROGRAMFILES64 when installing x64 applications.

Поэтому расписываю отдельно.

wolkow70 17-06-2012 11:29 1935673

Вот еще интересно:
Насколько оправдано использование хедера MoveFileFolder?
http://nsis.sourceforge.net/MoveFileFolder
Имеет ли он какие либо преимущества перед коммандой
Rename $INSTDIR\file.ext $INSTDIR\file.dat ?

kotkovets 17-06-2012 12:00 1935685

Цитата:

Цитата wolkow70
Имеет ли он какие либо преимущества перед коммандой
Rename $INSTDIR\file.ext $INSTDIR\file.dat ? »

преимущество только в том, что можно указывать какие файлы(с каким расширением) нужно переместить из папки, включая
вложенные каталоги с файлами.

wolkow70 17-06-2012 12:15 1935692

kotkovets,
Существует ли какой-либо сопособ (плагин например) разлочить занятый эксплорером файл. Например по пиду процесса (подобно анлокеру).
Выясняется, что залоченный файл RarExt.dll (или аналогичные) можно в процессе деинсталляции переименовать напрмер в RarExt.dll.0.tmp переместив в папку TEMP, и удалить программную папку без перезагрузки. Это дает возможность сразу переустановить программу без перезагрузки. Но хочется уже в папке TEMP как-то добить этой файл, так как его удаление требует все-равно перезагрузки или перезапуска экспорера.
Еще задачка перед перемещением файла проверить временную папку на наличие файла с таким же именем, и если есть то переименовать RarExt.dll.0.tmp в RarExt.dll.(номер).tmp и задать комманду на удаление.

kotkovets 17-06-2012 12:41 1935701

загруженная в оболочку проводника делка работает по пидом :) проводника.
Остальное, что вы пишите и видете - просто скрытие от глаз, что типа библиотека удаляется...
(хотя можно удалить физически файл, но это зависит от разработчика библиотеки, какие функции он всунул при разрегистации библиотеки) в оперативной памяти загруженная библиотека остается, до перезагрузки компа/оболочки.
вообще это оффтоп, поэтому обсуждение не хочу продолжать - написал так, как я считаю.

Ivn78 17-06-2012 13:33 1935710

del

kotkovets 17-06-2012 13:53 1935722

Цитата:

Цитата Ivn78
Подскажите плиз, как удалить директорию, только если она пуста? »

#1985

Ivn78 17-06-2012 15:00 1935745

kotkovets,
ага, а макрос в какую часть кода лучше вставить? в начало?

wolkow70 17-06-2012 15:01 1935749

kotkovets,
Подскажите плиз где ошибка в функции - счетчик не меняет значения

Код:

Function un.RarExt
Push $2
Push $1
Push $0
;
${If} ${FileExists} "$INSTDIR\RarExt.dll.0.tmp"
StrCpy $2 0
FindFirst $0 `$1` "$INSTDIR\RarExt*"
${Do}
IntOp $2 $2 + 1
FindNext $0 `$1`
${LoopUntil} $1 == ``
FindClose $0
${If} $2 != 0
!insertmacro MoveFile "$INSTDIR\RarExt.dll" "$INSTDIR\RarExt.dll.$2.tmp"
${EndIf}
${Else}
!insertmacro MoveFile "$INSTDIR\RarExt.dll" "$INSTDIR\RarExt.dll.0.tmp"
${EndIf}
;
Pop $0
Pop $1
Pop $2
FunctionEnd

Call un.RarExt

kotkovets 17-06-2012 15:18 1935758

Цитата:

Цитата Ivn78
ага, а макрос в какую часть кода лучше вставить? в начало? »

без разницы, главное запуск макроса происходил после объявления макроса.
Цитата:

Цитата wolkow70
где ошибка в функции »

смешно становится, если выделить глобальное условие
Код:

  ${If} ${FileExists} "$INSTDIR\RarExt.dll.0.tmp"
        ;!insertmacro MoveFile "$INSTDIR\RarExt.dll" "$INSTDIR\RarExt.dll.$2.tmp"
        ;тут выполняются условия, если есть файл - $INSTDIR\RarExt.dll.0.tmp
  ${Else}
        ;!insertmacro MoveFile "$INSTDIR\RarExt.dll" "$INSTDIR\RarExt.dll.0.tmp"
        ;тут выполняются условия, если нету файла - $INSTDIR\RarExt.dll.0.tmp
  ${EndIf}


wolkow70 17-06-2012 16:37 1935789

Цитата:

Цитата kotkovets
если выделить глобальное условие »

Тут должно выполняться условие такое:
1. Если нет файла $INSTDIR\RarExt.dll.0.tmp, то файл $INSTDIR\RarExt.dll переименовывается в $INSTDIR\RarExt.dll.0.tmp
Это в приведенной функции работает.

2. Если есть $INSTDIR\RarExt.dll.0.tmp, то он переименовывается в "$INSTDIR\RarExt.dll.$2.tmp", а файл "$INSTDIR\RarExt.dll" переименовывается в $INSTDIR\RarExt.dll.0.tmp
Это не работает. Нумерация файла в $2 не меняется.

kotkovets 17-06-2012 17:08 1935799

Цитата:

Цитата wolkow70
Это не работает. Нумерация файла в $2 не меняется. »

все работает.
Код:

  ${If} ${FileExists} "$INSTDIR\RarExt.dll.0.tmp"
        StrCpy $2 0
        FindFirst $0 `$1` "$INSTDIR\RarExt*"
        ${DoUntil} ${Errors}
            IntOp $2 $2 + 1
            MessageBox MB_OK "$1" IDOK
            FindNext $0 `$1`
        ${LoopUntil} $1 == ``
        FindClose $0
        MessageBox MB_OK "$2" IDOK
  ${EndIf}

Вот тока не пойму, зачем эта возня?
1. Если есть RarExt.dll.0.tmp, то $2 уже будет равен одному.
2. Все последующие файлы с именем RarExt* будут увеличивать на единицу переменную $2
3. Если таких файлов будет больше двух, будет переименовываться последний найденный.
---
или так все таки лучше :) вскидка на дальнейшее размышление...
Код:

  ${If} ${FileExists} "$INSTDIR\RarExt.dll.0.tmp"
        FindFirst $0 `$1` "$INSTDIR\RarExt*"
        ${DoUntil} ${Errors}
            Rename "$INSTDIR\$1" "$INSTDIR\RarExt.dll"
            FindNext $0 `$1`
        ${LoopUntil} $1 == ``
        FindClose $0
  ${EndIf}


wolkow70 17-06-2012 17:51 1935822

Цитата:

Цитата kotkovets
Вот тока не пойму, зачем эта возня? »

Так ведет себя программа при оригинальной деинсталляции. Видимо сделано для возможности оперативной переустановки или обновления программы. Я несколько раз устанавливал и удалял WinRar и каждый раз создавались новые файлы RarExt.dll.0.tmp с большим порядковым номером вместо 0. И так до перезагрузки. После чего они все удалялись.

kotkovets 17-06-2012 18:45 1935854

тренер
Код:

!include "MUI2.nsh"
OutFile "resrt.exe"
ShowInstDetails show

!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE Russian

Section ""
  StrCpy $2 -1
  FindFirst $0 `$1` "$EXEDIR\test*"
  ${DoUntil} ${Errors}
      StrCmp $1 "test.dll" +2
      Intop $2 $2 + 1
      DetailPrint "$2) $1"
      FindNext $0 `$1`
  ${LoopUntil} $1 == ``
  FindClose $0
  MessageBox MB_OK "integer: $2" IDOK
  ${If} $2 == -1
        CopyFiles /silent "$EXEDIR\test.dll" "$EXEDIR\test_0.dll"
  ${Else}
        Intop $2 $2 + 1
        CopyFiles /silent "$EXEDIR\test.dll" "$EXEDIR\test_$2.dll"
  ${EndIf}
SectionEnd


Vincent7 17-06-2012 19:46 1935886

kotkovets, вы ответите на мой вопрос?

kotkovets 17-06-2012 20:11 1935897

Цитата:

Цитата Vincent7
вы ответите на мой вопрос? »

ответ есть в теме и в справочнике для создания своих страниц.
---
Сами то что сделали по вопросу - не вижу ничего...

wolkow70 17-06-2012 20:44 1935908

Цитата:

Цитата kotkovets
Скрипт для тренировки, как создать файл с большим порядковым номером, так, что думайте, подсказка есть: »

Потестил тренировочный скрипт. Файл один раз скопировался test.txt - test_0.txt. Дальнейшие запуски тестера ни к чему не привели.

С WinRar вот как стоит задача:
При удалении программы RarExt.dll переименовывается в RarExt.dll.0.tmp. При этом RarExt.dll.0.tmp
и остается залоченной в оперативной памяти. Это позволяет продолжать работу с программой при обновлении или переустановке программы. Только после перезапуска оболочки полномочия переходят к новой делке.
При этом, если в папке с программой уже есть файл с наименованием RarExt.dll.0.tmp, то при следующей деинсталляции RarExt.dll переименовывается в RarExt.dll.1.tmp и т.д.

kotkovets 17-06-2012 21:20 1935918

Цитата:

Цитата wolkow70
Потестил тренировочный скрипт. Файл один раз скопировался test.txt - test_0.txt. Дальнейшие запуски тестера ни к чему не привели. »

исправил, тренируйтесь :) http://forum.oszone.net/post-1935854-2795.html

wolkow70 18-06-2012 12:03 1936209

Цитата:

Цитата kotkovets
исправил, тренируйтесь »

Мистика какая-то. Сделал из вашего кода тестер под свой лад:
Код:

  StrCpy $2 -1
  FindFirst $0 `$1` "$INSTDIR\RarExt*"
  ${DoUntil} ${Errors}
      StrCmp $1 "RarExt.dll" +2
      Intop $2 $2 + 1
      DetailPrint "$2) $1"
      FindNext $0 `$1`
  ${LoopUntil} $1 == ``
  FindClose $0
  MessageBox MB_OK "integer: $2" IDOK
  ${If} $2 == -1
        Rename "$INSTDIR\RarExt.dll" "$INSTDIR\RarExt.dll.0.tmp"
  ${Else}
        Intop $2 $2 + 1
        Rename "$INSTDIR\RarExt.dll" "$INSTDIR\RarExt.dll.$2.tmp"
  ${EndIf}

Компилирую, все работает как надо.
Помещаю код в функцию:

Код:

Function un.RarExt
Push $2
Push $1
Push $0
;
  StrCpy $2 -1
  FindFirst $0 `$1` "$INSTDIR\RarExt*"
  ${DoUntil} ${Errors}
      StrCmp $1 "RarExt.dll" +2
      Intop $2 $2 + 1
      DetailPrint "$2) $1"
      FindNext $0 `$1`
  ${LoopUntil} $1 == ``
  FindClose $0
  MessageBox MB_OK "integer: $2" IDOK
  ${If} $2 == -1
        Rename "$INSTDIR\RarExt.dll" "$INSTDIR\RarExt.dll.0.tmp"
  ${Else}
        Intop $2 $2 + 1
        Rename "$INSTDIR\RarExt.dll" "$INSTDIR\RarExt.dll.$2.tmp"
  ${EndIf}
;
Pop $0
Pop $1
Pop $2
FunctionEnd

Вызываю из анисталлера
Call un.RarExt
Не работает. Точнее переименовывает в первый раз. А потом показывает integer -1.
Кладу в папку тестер, запускаю, все срабатывает. Почему из функции не работает, не понятно.

Ivn78 18-06-2012 12:07 1936211

А можно как-то редактировать значение параметра в xml файле?

kotkovets 18-06-2012 12:17 1936216

Цитата:

Цитата wolkow70
Кладу в папку тестер, запускаю, все срабатывает. Почему из функции не работает, не понятно. »

тысячу раз писал $INSTDIR в инсталляторе не одно и тоже, что в деинсталляторе,
а текущая директория, где находится деинсталлятор, точнее откуда он запущен,
процесс деинсталлятора "раздваивается", что бы удалить самого себя
---
Ivn78, Можно, если представить, что это обычный текстовый файл.
есть плагин, но довольный тяжелый в плане изучения/применения.
http://nsis.sourceforge.net/XML_plug-in

wolkow70 18-06-2012 13:01 1936248

Цитата:

Цитата kotkovets
тысячу раз писал $INSTDIR в инсталляторе не одно и тоже, что в деинсталляторе,
а текущая директория, где находится деинсталлятор, точнее откуда он запущен, »

Это я знаю. В данном случае дело скорее всего не в этом. Так как, переименуемые файлы лежат в одной папке с деинсталлятором.

Ivn78 18-06-2012 13:01 1936249

kotkovets,
Цитата:

Цитата kotkovets
Можно, если представить, что это обычный текстовый файл »

а можно какой-нибудь пример...
нужно заменить значение Patch
Код:

<NotepadPlus>
    <GUIConfigs>
        <GUIConfig name="stylerTheme" path="C:\Program Files\Notepad++\stylers.xml" />
        </GUIConfig>
    </GUIConfigs>
</NotepadPlus>


wolkow70 18-06-2012 13:19 1936269

Цитата:

Цитата Ivn78
а можно какой-нибудь пример... »

Я так делал для Opera

Код:

${StrRep}

Var _FindInFile ; В эту переменную поместим полный путь к файлу, в котором будем производить замену
Var _LineReplace ; В эту переменную поместим строку, которую будем искать и заменять
Var _LineToInsert ; В эту переменную поместим строку, НА которую мы будем заменять искомую строку
Var _CurLineNumber ; В этой переменной храним номер обрабатываемой строки
Var _CurLine ; В этой переменной храним строку, с которой в данный момент сверяем
Var _LineNumbers ; В этой переменной храним количество строк в искомом файле

Function ReplaceLinesInFile
;
${LineSum} "$_FindInFile" $_LineNumbers ; Подсчитываем количество строк
strcpy $_CurLineNumber 0
startLineRead:
intop $_CurLineNumber $_CurLineNumber + 1
IntCmp $_CurLineNumber $_LineNumbers 0 0 endFunc ; Если номер текущей строки больше количества строк в файле - поиск завершен
${LineRead} "$_FindInFile" "$_CurLineNumber" $_CurLine ; Читаем строку по номеру текущей строки
${WordFind} '$_CurLine' "$_LineReplace" "E+1{" $R0 ; Ищем в строке нужный текст
StrCmp $R0 "1" startLineRead 0 ; Если в строке присутствует искомый текст, выполняем код ниже
${LineFind} "$_FindInFile" "" "" "Insert_Line" ; Вызываем функцию Insert_Line, которая произведёт замену
goto startLineRead
endFunc:
;
FunctionEnd

Function Insert_Line
StrCmp $R8 "$_CurLineNumber" 0 push
        ${StrRep} $_CurLine "$_CurLine" "$_LineReplace" "$_LineToInsert"
        FileWrite $R4 "$_CurLine"
        StrCpy $0 SkipWrite
        push:
        Push $0
FunctionEnd


StrCpy $_FindInFile '$INSTDIR\opera_install_log.xml' ; Заменяем строки в этом файле
StrCpy $_LineReplace 'C:\Program Files\Opera' ; Ищем и заменяем ЭТУ строку
StrCpy $_LineToInsert '$INSTDIR' ; На что будем заменять
Call ReplaceLinesInFile


kotkovets 18-06-2012 14:14 1936305

Цитата:

Цитата Ivn78
а можно какой-нибудь пример... »

http://forum.oszone.net/post-933509.html

Ivn78 18-06-2012 16:52 1936393

kotkovets,
Цитата:

Цитата kotkovets
есть плагин, но довольный тяжелый в плане изучения/применения »

Это правда... может, найдется время написать для конкретного примера?
http://forum.oszone.net/post-1936249.html#post1936249

K.A.V. 18-06-2012 18:52 1936445

Цитата:

Цитата Ivn78
Это правда... может, найдется время написать для конкретного примера? »

Найдите время и поищите в этой теме совсем недавно стоял почти такой же вопрос, нужно было в xml файле прочитать все строки и заменить значение пути к программе на свою строку, я тогда написал готовый пример, ищите в этой теме

wolkow70 18-06-2012 19:30 1936471

kotkovets,
Весь день бился с проблемой - решилось постановкой ClearErrors перед началом кода.

Код:

ClearErrors
StrCpy $2 -1
FindFirst $0 `$1` "$INSTDIR\RarExt*"
${DoUntil} ${Errors}
StrCmp $1 "RarExt.dll" +2
Intop $2 $2 + 1
DetailPrint "$2) $1"
FindNext $0 `$1`
${LoopUntil} $1 == ``
FindClose $0
MessageBox MB_OK "integer: $2" IDOK
  ${If} $2 == -1
        Rename "$INSTDIR\RarExt.dll" "INSTDIR\RarExt.dll.0.tmp"
  ${Else}
        Intop $2 $2 + 1
        Rename "$INSTDIR\RarExt.dll" "$INSTDIR\RarExt.dll.$2.tmp"
  ${EndIf}

Что за странные кавычки такие в коде ``. На нормальные кавычки они как переводятся?

wolkow70 18-06-2012 19:48 1936487

Цитата:

Цитата K.A.V.
Найдите время и поищите в этой теме совсем недавно стоял почти такой же вопрос, нужно было в xml файле прочитать все строки и заменить значение пути к программе на свою строку, я тогда написал готовый пример, ищите в этой теме »

Я уже приводил тут код . Вопрос был точно такой же.

Ivn78 18-06-2012 20:10 1936497

wolkow70, Там проблема с количеством строк, оно может быть разным. Но попробую прикрутить.

А как можно переименовать уже установленный (не при распаковки) файл?

kotkovets 19-06-2012 00:08 1936629

пример test.xml файла
PHP код:

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<NotepadPlus>
    <GUIConfigs>
           <GUIConfig name="stylerTheme" path="C:\Program Files\Notepad++\stylers.xml" />
    </GUIConfigs>
</NotepadPlus>


чтение и переход к нужному указанному узлу xml файла.

Код:


Name "XMLTest"
OutFile "XMLTest.exe"
ShowInstDetails show

!include "XML.nsh"
!include "Logiclib.nsh"
Section
${xml::LoadFile} "$EXEDIR\test.xml" $0
  ${If} $0 == 0
      ${xml::GotoPath} "/NotepadPlus/GUIConfigs/GUIConfig" $0 ;переходим к указаноому узлу
      ${xml::GetAttribute} "name" $0 $1 ;узнаем значение атрибута <name> узла </NotepadPlus/GUIConfigs/GUIConfig>
      DetailPrint "name = $0"
      ${xml::GetAttribute} "path" $0 $1
      DetailPrint "path = $0"
      ${xml::Unload}
  ${EndIf}
SectionEnd


перезапись( создание новых аттрибутов узла)

Перезаписываем значение аттрибута path узла /NotepadPlus/GUIConfigs/GUIConfig
Код:

  ${xml::LoadFile} "$EXEDIR\test.xml" $0
  ${If} $0 == 0
      ${xml::GotoPath} "/NotepadPlus/GUIConfigs/GUIConfig" $0 ;переходим к указаноому узлу
      ${xml::SetAttribute} "path" "test_test_test" $0 ;презапись аттрибутов узла
      ${xml::SaveFile} "$EXEDIR\test.xml" $0
      ${xml::Unload}
  ${EndIf}


дополнительно и очень важно!!!

Допустим в xml файле два узла - GUIConfigs
PHP код:

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<NotepadPlus>
    <GUIConfigs>
        <GUIConfig name="stylerTheme" path="C:\Program Files\Notepad++\stylers.xml" />
    </GUIConfigs>
    <GUIConfigs>
        <GUIConfig name="stylerTheme" path="C:\Program Files\Notepad++" />
    </GUIConfigs>
</NotepadPlus>

то путь к второму узлу GUIConfigs - /NotepadPlus/GUIConfigs[2]/GUIConfig
На практике очень много одноименных узлов, можно перечислить все пути к узлам, к примеру - GUIConfigs
Код:

        ${xml::LoadFile} "$EXEDIR\test.xml" $0
        loop:
          ${xml::FindNextElement} "GUIConfigs" $0 $1
          StrCmp $1 -1 close
          ${xml::ElementPath} $0
          DetailPrint "ElementPath: $0"
          Goto loop
        close:
        ${xml::FindCloseElement}
        ${xml::Unload}


wolkow70 19-06-2012 10:11 1936751

Цитата:

Цитата Ivn78
А как можно переименовать уже установленный (не при распаковки) файл? »


Rename "$INSTDIR\Ext.dll" "INSTDIR\Ext.dll.bak"

Vincent7 19-06-2012 18:03 1937079

kotkovets, как сделать неактивным поле выбора папки на кастомной странице?

kotkovets 19-06-2012 18:49 1937104

Vincent7, как прочитать пару предыдущих страничек темы? например 278...

Vincent7 19-06-2012 19:53 1937138

kotkovets, kotkovets, ага, сделал, но фон поля остался белым, а нужно чтобы был серый как тут http://upwap.ru/2553232
Как сменить цвет?
И как вы звать 'свободно/требуется места на диске' опять же как на скрине?

kotkovets 19-06-2012 20:07 1937151

Цитата:

Цитата Vincent7
kotkovets, ага, сделал, но фон поля остался белым »

а покажите КАК сделали :lol:
а то я не знаю.... у меня всегда серый :) или белый :)

Vincent7 19-06-2012 20:24 1937172

kotkovets, вот так: nsDialogs::SelectFolderDialog /NOUNLOAD $9 "$R0"
Pop $R0
GetDlgItem $R0 $HWNDPARENT 0
EnableWindow $R0 0

kotkovets 19-06-2012 20:38 1937193

Vincent7, а причем тут выбор папки??????????????????????????????????
Если SelectFolderDialog возвращает выбранную папку (путь к папке) иначе error
Код:

nsDialogs::SelectFolderDialog /NOUNLOAD $9 "$R0"
 Pop $R0
MessageBox MB_OK $R0

------
Цитата:

nsDialogs::SelectFolderDialog "титульная надпись" "$EXEDIR" ;-->(папка при открытии диалога)
Pop $R0
MessageBox MB_OK $R0
-----
может вам почитать справочку на русском -» nsDialogs: Создаем собственные страницы инсталлятора
И не делать и писать глупые сообщения, я не попугай, каждый раз повторять одно и тоже

Vincent7 19-06-2012 20:43 1937198

kotkovets, В русском справочнике не так много информации по плагину nsDialogs как хотелось бы, я английский читал. Да вы правы, глупость я написал, но с полем я разобрался. Осталось последнее, реализовать надписи 'свободно/требуется места на диске' как на скриншоте. Как их вызвать?

wolkow70 21-06-2012 11:12 1938047

Из СПРАВКИ:

Код:

Макрос ${AndIf} сработает (при выполнении условия равенства в ${AndIf}) в том случае,
если выполнится условие равенства в макросе ${If}, в ином случае ${AndIf} игнорируется.

Если в макросе ${If} выполнится условие равенства, то макрос ${OrIf} будет срабатывать всегда, игнорируя условия равенства значений. Если в макросе ${If} не выполнится условие равенства, то макрос ${OrIf} сработает, если выполнится условие равенства значений.

Поясните пожалуйста сколько раз могут последовательно повторяться макросы AndIf и OrIf ?

Код:

Пример на макросе ${IfNotThen}:
По этому макросу из справки для меня не совсем понятно как он работает.

kotkovets 21-06-2012 11:59 1938066

Цитата:

Цитата wolkow70
Поясните пожалуйста сколько раз могут последовательно повторяться макросы AndIf и OrIf ? »

Сколь угодно теоритически, на практике сложнее - преобладание идет составных условий.
Здесь нужно правильно раставить логику, просто размышлять логически.
AndIf - логика И, срабатывает при выполнении двух условий, типа, если только палка колбасы
и сарделька, условие выполнения наличие двух продуктов...
OrIf - логика ИЛИ, срабатывает. если одно из условий выполняется, независимо от другога, к примеру,
если палка колбасы ИЛИ сарделька...достаточно имения одного из перечисленных продуктов. чтобы условие выполнилось.
Цитата:

Цитата wolkow70
Пример на макросе ${IfNotThen}:По этому макросу из справки для меня не совсем понятно как он работает. »

Условие отрицания - НЕ
то же самое для чисел с одной командой
Код:

${If} 5 != 6
  ;5 не равно 6
${EndIf}

для выражений, текста и т.д
Код:

${IfNot} колбаса == колбаса
  ;НЕльзя  колбасу кушать
${EndIf}


wolkow70 21-06-2012 13:09 1938127

С макросами ${AndIf} ${OrIf} ${IfNot} в общем понятно.
Не понятно ${IfThen} ${IfNotThen}

Например в такой логике :

${IfThen} ${RunningX64} ${|}SetRegView 64${|}
Здесь выполняются комманды
${IfThen} ${RunningX64} ${|}SetRegView 32${|}

kotkovets 21-06-2012 13:18 1938136

Цитата:

Цитата wolkow70
Не понятно ${IfThen} ${IfNotThen} »

Это тоже самое, что
Код:

${If} $0 == 5
  MessageBox MB_OK "$$0 = $0"
${EndIf}
;-------одной строкой
${IfThen} $0 == 5 ${|} MessageBox MB_OK "$$0 = $0" ${|}

/**********************************************/

${IfNot} $0 == колбаса
  MessageBox MB_OK $0
${EndIf}
;-------одной строкой
${IfNotThen} $0 == колбаса ${|} MessageBox MB_OK $0 ${|}

Сокращенное написание одной команды в условии вместо 3 строк и все!

Vincent7 21-06-2012 17:26 1938312

kotkovets, я так понимаю, с моим вопросом вы не поможете?

wolkow70 23-06-2012 11:45 1939218

kotkovets,
Возник вопрос по использованию ${Errors} в логических конструкциях
Код:
Код:

ClearErrors
ReadINIStr $0 "$INSTDIR\operaprefs_default.ini" "System" "Multi User"
${If} $0 == "0"
SetOutPath "$INSTDIR\profile"
${ElseIf} $0 == "1"
SetOutPath "$APPDATA\Opera\Opera"
${ElseIf} ${Errors}
SetOutPath "$APPDATA\Opera\Opera"
${EndIf}

Так допустимо использовать? Нужно, если значение = 0 , то SetOutPath "$INSTDIR\profile , а если значение = 1 или параметр в ini вообще отсутствует, то SetOutPath "$APPDATA\Opera\Opera"

kotkovets 23-06-2012 12:41 1939255

Цитата:

Цитата wolkow70
Так допустимо использовать? »

конечно, можно добавить Else - иные условия, не удовлетворяющие выше условию и "объединить"
Код:

ClearErrors
ReadINIStr $0 "$INSTDIR\operaprefs_default.ini" "System" "Multi User"
${If} $0 == 0
      SetOutPath "$INSTDIR\profile"
${Else}
      ClearErrors
      SetOutPath "$APPDATA\Opera\Opera"
${EndIf}

---
Кстати, очень часто попадает в файле такая строка:
Код:

[System]
Multi User=0  ; If enabled Opera will use Windows profiles to store individual user settings

В этом случае: $0 = 0 ; If enabled Opera will use Windows profiles to store individual user settings
Поэтому из полученной строки, лучше всего брать только первый символ и затем под логику отдавать:
Код:

StrCpy $0 $0 1

wolkow70 23-06-2012 13:47 1939285

Цитата:

Цитата kotkovets
StrCpy $0 $0 1 »

Каждый раз надо прописывать в секциях перед логикой или один раз где-нибудь? Перед строкой ReadINIStr $0 или после?

kotkovets 23-06-2012 13:51 1939286

Цитата:

Цитата wolkow70
Перед строкой ReadINIStr $0 »

после ReadINIStr

wolkow70 23-06-2012 14:23 1939309

Что-то не найду в справке как после команды
WriteINIStr имя_файла "секция" "параметр" "значение_параметра"
создать пустую следующую (или последнюю) строку.

kotkovets 23-06-2012 15:07 1939327

Цитата:

Цитата wolkow70
Что-то не найду в справке как после команды
WriteINIStr имя_файла "секция" "параметр" "значение_параметра"
создать пустую следующую (или последнюю) строку »

Символы строк:
$\r --> переход каретки на новую строку
$\n --> создание новой строки
Код:

WriteINIStr $EXEDIR\test.ini "test" "test" "test$\n"
WriteINIStr $EXEDIR\test.ini "test1" "test1" "test1$\n"
WriteINIStr $EXEDIR\test.ini "test2" "test2" "test2$\n"


wolkow70 24-06-2012 17:54 1939741

kotkovets,

Возникло два практических вопроса:
1. Как действует флаг типа SetOverwrite on
- в пределах секции?
- применительно к конкретной команде?
- На протяжении всего скрипта?
- Пока не будет заменен другим флагом?
2. Существует ли несложный способ перед указанием команды RMDir /r "$INSTDIR" проверить не является ли удаляемая папка важной папкой Windows (типа $SYSDIR, $WINDIR, $APPDATA, $PROGRAMMFILES и т.п.?

kotkovets 24-06-2012 19:28 1939785

Цитата:

Цитата wolkow70
SetOverwrite on »

- На протяжении всего скрипта
- Пока не будет заменен другим флагом
К командам распаковки во время инсталляции - перезаписывать файл или нет(заменять новее старый файл)
Цитата:

Цитата wolkow70
Существует ли несложный способ перед указанием команды RMDir /r "$INSTDIR" проверить не является ли удаляемая папка важной папкой Windows (типа $SYSDIR, $WINDIR, $APPDATA, $PROGRAMMFILES и т.п.? »

типа того:
Код:

${If} $INSTDIR == $SYSDIR
    MessageBox MB_OK "Папка важная!"
    Abort
${EndIf}


wolkow70 24-06-2012 20:42 1939812

Цитата:

Цитата kotkovets
На протяжении всего скрипта »

То есть, если его выставить в первой секции, отвечающей за распаковку файлов, то он будет действовать и во всех других секциях, если в них не будет выставлен иной флаг?
Цитата:

Цитата kotkovets
К командам распаковки во время инсталляции »

К командам типа CopyFiles и Rename он не относится?

kotkovets 24-06-2012 21:32 1939829

Цитата:

Цитата wolkow70
То есть, если его выставить в первой секции, отвечающей за распаковку файлов, то он будет действовать и во всех других секциях, если в них не будет выставлен иной флаг? »

попробуйте, чем сто раз писать...
Цитата:

Цитата wolkow70
К командам типа CopyFiles и Rename он не относится? »

нет

Shivaki 25-06-2012 11:32 1940088

Добрый день! Выбирается ПО для создания инсталляции. Предполагается долгосрочное использование данного ПО для распространения большого количества разрабатываемых программ (организация). Очень нравится NSIS по своим возможностям. Но смущает, что текущая версия от 2009 года. Что вы можете сказать по поводу проекта NSIS: он еще жив, будет развиваться или как?

kotkovets 25-06-2012 11:40 1940092

Цитата:

Цитата Shivaki
Что вы можете сказать по поводу проекта NSIS: он еще жив, будет развиваться или как? »

Для текущих задач хорошо подходит - мощная поддержка WinAPI и плагинов.
Насчет развития: или как..:)

Shivaki 25-06-2012 12:08 1940107

Цитата:

Цитата kotkovets
Для текущих задач хорошо подходит - мощная поддержка WinAPI и плагинов.
Насчет развития: или как.. »

Да, для любых современных install-задач отличное и очень мощное средство. Но как-то не хочется начинать работать с проектом, который уже заведомо не поддерживается :(, т.к. это не разовая задача

K.A.V. 25-06-2012 13:06 1940140

Цитата:

Цитата Shivaki
Но как-то не хочется начинать работать с проектом, который уже заведомо не поддерживается »

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

Krinkels 25-06-2012 14:08 1940167

Цитата:

Цитата Shivaki
он еще жив, будет развиваться или как? »

NSIS как Цой, он жив :)
А так, из проекта ушел главный разработчик, так что будет новая версия или нет толком неизвестно.
Как по мне, так у NSIS достаточно своеобразный синтаксис, в который сразу тяжело въехать. За то есть огромная куча плагинов, через которые реализовано очень многое.

Shivaki 26-06-2012 08:08 1940571

Отписал на оф. сайт. Получил вот такой ответ:
There wasn't a release, but SVN is being updated in the background. A new release will hopefully be coming soon. No timeframe is available. Amir Szekely

Надеются, что новый релиз будет позже, но сроков назвать не могут.
Вобщем буду думать... Спасибо всем за ответы!

wolkow70 26-06-2012 13:42 1940754

kotkovets, помогите советом.

Наблюдаю такую проблему:
От случая к случаю в инсталляторе сбрасывается флаг SectionIn RO при коцании по другим чебоксам. При этом до перезапуска инсталлятора вернуть его снова не удается. Совершенно недоумеваю по какой причине это может происходить. Причем иногда сбрасывается, иногда нет.

Section "!${PRODUCT_NAME} (установка программы)" Install
SectionIn RO

---бла----
SectionEnd

PS: Обнаружил, что баг повторяется с несколькими инсталляторами, в скрипте которых был применен генератор ответов.

K.A.V. 26-06-2012 16:09 1940848

wolkow70, думаю, после всех сообщений в данной теме по работе с секциями (и с помощью информации в файле справки), вам не составит труда в функцию .onSelChange прописать команду на присвоение флагов (только чтение | отмечен) для даной секции

wolkow70 26-06-2012 17:03 1940885

Цитата:

Цитата K.A.V.
wolkow70, думаю, после всех сообщений в данной теме по работе с секциями (и с помощью информации в файле справки), вам не составит труда в функцию .onSelChange прописать команду на присвоение флагов (только чтение | отмечен) для даной секции »

Пробовал. Флаг ставится на момент запуска. При запуске инсталлятора он и так есть. Он сбрасывается в процессе операций с другими секциями.
Писал в Function .OnInit
IntOp $R0 $R0 | ${SF_SELECTED}
SectionSetFlags ${Install} "$R0"
Не помогает. Все равно, иногда сбрасывается.

kotkovets 26-06-2012 18:55 1940952

wolkow70, проблема со всем другом и не стоит гадать на кофейной гуще.
скрипт (без файлов) в студию...и будет все видно

K.A.V. 26-06-2012 18:56 1940953

Цитата:

Цитата wolkow70
Писал в Function .OnInit »

без комментариев....
Цитата:

Цитата K.A.V.
в функцию .onSelChange прописать команду на присвоение флагов »


wolkow70 26-06-2012 19:21 1940965

Цитата:

Цитата K.A.V.
без комментариев.... »

Почему же без комментариев? Не Ваши ли рекомендации из Справки:
Код:

Так же вы можете использовать варианты типа таких:

Section "Тестирование" TEST_SEC
SectionEnd

Function .onInit
  # При запуске инсталлятора назначаем секции статусы "Отмечена" и "Только для чтения"
  IntOp $0 ${SF_SELECTED} | ${SF_RO}
  SectionSetFlags ${TEST_SEC} $0
FunctionEnd

Так я по началу и пробовал решить проблему.

Что касается функции:
.onSelChange

то она у меня имеет такой вид:

Код:

Function .onSelChange
!insertmacro StartRadioButtons $1
!insertmacro RadioButton ${MultiUser}
!insertmacro RadioButton ${AllUser}
!insertmacro EndRadioButtons
FunctionEnd

и не имеет отношения к секции

Section "!${PRODUCT_NAME} (установка программы)" Install
SectionIn RO

K.A.V. 26-06-2012 19:26 1940969

Цитата:

Цитата wolkow70
Не Ваши ли рекомендации из Справки: »

Мои, НО у вас возникли проблемы, я пытаюсь вас натолкнуть на решение, а вы ничего не понимаете...
Я же вам ясно написал, пропишите в секции команду на установку флага секции, может и поможет

Код:

Function .onSelChange
!insertmacro StartRadioButtons $1
!insertmacro RadioButton ${MultiUser}
!insertmacro RadioButton ${AllUser}
!insertmacro EndRadioButtons

  IntOp $0 ${SF_SELECTED} | ${SF_RO}
  SectionSetFlags ${Install} $0

FunctionEnd


wolkow70 27-06-2012 09:58 1941214

Цитата:

Цитата K.A.V.
может и поможет
Код:
Function .onSelChange
!insertmacro StartRadioButtons $1
!insertmacro RadioButton ${MultiUser}
!insertmacro RadioButton ${AllUser}
!insertmacro EndRadioButtons
IntOp $0 ${SF_SELECTED} | ${SF_RO}
SectionSetFlags ${Install} $0
FunctionEnd »

Да, спасибо, помогло решить проблему.
Представляется мне, что такой проблемы вообще не должно быть

Цитата:

Цитата kotkovets
скрипт (без файлов) в студию...и будет все видно »

Скрипт внушительный больно, более 2000 строк.

Vincent7 27-06-2012 18:07 1941565

K.A.V., приветствую. Я попробовал, но неполучилось . Посмотрите, пожалуйста скрипт и скажите что я делаю не так..
http://upwap.ru/2571536

K.A.V. 27-06-2012 19:43 1941605

Vincent7, функцию "r" переместите ниже секций, в которых прописаны файлы для упаковки в инсталлятор, вы в функции используете идентификаторы секций, которые в скрипте не определены ДО функции "r", в этом и есть ошибка

Vincent7 27-06-2012 20:13 1941624

K.A.V., Спасибо вам огромное, все заработало!

Vincent7 27-06-2012 21:48 1941669

K.A.V., а если секций не 2 а 8, как тогда сделать?

wolkow70 29-06-2012 10:34 1942562

kotkovets, помогите пожалуйста с одним вопросом.

В скрипте:
Insttype "Стандартная установка" # SectionIn 1
Insttype "Распаковка портативной версии" # SectionIn 2

Не нужные секции для портативной распаковки я отключил.
SectionIn 1

Вопрос возник с секцией:

Section "!${PRODUCT_NAME} (установка программы)" Install
SectionIn RO

Там есть комманды, отвечающие за распаковку файлов, и есть комманды на внесение записей в реестр.
Как то можно из секции прочитать текущий тип установки, и если он "Распаковка портативной версии", то после распаковки пропустить комманды до конца секции по метке?

kotkovets 29-06-2012 11:20 1942595

wolkow70, для этого создается кастомная страничка с двумя радиобутонами:
1) стандартная установка
2) рапаковка портативки.
далее снимаются статусы радиобутонов и в секциях сравниваются состояния радибутонов для инсталляции/рапаковки.
Цитата:

Цитата wolkow70
Insttype "Стандартная установка" # SectionIn 1
Insttype "Распаковка портативной версии" # SectionIn 2 »

Велосипед :)

wolkow70 29-06-2012 12:28 1942637

Цитата:

Цитата kotkovets
для этого создается кастомная страничка с двумя радиобутонами: »

Не хочу я кастомную делать.

K.A.V. 29-06-2012 14:34 1942732

Цитата:

Цитата Vincent7
K.A.V., а если секций не 2 а 8, как тогда сделать? »

То нужно включить логику и добавить по аналогии

Цитата:

Цитата wolkow70
Как то можно из секции прочитать текущий тип установки »

Код:

GetCurInstType
Не?

wolkow70 29-06-2012 16:51 1942847

Цитата:

Цитата K.A.V.
GetCurInstType
Не? »

Не совсем понял... В справке по этому ничего нет.
Как это реально применить?

K.A.V. 29-06-2012 17:48 1942885

Цитата:

Цитата wolkow70
В справке по этому ничего нет. »

В англоязычной не так много информации по данной команде, использовать не сложно же...

Код:

Insttype "Стандартная установка" # SectionIn 1
Insttype "Распаковка портативной версии" # SectionIn 2

Section "Секция №1"
SectionIn 1
SectionEnd

Section "Секция №2"
SectionIn 2
SectionEnd

Section "Секция №3"
SectionIn 1
SectionEnd

Section "Секция №4"
SectionIn 2
SectionEnd


Section -Post
GetCurInstType $0
StrCmp $0 "0" 0 +2
MessageBox MB_OK|MB_ICONINFORMATION "Выбрана Стандартная установка"
StrCmp $0 "1" 0 +2
MessageBox MB_OK|MB_ICONINFORMATION "Выбрана Распаковка портативной версии"
StrCmp $0 "32" 0 +2
MessageBox MB_OK|MB_ICONINFORMATION "Пользователь выбрал свои компоненты для установки"
SectionEnd


Vincent7 30-06-2012 01:04 1943144

K.A.V., начал делать с восемью секциями, у sectiongetsize идентификаторы $1-8, а как тогда поставить идентификаторы к getflags?

K.A.V. 30-06-2012 06:42 1943178

Цитата:

Цитата Vincent7
у sectiongetsize идентификаторы $1-8 »

Это называют переменными

Цитата:

Цитата Vincent7
а как тогда поставить идентификаторы к getflags? »

Подставляйте с $R0 по $R9
К тому же, прочитайте справку, вопрос довольно глупый, если вы не умеете работать с переменными....

Vincent7 30-06-2012 18:21 1943428

K.A.V., ну да тоесть переменными, извиняюсь перепутал. теперь getsize $1-8, get3lags $R1-8, strcmp и strcpy тоже по аналогии сделал, но как это все сложить в oninit?

K.A.V. 30-06-2012 21:36 1943520

Vincent7, ну раз вы смогли всё сложить, почитайте ещё раз наш русскоязычный справочник по NSIS, а именно страничку "Логические конструкции", а потом попытайтесь их применить в вашем скрипте, если всё равно не получится, покажите результат того, чего вы написали

wolkow70 02-07-2012 11:53 1944244

kotkovets,

Что-то не работает с RegistryFunc.nsh такая конструкция:

${IfNot} ${KeyExists} "${HKCU}\Software\Classes\.${extenstion}"
${AndIfNot} ${KeyExists} "${HKLM}\SOFTWARE\Classes\.${extenstion}"
WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "" "UniExtract"
${EndIf}

Сделал так, работает:
${If} ${KeyExists} "${HKCU}\Software\Classes\.${extenstion}"
${ElseIf} ${KeyExists} "${HKLM}\SOFTWARE\Classes\.${extenstion}"
${Else}
WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "" "UniExtract"
${EndIf}

dix75 04-07-2012 13:24 1945628

Как определить есть ли в указанной дирректории вложенные дирректории?

kotkovets 04-07-2012 13:52 1945651

Цитата:

Цитата dix75
Как определить есть ли в указанной дирректории вложенные дирректории? »

С какой целью, и если папка не пуста?

dix75 04-07-2012 13:59 1945653

Цель есть или нет вложенные папки пустые или нет мне неважно

kotkovets 04-07-2012 14:10 1945659

Цитата:

Цитата dix75
Цель есть или нет вложенные папки пустые или нет мне неважно »

Код:

System::Call "Shlwapi::PathIsDirectoryEmpty(t'путь к папке')i.R0"

StrCmp $R0 1 0 +2
    MessageBox MB_OK "Папка пуста"
StrCmp $R0 0 0 +2
    MessageBox MB_OK "В папке что-то есть, не важно что..."


dix75 04-07-2012 14:42 1945685

kotkovets, Спасибо
но мне нужно чтобы в папке небыло папок а файлы могут быть

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

kotkovets 04-07-2012 15:17 1945719

Цитата:

Цитата dix75
но мне нужно чтобы в папке небыло папок а файлы могут быть »

ну можно как-то так
Код:

!include "FileFunc.nsh"
!include "LogicLib.nsh"

Function FindEpmty
  Intop $R0 $R0 + 1
  Push $0
FunctionEnd

Section
StrCpy $R0 0
ClearErrors
${Locate} "путь к папке" "/L=DE" "FindEpmty"
 IfErrors 0 +2
 StrCpy $R0 -1
${If} $R0 == -1
      MessageBox MB_OK "указываемая папка не существует" IDOK
${ElseIf} $R0 == 0
      MessageBox MB_OK "В указываемой папке нет вложенных папок или папки не пусты" IDOK
${ElseIf} $R0 > 0
  MessageBox MB_OK "В указываемой папке есть пустые вложенные папки(папка)" IDOK
${EndIf}
SectionEnd

В справке читайте - Locate, там все подробнее расписано.
---
зы.
каждая пустая папка увеличивает $R0 на единицу.

wolkow70 04-07-2012 15:30 1945735

Возник вопрос по радиобуттонам:

имею в скрипте:

Код:

Var 7ZRBTN

InstType "Сокращенная"
InstType "Полная"
InstType "Минимальная"

SectionGroup "Добавить в контексное меню 7Z-архивов" 7zContext
Section "Все пункты контекстного меню" 7zContextFull
SectionIn 2
!insertmacro RegisterContextMenuFull "7z"
SectionEnd
Section "Только пункт 'Извлечь с помощью UniExtract'" 7zContextMinimal
SectionIn 1
!insertmacro RegisterContextMenuMinimal "7z"
SectionEnd
SectionGroupEnd

Section "Ассоциировать с 7Z-архивами" 7ZAssoc
SectionIn 2
!insertmacro RegisterExtension "7z"
SectionEnd

Function .onSelChange
!insertmacro StartRadioButtons $7ZRBTN
!insertmacro RadioButton ${7ZContextMinimal}
!insertmacro RadioButton ${7ZContextFull}
!insertmacro RadioButton ${7ZAssoc}
!insertmacro EndRadioButtons
FunctionEnd


Function .OnInit
StrCpy $7ZRBTN ${7ZContextMinimal}
FunctionEnd

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

kotkovets 04-07-2012 16:00 1945760

Цитата:

Цитата wolkow70
Проблема в том, что с чебоксами секций самого радиобутона все нормально. Но две секции объеденены в группу, и если поставить галку на чекбоксе самой секции, то отмеченными получаются обе входящие в группу секции. »

уберите, строка лишняя
Код:

!insertmacro RadioButton ${7ZAssoc}

wolkow70 04-07-2012 16:04 1945767

Цитата:

Цитата kotkovets
уберите, строка лишняя »

В том и дело, что не лишняя. Здесь присутствует взаимоисключающий выбор:
Просто интегрировать в контекстное меню (два варианта - сокращенный и расширенный), или ассоциировать с файлами.
При нажатии 7ZAssoc должны отключаться 7ZContextMinimal и 7ZContextFull. Они и отключаются. Но затем если на чебоксе группы секций 7zContext поставить галочку, то активными становятся обе включенные подсекции, а нужно только 7ZContextMinimal .

kotkovets 04-07-2012 16:26 1945790

wolkow70, читайте с где-то страниц 20 назад там есть решения.

wolkow70 04-07-2012 16:45 1945813

Цитата:

Цитата kotkovets
wolkow70, читайте с где-то страниц 20 назад там есть решения. »

Если имеется в виду пост http://forum.oszone.net/post-1915688-2705.html , то я не пойму где в нем решение именно этой задачи.
Это ? SectionSetFlags ${IDS_1} ${SECTION_OFF} ;фиктивно отключаем группу ?

kotkovets 04-07-2012 20:41 1945963

Цитата:

Цитата wolkow70
SectionSetFlags ${IDS_1} ${SECTION_OFF} ;фиктивно отключаем группу ? »

да, достаточно добавить эту команду, но вытекают еще тысячу проблем...
--
ЗЫ.
Поэтому такие вопросы решаю через свои странички: просто и комфортно.

wolkow70 05-07-2012 11:54 1946276

Несложный вопрос.. :)
Кодек DivX.dll на 32-разрядной ОС распаковывается WINDOWS\system32
Пишу SetOutPath "$SYSDIR".
А на 64-битной распаковывается в WINDOWS\SysWOW64. Как тут правильно путь прописать?

kotkovets 05-07-2012 12:06 1946285

Цитата:

Цитата wolkow70
А на 64-битной распаковывается в WINDOWS\SysWOW64. Как тут правильно путь прописать? »

в библиотеке x64.nsh все расписано с примерами.

wolkow70 05-07-2012 13:05 1946317

Так сделал.

Код:

SetOutPath "$SYSDIR"
;
${If} ${RunningX64}
${EnableX64FSRedirection}
File "${pkgdir}\DivX\DivX.dll"
File "${pkgdir}\DivX\dpl100.dll"
${DisableX64FSRedirection}
${Else}
File "${pkgdir}\DivX\DivX.dll"
File "${pkgdir}\DivX\dpl100.dll"
${EndIf}


wolkow70 05-07-2012 18:50 1946634

kotkovets,

Пока делаю так, (из вашего примера):

Код:

${If} ${RunningX64}
  SetRegView 64
  WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components\6FA8588DEBF295543BD8D53E676560BE" "A4EAA01E8B89A024DB390E25C0326D42" "$INSTDIR\Nero Burning ROM\NeroExpress.exe"
  SetRegView 32
${Else}
  WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components\6FA8588DEBF295543BD8D53E676560BE" "A4EAA01E8B89A024DB390E25C0326D42" "$INSTDIR\Nero Burning ROM\NeroExpress.exe"
${EndIf}

Но куски кода внушительные, не хочется повторять (только одинаковые записи в реестр)
Думаю, как красивее можно сделать? Таким образом нормально?

Код:

${If} ${RunningX64}
 SetRegView 64
${Else}
 SetRegView 32
${EndIf}
  WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components\6FA8588DEBF295543BD8D53E676560BE" "A4EAA01E8B89A024DB390E25C0326D42" "$INSTDIR\Nero Burning ROM\NeroExpress.exe"
SetRegView 32


kotkovets 05-07-2012 23:18 1946793

Цитата:

Цитата wolkow70
Таким образом нормально? »

а зачем и к чему переключать вид реестра в 32-разрядной системе? смысла нет!
Цитата:

Цитата wolkow70
Думаю, как красивее можно сделать? »

Код:

${IfThen} ${RunningX64} ${|}SetRegView 64${|}
WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components\6FA8588DEBF295543BD8D53E676560BE" "A4EAA01E8B89A024DB390E25C0326D42" "$INSTDIR\Nero Burning ROM\NeroExpress.exe"
${IfThen} ${RunningX64} ${|}SetRegView 32${|}


wolkow70 06-07-2012 11:18 1946988

kotkovets,
Нормально. Получается, что такую логику можно применить и к такой конструкции?

${If} ${RunningX64}
${EnableX64FSRedirection}
File "${pkgdir}\DivX\DivX.dll"
${DisableX64FSRedirection}
${Else}
File "${pkgdir}\DivX\DivX.dll"
${EndIf}

У меня вызывают затруднение такие символы ${|}, что и в каких случаях ими выделяется?

kotkovets 06-07-2012 14:16 1947077

Цитата:

Цитата wolkow70
Получается, что такую логику можно применить и к такой конструкции? »

в макросах ${EnableX64FSRedirection} и ${DisableX64FSRedirection} используется
функция API, которой нет в х32.
Цитата:

Цитата wolkow70
У меня вызывают затруднение такие символы ${|}, »

я уже писал поэтому поводу, что:
Код:

${If} ${RunningX64}
  SetRegView 64
${EndIf}

то же самое, только для одной команды:
Код:

${IfThen} ${RunningX64} ${|} SetRegView 64 ${|}
аля стиль Visual Basic (VB)

wolkow70 07-07-2012 12:32 1947547

Товарищи, что-то не собирается инсталлятор с таким вариантом выбора типов деинсталляции:

InstType "un.Полное удаление MyApp" /NOCUSTOM
InstType "un.Удаление компонентов MyApp"

Смысл такой хочу придать:
Есть секция:
"Un.Полное удаление"

И секции
"Un.Удаление компонента 1"
"Un.Удаление компонента 2"
"Un.Удаление компонента 3"

При выборе типа удаления "Полное удаление" должна быть активна только секция "Un.Полное удаление", остальные секции не активны без выбора.
При выборе "un.Удаление компонента" первая секция не активна без выбора, остальные доступны для выбора, но не активны по умолчанию.
Прошу помощи.

K.A.V. 07-07-2012 13:08 1947560

Цитата:

Цитата wolkow70
При выборе типа удаления "Полное удаление" должна быть активна только секция "Un.Полное удаление", остальные секции не активны без выбора. »

Сколько можно издеваться? Вы имейте совесть, уже столько всего про секции здесь написано, что мне даже стыдно сейчас это сообщение писать

Читайте посты, читайте справку, вся информация по секциям есть, всё можно сделать!
А уж обычное присваивание флага секциям, если 1 секция отмечена, что может быть проще после всех примеров в этой теме????

От вашей лени я уже в шоке

Цитата:

Цитата wolkow70
Прошу помосчи. »

"прошу готовый код"

wolkow70 07-07-2012 13:11 1947563

А это как раз из Справки пример.

InstType "Полная" /NOCUSTOM
- отключает возможность самостоятельного выбора пользователем компонентов.
Пишу в скрипте InstType "un.Полное удаление MyApp" /NOCUSTOM
Но, компилляция не происходит.

Цитата:

Цитата K.A.V.
А уж обычное присваивание флага секциям »

Флаги присвоены. При запуске деинсталлятора, все изначально отмечается как нужно. Мне нужно, чтобы при "полном удалении" было невозможно изменить состав компонентов.

K.A.V. 07-07-2012 13:21 1947570

Цитата:

Цитата wolkow70
А это как раз из Справки пример »

А я вам абсолютно про другое говорю, вы опять не видите, что я вам пишу? Я вам пишу про секции

Вам необходимо использова функцию:

Код:

Function .onSelChange
FunctionEnd

В ней используйте команды:
GetCurInstType (пару страничек назад я про неё рассказывал, не помню кому делал пример)
SectionSetFlags

Я вижу этот код уже перед глазами даже без наброска, там буквально пара строк...

wolkow70 07-07-2012 13:43 1947585

Цитата:

Цитата K.A.V.
Я вам пишу про секции »

А я спрашивал про опции комманды InstType. Меня интересует почему они не работают.
В справке указаны возможные параметры /NOCUSTOM, /CUSTOMSTRING, /COMPONENTSONLYONCUSTOM.

wolkow70 07-07-2012 15:05 1947622

K.A.V.,
Пришлось таки делать через Function un.onSelChange.
И еще в Function un.onInit прописать комманды для инициализации значений при запуске деинсталлятора.

Кто-нибудь подскажет, как из выпадающего списка типов инсталляции убрать "По выбору", дабы его не было вообще?

K.A.V. 07-07-2012 15:13 1947624

Цитата:

Цитата wolkow70
А я спрашивал про опции комманды InstType. Меня интересует почему они не работают. »

Может быть, нужно было попробовать разные варианты, и посмотреть какую ошибку пишет компилятор в данных строках?

Цитата:

Цитата wolkow70
Кто-нибудь подскажет, как из выпадающего списка типов инсталляции убрать "По выбору", дабы его не было вообще? »


Создайте "пустой" Insttype
Код:

Insttype /NOCUSTOM
Insttype "Первая секция"
Insttype "Вторая секция"


wolkow70 07-07-2012 16:09 1947645

C деинсталлятором такой вариант не проходит:
InstType un. /NOCUSTOM
Usage: InstType [un.]install_type_name | /NOCUSTOM | /CUSTOMSTRING=str | /COMPONENTSONLYONCUSTOM

K.A.V. 08-07-2012 16:32 1948137

Цитата:

Цитата wolkow70
C деинсталлятором такой вариант не проходит: »

Значит там в самом NSIS ошибка, от нас это не зависит...

Либо делайте свою страничку с выбором типа удаления (что более разумно на мой взгляд)
Либо, можно вот так "извратиться" над NSIS (вроде бы работает)

Код:

InstType "un.Полное удаление MyApp"
InstType "/CUSTOMSTRING=Удаление компонентов MyApp"

Section "un.Секция №1"
SectionIn 1
SectionEnd

Section "un.Секция №2"
SectionIn 3
SectionEnd

Section "un.Секция №3"
SectionIn 1
SectionEnd

Section "un.Секция №4"
SectionIn 3
SectionEnd

Вообщем тип удаления "Удаление компонентов MyApp" вообще, по идее, идёт как пункт "Выборочное удаление", мы просто изменили название секции, за место "Выборочно" поставили свой текст

И обратите внимание на SectionIn 3 на циферку 3, это будет тип удаления "Удаление компонентов MyApp"

Запустил, проверил, вроде работает...Ну а обработку типа удаления в коде, я думаю вы уже сами определите, пример команды я давал здесь уже

wolkow70 09-07-2012 14:40 1948657

K.A.V.,
При таком варианте:
InstType "un.Полное удаление MyApp"
InstType "/CUSTOMSTRING=Удаление компонентов MyApp"
в функции типа:
Код:

Function un.onSelChange
GetCurInstType $0
MessageBox MB_OK $0
${If} $0 == "0"
SectionSetFlags ${Component1} 16
SectionSetFlags ${Component2} 16
SectionSetFlags ${Component3} 16
${ElseIf} $0 == "1"
SectionSetFlags ${Component1} 0
SectionSetFlags ${Component2} 0
SectionSetFlags ${Component3} 0
${EndIf}
FunctionEnd

Всегда при переключении идет возврат $0 == "0" , что не дает возможности играть флагами в зависимости от типа установки.
C вариантом :
InstType "un.Полное удаление"
InstType "un.Удаление компонентов"
Возврат значений был 0 , 1 , 32

Код:

Section Uninstall Uninstaller
SectionIn 1 RO
--удаление полное
SectionEnd

Section "Un.Удаление Component1" Component1
SectionIn 3
!insertmacro UnDeleteComponent1
SectionEnd

Section "Un.Удаление Component2" Component2
SectionIn 3
!insertmacro UnDeleteComponent2
SectionEnd

Section "Un.Удаление Component3" Component3
SectionIn 3
!insertmacro UnDeleteComponent3
SectionEnd


K.A.V. 09-07-2012 16:33 1948742

Цитата:

Цитата wolkow70
Всегда при переключении идет возврат $0 == "0" , что не дает возможности играть флагами в зависимости от типа установки. »

Тогда мы "поиграем" с NSIS с помощью WinMessages :biggrin:

Не забудьте подключить
Код:

!include WinMessages.nsh
И делаем вот так:
Код:

Function un.onSelChange
        FindWindow $0 '#32770' '' $HWNDPARENT
        GetDlgItem $1 $0 1017
        SendMessage $1 ${CB_GETCURSEL} "" "" $0
FunctionEnd

В переменную $0 будет помещен результат:
0 - Полное удаление MyAp
1 - Удаление компонентов MyApp

wolkow70 12-07-2012 17:49 1950767

Код:

Function .onSelChange
!insertmacro StartRadioButtons $7ZRBTN
!insertmacro RadioButton ${7zContextMinimal}
!insertmacro RadioButton ${7zContextFull}
SectionSetFlags ${7zContext} ${SECTION_OFF}
!insertmacro EndRadioButtons
;
!insertmacro StartRadioButtons $001RBTN
!insertmacro RadioButton ${001ContextMinimal}
!insertmacro RadioButton ${001ContextFull}
SectionSetFlags ${001Context} ${SECTION_OFF}
!insertmacro EndRadioButtons
FunctionEnd

Почему-то, при коцании по секциям, раскрываются все секции в радио-бутонах у которых есть команда типа SectionSetFlags ${} ${SECTION_OFF}

K.A.V. 14-07-2012 13:44 1951638

У кого есть возможность протестировать спец. билд NSIS на 64-bit системе?
https://bitbucket.org/dgolub/nsis64/downloads

Якобы, есть возможность обойти ограничение в 2 Гб, но только на 64-bit системе, у самого данной возможности нет, если кто сможет - протестируйте и сообщите сюда

Vincent7 15-07-2012 22:41 1952377

K.A.V., приветствую вас. Подскажите пожалуйста, как сделать чтобы на странице компонентов если не выбран ни один компонент, то кнопка 'далее' была неактивна?

MKN 16-07-2012 19:35 1952996

Vincent7,
Уже был пример : http://forum.oszone.net/showpost.php...postcount=2705

Vincent7 17-07-2012 01:14 1953220

MKN, a попроще нельзя ли как нибудь?

MKN 18-07-2012 13:46 1954195

Цитата:

Цитата Vincent7
a попроще нельзя ли как нибудь? »

В NSIS нельзя "как нибудь". А нужно так, как надо и как правильно. Другое дело - для правильных решений возможны варианты достижения положительного результата.

Vincent7 18-07-2012 14:14 1954211

MKN, окей, возможен ли другой вариант для решения моей задачи?

MKN 18-07-2012 15:19 1954247

Vincent7,
Цитата:

Цитата Vincent7
возможен ли другой вариант для решения моей задачи? »

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

K.A.V. 18-07-2012 15:49 1954275

Цитата:

Цитата Vincent7
MKN, окей, возможен ли другой вариант для решения моей задачи? »

Интересно...Вам уже мало того, что вам предлагают готовое решение вашего вопроса?

Или вы думаете, зададите вопрос, а вам в ответ 10 разных готовых кодов предоставят, чтобы вы ещё и посидели и выбрали, какой же самый красивый?

Вам предлагают решение, вам оно не нравится
Вывод: делайте сами и делайте "что-то новенькое"

КУДА ещё проще того кода, который вам предоставили???
Перечитать статусы всех секций и блокировать/не блокировать кнопку...

Либо вам просто лень почитать справку и вникнуть в значение команд, больше к этому варианту склоняюсь как обычно
Или у меня уже мания на лень людей, всех подозреваю :lol:

Vincent7 18-07-2012 17:12 1954324

K.A.V., тогда подскажите просто как заблокировать кнопку 'далее' на странице компонентов. Я так понимаю если сделать вот так -
СектионГетФлагс{секция} $Р1
{$Иф} $Р1==0
код блокировки кнопки
{$ендиф}

Сработает? :lol:

K.A.V. 18-07-2012 17:49 1954341

Цитата:

Цитата Vincent7
СектионГетФлагс{секция} $Р1
{$Иф} $Р1==0
код блокировки кнопки
{$ендиф}
Сработает? »

Именно такой код - нет, не сработает, приведите его в код NSIS скрипта, и, если у вас 1 секция, то сработает

Vincent7 18-07-2012 21:07 1954461

K.A.V., отлично! Подскажете код блокировки?:)

K.A.V. 18-07-2012 21:28 1954473

Цитата:

Цитата MKN
Vincent7,
Уже был пример : http://forum.oszone.net/showpost.php...postcount=2705 »

"Поищите" код блокировки в посте, ссылку на которую вам уже дали, там даже комментарии есть...
Из принципа не дам готовый код

Vincent7 19-07-2012 02:08 1954599

K.A.V., Спасибо. Такой вопрос, можно ли сделать так - проверить наличие такой то папки, если она есть то такой то компонент сделать неактивным и не выбранным?

K.A.V. 19-07-2012 07:17 1954636

Цитата:

Цитата Vincent7
проверить наличие такой то папки, если она есть то такой то компонент сделать неактивным и не выбранным? »

Читаем справочку, очень полезный документик

Для данного кода вам нужно использовать команды
DirState
SectionSetFlags

wolkow70 19-07-2012 14:35 1954831

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

Код:

${If} ${FileExists} "$EXEDIR\1.reg"
GoTo label 1
${ElseIf} ${FileExists} "$EXEDIR\2.reg"
GoTo label 2
${EndIf}
label 1:
label 2:

Или переход по метке допустим только внутри логики ?

K.A.V. 19-07-2012 14:44 1954835

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

Код:

IfFileExists "$EXEDIR\TEST1.log" label1 0
IfFileExists "$EXEDIR\TEST2.log" label2 0

MessageBox MB_OK|MB_ICONSTOP "Ни одного файла нету"

label1:
MessageBox MB_OK|MB_ICONINFORMATION "Первый файл найден, переходим сюда"

label2:
MessageBox MB_OK|MB_ICONINFORMATION "Первого файла нет, но есть второй"


wolkow70 19-07-2012 14:58 1954842

Цитата:

Цитата K.A.V.
а чем вам не угодили простые конструкции проверки файлов, типа таких... »

Пока так и сделал. Бывает, что нужно много файлов проверить, тогда лучше в логике через:
${If} ${FileExists}
${OrIf} ${FileExists}

Vincent7 19-07-2012 17:23 1954938

K.A.V., я сделал так http://upwap.ru/2620264
Код компилируется но инсталлятор не запускается, просто висит в процессах и все.

K.A.V. 19-07-2012 18:11 1954961

Цитата:

Цитата Vincent7
Код компилируется но инсталлятор не запускается, просто висит в процессах и все. »

А посидеть и проанализоровать кажду строчку своего кода, никак?
Смотрите внимательно... у вас лишний "прыжок" на метку dlc_3, который и вызывает данное поведение инсталлятора


Код:

${DirState} "$INSTDIR\BioGame\DLC\DLC_UNC_Pack01" $2
${If} $2 == "1"
IntOp $2 0 | 16
SectionSetFlags ${SEC02} $2
Goto dlc_3
${OrIf} $2 == "-1"
Goto dlc_3
${EndIf}
dlc_3:
Goto dlc_3
${DirState} "$INSTDIR\BioGame\DLC\DLC_EXP_Part02" $3
${If} $3 == "1"
IntOp $3 0 | 16
SectionSetFlags ${SEC03} $3
Goto dlc_4
${OrIf} $3 == "-1"
Goto dlc_4
${EndIf}
dlc_4:

Удалите строку из кода, выделенную жирным шрифтом

Vincent7 19-07-2012 18:34 1954971

K.A.V., премного благодарен :)

Vincent7 19-07-2012 22:46 1955081

K.A.V., а как можно подсчитать количество файлов в папке и ее подпапках? И можно ли сделать так чтобы развёрнутую группу нельзя было свернуть?

K.A.V. 19-07-2012 23:27 1955100

Цитата:

Цитата Vincent7
K.A.V., а как можно подсчитать количество файлов в папке и ее подпапках? »

Читайте в справке про функцию Locate, там всё описано

Что-то типа такого получится у вас (поставьте в поиск только файлы)
Код:

; В начале кода
!include "FileFunc.nsh"

Function TEST
var /global MyVar
${Locate} "$PROGRAMFILES" "/L=F" "Example3"

MessageBox MB_OK|MB_ICONINFORMATION "Найдено $MyVar файлов"
FunctionEnd


Function Example3
IntOp $MyVar $MyVar + 1
        Push $0
FunctionEnd


Цитата:

Цитата Vincent7
И можно ли сделать так чтобы развёрнутую группу нельзя было свернуть? »

Пропишите в функцию .onSelChange команду на присвоение флага группе, присваивайте флаг

Код:

!define SF_EXPAND    32
Теоретически, должно сработать

msn 20-07-2012 02:21 1955149

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

Цитата:

File "toolbar.exe"

ExecWait "$TEMP\toolbar.exe -rotate=A -title=ToolBar -sid=1"

п.с. а можно ли его окно (1 страница: установить/закрыть) вставить как страницу своего инсталлера (размеры одинаковые) ? (типа как ифрэйм в вебе:) )

спасибо

wolkow70 20-07-2012 12:48 1955391

Не могу найти способ решить такую задачу:

Код:

InstType "Сокращенная"
InstType "Полная"
InstType "Минимальная"

Section "Установить для всех Пользователей" MultiUser
command1
SectionEnd

Section /o "Установить для текущего Пользователя" AllUser
command2
SectionEnd

Function .onSelChange
!insertmacro StartRadioButtons $1
!insertmacro RadioButton ${MultiUser}
!insertmacro RadioButton ${AllUser}
!insertmacro EndRadioButtons
FunctionEnd

Function .OnInit
StrCpy $1 ${MultiUser}
FunctionEnd

Задача сделать так, что бы инсталлятор запускался с InstType "Сокращенная" по умолчанию. Без радио-буттона - так оно и есть. Из-за радио-бутона запускается с типом установки "По выбору".
Кто-нибудь может подсказать возможно ли это обойти ?

Krinkels 20-07-2012 13:08 1955414

Цитата:

Цитата K.A.V.
У кого есть возможность протестировать спец. билд NSIS на 64-bit системе?
https://bitbucket.org/dgolub/nsis64/downloads
Якобы, есть возможность обойти ограничение в 2 Гб, но только на 64-bit системе, у самого данной возможности нет, если кто сможет - протестируйте и сообщите сюда »

Создается exe файл больше 2 гигов, но при установке выдает что возможно дистрибутив поврежден. И подготовка к запуску занимает уж очень большое время. Пробовал паковать 7 гигов, так рядом с инсталятором создается .dat файл размером как раз на 7 гигов. Запускать пробовал, но окончания проверки так и не дождался

Vincent7 20-07-2012 16:18 1955568

K.A.V., с подсчетом разобрался благодарю вас за пример, а вот второй пример не сработал , ошибка SF EXPAND already defined

K.A.V. 20-07-2012 17:33 1955619

Цитата:

Цитата msn
НО его окно появляется на втором плане. как его вывести на первый план? »

Читайте документацию к тулбару, думаю можно запустить его установку в скрытом режиме....

Цитата:

Цитата wolkow70
Кто-нибудь может подсказать возможно ли это обойти ? »

Код:

Function .OnInit
StrCpy $1 ${MultiUser}
SetCurInstType 0
FunctionEnd

Цитата:

Цитата Krinkels
Создается exe файл больше 2 гигов, но при установке выдает что возможно дистрибутив поврежден. И подготовка к запуску занимает уж очень большое время. Пробовал паковать 7 гигов, так рядом с инсталятором создается .dat файл размером как раз на 7 гигов. Запускать пробовал, но окончания проверки так и не дождался »

Вообщем бессмысленно как-то всё)
Проще создать тогда отдельный архив с помощью 7-ZIP


Цитата:

Цитата Vincent7
ошибка SF EXPAND already defined »

Читайте справочку, это флаги, которые используются в командах типа SectionSetFlags
А группу нельзя заморозить стандартными методами, посмотрел сейчас, можно сделать максимум чтобы группа разворачивалась, когда отмечают какой-либо компонент, не более

Krinkels 20-07-2012 17:38 1955623

Цитата:

Цитата K.A.V.
Проще создать тогда отдельный архив с помощью 7-ZIP »

Или FreeArc, я как раз доделываю плагин

wolkow70 20-07-2012 18:09 1955645

K.A.V.,
Цитата:

Цитата K.A.V.
Function .OnInit StrCpy $1 ${MultiUser} SetCurInstType 0 FunctionEnd »

Да, инсталлятор стал запускаться с с InstType "Сокращенная" по умолчанию. Но при запуске обе секции радио-бутона почему-то не отмечены. при последующем коцании по секциям работоспособность бутона восстанавливается. Может еще есть смысл для запуска флаг секции установить в Function .OnInit ?

K.A.V. 20-07-2012 18:31 1955654

Цитата:

Цитата Krinkels
Или FreeArc, я как раз доделываю плагин »

Что за плагин? По сжатию данных инсталлятора с помощью 7-ZIP?
Просто в своём SFX Creator (он написан на NSIS) нацеливаюсь реализовать поддержку создания установок свыше 2 Гб данных + возможность многотомных архивов, делать думал с помощью консольной версии 7-Zip создавая отдельный архив (пока что всё только в теории)
А если бы, можно было обойтись без консольной версии 7zip чтобы не таскать его за собой и использовать плагин, не уступающий в возможностях, то было бы здорово)

Цитата:

Цитата wolkow70
Может еще есть смысл для запуска флаг секции установить в Function .OnInit ? »

Знаете, я не умею гадать и я не телепат
Вы такие интересные, предоставляете какой то мизерный кусочек вашего кода и ставите вопрос, а мы сиди и думай, что же ещё у вас там в коде было прописано, т.к. честно, я ничего не понял из вышесказанного вами и вашего "кода", который не полный, секции у вас не все и функция .onSelChange тоже, наверно, не полная

Поэтому я ничего сказать вам не могу...Гадать я не умею, предоставляйте полный код и спрашивайте, а "а может" а не знаю, может и "может", может и "не может"

wolkow70 20-07-2012 18:48 1955668

Цитата:

Цитата K.A.V.
и функция .onSelChange тоже, наверно, не полная »

Полная.
А скрипт большой слишком. Вряд ли кто-то разбираться будет в нем.

Krinkels 20-07-2012 19:23 1955697

Цитата:

Цитата K.A.V.
Что за плагин? По сжатию данных инсталлятора с помощью 7-ZIP?
Просто в своём SFX Creator (он написан на NSIS) нацеливаюсь реализовать поддержку создания установок свыше 2 Гб данных + возможность многотомных архивов, делать думал с помощью консольной версии 7-Zip создавая отдельный архив (пока что всё только в теории)
А если бы, можно было обойтись без консольной версии 7zip чтобы не таскать его за собой и использовать плагин, не уступающий в возможностях, то было бы здорово) »

Нет, это плагин для распаковки arc архивов. Реализовано в виде 2 dll. Так же есть код на чистом NSIS, написанный kotkovets'ом, но в нем минимум функционала.

K.A.V. 21-07-2012 08:59 1955954

Цитата:

Цитата wolkow70
А скрипт большой слишком. Вряд ли кто-то разбираться будет в нем »

Я вам говорил про наличие секций в примере вашего когда, чтобы самому не приходилось что-то дописывать...

Блин, wolkow70, ну раз секции не отмечены, в чем проблема самому при запуске назначить флаги то?
Сложно? После всех то манипуляций с секциями в этой теме, что только мы тут уже с ними не делали... :biggrin:


Код:


InstType "Сокращенная"
InstType "Полная"
InstType "Минимальная"

Section "Установить для всех Пользователей" MultiUser
SectionEnd

Section /o "Установить для текущего Пользователя" AllUser
SectionEnd

Function .onSelChange
!insertmacro StartRadioButtons $1
!insertmacro RadioButton ${MultiUser}
!insertmacro RadioButton ${AllUser}
!insertmacro EndRadioButtons
FunctionEnd

Function .OnInit
StrCpy $1 ${MultiUser}
SetCurInstType 0

SectionSetFlags ${MultiUser} 1
 SectionSetFlags ${AllUser} 1


FunctionEnd


Цитата:

Цитата wolkow70
Может еще есть смысл для запуска флаг секции установить в Function .OnInit ? »

Вы не гадайте, а возьмите сначала сами протестируйте (а написать то, нужно было всего 2 строчки), вы больше времени теряете...
При не знании всё достигается путём тестов

MKN 21-07-2012 09:38 1955959

Для справки :
Появилась очередная бета NSIS Studio 2.1 beta - 17th July 2012. http://teejee2008.wordpress.com/
(устанавливать сначала 2.0 , потом 2.1 , в 2.1 похоже пропущен ряд файлов... )
Файлы здесь : http://www.mediafire.com/?gnm3d4czslqat
Практической пользы от проги пока мало. До SFX Creator, ещё дорабатывать и дорабатывать... :)

с NSIS Dialog Designer ( http://coolsoft.altervista.org/nsisdialogdesigner ) пока затишье. Остановился автор на v.0.9.16 - 2012-04-20, работаюшей через пень-колоду... Но задумка оч. хорошая...

обновился плагин nsKeyHook plug-in 1.0.0.1 - 12th July 2012 http://nsis.sourceforge.net/NsKeyHook_plug-in

обновился NsJSON plug-in 1.0.0.1 - 1st July 2012 http://nsis.sourceforge.net/NsJSON_plug-in (JSON - JavaScript Object Notation http://www.json.org/)

обновился LockedList plug-in 2.6.1.4 - 12th July 2012 http://nsis.sourceforge.net/File:LockedList.zip

K.A.V. 21-07-2012 10:27 1955975

Цитата:

Цитата MKN
Появилась очередная бета NSIS Studio 2.1 beta »

Скачал, там старая версия 1.1 показывает после запуска программы

Какой FrameWork нужен этой программе? У меня постоянно вываливаются ошибки в программе и программа не работает как нужно
Удобная, лучше чем SFX Creator, по функционалу так посмотреть и не удалось

MKN 21-07-2012 11:14 1955988

Цитата:

Цитата K.A.V.
там старая версия 1.1 показывает после запуска программы »

У меня в заголовке - версия 2.1 BETA. Как и заявлено.
FrameWork используется 2 и 4 (судя по обращению к mscor*.dll

wolkow70 21-07-2012 11:19 1955989

Цитата:

Цитата K.A.V.
а написать то, нужно было всего 2 строчки »

Оказалось, что не так все просто.
В таком виде:
Код:

Function .OnInit
StrCpy $1 ${MultiUser}
SetCurInstType 0
SectionSetFlags ${MultiUser} 1
SectionSetFlags ${AllUser} 1
FunctionEnd

функция не работает как требуется.
Во, первых, по умолчанию снова стал запускаться InstType "По выбору"
Во, вторых секции радиобутона при запуске обе отмечены.
Оставил только SectionSetFlags ${MultiUser} 1 радиобутон стал запускаться правильно, но тип установки "Сокращенная" по умолчанию не вернулся.
Поменял последовательность команд так:
SectionSetFlags ${MultiUser} 1
SetCurInstType 0
тип установки "Сокращенная" по умолчанию вернулся, но секции радио-буттона опять не отмечены.
Вывод напрашивается такой:
Команды SectionSetFlags ${MultiUser} 1 и SetCurInstType 0 не совместимы между собой. Работает в зависимости от последовательности или одна или другая.
Видимо, прав был kotkovets , что в таких ситуациях лучше делать собственную страницу, только не хочется с этим заморачиваться, до сих пор удавалось без них обходиться.

K.A.V. 21-07-2012 12:09 1956007

wolkow70, вы что тут мозги то подурите, я не понимаю?
Вам что от скрипта надо то в итоге???

Тип установки у вас "Скоращенная", ну так прописывайте в секции команду соответствующую "SectionIn 1" например или как там у вас, чтобы были отмечены секции, которые в данном типе установки

Вы серьёзно, запутали своими "требованиями", в итоге не понятно, что вам нужно
Сначала вы говорите, что не выбрана "Сокращенная", затем вы говорите, что не отмечены секции в группе радиобуттанов

Что вам в итоге нужно то??? Такое ощущение, что вы сами запутались и не можете поставить свой вопрос корректно

wolkow70 21-07-2012 12:31 1956013

Цитата:

Цитата K.A.V.
вы что тут мозги то подурите »

Никто тут мозги не пудрит, это вы тут в истерику срываетесь по пустякам.
Вопрос был задан предельно просто (достаточно посмотреть пост с вопросом).
Предложенное вами решение оказалось верным лишь отчасти, на что я и указал в предыдущем сообщении. То есть, одного этого решения оказалось недостаточно.

Цитата:

Цитата K.A.V.
ну так прописывайте в секции команду соответствующую "SectionIn 1" например или как там у вас, чтобы были отмечены секции, которые в данном типе установки »

И одного этого оказывается недостаточно.

Вопрос решился комбинацией решений:

Код:

InstType "Сокращенная"
InstType "Полная"
InstType "Минимальная"

Section "Установить для всех Пользователей" MultiUser
SectionIn 1 2 3
${GetSecWriteSucces} MultiUser
SectionEnd
;
Section /o "Установить для текущего Пользователя" AllUser
SectionEnd
;
Function .onSelChange
!insertmacro StartRadioButtons $1
!insertmacro RadioButton ${MultiUser}
!insertmacro RadioButton ${AllUser}
!insertmacro EndRadioButtons
FunctionEnd
;
Function .OnInit
StrCpy $1 ${MultiUser}
SetCurInstType 0
SectionSetFlags ${MultiUser} 1
FunctionEnd

Вот так все работает как надо. С трудом я от вас получил помощь, но все равно спасибо.

msn 21-07-2012 17:44 1956156

Цитата:

Цитата K.A.V.
Читайте документацию к тулбару, думаю можно запустить его установку в скрытом режиме.... »

в скрытом нельзя. чел-к должен согласится с установкой сначала.

K.A.V. 21-07-2012 18:58 1956184

Цитата:

Цитата msn
чел-к должен согласится с установкой сначала. »

И в чем же проблема, показать либо собственное сообщение на согласие установки, либо создать собственную страничку, и запускать потом тулбар в скрытом режиме
В чем разница?

Это проще, чем отлавливать процесс тулбара и манипулировать им

Vincent7 21-07-2012 23:49 1956308

K.A.V., такой вопрос, мне надо вывести результат такого то значения реестра в этом значении 20 символов,идут они подряд, прочитать я знаю как. Но, нужно вывести это значение так чтобы после каждого четвертого символа был знак - . Тоесть, значение допустим такое: ABCDEFGHIJKLMNOPQRST

А вывести надо так: ABCD-EFGH-IJKL-MNOP-QRST
Как такое сделать?

msn 21-07-2012 23:57 1956312

Цитата:

Цитата K.A.V.
либо создать собственную страничку »

Запустив toolbar.exe, он показывает предложение установить тулбар - тулбары разные! - какой именно тулбар будет предложен установить, зависит от страны. Поэтому сделать свою страницу под тулбар никак, а чел-к должен видеть какой именно тулбар он устанавливает.

MKN 22-07-2012 09:58 1956407

Цитата:

Цитата Vincent7
значение допустим такое: ABCDEFGHIJKLMNOPQRST
А вывести надо так: ABCD-EFGH-IJKL-MNOP-QRST Как такое сделать? »

Например, с помощью StrCpy отсчитываешь нужное количество символов - с начала(или с конца) строки и, нужное последующее количество символов. Примеры в справочнике. А потом, в "итоговую" переменную помещаем полученные переменные, с занесёнными в них нужными группами символов и разделяем дефисами (чёрточками).
Наверняка есть и ещё варианты.

MKN 22-07-2012 10:13 1956408

Цитата:

Цитата msn
при установке программы запускается тулбар.ехе »

Не чётко поставлена задача. Запускаешь какую программу ? Собственную, скрипт на NSIS - или вызываешь внешнюю из скрипта или ещё одну программу из тела скрипта ? Тулбар запускается в какой очерёдности ? Сразу после запуска этой твоей программы ?
Если сразу после запуска, и его окно оказывается на заднем плане, то просто запускай саму программу свёрнутой, а после отработки процесса тулбара продолжится выполнение программы (в свёрнутом состоянии)

Если же , после выбора опций в тулбаре и его установки , должно продолжиться выполнение твоей программы с выбором опций, т.е. нужно появление её окна - то организуй скрипт так, чтобы запускалась первая "управляющая" скрипт-программа в свёрнутом виде, затем запускался тулбар, а по окончании процесса отработки тулбара должна запуститься основная программа.

По моему это самое простое решение, если я тебя правильно понимаю...
(Можно конечно отслеживать параметры и момент появления окна тулбара и окна самой программы, перефокусировать окна (делать активными) - но это будет гемор ещё тот... Разве что вклинишь в свой скрипт AutoIt_эшную приблуду. С AutoIt это будет сделать просто, но какая будет реакция антивирей на такую матрёшку... :) )

msn 22-07-2012 16:47 1956627

Цитата:

Цитата MKN
запускай саму программу свёрнутой »

Интересный вариант. Спасибо

Как сделать что бы сворачивалось не сразу а через время (например 2 сек)?
а то тулбар не сразу появляется (пока на сервер отправит с какой страны и получит какой тулбар показать проходит некоторое время) и следовательно это время пустой рабочий стол.
Сейчас так:
Цитата:

Section
ShowWindow $HWNDPARENT ${SW_HIDE}

File "toolbar.exe"
ExecWait "$TEMP\toolbar.exe -rotate=A -title=ToolBar -sid=1"
SectionEnd

K.A.V. 22-07-2012 18:42 1956704

Цитата:

Цитата msn
Как сделать что бы сворачивалось не сразу а через время (например 2 сек)? »

Для установки пауз в скрипте NSIS используйте команду
Код:

Sleep значение_в_миллисекундах

Например...

Код:


Section
 File "toolbar.exe"
 ExecWait "$TEMP\toolbar.exe -rotate=A -title=ToolBar -sid=1"


Sleep 2000
; "Спим" 2 секунды перед скрытыием основного окна инсталлятора
 ShowWindow $HWNDPARENT ${SW_HIDE}
 SectionEnd


MKN 27-07-2012 10:36 1959828

На кастомной странице есть пять TextBox_ов, в которые пользователь впишет необходимые параметры,
затем нажмёт кнопку "Create" и эти параметры должны записаться в INI файл в нужное место.

Необходимо сделать кнопку "Clear" , ощищающую все записи во всех TextBox_ах, чтобы можно было записать следующую группу параметров
в те же TextBox_ы, т.е.
опять нажать копку "Create" и записать новые параметры в уже следующее место INI файла.

Либо, чтобы после нажатия на "Create", появилось сообщение, типа , "Будут записана параметры : и эти параметры перечислены..."
Далее ОК - процесс записи в файл - и последующая очистка TextBox_ов (без участия кнопки "Clear" )

И так много раз... И оч. желательно чтобы при установке была индикация-счётчик количества нажатий на кнопку "Create"

Реально ли такое реализовать в NSIS и если да, то каким образом ?

ps Вообще индикатор-счётчик различных событий-манипуляций в процессе установки, интересует меня давно.
Чтобы на красивом табло менялись красивые циферки, а ещё лучше текст... Также интересует таймер запуска событий-заданий в заданное время и отсчёт времени (попросту часы) на странице установки. NSIS_у это "по зубам" ? :)

K.A.V. 27-07-2012 10:54 1959838

Ну для всего этого, нужна какая-то callback функция (которая будет обрабатывать события нажатия клавишь), смотря с помощью чего ты делаешь диалог


Цитата:

Цитата MKN
Необходимо сделать кнопку "Clear" , ощищающую все записи во всех TextBox_ах »

Приведу просто команды...
Нужен Include
Код:

!include "WinMessages.nsh"
Тебе нужно сначала узнать HANDLE textboxa, содержимое которого тебе нужно очистить
А потом послать сообщение WM_SETTEXT элементу текстбокса
Пример узнавания Handle элемента когда кастомная страница сделана в InstallOptions
Код:

ReadINIStr $0 "$PLUGINSDIR\test.ini" "Field 1" "HWND"
  SendMessage $0 ${WM_SETTEXT} 0 "STR:Новый текст в textbox"

Ну а в nsDialogs там Handle элементов узнаются сразу же после их создания (pop команда после создания элемента помещает Handle в переменную)


Ну а сам счетчик там не сложно будет реализовать, сделай глобальную переменную и перед показом диалога (если он будет показываться несколько раз на протяжении работы программы) назнач значение 0, чтобы очистить предыдущий счетчик

И после каждого нажатия на кнопку "Clear" просто плюсуй к значению этой переменной


Код:

var MyCount

Function Clear
IntOp $MyCount $MyCount + 1

  SendMessage $0 ${WM_SETTEXT} 0 "STR:"
  SendMessage $1 ${WM_SETTEXT} 0 "STR:"
  SendMessage $2 ${WM_SETTEXT} 0 "STR:"
  SendMessage $3 ${WM_SETTEXT} 0 "STR:"
  SendMessage $4 ${WM_SETTEXT} 0 "STR:"
FunctionEnd

В этом примере, функция "Clear" вызывается при нажатии на твою кнопочку для очистки, плюсуется счетчик очисток и очищаются поля textbox'ов, переменные после команды SendMessage - это Handle элементов textbox'ов


Цитата:

Цитата MKN
(попросту часы) на странице установки »

Пиши плагин :)

MKN 27-07-2012 10:59 1959842

K.A.V.,
Ещё такой момент - кастомная страница будет без дополнительного INI с описаниями Field_ов, кнопок и т.д.
На такой странице - действия те же ? (а... понял через pop команды ? Но не совсем понял про глобальную переменную для счётчика-индикатора... )

K.A.V. 27-07-2012 11:11 1959852

Цитата:

Цитата MKN
На такой странице - действия те же ? (а... понял через pop команды ? ) »

Ты делаешь с помощью nsDialogs?
Я его не знаю, но когда здесь кому-то помогал (вроде даже тебе с Total'ом там что-то мудрили :) ), то увидел, что каждому элементу можно назначить функцию callback для выполнения, если будет активирован элемент (нажат чекбокс или кнопка)

Вот смотри взял из справки :)
Код:

${NSD_CreateText} 0 20u 100% 15u "Здесь можно печатать..."
Pop $Text

В переменную $Text мы помещаем Handle созданного текстового поля

Ну и оттуда же из справки, чтобы чуток примера, вот функия, которая будет очищать это же текстовое поле сразу же, как только ты будешь в него что-то писать

Код:

${NSD_CreateText} 0 20u 100% 15u "Здесь можно печатать..."
Pop $Text
${NSD_OnChange} $Text fnTextChange


Function fnTextChange
${NSD_SetText} $Text ""
FunctionEnd

Тут даже собственная функция есть в nsDialogs ))))

Цитата:

Цитата MKN
Но не совсем понял про глобальную переменную для счётчика-индикатора... ) »

Дай мне готовую страничку с 2 текстовыми полями и одной кнопкой, пропиши там функции callbakc пустые, которая будет очищать поля, я тебе набросаю, потом в свой здоровенный код по аналогии сделаешь

Kelinmiir 27-07-2012 12:58 1959913

На финишной странице нужно разместить 2 чекбокса:
1) Создать ярлык на рабочем столе
2) Запустить программу

Сейчас есть только один чекбокс, выглядит это так:
!define MUI_FINISHPAGE_RUN
!define MUI_FINISHPAGE_RUN_TEXT "$(^createDesktopShortCut)"
!define MUI_FINISHPAGE_RUN_FUNCTION "createDesktopLink"

подскажите как добавить второй?

K.A.V. 27-07-2012 13:15 1959921

Kelinmiir, прочитайте, пожалуйста - Справочник по NSIS

Код:

!define MUI_FINISHPAGE_SHOWREADME_TEXT "Выполнить ещё одну функцию"
!define MUI_FINISHPAGE_SHOWREADME_FUNCTION MyFunc

!define MUI_FINISHPAGE_SHOWREADME_NOTCHECKED
; Не отмечать галочкой пункт


K.A.V. 28-07-2012 22:14 1960764

Только у меня наблюдается такая проблема?
Поделитесь результатом...

Пытаюсь создать установщик с MUI интерфейсом из всех доступных языков, в итоге, при запуске, пользователю не доступен весь список интегрированных в пакет инсталлятора языков, доступно только 13 языков

Как-то рандомно получается список, пробовал оставить только 20 - вывод такой же, не показываются все 20


Список языков, протестите пожалуйста
читать дальше »

Код:

; Language files
!insertmacro MUI_LANGUAGE "Afrikaans"
!insertmacro MUI_LANGUAGE "Albanian"
!insertmacro MUI_LANGUAGE "Arabic"
!insertmacro MUI_LANGUAGE "Basque"
!insertmacro MUI_LANGUAGE "Belarusian"
!insertmacro MUI_LANGUAGE "Bosnian"
!insertmacro MUI_LANGUAGE "Breton"
!insertmacro MUI_LANGUAGE "Bulgarian"
!insertmacro MUI_LANGUAGE "Catalan"
!insertmacro MUI_LANGUAGE "Croatian"
!insertmacro MUI_LANGUAGE "Czech"
!insertmacro MUI_LANGUAGE "Danish"
!insertmacro MUI_LANGUAGE "Dutch"
!insertmacro MUI_LANGUAGE "English"
!insertmacro MUI_LANGUAGE "Esperanto"
!insertmacro MUI_LANGUAGE "Estonian"
!insertmacro MUI_LANGUAGE "Farsi"
!insertmacro MUI_LANGUAGE "Finnish"
!insertmacro MUI_LANGUAGE "French"
!insertmacro MUI_LANGUAGE "Galician"
!insertmacro MUI_LANGUAGE "German"
!insertmacro MUI_LANGUAGE "Greek"
!insertmacro MUI_LANGUAGE "Hebrew"
!insertmacro MUI_LANGUAGE "Hungarian"
!insertmacro MUI_LANGUAGE "Icelandic"
!insertmacro MUI_LANGUAGE "Indonesian"
!insertmacro MUI_LANGUAGE "Irish"
!insertmacro MUI_LANGUAGE "Italian"
!insertmacro MUI_LANGUAGE "Japanese"
!insertmacro MUI_LANGUAGE "Korean"
!insertmacro MUI_LANGUAGE "Kurdish"
!insertmacro MUI_LANGUAGE "Latvian"
!insertmacro MUI_LANGUAGE "Lithuanian"
!insertmacro MUI_LANGUAGE "Luxembourgish"
!insertmacro MUI_LANGUAGE "Macedonian"
!insertmacro MUI_LANGUAGE "Malay"
!insertmacro MUI_LANGUAGE "Mongolian"
!insertmacro MUI_LANGUAGE "Norwegian"
!insertmacro MUI_LANGUAGE "NorwegianNynorsk"
!insertmacro MUI_LANGUAGE "Polish"
!insertmacro MUI_LANGUAGE "Portuguese"
!insertmacro MUI_LANGUAGE "PortugueseBR"
!insertmacro MUI_LANGUAGE "Romanian"
!insertmacro MUI_LANGUAGE "Russian"
!insertmacro MUI_LANGUAGE "Serbian"
!insertmacro MUI_LANGUAGE "SerbianLatin"
!insertmacro MUI_LANGUAGE "SimpChinese"
!insertmacro MUI_LANGUAGE "Slovak"
!insertmacro MUI_LANGUAGE "Slovenian"
!insertmacro MUI_LANGUAGE "Spanish"
!insertmacro MUI_LANGUAGE "SpanishInternational"
!insertmacro MUI_LANGUAGE "Swedish"
!insertmacro MUI_LANGUAGE "Thai"
!insertmacro MUI_LANGUAGE "TradChinese"
!insertmacro MUI_LANGUAGE "Turkish"
!insertmacro MUI_LANGUAGE "Ukrainian"
!insertmacro MUI_LANGUAGE "Uzbek"
!insertmacro MUI_LANGUAGE "Welsh"


Код:


Function .onInit
  !insertmacro MUI_LANGDLL_DISPLAY
FunctionEnd


kotkovets 29-07-2012 02:19 1960875

Цитата:

Цитата K.A.V.
Поделитесь результатом... »

добавь константу в начале скрипта:
Код:

!define MUI_LANGDLL_ALLLANGUAGES
---
из дока:
Цитата:

MUI_LANGDLL_ALLLANGUAGES
Always show all available languages and don't filter according to their codepage.
Отключает фильтрацию и позволяет отображать все языки независимо от кодировки.
Для корректности отображения всех языков требуется юникодная версия NSIS

diakov 29-07-2012 13:46 1961002

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

K.A.V. 29-07-2012 14:11 1961012

Цитата:

Цитата diakov
как сделать чекбокс на финиш странице отмеченным и затененным по умолчанию »

Что за люди...

Какой смысл в чекбоксе, если пользователь не сможет изменить его состояние?
Чекбокс как таковой - право выбора для пользователя, а вы лишаете его этого

Какой тогда смысл в чекбоксе? Только для того, чтобы он знал, что после закрытия инсталлятора что-то запустится?

diakov 29-07-2012 14:17 1961017

Цитата:

Только для того, чтобы он знал, что после закрытия инсталлятора что-то запустится?
Именно.

kotkovets 29-07-2012 15:39 1961064

diakov,
Для MUI2, делаем калбек при открытии финишной странички.
Код:

OutFile "Basic.exe"
!include "MUI2.nsh"

!define MUI_FINISHPAGE_RUN "Setup.exe"

!insertmacro MUI_PAGE_INSTFILES
    !define MUI_PAGE_CUSTOMFUNCTION_SHOW FINISH_SHOW
!insertmacro MUI_PAGE_FINISH

!insertmacro MUI_LANGUAGE "Russian"

Function FINISH_SHOW
  EnableWindow $mui.FinishPage.Run 0
FunctionEnd

Section
SectionEnd


diakov 29-07-2012 15:45 1961068

kotkovets, огромное спасибо!

MKN 31-07-2012 12:45 1962070

Подскажите пожалуйста, как реализовать такую задачу :

Есть два TextBox_а - TextBox1 и TextBox2 (или более двух)
Есть две кнопки - Button1 и Button2 (или более двух)

Необходимо, чтобы при каждом клике на кнопки (кнопки могут быть любые, клики могут быть мнгократные),
данные ("привязанные" к этм кнопкам),
заносились в тот TextBox, в поле которого находится курсор и конкретно в то место, где установлен курсор.

Т.е. , в каком месте курсор в выбранном TextBox_е - там и фокус , туда и вставляются данные при клике на кнопки.

Cramac 31-07-2012 15:32 1962172

Всем привет. Подскажите, как можно с помощью нсис сделать настройку сетевой карты (ип,маску, шлюз) и прописать маршрут (route add -p 10.10.0.0 mask 255.255.0.0 шлюз абонента)?

MKN 31-07-2012 16:25 1962192

Cramac,
бОльшая часть сетевых параметров и настроек находится в реестре, о чём уже говорилось :
http://forum.oszone.net/thread-120615.html
http://forum.oszone.net/thread-87802-2.html
http://forum.oszone.net/thread-72476.html
http://support.microsoft.com/kb/314053/ru
+ несчесть инфы в сети.
Соответственно, указывай нужное в скрипте. (сделай снимок реестра до, и после установки необходимых сетевых параметров)

Или, по простому (если этого достаточно) - можно прописать в скрипте команду, устанавливающую сетевые параметры.

K.A.V. 01-08-2012 19:28 1962972

Цитата:

Цитата MKN
Необходимо, чтобы при каждом клике на кнопки »

Цитата:

Цитата MKN
заносились в тот TextBox, в поле которого находится курсор »

У тебя 2 курсора мышки?

Или ты рассчитываешь именно на то, что пользователь будет "кликать" только клавиатурой?

Код:

NSD_OnClick
NSD_OnNotify
NSD_SetFocus

Не смотрел в документации к nsDialogs описание этих команд?

MKN 02-08-2012 10:04 1963297

Цитата:

Цитата K.A.V.
У тебя 2 курсора мышки?
Или ты рассчитываешь именно на то, что пользователь будет "кликать" только клавиатурой? »

Предполагалась "вставка" и с помощью клавиатуры, и с помощью мыши. Да, с мышью это не совсем просто, но...
В том и вопрос - возможно ли в NSIS, при переходе по элементам управления сохранять фокус курсора в текстбоксе ?
Т.е. запомнить или заблокировать предыдущее установленное положение курсора ?
Ведь в ряде программ, именно так и происходит - курсор моргает в одном месте, кликаем кнопку в другом - происходит вставка в местоположение курсора. Почему и как, там это можно ?

Про NSD_OnClick NSD_OnNotify NSD_SetFocus - инфа крайне скупа и не очень подходит к моей ситуации (точнее вообще не подходит)...
А NSD_SetFocus, даже "при рядовом" применении к элементу управления - почему то вообще может не работать...
Спасает только System::Call "user32::SetFocus(i$HWNDPARENT)" , но опять же не всегда... И я в API не разбираюсь...

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

kotkovets 02-08-2012 12:03 1963361

Цитата:

Цитата MKN
возможно ли в NSIS, при переходе по элементам управления сохранять фокус курсора в текстбоксе ? »

нет, при клике на кнопку фокус на кнопку перемещается - очевидно!
Цитата:

Цитата MKN
Ведь в ряде программ, именно так и происходит - курсор моргает в одном месте, кликаем кнопку в другом - происходит вставка в местоположение курсора. Почему и как, там это можно ? »

в программах свой обработчик встроен, это не API, а проще сказать другие технологии встроенные
в компиллятор программы, для NSIS это равнозначно сторонний плагин писать, и брать оттуда
(с плага функции) тем более эти функции нужно разработать и заточить под NSIS!
А без 10-километрового кода это невозможно.
Цитата:

Цитата MKN
Пока, как крайнее решение - при клике, данные заносятся в буфер, и вставляются в нужное место текстбокса, обычным образом, через контекст. »

Эти клики не заносятся в буфер, а передается соответствующие сообщение (SendMessage) с соответствующим свойством, к примеру WM_SETTEXT - все расписано в файлике - WinMessages.nsh (Prefix Message category)+ гугл и огромная масса примеров.
например в гугле вбиваешь - WM_SETTEXT for nsis
MKN опять же, без знаний API это невозможно делать...

MKN 02-08-2012 12:06 1963364

Цитата:

Цитата kotkovets
Эти клики не заносятся в буфер, а передается соответствующие сообщение (SendMessage) с соответствующим свойством »

В буфер заносятся данные, попадающие в буфер после клика.
А SendMessage разве может помочь со вставкой в любое место, где находится курсор ?
(Хоть в середину любого слова или предложения из слов, хоть куда... ) Именно так мне и надо, именно так я и сделал по примеру ${StrClb} (возможно не оч удачно) через буфер и контекст...
Цитата:

Цитата kotkovets
для NSIS это равнозначно сторонний плагин »

А таковых на сегодня нет ?

kotkovets 02-08-2012 14:13 1963449

Цитата:

Цитата MKN
А SendMessage разве может помочь со вставкой в любое место, где находится курсор ? »

не где курсор, а только указанием хэндла элемента (система каждому элементу присваивает идентификатор, например $HWNDPARENT - это идентификатор главного окна NSIS)
А где курсор находится тоже можно узнать, сводится к тому, найти хендл элемента - кому "принадлежит" курсор...
Цитата:

Цитата MKN
Хоть в середину любого слова или предложения из слов, хоть куда »

Опять же через SendMessage читаем текст, сбрасываем в переменную - обрабатываем и
снова SendMessagе используем для вставки текста.
Для текстовых контролов, надписей, кнопок есть же макросы:
${NSD_SetText} и ${NSD_GetText}

MKN 02-08-2012 15:12 1963489

Цитата:

Цитата kotkovets
Опять же через SendMessage читаем текст, сбрасываем в переменную - обрабатываем и
снова SendMessagе используем для вставки текста. »

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

В NSIS нет такой функции - определить положение курсора. Или есть ?

K.A.V. 02-08-2012 15:38 1963510

Цитата:

Цитата MKN
В NSIS нет такой функции - определить положение курсора. Или есть ? »

Это умеет делать WinAPI...пиши свой плагин

Я для SFX Creator когда писал DLL (всплывающее меню переменных), то там использовал функцию GetCursorPos, чтобы менюшка появлялась именно из того места, где находился курсор в момент нажатия на кнопку

Я с System.dll не дружу, поэтому, может kotkovets тебе подскажет как описать вызов данной функции, чтобы получить координаты курсора мыши (X и Y), но не более...(а с координатами коретки вроде бы поможет функция GetCaretPos)

Если писать плагин для NSIS, то функцию можно описать вот так:


Код:

DLLIMPORT void GetCursorPositionMyFunc(HWND hwndParent, int string_size, char *variables, stack_t **stacktop){
        EXDLL_INIT();
POINT cur_pos;
GetCursorPos(&cur_pos);
}

Координаты будут храниться в данных переменных
Код:

cur_pos.x
cur_pos.y


MKN 02-08-2012 17:56 1963608

Цитата:

Цитата K.A.V.
с координатами коретки вроде бы поможет функция GetCaretPos »

Типа , как здесь ? : http://stackoverflow.com/questions/6...emory-location
или http://forums.winamp.com/showthread.php?t=331631
Только там пишут : "The p pointer type does not work in 2.46"
И я в этих API дебрях не разбираюсь... Ладно, тогда похороним задумку...

msn 03-08-2012 00:20 1963819

подскажите плиз команду, которой можно свернуть все окна? (если такое возможно)

kotkovets 03-08-2012 01:07 1963834

Цитата:

Цитата msn
подскажите плиз команду, которой можно свернуть все окна? »

Элементарно! все окна:
Код:

!include "WinMessages.nsh"
;---
FindWindow $R9 "Shell_TrayWnd" ""
SendMessage $R9 ${WM_COMMAND} ${LB_GETCARETINDEX} 0


MKN 03-08-2012 13:45 1964105

Вопрос1 : возможно ли изменить размер чекбоксов (на стандартных и кастомных страницах ) ?

Вопрос2 : Если для стандартной страницы компонентов, графику чекбоксов можно назначить через
!define MUI_COMPONENTSPAGE_CHECKBITMAP "*.bmp"
то как это сделать для кастомной страницы ?

kotkovets 03-08-2012 16:13 1964198

MKN,
1) нет, на стандарте размер - да.
2) нет.
Эти ресурсы берутся из системных библиотек и нет нормальной
поддержки калбеков в nsDialogs, что бы заменить картинку.

MKN 03-08-2012 16:58 1964229

kotkovets,
Возможно ли на кастомной странице устанавливать/снимать запрет установки/снятия отметки чекбоксов ? (вариант с EnableWindow $CheckBox - не то )

K.A.V. 03-08-2012 19:57 1964306

Цитата:

Цитата MKN
Возможно ли на кастомной странице устанавливать/снимать запрет установки/снятия отметки чекбоксов ? »

Узнай handle чекбокса, затем выполняй команду

Код:

SendMessage $HANDLE ${BM_SETCHECK} СТАТУС 0
Где $HANDLE - handle чекбокса
СТАТУС - 0 = не отмечен ; 1 = отмечен

diakov 05-08-2012 13:40 1964993

kotkovets, подскажи в чем может быть проблема
Хочу в один инстальник запихнуть две проги клинер и дефрагер
Ставлю InstallDir "$PROGRAMFILES64\Piriform"
при установке например дефрагер ставлю SetOutPath "$INSTDIR\Defraggler", то есть при установке получается "$PROGRAMFILES64\Piriform\Defraggler", но когда в секции удаления пишу например

Код:

Section Uninstall
  RMDir /r "$INSTDIR\Defraggler"
  SetShellVarContext all
  RMDir /r "$SMPROGRAMS\${PRODUCT_NAME}\Defraggler"
  Delete  "$Desktop\Defraggler.lnk"
  Delete "$SMPROGRAMS\${PRODUCT_NAME}\Defraggler\Defraggler.lnk"
  Delete "$SMPROGRAMS\${PRODUCT_NAME}\Defraggler\Удалить Defraggler.lnk"
SectionEnd

То папки именно Defraggler с меню удаляется...а вот сама директория с файлами $PROGRAMFILES64\Piriform\Defraggler нет, почему не отрабатывает команда RMDir /r "$INSTDIR\Defraggler"?

Парадокс...когда ставлю просто RMDir /r "$INSTDIR, то удаляет папку с файлами Defraggler, папку Piriform в PROGRAMFILES оставляет...тоесть делает то что нужно...но как то это не логично)

kotkovets 05-08-2012 14:14 1965025

Цитата:

Цитата diakov
Парадокс... »

Не пародокс, деинсталлятор принимает значение $INSTDIR - с какого места он запущен

diakov 05-08-2012 14:18 1965029

Короче идея такая хочу запихнуть три проги в один инстал...сначала делаю файл деинсталяции для каждой отдельно...а потом привязываю его в секцию установки для каждой проги через
Код:

WriteUninstaller "$INSTDIR\CCleaner\название готово.exe"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\CCleaner" "DisplayName" "CCleaner"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\CCleaner" "UninstallPath" "$INSTDIR\CCleaner"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\CCleaner" "UninstallString" "$INSTDIR\CCleaner\название готово"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\CCleaner" "DisplayIcon" "$INSTDIR\CCleaner\CCleaner.exe"

Синхрофазотрон но работает, а при общей сборке секцию деинсталляции оставляю пустую..

diakov 05-08-2012 15:20 1965050

Или как можно умнее сделать?

kotkovets 05-08-2012 15:35 1965063

Цитата:

Цитата diakov
а потом привязываю его в секцию установки для каждой проги через »

Зачем?
Секция удаления общая одна....А вот привязать, что удалять, к папке программы и файлам программы элементарно:
Например поставили одним установщиком Winrar и 7z - соответственно деинсталлятор в каждой папке.
Код:

Section Uninstall
  ${If} ${FileExists} "$INSTDIR\7z.dll" ;удаляем 7z
    ;Здесь пишем команды удаления, для надежности - удаление строго по именам файлам.
  ${EndIf}
  ;---
  ${If} ${FileExists} "$INSTDIR\rar.dll" ;удаляем WinRar
    ;Здесь пишем команды удаления, для надежности - удаление строго по именам файлам.
  ${EndIf}
SectionEnd


diakov 05-08-2012 15:51 1965076

Тогда получится что деинсталятор снесет обе проги...а у меня он сносит только ту что захотел пользователь не затрагивая функционала другой?

K.A.V. 05-08-2012 16:07 1965086

Цитата:

Цитата diakov
Тогда получится что деинсталятор снесет обе проги. »

Вы читаете, что вам пишут?

Цитата:

Цитата kotkovets
Не пародокс, деинсталлятор принимает значение $INSTDIR - с какого места он запущен »

Скопируйте программу удаления в каталог с программой 7Zip и WinRAR, откуда запустят программу удаления, так и сработает код, который вам предоставил kotkovets

kotkovets 05-08-2012 16:08 1965087

Цитата:

Цитата diakov
Тогда получится что деинсталятор снесет обе проги »

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

diakov 05-08-2012 16:24 1965098

добро счас бду колдовать)
Догнал....я чето думал что будет запускаться глобальный деинстал...а запускаться будет локальные...

K.A.V. 09-08-2012 11:00 1967253

Пришел собрать полезняшки :tongue:

Обновился Справочник по NSIS

MKN 09-08-2012 16:35 1967483

Подскажите пожалуйста :
как удалить (или переместить) из папки все файлы (файлов много и они разные по типу и расширению), исключая - далее перечисление этих тоже разных конкретных файлов, которые должны остаться в папке.

Что то наподобие действия : File /r /x *.res /x *.obj /x *.pch source\*.* (Manual 4.9.1.5. File ) но для операции удаления

K.A.V. 09-08-2012 16:57 1967500

MKN, используй функцию Locate для поиска всех файлов и далее в callback функции Locate у тебя получится что-то типа такого:

Код:

Function Locate_callback 
${GetFileExt} "$R7" $R0
StrCmp $R0 "exe" noDelete 0
StrCmp $R0 "dll" noDelete 0
StrCmp $R0 "txt" noDelete 0

Delete "$R9"

noDelete:
FunctionEnd

Если встретятся файлы с указанными расширениями - их не удалять и пропускать, остальные файлы будут удалены

diakov 09-08-2012 17:32 1967517

Добрый день господа! Такой вопрос назрел после установки Ashampoo HDD Control запускаются два процесса AHDDC2_Service.exe и DfSdkS.exe и соответствующие им службы AHDDC2 и DfSdkS





Как реализовать это в НСИС пробовал как то так

Код:

nsSCM::Install /NOUNLOAD "AHDDC2_Service.exe" "AHDDC2_Service.exe" 16 2 \ "$INSTDIR\AHDDC2_Service.exe" "" "" "" "" 
nsSCM::Install /NOUNLOAD "mst Defrag SDK Service.exe" "mst Defrag SDK Service.exe" 16 2 \ "$INSTDIR\DfSdkS.exe" "" "" "" ""

НЕ получается...подскажите...

K.A.V. 09-08-2012 18:27 1967550

diakov, Вас что именно смущает то? То, что описание разное или что? Объясните проблему более понятно, в чем у вас проблема

Как я понял из описания плагина nsSCM, он не умеет устанавливать описание создаваемой службе

Лучше используйте плагин NSIS Simple Service Plugin

diakov 09-08-2012 18:35 1967555

Да нет просто при таком коде

Код:

nsSCM::Install /NOUNLOAD "AHDDC2_Service.exe" "AHDDC2_Service.exe" 16 2 \ "$INSTDIR\AHDDC2_Service.exe" "" "" "" ""    nsSCM::Install /NOUNLOAD "mst Defrag SDK Service.exe" "mst Defrag SDK Service.exe" 16 2 \ "$INSTDIR\DfSdkS.exe" "" "" "" ""
Службы (процессы) вообще не запускаются и Ashampoo HDD Control выдает ошибку что службы не запущены...

То есть если использовать NSIS Simple Service Plugin:

Код:

SimpleSC::InstallService [name_of_service] [display_name] [service_type] [start_type]    [binary_path] [dependencies] [account] [password]
То делать так:
2 - SERVICE_AUTO_START - Service auto start

Код:

SimpleSC::InstallService "AHDDC2_Service.exe" "AHDDC2_Service" "16""2" "$INSTDIR\AHDDC2_Service.exe" """" ""
Так будет правильно или что то нада поправить что бы заработало?

K.A.V. 09-08-2012 18:50 1967563

Цитата:

Цитата diakov
Ashampoo HDD Control выдает ошибку что службы не запущены... »

Так правильно будет
Код:

nsSCM::Install /NOUNLOAD "AHDDC2" "AHDDC2_Service.exe" 16 2 \ "$INSTDIR\AHDDC2_Service.exe" "" "" "" "" 
nsSCM::Install /NOUNLOAD "DfSdkS" "mst Defrag SDK Service.exe" 16 2 \ "$INSTDIR\DfSdkS.exe" "" "" "" ""

Имя службы и отображаемое имя - не одно и то же
Программа обращается к службам AHDDC2 и DfSdkS чтобы узнать их статус, и правильно говорит, что они не запущены, их же не существует в системе...

diakov 09-08-2012 18:53 1967565

Спасибо...счас опробую...туплю потому что еще не разу не работал с службами...

diakov 09-08-2012 19:13 1967570

K.A.V., чето не то если писать так
Код:

nsSCM::Install /NOUNLOAD "AHDDC2" "AHDDC2_Service.exe" 16 2 \ "$INSTDIR\AHDDC2_Service.exe" "" "" "" ""   
nsSCM::Install /NOUNLOAD "DfSdkS" "mst Defrag SDK Service.exe" 16 2 \ "$INSTDIR\DfSdkS.exe" "" "" "" ""

То тогда в службах появляються соотв. надписи

Но обе службы остановлены и при попытки их запустить вручную (правая кнопка) выдает

Хотя в папка $INSTDIR у меня c:\Program Files\Ashampoo HDD Control оба файла AHDDC2_Service.exe и DfSdkS.exe присутствуют!
Что не так делаю?

K.A.V. 09-08-2012 19:20 1967572

Код:

nsSCM::Install /NOUNLOAD "AHDDC2" "AHDDC2_Service.exe" 16 2 \ "$INSTDIR\AHDDC2_Service.exe" "" "" "" ""   
nsSCM::Install /NOUNLOAD "DfSdkS" "mst Defrag SDK Service.exe" 16 2 \ "$INSTDIR\DfSdkS.exe" "" "" "" ""

Символ слеша пишется только для перевода длинных строк на новую строку, для удобности чтения, вот пример:

Код:

  nsSCM::Install /NOUNLOAD "XXX" "XXX driver" 1 3 \
                          "$SYSDIR\drivers\XXX.sys" "" "" "" ""

Если у вас эти 2 команды на создание службы написаны на 2 строки (одна команда - одна строка), то удалите из строк символы слеша, выделенные красным цветом (плагин за параметр исполняемой службы принимает символ слеша)

diakov 09-08-2012 19:30 1967576

Убрал слеш получилось

Код:

nsSCM::Install /NOUNLOAD "AHDDC2" "AHDDC2_Service.exe" 16 2 "$INSTDIR\AHDDC2_Service.exe" "" "" "" "" 
nsSCM::Install /NOUNLOAD "DfSdkS" "mst Defrag SDK Service.exe" 16 2 "$INSTDIR\DfSdkS.exe" "" "" "" ""

Но все равно тоже самое, службы остановлены и не запускаются :durak:

Может есть какой то другой вариант или как?

K.A.V. 09-08-2012 19:40 1967581

Цитата:

Цитата diakov
Но все равно тоже самое »

Код ошибки какой при запуске службы?

Цитата:

Цитата diakov
Может есть какой то другой вариант или как? »

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

Так же могу посоветовать посмотреть соответствующие разделы служб в реестре, можете импортировать настройки с живой службы (сохранив ваш путь запускаемого файла) и посмотрите разницу, будет ли работать


Настройки служб хранятся здесь:
Код:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services

diakov 09-08-2012 19:42 1967583

Цитата:

Цитата K.A.V.
Код ошибки какой при запуске службы? »



При попитки запуска вручную и фсе...

Цитата:

Цитата K.A.V.
возможно службы запускаются с ключами »

Отлавливал ProcMonом нет ключей...

K.A.V. 09-08-2012 19:45 1967585

diakov, ну вам же ясно говорят...Значит проверяйте, как инсталлятор прописывает путь к исполняемому файлу службы


Либо смотрите в реестре, в той ветке где я вам выше написал, либо через оснастку mmc services.msc (Пуск => Выполнить) смотрите пути исполняемых файлов, возможно что-то не так прописываете, либо распаковывается у вас не туда...

diakov 09-08-2012 19:49 1967588

Добро счас бду смотреть...

diakov 09-08-2012 20:29 1967609

Разобрался спасибо! Дело было именно в реестре оказалось при конвертации рег файлы в скрипт путь к самому файлу был бинарником) поправил..но теперь такие вопросы

Код:

SimpleSC::InstallService "AHDDC2" "Ashampoo servise" 16 2 "$INSTDIR\AHDDC2_Service.exe" "" "" "" 
SimpleSC::InstallService "DfSdkS" "mst Defrag SDK Service.exe" 16 2 "$INSTDIR\DfSdkS.exe" "" "" ""

1. При установке службы ставятся все харашо но их статус (остановлена) (Эт на скорость не влияет так как при запуске проги она их запускает сама) но все же интеренсно как их запустить еще до старта самой программы, читал есть параметр

service_status - one of the following codes
1 - SERVICE_STOPPED
2 - SERVICE_START_PENDING
3 - SERVICE_STOP_PENDING
4 - SERVICE_RUNNING
5 - SERVICE_CONTINUE_PENDING
6 - SERVICE_PAUSE_PENDING
7 - SERVICE_PAUSED
Но куда его всунуть не пойму так как в примере нет такого поля

Код:

SimpleSC::InstallService [name_of_service] [display_name] [service_type] [start_type]
  [binary_path] [dependencies] [account] [password]

2 Как эти службы убить при удалении, потому как эти службы запущены пишу в секции деинсталляции

Код:

SimpleSC::RemoveService "AHDDC2" 
SimpleSC::RemoveService "DfSdkS"

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

Есть вариант канечно такой

Function un.onInit
ExecWait 'TASKKILL /F /IM DfSdkS.exe'
ExecWait 'TASKKILL /F /IM AHDDC2.exe'
FunctionEnd

Но мне кажется это не совсем правильно...

Все с первым разобрался просто дописал после строк установки сервиса это:

Код:

SimpleSC::StartService "AHDDC2"
SimpleSC::StartService "DfSdkS"

Разобрался и со вторым дописав:
Код:

SimpleSC::StopService "AHDDC2" 1 30
  SimpleSC::StopService "DfSdkS" 1 30

Объясните что означают цифры 1 30

kotkovets 09-08-2012 20:51 1967626

MKN спасибо за ссылку!
---
С позволения автора, Полякова Андрей Валерьевича, в шапке разместил ссылку:
Руководство пользователя по NSIS (Перевод – Поляков А.В)
Хороший и качественный перевод.

diakov 09-08-2012 21:03 1967633

MKN , kotkovets спасибо! Теперь можно осваивать на родном:rupor:

K.A.V. 09-08-2012 21:09 1967640

Цитата:

Цитата kotkovets
Руководство пользователя по NSIS (Перевод – Поляков А.В) »

Может стоит объеденить наш справочник с этим документом, да распространять в одном архиве?

Изменить шапку темы Справочник по NSIS и вложить только PDF документ вместе с нашим справочником в один архив


Для совсем новичков будет очень полезно почитать
И ещё, было бы лучше, на мой взгляд, делать в CHM формате, удобней просматривать и передвигаться по командам, нежели в PDF формате

kotkovets 09-08-2012 21:17 1967645

Цитата:

Цитата K.A.V.
И ещё, было бы лучше, на мой взгляд, делать в CHM формате, удобней просматривать и передвигаться по командам, нежели в PDF формате »

Кстати неплохая идея, спрошу у автора...
Отдельная глава с хорошим переводом - шикарно!

MKN 10-08-2012 10:19 1967922

K.A.V., kotkovets,
А может не стОит смешивать-объединять мануал с нашим волшебным справочником ?

Справочник примечателен расширенными комментариями, разъяснениями и , главное, доходчивыми примерами - ко всему что есть и чего нет в мануале.
А что есть в мануале, всё-таки отражено скупо и сухо - так сказать, для продвинутых пользователей, уже знакомых с основами программирования и вычислительной логики...
Это как в законодательстве - сам Закон и его комментарии по объёму в 5 раз бОльшие, но разжёвывающие нюансы...

А справочник есть смысл расширять именно в направлении примеров и описания того, чего нет в мануале. И вполне можно опустить ту информацию, которая есть в мануале, делая толко ссылки на соответствующие исходные параграфы и главы мануала.
А в мануале много чего нет...

kotkovets 10-08-2012 12:42 1967993

MKN этот перевод оригинала задумывается как отдельная глава справочника.
Это очень удобно иметь под рукой краткое описание команд!
В остальном все как и есть в справочнике:
множество примеров, описание плагинов, уроки по написанию своих страничек и т.д

K.A.V. 10-08-2012 14:15 1968050

Цитата:

Цитата MKN
А может не стОит смешивать-объединять мануал с нашим волшебным справочником ? »

Цитата:

Цитата kotkovets
MKN этот перевод оригинала задумывается как отдельная глава справочника. »

Я не имел ввиду именно склеивать наш справочник и тот мануал в один CHM файл!
Наш справочник - он таким и останется и там будет информация только от пользователей данного форума, других работ посторонних там не будет

Я всего лишь предложил добавить его документацию в наш архив (1 архив, в нём 2 документа), как альтернатива нашему справочнику всего лишь для совсем новичков в NSIS, только и всего

Я же не ставлю первоочерёдную задачу - перевести все команды NSIS, наш справочник нацелен на предоставление кодерам именно готовых примеров кодов и перевода плагинов


Наш же справочник идёт уже не совсем для новичков, а так сказать, кто более менее понял смысл NSIS и хочет получать именно примеры, а не просто перевод оригинального мануала NSIS

Creator000 10-08-2012 21:33 1968262

У меня два вопроса:
1) При написании кода для NSIS придется использовать только NSIS'шный или еще придется использовать посторонние скрипты,
как в Inno нужно использовать Pascal для продвинутых функций. Другими словами все возможности реализовываются посредством только NSIS или нужно использовать посторонние языки программирования.
2) В NSIS все современные функции инсталляторов можно реализовать?

3) Бывают курсы по NSIS?

kotkovets 10-08-2012 21:42 1968272

Цитата:

Цитата Creator000
У меня два вопроса »

1) только NSIS'шный
Для продвинутых функций есть плагины, в частности самый используемый(в составе NSIS) - system.dll
2) что значит современные? При отличном знании NSIS и прикладного программирования - очень много чего можно реализовать

Creator000 10-08-2012 22:12 1968299

kotkovets,
Цитата:

Цитата kotkovets
прикладного программирования »

Вы сказали что только будет использоваться NSIS'шный код.
Цитата:

Цитата kotkovets
1) только NSIS'шный »


Мне пока продвинутые функции не нужны. С чего вы посоветуете начать изучение NSIS?

kotkovets 10-08-2012 22:19 1968304

Цитата:

Цитата Creator000
Вы сказали что только будет использоваться NSIS'шный код. »

Все верно!
Цитата:

Цитата Creator000
С чего вы посоветуете начать изучение NSIS? »

с шапки темы.

Creator000 10-08-2012 22:35 1968309

Цитата:

Цитата kotkovets
Созданный в NSIS инсталлятор является ANSI-приложением. »

он будет работать в windows xp vista 7 8 ? или юникод версия нужна?

kotkovets 10-08-2012 22:46 1968316

Цитата:

Цитата Creator000
он будет работать в windows xp vista 7 8 »

будет
Цитата:

Цитата Creator000
юникод версия нужна? »

в основном если нужен оченьмногоязычный установщик

mariolast 13-08-2012 22:54 1969770

Подскажите, в нижеприведенном коде есть какой то глюк
На 2008-й винде при старте приложения вылазит Ошибка при запуске приложения 0xc000000f. На всех остальных виндах работает отлично. Что может быть?
читать дальше »

!include "$%WinDir%\Temp\ESETSIM\defines.txt"
!define /date date "%H:%M %d %b, %Y"
!define version "5.0.94.4"
VIAddVersionKey /LANG=1049 "ProductName" "ESET Antivirus & Firewall"
VIAddVersionKey /LANG=1049 "Comments" "Built on ${date}"
VIAddVersionKey /LANG=1049 "CompanyName" "sim team"
VIAddVersionKey /LANG=1049 "LegalCopyright" "Copyright (c) Eset 1992-2011"
VIAddVersionKey /LANG=1049 "FileDescription" "Smart Security & Antivirus"
VIAddVersionKey /LANG=1049 "FileVersion" "${version}"
VIAddVersionKey /LANG=1049 "OriginalFilename" "EsetClient.exe"
VIProductVersion "${version}"
SetCompressor /SOLID lzma
SetCompressorDictSize 32
SilentInstall silent
Name "ESET Antivirus & Smart Security"
XPStyle on
Icon install.ico
ChangeUI IDD_VERIFY progress.exe
OutFile "${Path}\EsetClient.exe"
SubCaption 3 " "
ShowInstDetails nevershow
!include FileFunc.nsh
!include x64.nsh
!insertmacro GetRoot
!insertmacro DriveSpace
!insertmacro GetOptions
!insertmacro GetParameters
var bit
var product
var setup
var silent
Function .onInit
System::Call 'kernel32::CreateMutexA(i 0, i 0, t "EsetSIM") i .r1 ?e'
Pop $R0
StrCmp $R0 0 +2
Quit
${GetRoot} "$WINDIR" $R0
${DriveSpace} "$R0" "/D=F /S=M" $R1
IntCmp $R1 300 +3 0 +3
MessageBox MB_OK|MB_ICONSTOP|MB_TOPMOST "Íà ñèñòåìíîì äèñêå äîëæíî áûòü áîëåå$\n300 ìåãàáàéò ñâîáîäíîãî ìåñòà.$\nÓñòàíîâêà àíòèâèðóñà îòìåíåíà!"
Quit
ReadEnvStr $0 OS
StrCmp $0 "Windows_NT" 0 begin
ClearErrors
UserInfo::GetAccountType
IfErrors +3
Pop $0
StrCmp $0 "Admin" begin
MessageBox MB_OK|MB_ICONSTOP|MB_TOPMOST "Äëÿ óñòàíîâêè ïðîãðàììû ó ïîëüçîâàòåëÿ$\näîëæíû áûòü ïðàâà àäìèíèñòðàòîðà.$\nÓñòàíîâêà àíòèâèðóñà îòìåíåíà!"
Quit
begin:
${If} ${RunningX64}
SetRegView 64
${EndIf}
ClearErrors
ReadRegStr $0 HKLM "SOFTWARE\ESET\ESET Security\CurrentVersion\Info" "ProductName"
ReadRegStr $1 HKLM "SOFTWARE\ESET\ESET Security\CurrentVersion\Info" "ProductVersion"
ReadRegStr $2 HKLM "SOFTWARE\ESET\ESET Security\CurrentVersion\Info" "InstallDir"
ReadRegStr $3 HKLM "SOFTWARE\ESET\ESET Security\CurrentVersion\Info" "ProductCode"
IfErrors search_AV
messagebox::show MB_DEFBUTTON2|MB_TOPMOST "Óñòàíîâêà àíòèâèðóñà ESET" "0,103" " $\n Íà Âàøåì êîìïüþòåðå óæå óñòàíîâëåí $\n $0 $1 $\n $\n $\n Óäàëèòå $0. $\n Ïåðåçàãðóçèòå êîìïüþòåð è çàïóñòèòå óñòàíîâêó ñíîâà. $\n $\n " "Óäàëèòü $0" "Îòìåíà"
Pop $4
StrCmp $4 "1" +2
Quit
Exec '"$2callmsi.exe" /x $3 /qb'
Quit
search_AV:
ClearErrors
StrCpy $R0 "G DATA Software"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\AVKWCtl"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "AVAST Antivirus"
StrCpy $0 "Software\ALWIL Software\Avast\4.0"
EnumRegKey $R1 HKLM $0 0
IfErrors +4
ReadRegStr $R1 HKLM $0 Avast4ProgramFolder
IfFileExists $R1\aswRunDll.exe conflicts
DeleteRegKey HKLM $0
ClearErrors
StrCpy $1 "Software\Wow6432Node\ALWIL Software\Avast\4.0"
EnumRegKey $R2 HKLM $1 0
IfErrors +4
ReadRegStr $R1 HKLM $0 Avast4ProgramFolder
IfFileExists $R1\aswRunDll.exe conflicts
DeleteRegKey HKLM $0
ClearErrors
StrCpy $R0 "AVG Antivirus or Internet Security"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\AvgCoreSvc"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $0 "SYSTEM\CurrentControlSet\Services\avg8wd"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "Kaspersky Antivirus or Internet Security"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\AVP"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "Symantec Software"
StrCpy $0 "SOFTWARE\Symantec\InstalledApps\SRTSP"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $0 "SOFTWARE\Symantec\InstalledApps\SAVRT"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $0 "SOFTWARE\Symantec\InstalledApps\SMSVersionSupport"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "Norton Internet Security"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\ccEvtMgr"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $0 "SYSTEM\CurrentControlSet\Services\Norton Internet Security"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $0 "Software\Norton"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $0 "Software\Wow6432Node\Norton"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "Panda Software"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\PAVSRV"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "Avira Antivirus or Security Suite"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\AntiVirService"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "BitDefender Software"
StrCpy $0 "SOFTWARE\BitDefender"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "CA Software"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\CAISafe"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "F-Secure Software"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\Eventlog\System\F-Secure Gatekeeper"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "McAfee Software"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\McShield"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "Windows Live OneCare"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\OneCareMP"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "TrendMicro Software"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\SfCtlCom"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $0 "SYSTEM\CurrentControlSet\Services\tmcomm"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $0 "SYSTEM\CurrentControlSet\Services\tmtdi"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "TrustPort Antivirus or PC Security"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\avas_service"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "Norman Antivirus or Security Suite"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\nsesvc"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "Rising Antivirus"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\RsRavMon"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "Bullguard Internet Security"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\BsFileScan"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "Sunbelt VIPRE Antivirus"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\SBAMSvc"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
StrCpy $R0 "Microsoft Security Essentials"
StrCpy $0 "SYSTEM\CurrentControlSet\Services\MsMpSvc"
EnumRegKey $R1 HKLM $0 0
IfErrors 0 conflicts
ClearErrors
Goto +3
conflicts:
MessageBox MB_OK|MB_ICONSTOP|MB_TOPMOST "Âíèìàíèå! Íà Âàøåì êîìïüþòåðå óæå óñòàíîâëåí $R0$\nÓäàëèòå åãî èç Ïàíåëè óïðàâëåíèÿ è çàïóñòèòå óñòàíîâêó ñíîâà"
Quit
${GetParameters} $R0
StrCpy $silent qb
${GetOptions} "$R0" "/eav" $product
IfErrors +4
StrCpy $product "eav"
StrCpy $silent qn
Goto bit
ClearErrors
${GetOptions} "$R0" "/ess" $product
IfErrors +4
StrCpy $product "ess"
StrCpy $silent qn
Goto bit
ClearErrors
ReadRegStr $0 HKLM "SOFTWARE\ESET\ESET Security\CurrentVersion\Info" "ProductName"
IfErrors run
StrCpy $1 $0 4 #
StrCmp $1 "ESET" 0 run
ReadRegStr $2 HKLM "SOFTWARE\ESET\ESET Security\CurrentVersion\Info" "ProductVersion"
MessageBox MB_OK|MB_ICONSTOP|MB_TOPMOST "Íà Âàøåì êîìïüþòåðå óæå óñòàíîâëåí$\n$0 $2$\n$\nÂîçìîæíû ïðîáëåìû ïðè óñòàíîâêå ïîâåðõ ðàáîòàþùåãî ESET ! ! !$\n$\nÓäàëèòå $0.$\nÇàòåì çàïóñòèòå óñòàíîâêó ñíîâà.$\n$\nÓñòàíîâèòü ïîâåðõ ñòàðîé âåðñèè ìîæíî$\nïðè ïîìîùè êëþ÷åé ñêðûòîé óñòàíîâêè$\n/eav = NOD32 Antivirus$\n/ess = Smart Security"
Quit
run:
ClearErrors
messagebox::show MB_DEFBUTTON3|MB_TOPMOST "Óñòàíîâêà àíòèâèðóñà ESET" "0,103" "Êàêîé àíòèâèðóñíûé ïðîäóêò âû õîòèòå óñòàíîâèòü äëÿ çàùèòû ñâîåãî êîìïüþòåðà?$\n$\nNOD32 Antivirus = Àíòèâèðóñ + Àíòèøïèîí (ðåêîìåíäóåòñÿ íà÷èíàþùèì ïîëüçîâàòåëÿì)$\n$\nSmart Security = Àíòèâèðóñ + Àíòèøïèîí + Àíòèñïàì + Ïåðñîíàëüíûé ôàéåðâîë (îïûòíûì)" "NOD32 Antivirus" "Smart Security" "Îòìåíà"
Pop $product
StrCmp $product "1" 0 +3
StrCpy $product "eav"
Goto bit
StrCmp $product "2" 0 +3
StrCpy $product "ess"
Goto bit
Quit
bit:
${If} ${RunningX64}
StrCpy $bit 64
${Else}
StrCpy $bit 32
${EndIf}
FunctionEnd
Section Install
SetOutPath "$WINDIR\Temp\EsetSIM"
File cfg.xml
File /nonfatal "/oname=$WINDIR\Temp\EsetSIM\cfg.xml" "eset.xml"
StrCmp $product "eav" 0 ess
StrCmp $bit "32" 0 eav64
File /r "Distrib\eavbe_nt32_rus\*.*"
File /nonfatal "/oname=$WINDIR\Temp\EsetSIM\cfg.xml" "eav.xml"
StrCpy $setup eavbe_nt32_rus
StrCpy $9 "$PROGRAMFILES\ESET\ESET NOD32 Antivirus"
Goto install
eav64:
StrCmp $bit "64" 0 exit
File /r "Distrib\eavbe_nt64_rus\*.*"
File /nonfatal "/oname=$WINDIR\Temp\EsetSIM\cfg.xml" "eav.xml"
StrCpy $setup eavbe_nt64_rus
StrCpy $9 "$PROGRAMFILES64\ESET\ESET NOD32 Antivirus"
Goto install
ess:
StrCmp $product "ess" 0 exit
StrCmp $bit "32" 0 ess64
File /r "Distrib\essbe_nt32_rus\*.*"
File /nonfatal "/oname=$WINDIR\Temp\EsetSIM\cfg.xml" "ess.xml"
StrCpy $setup essbe_nt32_rus
StrCpy $9 "$PROGRAMFILES\ESET\ESET Smart Security"
Goto install
ess64:
StrCmp $bit "64" 0 exit
File /r "Distrib\essbe_nt64_rus\*.*"
File /nonfatal "/oname=$WINDIR\Temp\EsetSIM\cfg.xml" "ess.xml"
StrCpy $setup essbe_nt64_rus
StrCpy $9 "$PROGRAMFILES64\ESET\ESET Smart Security"
Goto install
install:
SetOutPath "$9\License"
File /nonfatal "eset.lic"
SetOutPath "$WINDIR\Temp\EsetSIM\APPDATADIR\Updfiles"
File /nonfatal "$%WinDir%\Temp\EsetSIM\Distrib\Updfiles\*.nup"
IfFileExists "$EXEDIR\eset_upd\update.ver" 0 start
StrCmp $EXEDIR "c:" start
IfFileExists "c:\eset_upd\*" 0 +2
RMDir /r /rebootok "c:\eset_upd"
CreateDirectory "c:\eset_upd"
CopyFiles /silent "$EXEDIR\eset_upd\*" "c:\eset_upd"
start:
WriteRegDWORD HKCU "Software\ESET\ESET Security\CurrentVersion\Client" "ShowSplash" 0x00000000
WriteRegDWORD HKCU "Software\ESET\ESET Security\CurrentVersion\Client" "ShowDesktopAlert" 0x00000000
WriteRegDWORD HKLM "\SOFTWARE\ESET\ESET Security\CurrentVersion\Info" "PackageFeatures" 0x00000001
ExecWait '"$SYSDIR\msiexec.exe" /i "$WINDIR\Temp\EsetSIM\$setup.msi" /$silent'
exit:
SetOutPath "$WINDIR\Temp"
RMDir /r /rebootok "$WINDIR\Temp\EsetSIM"
Quit
SectionEnd

Mafioza 13-08-2012 23:11 1969790

как сделать чтоб инсталл спросил о создании ярлыков на раб.столе и в панели быстрого запуска ??

K.A.V. 14-08-2012 09:09 1969880

Цитата:

Цитата mariolast
На 2008-й винде при старте приложения вылазит Ошибка »

Цитата:

Цитата mariolast
На всех остальных виндах работает отлично »

Цитата:

Цитата mariolast
Что может быть? »

Проблема в ОС?

Если бы данный скрипт не отрабатывал на всех ОС без исключения, то можно было бы искать ошибку в нём
Может быть, 2008 отличается от других ОС? x64? Смотрите разницу в системах

Или может запускаете инсталлятор из сетевого окружения?? - Сообщение об ошибке при попытке открыть общие сетевые приложения на клиентском компьютере под управлением Windows 7 или Windows Server 2008 R2: 0xc000000f

----

Цитата:

Цитата Mafioza
как сделать чтоб инсталл спросил о создании ярлыков на раб.столе и в панели быстрого запуска ?? »

Это можно сделать после прочтения Справочника по NSIS

Vincent7 14-08-2012 15:37 1970127

K.A.V., как привязать чекбокс к секции?

Creator000 14-08-2012 17:31 1970187

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

Creator000 14-08-2012 19:31 1970258

SetOutPath определяет куда будет установлена программа или распакованы временные файлы? для чего это

Creator000 14-08-2012 20:38 1970295

сначала нужно писать MUI_HEADERIMAGE а потом MUI_HEADERIMAGE_BITMAP ?

K.A.V. 14-08-2012 21:55 1970347

Цитата:

Цитата Vincent7
K.A.V., как привязать чекбокс к секции? »

Вопроса не понял

Цитата:

Цитата Creator000
на полякова ссылки не рабочие. на зеркале (яндекс) скачивает какой то файл это точно не учебник. »

Там ZIP архив, скачиваете, открываете, в нём PDF документ - это и есть справочник
Для просмотра PDF документов используйте спец. программы, простым запросом в Google можно сразу же получить результат

Цитата:

Цитата Creator000
SetOutPath определяет куда будет установлена программа или распакованы временные файлы? для чего это »

Справочник по NSIS => Перевод справки NSIS => File

Цитата:

Цитата Creator000
сначала нужно писать MUI_HEADERIMAGE а потом MUI_HEADERIMAGE_BITMAP ? »

Справочник по NSIS => Оформление => Интерфейс Modern => Заголовок инсталлятора


Сложно взять, и почитать справочник на родном языке?
За вас ещё искать информацию в справочнике, это слишком...

Creator000 14-08-2012 22:00 1970350

Цитата:

Цитата K.A.V.
Сложно взять, и почтитать справочник на родном языке? »

Я не корректно задал вопрос? или вам тяжело ответить на вопрос? я не спрашиваю какая функция, я спрашиваю использовать мне сразу две или одну MUI_HEADERIMAGE_BITMAP?

Creator000 14-08-2012 22:05 1970352

Вложений: 1
Цитата:

Цитата K.A.V.
Там ZIP архив, скачиваете, открываете, в нём PDF документ - это и есть справочник »

где там?
здесь у меня не качает.
с яндекса вот что качается

K.A.V. 14-08-2012 22:24 1970362

Цитата:

Цитата Creator000
Я не корректно задал вопрос? или вам тяжело ответить на вопрос? »

А я вам некорректно ответил?
Я сейчас в данной "перепалке" в выйгрышной ситуации, т.к. вы задали вопрос, который описан в первых строках документа в справочнике, путь к которому я вам написал

Мы для чего справочник вообще написали, чтобы быстрее для вас ответы что-ли искать? :lol:
Я тут не собираюсь заниматься юзанием клавишь Ctrl+C и Ctrl+V только потому, что вам лень открыть справочник и перейти по пути, который я специально для вас нашел и написал его тут

Цитата:

Цитата Creator000
использовать мне сразу две или одну MUI_HEADERIMAGE_BITMAP? »

Откройте справочник на указанной мной выше страничке и вы увидите ответ на свой вопрос в самом начале документа


Цитата:

Цитата Creator000
с яндекса вот что качается »

У меня всё в порядке (только что качал), ищите проблему у себя

Creator000 14-08-2012 23:48 1970399

Цитата:

Цитата K.A.V.
вам лень открыть справочник и перейти по пути, который я специально для вас нашел и написал его тут »

не будь таким самоуверенным.

Цитата:

Команда MUI_HEADERIMAGE позволяет отображать картинку.
!define MUI_HEADERIMAGE
По умолчанию: ${NSISDIR}\Contrib\Graphics\Header\nsis.bmp
Чтобы добавить свою картинку пишем:
!define MUI_HEADERIMAGE_BITMAP "Моя картинка.bmp"
Ну. Писать MUI_HEADERIMAGE а потом MUI_HEADERIMAGE_BITMAP? Или сразу MUI_HEADERIMAGE_BITMAP? Надо точней писать свой справочник.

Цитата:

Цитата K.A.V.
Откройте справочник на указанной мной выше страничке и вы увидите ответ на свой вопрос в самом начале документа »

ага

Begin2Fly 15-08-2012 00:02 1970407

Всё разжевали как маленькому ребёнку, а он ещё и недоволен. Есть же на свете такие упыри ещё...
Ты дядька просто учись. Пробой и так, и сяк, а если компилятору что-то не понравится - он сообщит и укажет на номер строки.
Но не надо искать причину своей недалёкости в других людях.

А по поводу
Цитата:

Цитата Creator000
Писать MUI_HEADERIMAGE а потом MUI_HEADERIMAGE_BITMAP? Или сразу MUI_HEADERIMAGE_BITMAP? »

Не имеет значения в каком порядке.

Creator000 15-08-2012 00:07 1970411

Цитата:

Error while loading icon from "{$DESKTOP}\1.ico": can't open file
что не правильно? у меня действительно на рабочем столе лежит картинка 1.ico

Creator000 15-08-2012 01:47 1970455

2) текст на страницах изменить нужно в файле или с помощью команд? ( MUI_WELCOMEPAGE_TITLE MUI_WELCOMEPAGE_TEXT да да я читал)

K.A.V. 15-08-2012 10:40 1970522

Цитата:

Цитата Creator000
не будь таким самоуверенным. »

Мы на "ты" не переходили, имейте хоть каплю уважения к людям, которые пытаются вам здесь помочь, тратя своё личное время

Цитата:

Цитата Creator000
Писать MUI_HEADERIMAGE а потом MUI_HEADERIMAGE_BITMAP? Или сразу MUI_HEADERIMAGE_BITMAP? »

Цитата:

Цитата Creator000
Надо точней писать свой справочник. »

Надо вам создать пустой проект и методом тестов выяснить, который займёт буквально 1-2 минуты, если вы не понимаете то, что разжеванно в справочнике

Если Вы такой умный, почему же не написали свой "точный справочник"?

Вам помогаешь - вы не довольны, как будто вам тут все чем-то обязаны

Krinkels 15-08-2012 11:00 1970532

Нда, почитал я тут ваши "дебаты", складывается ощущение что Creator000 обычный троль.
З.Ы. Пардон за оффтоп, не удержался

Цитата:

Цитата Creator000
2) текст на страницах изменить нужно в файле или с помощью команд? ( MUI_WELCOMEPAGE_TITLE MUI_WELCOMEPAGE_TEXT да да я читал) »

Знаешь, а ведь не видно. Притом совсем.
А теперь смотри: NSIS_Help.chm - Оформление -> Интерфейс Modern -> Страница приветствия - читай

Vincent7 15-08-2012 11:14 1970544

K.A.V., ну на custom странице при клике на чекбокс выбиралась такая то секция. Вобщем как на стандартной странице компонентов

Creator000 15-08-2012 11:53 1970576

Цитата:

Цитата K.A.V.
Мы на "ты" не переходили, имейте хоть каплю уважения к людям, которые пытаются вам здесь помочь, тратя своё личное время »

я буду вас уважать когда вы перестанете меня необоснованно оскорблять

Цитата:

Цитата Krinkels
А теперь смотри: NSIS_Help.chm - Оформление -> Интерфейс Modern -> Страница приветствия - читай »

ты не поверишь - я читал!!!
у меня вопрос текст в установщике изменить можно в самом файле переписать как я делал в inno
или только с помощью команд?

MUI_WELCOMEPAGE_TITLE
MUI_WELCOMEPAGE_TEXT
MUI_DIRECTORYPAGE_TEXT_TOP
MUI_DIRECTORYPAGE_TEXT_DESTINATION
DirText
и другие. да если мне так будут помогать то я далеко уеду.

Цитата:

Цитата Creator000
Error while loading icon from "{$DESKTOP}\1.ico": can't open file »

и еще. ну очень хочется узнать в чем ошибка. помогите, будьте людьми

Krinkels 15-08-2012 11:58 1970582

Нда, про запятые ты явно не слышал.
Если так хочется, то открываешь Russian.nsh и изменяешь все что нужно. Например:
!ifdef MUI_WELCOMEPAGE
${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Вас приветствует мастер установки $(^NameDA)"
${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Эта программа установит $(^NameDA) на ваш компьютер.$\r$\n$\r$\nПеред началом установки рекомендуется закрыть все работающие приложения. Это позволит программе установки обновить системные файлы без перезагрузки компьютера.$\r$\n$\r$\n$_CLICK"
!endif

Creator000 15-08-2012 12:04 1970588

Цитата:

Цитата Krinkels
Нда, про запятые ты явно не слышал. »

Я на уроке Русского языка, уважаемый?


Цитата:

Цитата Krinkels
Если так хочется, то открываешь Russian.nsh и изменяешь все что нужно. »

Спасибо. Зачем засоряться лишними командами, когда можно изначально все переделать.
Только там Russian.nlf, а .nsh совсем другое.

K.A.V. 15-08-2012 12:05 1970590

Цитата:

Цитата Creator000
я буду вас уважать когда »

Я не прошу ни у кого, чтобы меня уважали, это ваше личное дело

Цитата:

Цитата Creator000
когда вы перестанете меня необоснованно оскорблять »

аааа, ок, я вас оскорбил тем, что направил вас читать справочник? :biggrin:
Разговор не имеет смысла, больше не буду вас "оскорблять" своей помощью, раз так


---
Цитата:

Цитата Vincent7
K.A.V., ну на custom странице при клике на чекбокс выбиралась такая то секция »

Так, вы хотите чтобы при отметке радиокнопки или галочки отмечалась другая галочка, так??
С помощью чего делаете custom диалог? с nsDialogs я вам не помогу, если с помощью InstallOptions, то подскажу

Vincent7 15-08-2012 12:29 1970608

K.A.V., я делаю кастомную страницу выбора компонентов, и пока мне нужно чекбоксы 'привязать' к секциям(компонентам), так же как если бы это была стандартная mui components page. Делаю в nsDialogs

Creator000 15-08-2012 12:30 1970609

K.A.V., я не школото чтобы спрашивать не читая справку. Конечно, я читал. А вы вместо того, чтобы ответить "да" "нет" посылаете.

***

В статьях от hb860 мне не понятно. Я так понял он в свой установщик засунул установщик opera и flash player, распаковал в temp и оттуда установил? Так вот меня интересует перепаковка программ (это когда программа лишается своего установщика и надо свой написать).

Я так не понял для чего нужны файлы: 1049.MST и opera installer.msi хоть убейте. Запускал opera'у там нет ничего. Точней там есть только opera.exe и целый архив. Но нужных файлов нет. Я запускал выше 10-й версии. Возможно, поэтому нет. Но вопрос даже не в этом. А в другом. Зачем это нужно? И как мне найти нужные файлы если захочу перепаковывать другие браузеры и даже программы и игры?

И установка происходит посредством Windows Installer. А не надо, чтобы мой установщик сам все это делал.

Krinkels 15-08-2012 13:11 1970633

Цитата:

Цитата Creator000
И как мне найти нужные файлы если захочу перепаковывать другие браузеры и даже программы и игры? »

Тут несколько вариантов:
1. Обратиться к помощи экстрасенсов.
2. Задать вопрос в "Что, где, когда"
3. При установке софта воспользоваться специальными программами которые покажут что и куда копируется при установке. Далее брать нужные файлы и с ними работать.

Выбирай

K.A.V. 15-08-2012 19:03 1970845

Цитата:

Цитата Vincent7
K.A.V., я делаю кастомную страницу выбора компонентов, и пока мне нужно чекбоксы 'привязать' к секциям(компонентам), так же как если бы это была стандартная mui components page. Делаю в nsDialogs »

Если я правильно понял, то я вас в правильном направлении подтолкну данным кодом:
читать дальше »

Код:


!include "MUI2.nsh"
!include "FileFunc.nsh"
!include "LogicLib.nsh"
!include "WinMessages.nsh"
!include "nsDialogs.nsh"

Page custom fnc_TEST
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

Name "TEST.exe"
Caption "TEST.exe"
OutFile "TEST.exe"
ShowInstDetails show
XPStyle on

Var dlg
Var RadioButton1
Var RadioButton2
Var CheckBox

Function fnc_TEST
 
  nsDialogs::Create 1018
  Pop $dlg
 
; Тестовые радиобуттоны
  ${NSD_CreateRadioButton} 15u 7u 64u 13u "Отметить"
  Pop $RadioButton1
  ${NSD_OnClick} $RadioButton1 SetState1 ; При нажатии на кнопку выполняем функцию SetState1 (отмечаем галочку)
 
  ${NSD_CreateRadioButton} 15u 25u 36u 11u "Снять"
  Pop $RadioButton2
  ${NSD_OnClick} $RadioButton2 SetState2 ; При нажатии на кнопку выполняем функцию SetState2 (Снимаем галочку)
   
   
; Галочка 
  ${NSD_CreateCheckBox} 110u 15u 184u 11u "Моя галочка"
  Pop $CheckBox                         
                     
  nsDialogs::Show
FunctionEnd



Function SetState1
${NSD_SetState} $CheckBox ${BST_CHECKED}
;  ${BST_CHECKED} - галочка отмечена
;  ${BST_UNCHECKED} - галочка НЕ отмечена
FunctionEnd


Function SetState2
${NSD_SetState} $CheckBox ${BST_UNCHECKED}
;  ${BST_CHECKED} - галочка отмечена
;  ${BST_UNCHECKED} - галочка НЕ отмечена
FunctionEnd



Section
;SetAutoClose true
SectionEnd


Vincent7 15-08-2012 21:25 1970920

K.A.V., не совсем то, но мне пригодился этот код, спасибо!

K.A.V. 15-08-2012 22:06 1970931

Цитата:

Цитата Vincent7
K.A.V., не совсем то »

Значит объясните более расширенно, раз я не понял, что именно вам нужно реализовать...

Вы хотите создать полностью идентичное поле со списком галочек аля "секций компонентов" как при подключении MUI_PAGE_COMPONENTS с отображением групп секций или что?

Не совсем понял, что именно вам нужно :dont-know
Или просто мозг не соображает, приболел малость

Vincent7 15-08-2012 23:04 1970965

K.A.V., с этим все, разрулил:). Теперь назрел вопрос, можно ли в nsDialogs сделать как в .mouseoversection, чтобы при наведении курсора на чекбокс, вылезала к примеру надпись?

K.A.V. 16-08-2012 00:00 1970994

Цитата:

Цитата Vincent7
можно ли в nsDialogs сделать как в .mouseoversection, чтобы при наведении курсора на чекбокс, вылезала к примеру надпись? »

Тип такого?
Наводите на радиокнопки и смотрите на чекбокс :biggrin:

читать дальше »


Код:

!include "MUI2.nsh"
!include "FileFunc.nsh"
!include "LogicLib.nsh"
!include "WinMessages.nsh"
!include "nsDialogs.nsh"

Page custom fnc_TEST
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

Name "TEST.exe"
Caption "TEST.exe"
OutFile "TEST.exe"
ShowInstDetails show
XPStyle on

Var dlg
Var RadioButton1
Var RadioButton2
Var CheckBox

Function fnc_TEST
 
  nsDialogs::Create 1018
  Pop $dlg
 
; Тестовые радиобуттоны
  ${NSD_CreateRadioButton} 15u 7u 64u 13u "Отметить"
  Pop $RadioButton1
  ${NSD_OnClick} $RadioButton1 SetState1 ; При нажатии на кнопку выполняем функцию SetState1 (отмечаем галочку)
 
  ${NSD_CreateRadioButton} 15u 25u 36u 11u "Снять"
  Pop $RadioButton2
  ${NSD_OnClick} $RadioButton2 SetState2 ; При нажатии на кнопку выполняем функцию SetState2 (Снимаем галочку)
   
   
; Галочка 
  ${NSD_CreateCheckBox} 110u 15u 184u 11u "Моя галочка"
  Pop $CheckBox   

########################################################## 
getfunctionaddress $0 SetState1
nsDialogs::OnNotify $RadioButton1 $0

getfunctionaddress $1 SetState2
nsDialogs::OnNotify $RadioButton2 $1
##########################################################                         
                     
  nsDialogs::Show
FunctionEnd



Function SetState1
${NSD_SetState} $CheckBox ${BST_CHECKED}
;  ${BST_CHECKED} - галочка отмечена
;  ${BST_UNCHECKED} - галочка НЕ отмечена
FunctionEnd


Function SetState2
${NSD_SetState} $CheckBox ${BST_UNCHECKED}
;  ${BST_CHECKED} - галочка отмечена
;  ${BST_UNCHECKED} - галочка НЕ отмечена
FunctionEnd



Section
;SetAutoClose true
SectionEnd



Limonica 16-08-2012 14:58 1971285

Имеется ли в NSIS команда аналогичная команде в CMD Windows - "SC" (работа со службами)?

Даже не так, нужно просто отредактировать название службы, просто обошёлся параметром WriteRegStr

Vincent7 16-08-2012 20:01 1971431

K.A.V., не получается у меня. Делаю так
Function func
nsDialogs::Create 1018
${NSD_CreateCheckbox} 25u 27u 68u 14u "checkbox"
pop $checkbox
getfunctionaddress $0 text
nsDialogs::OnNotify $checkbox $0
nsDialogs::Show
FunctionEnd

Function text
${NSD_CreateLabel} 0 5u 100u 10u "note"
FunctionEnd

Ведь надпись note должна по идее появлятся только когда курсор на чекбоксе, а она там сразу есть

Creator000 16-08-2012 20:45 1971455

Krinkels, подскажите такую программу.
Но вы меня не поняли. Из папки temp в учебнике брали какие то два файла. Выше писал. Зачем?

K.A.V. 16-08-2012 21:36 1971478

Vincent7, не знаю, почему так работает nsDialogs, я в нём не разбирался

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

Код:

Var Label
Var MyVar
 
Function func
 nsDialogs::Create 1018
 ${NSD_CreateCheckbox} 25u 27u 68u 14u "checkbox"
 pop $checkbox
 
 ${NSD_CreateLabel} 0 5u 100u 10u ""
 pop $Label

 ${NSD_OnNotify} $checkbox text
 
 nsDialogs::Show
FunctionEnd


Function text
IntCmp $MyVar 2 0 +2 0
 ${NSD_SetText} $Label "note"
IntOp $MyVar $MyVar + 1
FunctionEnd


kotkovets 17-08-2012 01:08 1971565

Цитата:

Цитата K.A.V.
не знаю, почему так работает nsDialogs, я в нём не разбирался »

здесь плагин возвращает в стек указатель на структуру нотификации.
А со структуры (с нужного члена структуры) можно судить: вышел или нет за пределы курсор мыши прямоугольной области чекбокса. Но с чекбоксом плагин возвращает неадекватные значения членов структуры - именно чекбоксами такой глюк, может быть винда - с остальными элементами контролов вроде бы нормально.
Как вариант - в событии нотификации вычислять в "ручную" прямоугольную область чекбокса и координаты курсора мыши....
Очень громоздко и сложный код - не охота возиться.
Проще плагином воспользоваться (тултипы - всплывающие надписи при наведении курсора)
http://nsis.sourceforge.net/ToolTips_plug-in

MKN 17-08-2012 17:43 1971947

Цитата:

Цитата Creator000
интересует перепаковка программ (это когда программа лишается своего установщика и надо свой написать). »

Для этого нужно чётко знать и представлять сценарий установки программы. Т.е. что происходит и в какой последовательности, при/после установки с файловой системой и реестром, какие устанавливаются/запускаются "дополнения(службы, сервисы, драйверы и пр.) и т.д.
И только на основании знаний об этих всех действиях, можно делать собственный инсталлятор. Инсталлятор в свою очередь, должен делаться с соблюдением ряда общепринятых правил. И только "на десятом месте" будет всякая ерунда, типа оформления-дизайна и др. не принципиальных вещей...
А установка Oper_ы, описанная в справочнике - всего лишь пример установки готовых инсталляторов из скрипта (с рассказом что, как и зачем), где файл opera installer.msi - собственно сам инсталлятор, а 1049.MST - русскоязычный файл сценария установки этого инсталлятора. Ну и install_flash_player.exe - понятно что.

MKN 17-08-2012 18:17 1971977

Цитата:

Цитата kotkovets
Как вариант - в событии нотификации вычислять в "ручную" прямоугольную область чекбокса и координаты курсора мыши.... »

А можно ведь возле чекбокса поместить картиночку и наводить мышь на неё, с последующим "всплытием" чего либо.. Это не проще ли получится ?

Creator000 19-08-2012 21:17 1972927

ошибка: File: "{C:\Program Files\NSIS\Contrib\Graphics\My\orange-nsis.bmp" -> no files found
картинка там лежит. почему он ее не видит какие могут быть причины?

K.A.V. 19-08-2012 21:35 1972939

Цитата:

Цитата Creator000
картинка там лежит »

Лежит, но не там

Цитата:

Цитата Creator000
почему он »

Кто?

Цитата:

Цитата Creator000
не видит »

Цитата:

Цитата Creator000
какие могут быть причины? »

1. "Он" ослеп
2. "Он" невнимательный
3. Вы "его" обманули

Creator000 19-08-2012 21:48 1972947

Цитата:

Цитата K.A.V.
Лежит, но не там »



Цитата:

Цитата K.A.V.
1. "Он" ослеп
2. "Он" невнимательный
3. Вы "его" обманули »

Давай еще варианты.

K.A.V. 19-08-2012 22:04 1972959

Цитата:

Цитата Creator000
да ладно? »

ага
Скрином не убедили

Цитата:

Цитата Creator000
Давай еще варианты. »

А что вам ещё дать? :biggrin:
Ну хорошо, держите ещё парочку ;)

1. Вы слепой
2. Вы невнимательный


P.S.
лааадно, вот вам подсказка:
Скопируйте путь не существующего файла из лога ошибки и вставьте в Пуск => Выполнить

Creator000 19-08-2012 22:18 1972969

Цитата:

Цитата K.A.V.
Скопируйте путь не существующего файла из лога ошибки и вставьте в Пуск => Выполнить »

я вставил C:\Program Files\NSIS\Contrib\Graphics\My\orange-nsis.bmp. открылась картинка. что не правильного?

K.A.V. 19-08-2012 22:25 1972975

Цитата:

Цитата Creator000
что не правильного? »

Цитата:

Цитата K.A.V.
из лога ошибки »

Вставьте то, что указано в логе...

Цитата:

Цитата Creator000
"{C:\Program Files\NSIS\Contrib\Graphics\My\orange-nsis.bmp" »


K.A.V. 19-08-2012 22:51 1972989

Код:

{C:\Program Files\NSIS\Contrib\Graphics\My\orange-nsis.bmp

K.A.V. 19-08-2012 22:58 1972995

Цитата:

Цитата Creator000
а как ее убрать? »

Всмысле как?? Смотрите скрипт своего инсталлятора, где вы там указывали путь к своему изображению, в коде и делайте поправку

Begin2Fly 20-08-2012 17:43 1973495

Цитата:

Цитата Creator000
можно из чужого установщика вытащить интерфейс NSIS? »

Нельзя.

Begin2Fly 20-08-2012 18:57 1973553

Creator000, маловероятно, потому что неизвестно что будет с самим NSIS в ближайшем будущем.

K.A.V. 20-08-2012 18:58 1973554

Цитата:

Цитата Creator000
можно из чужого установщика вытащить интерфейс NSIS? »

Именно внешний вид диалогов (как расположены элементы) и сами файлы изображений - да
Для просмотра и извлечения внешнего вида диалогов воспользуйтесь программой ResHacker
Чтобы вытащить файлы изображений - откройте инсталлятор с помощью программы 7-Zip

Creator000 20-08-2012 20:31 1973608

K.A.V., ну естественно мне нужен внешний вид установщика. а что еще то нужно?
Цитата:

Цитата K.A.V.
Чтобы вытащить файлы изображений - откройте инсталлятор с помощью программы 7-Zip »

это да (и winrar может) но иногда выходит ошибка. файл не может быть открыт как архив.

Creator000 20-08-2012 22:46 1973678

K.A.V., а как сохранять ресурсы например картинки из этой программы? они сохраняются в rc файле

K.A.V. 20-08-2012 23:07 1973693


Creator000 20-08-2012 23:53 1973706

а тут как

K.A.V. 21-08-2012 00:00 1973710

Цитата:

Цитата Creator000
а тут как »

Вы даже не хотите сами посидеть и в чём -то разобраться, этот вопрос, честно говоря, не серьёзный...

Смотрите внимательней...

Creator000 21-08-2012 00:05 1973714

K.A.V., у папки icon нет такой функции

K.A.V. 21-08-2012 00:25 1973722

Creator000, такое ощущение, что вы просто издеваетесь надо мной своими сообщениями

Как мне ещё выделить на скрине информацию, на которую вы должны обратить внимание?
Если я вам специально маркером выделил нужную папку

MKN 21-08-2012 09:08 1973800

Creator000,
Эвоно как, сколько уже букв из-за какой то ерунды... Рисуночки-иконочки... :)
Для быстрого и простого извлечения этого бесполезного хозяйства, подойдёт любой граббер ресурсов (Resource Grabber) или экстрактор ресурсов (Resources Extract). Набери в поисковике - море ссылок.
А уж конкретно внешний вид инсталлятора кто же тебе извлечёт и что это вообще даст ? Это творчество разраба, описанное в его скрипте. Вот и ты, описывай, как фантазия подскажет... Нет фантазии, сделай скрин, понравившейся страницы и изучай его... Потом попробуй повтори в скрипте все его кнопочки , картиночки и пр. ...

Creator000 21-08-2012 16:20 1974040

MKN, а как написать свой интерфейс? это тяжело?
для граббинга ico картинок из exe использую td-ei-IconExtractor.

Creator000 21-08-2012 23:45 1974328

Цитата:

Function FuncDialogValidate
ReadINIStr $1 "$PLUGINSDIR\Project1.ini" "Field 1" "State"
StrCmp $1 "" 0 +3 ; Текстовое поле пустое?
MessageBox MB_OK|MB_ICONSTOP "Вам необходимо заполнить текстовое поле вашим текстом"
Abort
ReadINIStr $1 "$PLUGINSDIR\Project1.ini" "Field 2" "State" StrCmp $1 "0" 0 +3 ; Чекбокс не отмечен?
MessageBox MB_OK|MB_ICONSTOP "Отметьте галочкой чекбокс для продолжения!"
Abort
StrCmp $1 "1" 0 -2 MessageBox MB_OK|MB_ICONINFORMATION "Чекбокс отмечен, продолжаем"
FunctionEnd
а можно все функции? тут только как проверить данные чтоб были заполнены. а другие фишки??

K.A.V. 22-08-2012 00:47 1974368

Цитата:

Цитата Creator000
а можно все функции? »

Что вы имеете ввиду под "все функции"?

Цитата:

Цитата Creator000
а другие фишки?? »

Какие, например?


Это пример создания кастомной странички для новичков в NSIS и для тех, кто хочет создать простую страничку

Chantico 22-08-2012 15:50 1974717

Здравствуйте!
Подскажите, пожалуйста можно ли в nsis как-нибудь добавить видео, которое будет показываться при установке? Если можно, то как его присоединять?
Заранее благодарна за ответ.

K.A.V. 22-08-2012 16:04 1974730

Chantico, здравствуйте

Честно сказать, таким вопросом я не задавался...
И как встроить проигрывание видео именно в сам диалог инсталлятора я не знаю
Разве что, попробовать плагин nsWeb, его описание есть в нашем справочнике Справочник по NSIS
И вставить в свою HTML страничку на видео типа swf

Либо же просто запустить внешнюю программу для проигрывания видео файла

K.A.V. 22-08-2012 16:43 1974764

Цитата:

Цитата Creator000
ну вопервых мне нужен полный инсталлятор »

C таким подходом вы никогда не будете писать даже простенькие инсталляторы

Учитесь делать всё сами, а не требовать всё готовое, чтобы потом только изменить заголовок инсталлятора и автора "репака"

K.A.V. 22-08-2012 17:34 1974810

Creator000, в учебнике хотите сказать недостаточно информации, чтобы написать полный инсталлятор? :o

MKN 22-08-2012 18:20 1974843

Цитата:

Цитата Chantico
добавить видео, которое будет показываться при установке? »

Самое простое - это запустить из скрипта, на время или перед установкой, какой нибудь маленький автономный плейер проигрывающий видео. В нужный момент, прекращать его процесс и удалять.
Таких плейеров размером от десятков килобайт до сотен килобайт - тьма. (Tiny Player, Small Media Player, CS Player и т.д.)
Видел где то видеоплейер размером 16К !
Это меньше плагина и уж точно лучше громоздкого кода, как скажем был здесь : http://forums.winamp.com/showthread.php?t=322384

Creator000 22-08-2012 18:47 1974863

K.A.V., давайте разберем строку
Цитата:

StrCmp $1 "" 0 +3
что такое strcmp? какие еще могут быть варианты
что такое $1
что такое 0
что такое +3

Begin2Fly 22-08-2012 18:55 1974868

Creator000, почему вы в упор не желаете смотреть в справочник? Там всё по-русски написано. Чесслово, надоело уже получать оповещения с вашими бессмысленными постами.
Справочник по NSIS. Версия 1.4 > Указатель > StrCmp. Всё по русски написано и разжёвано, чего ещё надо?

kotkovets 22-08-2012 18:56 1974871

Creator000, Надоело, читать вашу муть, типа что такое strcmp, $1
уже несколько страниц полного флуда!
Еще таких пару сообщений - сообщу модератору.
Из-за Вас тема превращается в пустую болтовню - в барахолку

69KA 24-08-2012 11:02 1976047

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

Begin2Fly 24-08-2012 13:46 1976164

69KA, я делаю так:

Код:

!include "x64.nsh"

${If} ${RunningX64}
  ExecWait "$INSTDIR\64bit-File.exe" ; Если винда 64-битная, запускаем 64bit-File.exe
${Else}
  ExecWait "$INSTDIR\32bit-File.exe" ; Иначе запускаем 32bit-File.exe
${EndIf}

Естественно, вместо ExecWait может быть и nsExec::Exec, просто Exec и любые другие команды в зависимости от того, что вы хотите получить в результате.

wolkow70 25-08-2012 00:02 1976524

Цитата:

Цитата 69KA
извените, помогите новечку, мне нужно сделать что бы в зависимости от разрядости винды вызывался соответстующий внешний .ехе файл (установить драйвер). подскажите функции и инструкции через которые из будет удобно сделать. зарание спасибо. »

Иногда бывает необходимость и так сделать. Особенно, если речь идет об установке драйвера, а то он может не в ту папку попасть :).

Код:

${If} ${RunningX64}
${DisableX64FSRedirection}
 ExecWait "$INSTDIR\64bit-File.exe" ; Если винда 64-битная, запускаем 64bit-File.exe
${EnableX64FSRedirection}
${Else}
ExecWait "$INSTDIR\32bit-File.exe" ; Иначе запускаем 32bit-File.exe
${EndIf}


diakov 25-08-2012 18:35 1976879

kotkovets, подскажи пожалста, вот например при установки проги я хочу запустить патч запускаю его через команду ExecWait например, соответственно он запускается и пользователю остается нажать на кнопку generate например, возможно ли что бы сам инсталлятор нажимал эту кнопку (тоесть эмулировать нажатие на кнопку самим нсис)...встречал такой инстальник но не на нсис...

И еще по аналогии вопрос..перепаковал я аимп и хочу запихнуть туда DFX Audio Enhancer например возможно ли включить в репак оригинальный файл .exe DFX Audio Enhancer и в тихом режиме его установить что бы не появлялись окна исталлятора DFX Audio Enhancer.. спасибо!

diakov 25-08-2012 19:02 1976891

Вот пытаюсь перепаковать DFX Audio Enhancer 11.0.14 не получается поставить драйвер в папке плага есть файлы
dfx11_0ntamd64.cat
dfx11_0ntx86.cat
ptdevcon32.exe
ptdevcon64.exe
dfx11_0.inf
dfx11_0x64.inf
dfx11_0.sys
dfx11_0x64.sys
Соответственно под х64 и х86, пробовал так
ExecWait "rundll32.exe SETUPAPI.DLL,InstallHinfSection DefaultInstall 132 $INSTDIR\DFX\Universal\Drivers\dfx11_0.inf"
Не получается чето...

Vincent7 26-08-2012 00:29 1977038

Возможно execwait в тихом режиме нужно выполнить

diakov 26-08-2012 11:28 1977127

Цитата:

Цитата Vincent7
Возможно execwait в тихом режиме нужно выполнить »

Да не не то...

MKN 26-08-2012 16:12 1977274

Цитата:

Цитата diakov
ExecWait "rundll32.exe SETUPAPI.DLL,InstallHinfSection DefaultInstall 132 $INSTDIR\DFX\Universal\Drivers\dfx11_0.inf" »

Касательно этой команды, можно попробовать указать путь $SYSDIR\RUNDLL32.EXE
Касательно конкретно установки Dfx драйвера - эта команда вряд ли его установит...
В дистрибутив не даром входят DevCon компоненты (ptdevcon32.exe и ptdevcon64.exe) а также похоже, что и сам установщик DfxSetupDrv.exe. Как всё это действует, знают только разрабы...
Можно конечно взять за основу "классический" DevCon http://support.microsoft.com/kb/311272
Или DPInst - http://msdn.microsoft.com/en-us/library/ff544775.aspx. Только сработает ли... Попробуй.
Также похоже, что учитывается и архитектура процессоров ( amd64 и x86-64), что требует соответствующего выбора при установке драйверов. Это можно определять кодом :
Код:

Section
    System::Alloc 32
    Pop $0
    System::Call "Kernel32::GetNativeSystemInfo(i) v (r0)"
    System::Call "*$0(&i2 .r1)"
    System::Free $0
   
    StrCmp $1 9 0 +2
        DetailPrint PROCESSOR_ARCHITECTURE_AMD64
       
    StrCmp $1 6 0 +2
        DetailPrint PROCESSOR_ARCHITECTURE_IA64   
             
    StrCmp $1 0 0 +2
        DetailPrint PROCESSOR_ARCHITECTURE_INTEL
       
    StrCmp $1 0xffff 0 +2
        DetailPrint PROCESSOR_ARCHITECTURE_UNKNOWN
SectionEnd

Вообще установка из NSIS "не типовых" драйверов - дело скользское... А для классической установки драйверов, давно назрела пора в плагине. Тот что имеется (http://nsis.sourceforge.net/InstDrv_plug-in), уж очень дремучий и не универсальный... По сути не рабочий...

wolkow70 26-08-2012 19:09 1977349

Я для Revo Uninstaller под разную архитектуру так делал:

${If} ${RunningX64}
${DisableX64FSRedirection}
ExecWait "rundll32.exe SETUPAPI.DLL,InstallHinfSection DefaultInstall 132 $INSTDIR\revoflt.inf"
${EnableX64FSRedirection}
${Else}
ExecWait "rundll32.exe SETUPAPI.DLL,InstallHinfSection DefaultInstall 132 $INSTDIR\revoflt.inf"
${EndIf}

diakov 27-08-2012 09:19 1977588

Цитата:

Цитата wolkow70
${If} ${RunningX64}
${DisableX64FSRedirection}
ExecWait "rundll32.exe SETUPAPI.DLL,InstallHinfSection DefaultInstall 132 $INSTDIR\revoflt.inf"
${EnableX64FSRedirection}
${Else}
ExecWait "rundll32.exe SETUPAPI.DLL,InstallHinfSection DefaultInstall 132 $INSTDIR\revoflt.inf"
${EndIf} »

Да в рево так работает тоже так делал...
А как на счет эмуляции нажатия на кнопки самим нсис?

wolkow70 27-08-2012 12:43 1977706

Цитата:

Цитата diakov
А как на счет эмуляции нажатия на кнопки самим нсис? »

Не доводилось заниматься... Пока сочетаю с AutoIt. Хотя язык во многом схожий.

K.A.V. 27-08-2012 13:51 1977755

Цитата:

Цитата diakov
А как на счет эмуляции нажатия на кнопки самим нсис? »

Код:

FindWindow $0 '#32770' 'Моя программа 1.0'
; Ищем окно инсталлятора
  IsWindow $0 +2 0
  MessageBox MB_OK|MB_ICONSTOP "Указанное окно не найдено"  idOK error

GetDlgItem $1 $0 1 
; Получаем дескриптор кнопки "Далее"

MessageBox MB_OK|MB_ICONINFORMATION "После нажатия на кнопку ОК будет нажата кнопка 'Далее'"

SendMessage $1 ${BM_CLICK} 0 0
; Нажимаем кнопку
error:


PS
Нужен инклуд библиотеки
Код:

!include "winmessages.nsh"

diakov 27-08-2012 16:20 1977872

Однако разобрацо нада :)

Creator000 27-08-2012 21:02 1978041

че такое
в HM NIS Edit. просто объекты в ini файле переставил местами.

K.A.V. 27-08-2012 21:38 1978067

Цитата:

Цитата diakov
Однако разобрацо нада »

Ну...Давайте разберём вместе, раз вам мой пример мало чего дал :)

Для того, чтобы нажать на кнопку - нужно сначала узнать её дескриптор
Если вы хотите нажать на кнопку внешнего инсталлятора, то сначала вам необходимо найти дескриптор окна инсталлятора, чтобы потом получить дескриптор кнопки
ищем дескриптор окна

Код:

FindWindow $0 '#32770' 'Моя программа 1.0'


Можете добавить проверку наличия окна командой IsWindow
проверяем, существует ли искомое окно

Код:

  IsWindow $0 +2 0
  MessageBox MB_OK|MB_ICONSTOP "Указанное окно не найдено"  idOK error




Если вам необходимо нажать на кнопку в своём инсталляторе, то можно не использовать вышеупомянутые 2 команды (поиск и проверка наличия окна), а сразу перейти к получения дискриптора кнопки
вот так

Код:

GetDlgItem $1 $HWNDPARENT 1


При исполнении команды GetDlgItem, мы помещаем в переменную $1 дескриптор элемента у которого идентификатор 1 (смотрите ID элементов непосредственно через программы просмотров ресурсов, такие как ResHacker и Restorator)
Переменная $HWNDPARENT - это дескриптор окна вашего пакета инсталлятора, если вы определяете дескриптор окна внешнего инсталлятора с использованием команды FindWindow, то замените $HWNDPARENT переменной $0

В нашем случае идентификатор под номером 1 в команде GetDlgItem - это кнопка Далее в диалогах NSIS

Вот и всё, после того как узнали дескриптор кнопки, эмулируем нажатие посылкой Win сообщения
вот так

Код:

SendMessage $1 ${BM_CLICK} 0 0


-------


Цитата:

Цитата Creator000
че такое

Поисковик Google ещё никто не отменял
Попробуйте запустить программу от имени администратора, может UAC балуется? :)

diakov 28-08-2012 18:54 1978672

Цитата:

Цитата K.A.V.
смотрите ID элементов непосредственно через программы просмотров ресурсов, такие как ResHacker и Restorator »

Ах воно оно что а тодумаю как конкретно узнать...спасибо буду експерементировать...

kotkovets 28-08-2012 20:43 1978737

Цитата:

Цитата diakov
Ах воно оно что а тодумаю как конкретно узнать... »

Все это упрощенно и быстро можно узнать - http://forum.oszone.net/thread-129417.html
В пакет AutoIt входит весьма полезная утилитка - Au3Info.exe
Это программка наведением прицела на элемент диалога позволяет узнать все нужные параметры окошка
и параметры элементов диалога, остается фактически тока нужные "циферки" вставить в скрипт NSIS

Creator000 29-08-2012 23:45 1979548

Где можно узнать больше о nsDialog? мне эта штука больше понравилась чем IO.
чтобы кто-то разжевал поподробней для чего и как работают эти функции.

MKN 30-08-2012 10:15 1979684

Цитата:

Цитата Creator000
Где можно узнать больше о nsDialog? »

Здесь : http://nsis.sourceforge.net/NsDialogs_FAQ\
http://nsis.sourceforge.net/Docs/nsDialogs/Readme.html
http://nsis.sourceforge.net/Include/nsDialogs.nsh
http://nsis.sourceforge.net/Category:NsDialogs_Examples

Creator000 30-08-2012 17:31 1980005

MKN, а что нибудь по русски есть?

MKN 31-08-2012 09:01 1980307

Creator000,
Есть Promt, Lingvo, Google Translate. Переведи док. и выложи здесь. :)

volk1234 31-08-2012 12:48 1980454

Creator000

Перестаньте использовать форум как чат!

Creator000 31-08-2012 20:28 1980794

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

K.A.V. 31-08-2012 21:12 1980817

Я, видимо, самый смелый. Попробую вступить в диалог :biggrin:

Цитата:

Цитата Creator000
мне не подходит инструкция. »

Ссылку на инструкцию

Цитата:

Цитата Creator000
а целый интерфейс пользователя »

Приведите пример "интерфейса пользователя", т.к. я сомневаюсь, что понимаю данное выражение так же, как вы его понимаете

Цитата:

Цитата Creator000
который я смог бы потом подключать в коде непосредственно самого установщика »

Вряд ли вы сможете подключить к установщику целый отдельный диалог из ресурса EXE файла всего интерфейса NSIS, если я правильно понял вашу задачу

Чем не устраивают custom странички ??

Creator000 31-08-2012 21:57 1980840

K.A.V., nsDialogs: Создаем собственные страницы инсталлятора

K.A.V. 31-08-2012 22:19 1980859

Creator000, если вам "не подходит инструкция" - читайте оригинал на английском

Что вам в ней не нравится? Там описаны основные моменты для работы с nsDialogs, всё остальное - исключительно ваша фантазия

Если вы будете задавать вопросы типа "как создать радио кнопку", то ответа я вам не дам, т.к. там это описано

Так описано, как получать и обрабатывать состояния элементов, как привязать событие элемента к какой-либо функции

Конкретный вопрос задайте...Только просить готовый код, как обычно, не нужно, думаю сами уже поняли, что здесь помогут только в конкретном вопросе, а не в предостовлении готовых кодов

Creator000 31-08-2012 22:49 1980874

K.A.V., я не прошу готовый код - от вас не дождешься.
в справочнике:
подключаем MUI.nsh (это интерфейс пользователя я правильно понимаю?)
потом страницы готовые с помощью !insertmacro
и тут мы решили между ними сделать свою страничку. пишем page и функции

А мне не нужно создавать отдельные странички. мне нужно написать себе свой интерфейс My_MUI.nsh
а потом уже его подключать непосредственно к самому коду конкретного инсталлятора.
чтобы я с помощью команд !insertmacro подключал свои уже готовые странички.
My_MUI.nsh - код моих страничек
Opera.nsh - код самого установщика для оперы.

K.A.V. 31-08-2012 23:26 1980893

Цитата:

Цитата Creator000
K.A.V., я не прошу готовый код - от вас не дождешься. »

Да ладно вам...Почитайте тему внимательно, я здесь уже столько готовых кодов привёл, написанных с 0...
Я могу привести готовый код участинку, если вижу, что он что-то сделал для реализации нужного ему функционала.
Просто у меня нет желания тратить свою время на помощь ленивым людям, вот и всё
В этом вопросе меня поддержит любой участник форума, даже и не сомневаюсь, ленивых нигде не любят, и уж тем более в программировании, где нужно работать мозгами


Цитата:

Цитата Creator000
мне нужно написать себе свой интерфейс My_MUI.nsh »

Ну так, копируйте файл, открывайте, сидите разбирайтесь в коде и делайте свой интерфейс, в чем пробелма то?

Цитата:

Цитата Creator000
это интерфейс пользователя я правильно понимаю? »

Что касается именно "интерфейса", то там прописаны функции по установке цветов и установке текстов на элементы, это вкратце
По сути, этот файл содержит настройки внешнего вида интерфейса, но данный файл не способен вам предоставить возможность создания страничек по типу тех стандартных в NSIS, подгружая файл ресурса диалога из EXE файла (как вы хотите сделать, если я правильно понял)
Что содержится ещё в данном файле -можете посмотреть всё сами, октрывайте и изучайте

Цитата:

Цитата Creator000
чтобы я с помощью команд !insertmacro »

Стандартные странички "Приветствие", "Лицензия" и т.д., вы не сможете по типу таких страничек добавить свои, поймите, это делается на уровне компилятора NSIS и вы можете только изменить внешний вид данных страничек и расположение элементов + размеры окна самого интерфейса, это можно сделать подправив EXE файл оболочки интерфейса (modern.exe к примеру файл)
Можете скачать к примеру Ultra Modern UI интерфейс, там интерфейс полностью на изображениях сделан красиво...

Я же вам сразу сказал, что свой интерфейс вы не напишите, вы можете изменить уже существующий внешний вид и расположение элементов на стандартных странчках, не более

Я одного не пойму, чем вас не устраивает создание страничек с помощью команды CustomPage??
Что в них не так?

Creator000 31-08-2012 23:39 1980898

Цитата:

Цитата K.A.V.
В этом вопросе меня поддержит любой участник форума, даже и не сомневаюсь, ленивых нигде не любят, и уж тем более в программировании, где нужно работать мозгами »

Я согласен с вами. просто когда не можешь врубиться в тему всякое желание пропадает.

Цитата:

Цитата K.A.V.
Я одного не пойму, чем вас не устраивает создание страничек с помощью команды CustomPage??
Что в них не так? »

Я не знаю как вам объяснить.
!insertmacro MUI_PAGE_WELCOME - вот хочу чтобы там была моя картинка и повествование.
мне Все время под !insertmacro MUI_PAGE_WELCOME писать page? или можно ее изменить как мне хочется?(мой фон, мои icon, мое описание)
аналогично на других страницах. всякие свистерельки-пердельки прикручивать к страницам (чекбоксы, радио)
мне нужно будет пожизненно это приписывать или можно где то это прописать (в MUI я полагаю) ?

K.A.V. 31-08-2012 23:56 1980908

Цитата:

Цитата Creator000
вот хочу чтобы там была моя картинка »

Скажите мне, неужели в справочнике нет информации, как поставить свою картинку на страничку приветствия??
Серьёзно, похоже просто на издевательство...

Цитата:

Цитата Справочник по NSIS
Команда MUI_WELCOMEFINISHPAGE_BITMAP добавляет свою картинку на страницах «Приветствия» и «Завершения»:
!define MUI_WELCOMEFINISHPAGE_BITMAP "Моя картинка.bmp"

По умолчанию: ${NSISDIR}\Contrib\Graphics\Wizard\win.bmp
Рекомендуемый размер картинки 164x314

Цитата:

Цитата Creator000
мое описание »

Цитата:

Цитата Справочник по NSIS
Команда MUI_WELCOMEPAGE_TITLE помещает заданный текст в титульный заголовок страницы.
Команда MUI_WELCOMEPAGE_TEXT помещает заданный текст в нижний заголовок страницы.

!define MUI_WELCOMEPAGE_TITLE "Добро пожаловать! Это справочник по NSIS"
!define MUI_WELCOMEPAGE_TEXT " ЭТОТ СПРАВОЧНИК ПО NSIS ПОЛЕЗЕН НЕ ТОЛЬКО ДЛЯ НАЧИНАЮЩИХ, НО И ДЛЯ ОПЫТНЫХ ПОЛЬЗОВАТЕЛЕЙ. \
Советую этот справочник освоить, чтобы вы нас радовали \
красивыми инсталляторами своих приложений!"


MaGoth 02-09-2012 20:33 1981772

Привет народ, :)
Напомните плиз как запустить консольную утиль при инсталляции в скрытом режиме?!

K.A.V. 02-09-2012 21:11 1981799

MaGoth, ExecCmd plug-in

Creator000 02-09-2012 22:13 1981848

K.A.V.,
вопрос про Page custom fnCustomInit fnCustomDestroy
fnCustomInit fnCustomDestroy это обязательно? а бывают еще какие нибудь функции у page custom? или для создания страниц этого хватит?
Я просто волнуюсь, вдруг есть что нибудь более подходящее мне

K.A.V. 02-09-2012 22:31 1981864

Creator000, я же вроде в справочнике описал, или нет?

fnCustomInit - обязательно, в ней мы вызываем инициализацию диалога и потом функцию показа диалога (можно внести изменения в файл диалога перед показом, например)

fnCustomDestroy - в этой функции мы обрабатываем статусы элементов и например, значения того, что пользователь ввёл в текстовые элементы, если таковые имеются

Обе функции обязательны

Creator000 02-09-2012 22:41 1981868

K.A.V.,
Цитата:

Цитата K.A.V.
я же вроде в справочнике описал, или нет? »

Статью про nsDialogs писали не вы.

Цитата:

Цитата K.A.V.
fnCustomDestroy - в этой функции мы обрабатываем статусы элементов и например, значения того, что пользователь ввёл в текстовые элементы, если таковые имеются
Обе функции обязательны »

А если мне ненужно проверять и сообщать пользователю что он ввел и отметил все равно нужна последняя функция?

K.A.V. 02-09-2012 22:50 1981871

Цитата:

Цитата Creator000
Статью про nsDialogs писали не вы. »

А я думал вы про IO спрашиваете))

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

Цитата:

Цитата Creator000
А если мне ненужно проверять и сообщать пользователю что он ввел и отметил все равно нужна последняя функция? »

В nsDialogs вторая функция вообще не обязательна
В IO вторая при таком раскладе не обязательна

Creator000 02-09-2012 23:00 1981876

K.A.V., я уточню
fnCustomDestroy - чисто проверяет что ввел пользователь и может это показать отдельным окошком

вообще она может выводить всякого рода окна в любом месте. это все? тогда она мне не нужна.
а например она может вывести окно в случае если пользователь ввел не правильно что -то или не ввел вообще ничего и утановщик должен будет сказать, чтобы пользователь исправил свою ошибку.

K.A.V. 02-09-2012 23:04 1981877

Цитата:

Цитата Creator000
а например она может вывести окно в случае если пользователь ввел не правильно что -то или не ввел вообще ничего и утановщик должен будет сказать, чтобы пользователь исправил свою ошибку. »

Читайте справочник, команду StrCmp
Читайте статус элемента, затем сравнивайте значения командой StrCmp

Creator000 02-09-2012 23:07 1981879

K.A.V., nsDialog можно редактировать в HM NIS Edit?

столкнулся с такой ошибкой Usage: SetCompress (off|auto|force)
после добавления SetCompress /SOLID lzma (по вашей методичке смотрел). подскажите пожалуйста что не так.

K.A.V. 02-09-2012 23:13 1981884

Цитата:

Цитата Creator000
K.A.V., nsDialog можно редактировать в HM NIS Edit? »

Нет...
В nsDialogs вы указываете координаты элемента при его создании, nsDialogs не использует INI файлы

А вот IO использует INI файлы в качестве настроек диалога

Creator000 02-09-2012 23:28 1981892

K.A.V., можете считать меня глупым. но я не понимаю.
не работает SetCompress /SOLID lzma

с таким кодом
Цитата:

!include "MUI.nsh"
SetCompress off
!insertmacro MUI_PAGE_WELCOME
Page custom fnCustomInit fnCustomDestroy
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "Russian"
Name "Winreview.ru"
OutFile "winreview.exe"
ShowInstDetails show
Var Dialog
Function fnCustomInit
nsDialogs::Create 1018
Pop $Dialog nsDialogs::Show
FunctionEnd
Function fnCustomDestroy
FunctionEnd
Section DetailPrint "Hello from winreview.ru"
SetAutoClose false
SectionEnd

MKN 03-09-2012 09:10 1982002

Цитата:

Цитата Creator000
можете считать меня глупым. но я не понимаю. не работает SetCompress /SOLID lzma
с таким кодом
Код:

SetCompress off
»

Тактично будем считать тебя невнимательныи и ленивым, т.к. поиск в теме и справочнике (4.8.2.3 SetCompress) , ты упорно игнорируешь...
А если поискать, секунд десять, то можно увидеть, что для сжатия используется (как вариант) :
Код:

SetCompressor /SOLID LZMA
SetCompressorDictSize 64 ;или 128, зависит от оперативки компа, максимум 170
SetDatablockOptimize on

И как можно что то сжать, если ты установил SetCompress off ?

Creator000 03-09-2012 14:37 1982163

MKN,
Цитата:

Цитата MKN
И как можно что то сжать, если ты установил SetCompress off ? »

дело в том то, что я убрал off. и поставил /SOLID LZMA. - не работает. если это не рабочий вариант зачем его писать в справочнике?

K.A.V. 03-09-2012 14:53 1982172

Цитата:

Цитата Creator000
дело в том то, что я убрал off. и поставил /SOLID LZMA »

По тому коду, который вы предоставили - там почему-то этого не видно

Значит слишком поздно прописываете команду, приведите саму строку с ошибкой (что пишет компилятор)

Creator000 03-09-2012 18:53 1982302

откуда у меня взялся в установщике IO?

и как от него избавиться.

kotkovets 03-09-2012 19:26 1982323

Цитата:

Цитата Creator000
откуда у меня взялся в установщике IO? »

инклудинг библиотеки InstallOptions.dll "жестко" привязан к строке кода:
Код:

!include "MUI.nsh"
а так привязывается к nsDialogs.dll:
Код:

!include "MUI2.nsh"
Почему так? а потому, что в NSIS нет стандартных страничек приветствия и финиша!
Эти странички уже описаны в соответствующих библиотеках, указанные в файле MUI(2).nsh (заготовки страниц - интерфейс MUI)
---
На Все Ваши вопросы есть ответ в справочнике на РуссКом...
ЧитайТе шапку темы...
Creator000
Просьба ТуПых вопросов не задавать - получите такой же ответ.
Это форум для обсуждения NSIS, а не для общения, общайтесь и флудите в другом месте, но не здесь!
Или Вам замечание модератора не указ?

Creator000 03-09-2012 19:30 1982328

kotkovets, а есть тема где могут отвечают на простые вопросы nsis?
в личку никто не помогает - для есть форум. а на форуме - не задавай глупых вопросов, не флуди, так где мне задавать вопросы?

K.A.V. 03-09-2012 20:14 1982350

Цитата:

Цитата Creator000
откуда у меня взялся в установщике IO? »

ioSpecial.ini - это файл настроек диалога "Приветствие" и "Финиш" (${NSISDIR}\Contrib\Modern UI\ioSpecial.ini)
Можете попробовать изменить данный файл и скомпилировать - у вас изменятся данные странички

Цитата:

Цитата Creator000
kotkovets, а есть тема где могут отвечают на простые вопросы nsis? »

Цитата:

Цитата Creator000
а на форуме - не задавай глупых вопросов, не флуди, так где мне задавать вопросы? »

Весь смысл в наших ответов вам в том, что в нашем Справочнике уже есть ответы на ваши "глупые вопросы", вот и всё

Не ленитесь и будьте внимательны, читайте справочник с первой странички и до конца

MaGoth 04-09-2012 01:32 1982529

Привет народ,
Нарисовалось тут у меня еще несколько проблем, и с чем они связаны пока не понял, суть такова:

Есть 3 файла:
test1.nsi - тестовая болванка написана давно и хорошо работает(но только у меня на компе) не зависимо от того каким компиллером собираю ехешник.
рабочий кусок кода из этого скрипта:
читать дальше »
Код:

!include "MUI.nsh"
!include "WinMessages.nsh"
Name "TB4DFs Example"
OutFile "TB4DFs.exe"
ShowInstDetails nevershow
ShowUnInstDetails nevershow

!insertmacro MUI_LANGUAGE Russian

Section
!insertmacro MUI_HEADER_TEXT "..." "..."
FindWindow $0 "#32770" "" $HWNDPARENT
StrCpy $1 "0"
StrCpy $2 "75"
StrCpy $3 "450"
StrCpy $4 "15"
StrCpy $5 "0x00f0ff"
StrCpy $6 "0x0000ff"

System::Call 'GVX::CPB(i r0, i r1, i r2, i r3, i r4, i r5, i r6, 1, 1)i .r7'
DetailPrint "..."
ShowWindow $7 ${SW_SHOW}
SetDetailsPrint both
StrCpy $8 ".\SA.md"
StrCpy $9 "Test2"
System::Call 'GVX::MVDFExtVolum(t r8, t r9, i r7 )'
ShowWindow $7 ${SW_HIDE}

...

SectionEnd

Function .onInit
  !define VFX "GVX.dll"
  SetOutPath "."
  ReserveFile "${VFX}"
  File "${VFX}"
FunctionEnd


Но, если этот код поместить в два других файла (полные версии) скрипта инсталлятора, то при их компиляции начинаются лаги...


test2.nsi - полная версия АНСИ, все компилится и собирается но на финальной странице нет Фокуса, и кнопку завершения нажать нельзя. + при компиляции исчезает один язык из трех используемых.

test3.nsi - полная версия ЮТФ, все компилируется, доступны все требуемые языки, но при запуске кода по отработке .dll начинаются лаги...

В общем хочу реализовать в инсталлере так, так чтобы при вызове .dll-ки с тем или иным параметром, текстовые поля в окне инсталляции менялись в зависимости от того что она выполняет, а по завершении возвращалось исходное сосояние текстовых полей.

nsDialogs не использую, установлен НСИС версии 2,46 (АНСИ - сборка от Виктора_ВГ с бороды.ру и ЮТФ - оф. версия с сайта).
Кто что думает по этому поводу?!

Хотелось бы обсудить эти вопросы с кем нибудь в Аське/Скайпе/ЛС ...
Заранее благодарю. :)

kotkovets 04-09-2012 09:13 1982639

Цитата:

Цитата MaGoth
В общем хочу реализовать в инсталлере так, так чтобы при вызове .dll-ки с тем или иным параметром, текстовые поля в окне инсталляции менялись в зависимости от того что она выполняет, а по завершении возвращалось исходное сосояние текстовых полей »

А ну препроцесcор для чего? правильно! он добавит ту или иную строчку кода в зависимости от компилятора (ANSI или юникод)
Пример из справочника, выделение структуры в зависимости от типа компилятора:
Код:

Section
  !ifndef NSIS_UNICODE ;если не юникод
      System::Call "*(i148,i,i,i,i,&t128)i.r6" # выделяем память под структуру размером 148 байт
  !else ;если юникод
      System::Call "*(i276,i,i,i,i,&w256)i.r6" # для юникода 276 байт (2 байта - 1 символ)
  !endif
SectionEnd


MaGoth 04-09-2012 12:51 1982752

kotkovets, не поможешь адаптировать мой скрипт относительно использования кода из твоего примера?
Глянул справку там без пол литры не обойтись... :/


Зы, По мини проге запускаемой в тихом режиме, проверил ее работу в связке с плагином ExecCmd::exec, инсталлер все собирает ошибок никаких нет, как нет и результирующих файлов, которые должны появится в требуемых каталогах.
В случае использования ExecWait все прекрасно работает, окошко отображается и появляются все требуемые файлы в каталогах.
Вопрос: как в итоге избавится от окна проги так, чтобы она при этом срабатывала нормально? Кто что думает ?!

K.A.V. 04-09-2012 22:17 1983133

Цитата:

Цитата MaGoth
как нет и результирующих файлов, которые должны появится в требуемых каталогах »

Файлы, я так понимаю, должны появиться после исполнения проги через ExecCmd?
Что за программа, если не секрет?
Приведите так же команду ExecCmd на исполнение приложения

MaGoth 04-09-2012 23:44 1983197

K.A.V.,
Цитата:

Файлы, я так понимаю, должны появиться после исполнения проги через ExecCmd?
Да.

Цитата:

Что за программа, если не секрет?
Самопальный билдер/андпакер + немного работы со звуком. Все подробности в аську или куда ни будь еще, если будет желание помочь.

Цитата:

Приведите так же команду ExecCmd на исполнение приложения.
Код:

...
  FileOpen $0 "${MNB} Install\comm.vs" w
  FileWrite $0 "%%(%%D)%%N%%N"
  FileClose $0
  SetOutPath "${MNB2} Install2"
  ExecCmd::exec '${MNB} Install\GDR.exe ${MNB3} "$INSTDIR\SOdsee.vd" ".. : : " "comm.vs"'
...

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

K.A.V. 05-09-2012 11:12 1983391

Цитата:

Цитата MaGoth
Все подробности в аську или куда ни будь еще, если будет желание помочь. »

Желание помогать есть, иначе меня бы не было в этой теме и не было бы справочника ;)
У меня не на столько много времени, чтобы помогать в режиме реального времени

Цитата:

Цитата MaGoth
Хм.. а не может она не срабатывать »

Поиграться с кавычками не пробовали??? Может программа не правильно принимает параметры, которые вы ей передаёте, попробуйте заключить в одни кавычки все 3 параметра (у вас же 3 параметра передаётся??)

Код:

  ExecCmd::exec '${MNB} Install\GDR.exe "${MNB3} $INSTDIR\SOdsee.vd .. : :  comm.vs"'

P.S.
Код:

Pop $0
ExecCmd::wait $0

Ждать завершения исполнения приложения (ну вдруг вы не указывали)

MaGoth 05-09-2012 11:44 1983411

K.A.V.,
Цитата:

Поиграться с кавычками не пробовали??? Может программа не правильно принимает параметры, которые вы ей передаёте, попробуйте заключить в одни кавычки все 3 параметра (у вас же 3 параметра передаётся??)
Пробовал, не работает, выдает ошибки на уровне вызова команд при работе инсталлера. Передается 4 параметра.

Будем думать дальше что тут и как...

K.A.V. 05-09-2012 11:56 1983418

Цитата:

Цитата MaGoth
выдает ошибки на уровне вызова команд при работе инсталлера »

Что за ошибки то?

Если как вы написали
Цитата:

Цитата MaGoth
Самопальный билдер/андпакер »

То пропишите в нём отображение командной строки при запуске (ну я в том смысле, чтобы проверить, все ли параметры программе передаются корректно)

Можете ещё попробовать ExecDos plug-in, он практически такой же...Я его использую для запуска в скрытом режиме компилятора NSIS в своей программе SFX Creator :)

MaGoth 05-09-2012 12:43 1983439

Цитата:

Что за ошибки то?
Не передаются параметры по изменяемому файлу, для исполнения прогой.

Цитата:

Можете ещё попробовать ExecDos plug-in,
Попробуем. :)

K.A.V. 05-09-2012 13:02 1983456

Цитата:

Цитата MaGoth
Не передаются параметры по изменяемому файлу »

comm.vs??
Так вы полный путь, не пробовали прописывать в передаваемом параметре? ;)

MaGoth 05-09-2012 13:21 1983463

K.A.V.,
Цитата:

Так вы полный путь, не пробовали прописывать в передаваемом параметре?
Пробовал и так и эдак, месаги пишут что все ровно, пути все на месте, а файлов нет...

ExecDos plug-in - скрывает прогу, но нет файлов. :/

Зы, Такое ощущение что через плагины содержимое файла не читается.

K.A.V. 05-09-2012 13:31 1983469

Цитата:

Цитата MaGoth
Пробовал и так и эдак, месаги пишут что все ровно, пути все на месте, а файлов нет... »

Ну прям магия какая-то :)

Запакуйте всё это дело с комментами к вашей проге в архив и скиньте мне в личку ссылку на скачивание либо вложение, попозже посмотрю, может и разгадаю ваш ребус :)

MaGoth 05-09-2012 13:35 1983472

Добро, после 16:00 как вернусь с работы сделаю.

Creator000 06-09-2012 22:02 1984432

С помощью InstallDir задал каталог установки по умолчанию. Но это просто декорация
SetOutPath задает реальный каталог. и программа устанавливает только туда.


у InstallDir у меня была програм файлс
у setOutPath был темп. программа ставится только в темп, даже если в странице !insertmacro MUI_PAGE_DIRECTORY выбрать другой каталог.
как сделать свободу выбора каталога?

K.A.V. 06-09-2012 23:21 1984486

Цитата:

Цитата Creator000
SetOutPath задает реальный каталог. и программа устанавливает только туда. »

Вы прочитайте внимательно про переменные NSIS
И прочитайте для чего конкретно SetOutPath

$INSTDIR = InstallDir
В SetOutPath указывайте $INSTDIR

Вам с такими темпами и до временного бана не далеко

Creator000 11-09-2012 22:03 1986991

я так понимаю в каждом плагин и библиотека в nsis использует свой язык?

K.A.V. 12-09-2012 13:10 1987315

Цитата:

Цитата Creator000
я так понимаю в каждом плагин и библиотека в nsis использует свой язык? »

ммм...английский? :yes:

Честно сказать, "я понял, что ничего не понял из ваших слов"

Creator000 12-09-2012 20:08 1987551

K.A.V., про такие штучки fnCustomInit в справочнике не нашел. (NSIS_Руководство_пользователя)

K.A.V. 13-09-2012 08:13 1987758

Цитата:

Цитата Creator000
K.A.V., про такие штучки fnCustomInit в справочнике не нашел »

Я же вам отвечал страницу назад! В данной функции прописывются создание элементов и в конце функции команда на показ диалога, ничего там сверхъестветсвенного нет, столько примеров уже и в этой теме и есть в справочнике...

Creator000 16-09-2012 17:44 1989713

а что лучше InstallOptions, InstallOptionsEx или nsDialogs ?

MKN 17-09-2012 10:11 1990142

Цитата:

Цитата Creator000
а что лучше InstallOptions, InstallOptionsEx или nsDialogs ? »

Если бы ты прочёл хотя бы первые строки Eng дока, то увидел бы суть перевода :
"nsDialogs это новый NSIS плагин, появившийся взамен InstallOptions. nsDialogs не использует INI-файлов, что делает процесс создания страниц более быстрым и более гибким."
А уж, что кому лучше - дело индивидуальное... Но логика подсказывает, что в данном случае, лучше следовать прогрессу...

diakov 17-09-2012 17:43 1990372

Добрый день! Такой вопрос как выполнить средствами нсис команду в cmd.exe например "ipconfig /flushdns" читал о плагине ExecCmd но чето не пойму че к чему...

MKN 19-09-2012 11:28 1991363

diakov,
команда :
ExecCmd::Exec "ipconfig /flushdns"
Ессно необходимо наличие плагина, а именно ExecCmd.dll

dix75 20-09-2012 12:56 1991976

Подскажите пожайлуста
можно ли из NSIS сделать простой запрос(GET) на определенный урл?

MKN 20-09-2012 17:17 1992132

dix75,
Посмотри здесь : http://nsis.sourceforge.net/Category:Internet_Functions
А также посмотри на плагины : Inetc plug-in NSISdl plug-in Internet plug-in и подобные

Creator000 21-09-2012 23:43 1992833

почти все хорошо в вашей справке только вот мне не понятны не которые функции и команды, а именно когда и в каких ситуациях их нужно применять.

K.A.V. 22-09-2012 15:53 1993060

Цитата:

Цитата Creator000
когда и в каких ситуациях их нужно применять. »

И что вам ответить на такой вопрос, как думаете?

Я отвечу так: когда есть необходимость скопировать файл - прописываете команду копирования файла

Это очевидно...Как ещё ответить на ваш вопрос, я даже не знаю...

Это тоже самое, что: у меня есть автомобиль, мне нужно съездить куда-то
Вопрос: когда заводить автомобиль?

Limonica 22-09-2012 17:51 1993137

Как работать с манифестом, в готовом инсталляторе, при изменении данных выскакивает ошибка.

MKN 22-09-2012 19:53 1993202

Цитата:

Цитата Creator000
когда и в каких ситуациях их нужно применять »

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

Creator000 22-09-2012 22:11 1993293

У меня есть команда Page которая создает новую страницу.
Есть функция:
Код:

Function fnCustomInit
nsDialogs::Create 1018
Pop $Dialog 
${NSD_CreateRadioButton} 0 5u 100u 10u "компонент 1"
Pop $RadioButton 
${NSD_CreateRadioButton} 0 18u 100u 10u "компонент 2"
Pop $RadioButton 
nsDialogs::Show
FunctionEnd

Как видите у меня там два флажка.

Есть секции com1 id1 и com2 id2 /o.

Далее из вашей Справки вычитал функцию выбора:
Код:

Function .onSelChange  (кстати, не нашел такую функцию в aimp2)
!insertmacro StartRadioButtons $1
!insertmacro RadioButton ${id1}
!insertmacro RadioButton ${id2}
!insertmacro EndRadioButtons
FunctionEnd

Выбор по умолчанию:
Код:

Function .onInit
StrCpy $1 ${id1}
FunctionEnd

Не получается у меня все это связать в одно.

K.A.V. 22-09-2012 22:30 1993303

Creator000, функция .onSelChange обрабатывается только на стандартной страничке компонентов

Вы же, используете собственную страничку компонентов, поэтому прописывайте в функциях относящихся к вашим радиокнопкам (которые будут выполнятся при нажатии на радиокнопку) команды на снятие/установку статусов
Используйте для назначения функций радиокнопкам команды ${NSD_OnClick}

kotkovets 22-09-2012 22:38 1993306

Цитата:

Цитата Creator000
Function .onSelChange »

Эта встроенная функция для стандартной странички выбора компонентов!
делается так, специально для флудил, которые б**ть, ни справки не читают и по русски не понимают:
читать дальше »
Код:

!include MUI2.nsh

Name "nsDialogs Example"
OutFile "nsDialogs Example.exe"

Var dlg
Var RadioButton
Var RadioButton1

Page custom nsDialogPage nsDialogPageDestroy
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

Function nsDialogPage
  nsDialogs::Create 1018
  Pop $dlg
  ${NSD_CreateRadioButton} 0 5u 100u 10u "компонент 1"
  Pop $RadioButton
  ${NSD_CreateRadioButton} 0 28u 100u 10u "компонент 2"
  Pop $RadioButton1
  ${NSD_SetState} $RadioButton 1 ;устанавливаем состояние флажка компонент 1 в (1)
  ${NSD_SetState} $RadioButton1 0 ;устанавливаем состояние флажка компонент 2 в (0)
  nsDialogs::Show
FunctionEnd

Function nsDialogPageDestroy ;функция которая выполняется после закрытия стр. nsDialogPage
  ${NSD_GetState} $RadioButton $R9 ;считываем состояние флажка "компонент 1" в переменную $R9
  ${NSD_GetState} $RadioButton1 $R8
FunctionEnd

Section ""
  ${If} $R9 == 1
    MessageBox MB_ICONINFORMATION|MB_OK '"компонент 1" отмечен!$\n"компонент 2" не отмечен!' IDOK
  ${ElseIf} $R8 == 1
    MessageBox MB_ICONINFORMATION|MB_OK '"компонент 2" отмечен!$\n"компонент 1" не отмечен!' IDOK
  ${EndIf}
SectionEnd


---
Цитата:

Цитата K.A.V.
Используйте для назначения функций радиокнопкам команды ${NSD_OnClick} »

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

Creator000 22-09-2012 23:01 1993316

Мда. тут уже матом шлют
и чего читать если в вашей справке это не написано?
я так и не смог ничего найти про nsDialogPage. а с английским плохо. fnCustomInit nsDialogPage одно и то же?
Спасибо за помощь.

kotkovets 22-09-2012 23:21 1993330

Цитата:

Цитата Creator000
я так и не смог ничего найти про nsDialogPage. а с английским плохо. fnCustomInit nsDialogPage одно и то же? »

читать нужно, и ни кто матом шлать не будет...
названия функций произвольно задают латинскими буквами...
Цитата:

Цитата из справки
Команда Page custom fnCustomInit fnCustomDestroy буквально означает — создать пользовательскую страницу, выполнить функцию fnCustomInit при создании, при закрытии страницы выполнить функцию fnCustomDestroy. Ничего сложного, не так ли ?


Oleg48 23-09-2012 00:13 1993343

Уважаемые форумчане, знатоки NSIS, хотел задать вопрос по поводу локализации приложений на Windows 7x64. Появилась небольшая проблема с удалением ярлыков из меню "Пуск" в Windows 7x64, простой код удаления ярлыков:
Код:

Delete "$DESKTOP\4 элемента.lnk"   
Delete "$SMPROGRAMS\Misteria Games\4 элемента\Удалить программу.lnk"   
Delete "$SMPROGRAMS\Misteria Games\4 элемента\Web-сайт программы.lnk"   
Delete "$SMPROGRAMS\Misteria Games\4 элемента\4 элемента.lnk"       
RMDir "$SMPROGRAMS\Misteria Games\4 элемента"

Не удаляет ярлыки, они остаются в меню "Пуск", они почему то остаются в папке "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\", удалять их приходится добавление кода с прямым обращение к этой папке:

Код:

Delete "$DESKTOP\4 элемента.lnk"   
Delete "$SMPROGRAMS\Misteria Games\4 элемента\Удалить программу.lnk" 
Delete "$SMPROGRAMS\Misteria Games\4 элемента\Web-сайт программы.lnk"   
Delete "$SMPROGRAMS\Misteria Games\4 элемента\4 элемента.lnk" 
RMDir "$SMPROGRAMS\Misteria Games\4 элемента"

Delete "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Misteria Games\4 элемента\Удалить программу.lnk"   
Delete "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Misteria Games\4 элемента\Web-сайт программы.lnk"   
Delete "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Misteria Games\4 элемента\4 элемента.lnk"     
RMDir "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Misteria Games\4 элемента
"

Подскажите пожалуйста какой-нибудь более простой не такой карявый способ удаления ярлыков в меню "Пуск" в Windows 7x64, может нужно добавить какие-нибудь компоненты что-бы ярлыки сценарий удалял коректно.

kotkovets 23-09-2012 01:20 1993356

Oleg48, Вот такой маленький примерчик думаю "прояcнит" ситуацию насквозь...
смысл, в том - вставить этот код в любое место скрипта --> следить за значением переменной...
Код:

  SetShellVarContext all
    MessageBox MB_OK "$SMPROGRAMS" IDOK
  SetShellVarContext current
    MessageBox MB_OK "$SMPROGRAMS" IDOK

---
Цитата:

Цитата Creator000
только я немного другой вопрос задавал.. »

ага.. а мы немного не так отвечаем...

Oleg48 23-09-2012 09:24 1993390

kotkovets, спасибо за подсказку, только вот инсталлятор каторый я делаю, полностью тихий т. е. ничего неспрашивает и некаких вопросов пользователю незадает, как в этом случае усмотреть в какую папку ложаться ярлыки?

kotkovets 23-09-2012 09:41 1993393

Цитата:

Цитата Oleg48
как в этом случае усмотреть в какую папку ложаться ярлыки? »

точно также - убедиться куда попадают ярлыки и убрать отладочный код - только сообщения.

wolkow70 23-09-2012 16:40 1993533

kotkovets, может подскажите существует ли решение такой проблемы.

Пробую сделать сборку Daemon Tools Lite. Предусмотрено включение в сборку активированной бесплатной лицензии. Однако после распаковки ее в профиль программа файл лицензии не опознает. В тоже время, если просто скопировать файл через проводник , то все нормально. По хэшам файл не ломается (контрольные суммы совпадают). Если запаковать файл в архив и распаковать уже в профиле после установки, то тоже все нормально. Получается, что повреждаются какие аттрибуты файла через комманду File при компиляции скрипта. Пробовал с File /a все равно тоже самое.

K.A.V. 23-09-2012 17:06 1993541

wolkow70, может быть дата изменения файла меняется? Возможно это тоже влияет на файл лицензии (может быть защита по проверке времени изменения файла)

Creator000, интересно, сколько ещё вас нужно направлять читать файл справки
Вы логически думать умеете? У меня такое ощущение, что нет...
Без обид, ничего личного, нооо если чуток подумать, то можно применить команду StrCmp и проверять, отмечен ли второй флаг и, если отмечен, обнулять первый...Это ведь элементарная логика

Получится что-то на подобии этого...
Код:

StrCmp $RadioButton2_State "1" 0 +2
 StrCpy $RadioButton1_State "0"


wolkow70 23-09-2012 17:33 1993556

Цитата:

Цитата K.A.V.
wolkow70, может быть дата изменения файла меняется? Возможно это тоже влияет на файл лицензии (может быть защита по проверке времени изменения файла) »

Скорее всего, так и есть.

Потому, что если делаю коммандой копирования из папки инсталлятора, так:
CopyFiles /silent "$EXEDIR\license.dat" "$APPDATA\DAEMON Tools Lite" , то принимается лицензия.

А если методом распаковки, так:
SetShellVarContext all
SetOutPath "$APPDATA\DAEMON Tools Lite"
File /a "${pkgdir}\license.dat" , то не принимается.

Если запаковать файл в 7z архив, и распаковать в директории назначения, то принимается.
Интересует, можно ли средствами NSIS защитить все атрибуты файла при компиляции и при распаковке?

MKN 23-09-2012 17:58 1993564

Цитата:

Цитата wolkow70
можно ли средствами NSIS защитить все атрибуты файла при компиляции и при распаковке? »

4.9.1.5 File
If the /a switch is used, the attributes of the file(s) added will be preserved.
File /a something.exe

wolkow70 23-09-2012 18:09 1993568

Цитата:

Цитата MKN
If the /a switch is used, the attributes of the file(s) added will be preserved. »

Это не помогает. У меня и так прописано
File /a "${pkgdir}\license.dat"

Тут видимо, надо сохранить дату изменения файла, так как она прописывается и в самом файле для проверки активации лицензии.

MKN 23-09-2012 18:29 1993580

Цитата:

Цитата wolkow70
надо сохранить дату изменения файла »

Дык дата изменения и сохраняется при File /a

wolkow70 23-09-2012 19:02 1993591

Цитата:

Цитата MKN
Дык дата изменения и сохраняется при File /a »

Сохранял так атрибуты типа "скрытый", "для чтения" ...
Насчет даты изменения - спорный вопрос. Что-то тут не работает.
Может при распаковке дата последних изменения и открытия одновременно меняются ?

Creator000 23-09-2012 19:17 1993599

K.A.V., нет, не работает. Состояние флажка 2 считывает, сплывает окно, а вот менять состояние флажка 1 не хочет.

Oleg48 24-09-2012 13:24 1993936

kotkovets, попробЫвал эксперементировать с получением переменных, вроде все получилось только, переменная обьявленная как глобальная почему-то ее значение невидится в секции удаления и приходится их дублировать:
Код:

...
;функция в которой определяется переменная пути установки
Function .onInit     
 Var /Global deliconAll   
 SetShellVarContext all     
 StrCpy $deliconAll "$SMPROGRAMS" 
FunctionEnd   

Section "MainSection" SEC01
...
;в этой секции значение переменной работает
  CreateDirectory "$deliconAll\Total Commander"
  CreateShortCut "$deliconAll\Total Commander\Total Commander.lnk" "$INSTDIR\Totalcmd.exe"
...
SectionEnd

Section -AdditionalIcons
;в этой секции значение переменной тоже работает
  WriteIniStr "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}"
  CreateShortCut "$deliconAll\Total Commander\Web-сайт программы.lnk" "$INSTDIR\${PRODUCT_NAME}.url"
  CreateShortCut "$deliconAll\Total Commander\Удалить программу.lnk" "$INSTDIR\uninst.exe"
SectionEnd
...
Section Uninstall
...
;в этой секции переменная существует, но значение уже неизвестно, и приходится повторять код
  SetShellVarContext all
  StrCpy $deliconAll "$SMPROGRAMS"
  Delete "$deliconAll\Total Commander\Удалить программу.lnk"
  Delete "$deliconAll\Total Commander\Web-сайт программы.lnk"
  Delete "$deliconAll\Total Commander\Total Commander.lnk"
  RMDir "$deliconAll\Total Commander"
;опять же приходится дублировать код удаления ярлыков из другово места т.к. ставиться это на Windows7x64 
  SetShellVarContext current
  StrCpy $deliconAll "$SMPROGRAMS"
  Delete "$deliconAll\Total Commander\Удалить программу.lnk"
  Delete "$deliconAll\Total Commander\Web-сайт программы.lnk"
  Delete "$deliconAll\Total Commander\Total Commander.lnk"
  RMDir "$deliconAll\Total Commander"
...
SectionEnd
...

Подскажите пожалуйста, почему переменная в секции удаления теряет свое значения, и как избавиться от дублирования кода в этой секции?

kotkovets 24-09-2012 13:50 1993944

Цитата:

Цитата Oleg48
Подскажите пожалуйста, почему переменная в секции удаления теряет свое значения, и как избавиться от дублирования кода в этой секции? »

все значения переменных из инсталлятора в деинсталлятор не переносятся
В основном, по моему мнению, сделано для гибкости, иначе деинсталлятор был бы "жестким".
Иначе, оборотная сторона гибкости NSIS...

yyv 24-09-2012 13:53 1993948

добрый день
страница MUI_PAGE_INSTFILES
на ней неактивен крестик для закрытия инсталера
есть возможность сделать его активным?
Спасибо

Krinkels 24-09-2012 15:27 1993983

yyv
http://nsis.sourceforge.net/InstFile...s#Full_Example

yyv 25-09-2012 14:26 1994496

Цитата:

Цитата Krinkels

или я там чего-то не увидел, или там этого нет...

я уточню. Мне нужны операции не с кнопкой "отмена"
это я знаю как работает.
мне нужно сделать активным именно крестик закрытия окна.
В приведенной вами ссылке я не нашел этого.
Да и если скомпилировать "Full Example"
этот крестик во время выполнения INSTFILES так же остается неактивным..
теоретически Я должен получить доступ к WS_SYSMENU диалога...
Но пока еще не разобрался

MKN 25-09-2012 15:23 1994532

Цитата:

Цитата yyv
Мне нужны операции не с кнопкой "отмена" это я знаю как работает.
мне нужно сделать активным именно крестик закрытия окна. »

А зачем ?

Salmo 26-09-2012 21:16 1995337

Будьте добры, подскажите, как вписать в текстовый файл строку в кавычках
FileWrite $0 "OSZone.net $\r$\n", чтобы строка выглядела так: "OSZone.net"

Begin2Fly 26-09-2012 21:25 1995340

Salmo, должно сработать: FileWrite $0 '"OSZone.net $\r$\n"'

Salmo 26-09-2012 21:49 1995350

Begin2Fly,
Цитата:

Цитата Begin2Fly
должно сработать: FileWrite $0 '"OSZone.net $\r$\n"' »

Я знаю, что сработает, но строка вписанная в файл, в данном случае имеет вид : OSZone.net, т.е. без двойных кавычек. Мне же нужен результат с кавычками : "OSZone.net"

Все понял! Слепота, не заметил одинарные кавычки...

Begin2Fly 26-09-2012 21:58 1995356

Salmo, проверил, с двойными кавычками:
Код:

FileOpen $4 "$EXEDIR\SomeText.txt" w
FileWrite $4 '"OSZone.net"$\r$\n'
FileClose $4


Salmo 26-09-2012 22:04 1995360

Begin2Fly, Спасибо, я еще и не успел проверить... На предыдущей странице я написал, что не заметил одинарные кавычки :)

kotkovets 26-09-2012 23:15 1995378

Цитата:

Цитата Begin2Fly
FileWrite $4 '"OSZone.net"$\r$\n' »

Бывает, но не часто, что такое экранирование не принимается...
или не подходит...
А что бы всегда и везде принималась экранировка кавычек, можно делать так:
Код:

FileWrite $4 "$\"OSZone.net$\"$\r$\n"
выглядит сложнее, но надежно 100%

Reptiliy 27-09-2012 03:34 1995422

Как сделать чтоб после распаковки запустилась фотка?

PHP код:

Section "File2"
SetOutPath "$DESKTOP"
SetOverwrite on
File 
"C:\Users\user\Desktop\Install Nsis\foto.png"
Exec $Desktopfoto.png
FileClose 
$


Begin2Fly 27-09-2012 03:39 1995423

Reptiliy, так, например:
ExecShell "open" "$DESKTOP\фото.png"

Цитата:

Exec $DESKTOPфото.png
FileClose $0
Это ни к чему.

Salmo 28-09-2012 01:10 1995887

Цитата:

Цитата kotkovets
выглядит сложнее, но надежно 100% »

Спасибо, принял к сведению... Проверил - работают оба варианта.

dix75 28-09-2012 18:30 1996268

Добрый вечер!
есть функция
Код:

HINTERNET InternetOpen(
  _In_  LPCTSTR lpszAgent,
  _In_  DWORD dwAccessType,
  _In_  LPCTSTR lpszProxyName,
  _In_  LPCTSTR lpszProxyBypass,
  _In_  DWORD dwFlags
);

я её пытаюсь вызвать так.
Код:

System::Call "wininet::InternetOpen( t'w', i 0, t'', t'', i 0) *v.r1"
Общий код для запроса выглядит так
Код:

System::Call "wininet.dll::InternetOpen( t 'w2', i 0, t '', t '', i 0) *v.r1"
#System::Call "Kernel32::GetLastError() i.r2"
#MessageBox MB_OK "$2"
System::Call "wininet.dll::InternetOpenUrl( *v $1, t 'http://example.ru/', t '', i 0, i 0, i 0) *v.r2"       
System::Free $1
System::Free $2

Код ошибки 80. Почему-то не хочет работать. Не могу найти ошибку

kotkovets 28-09-2012 23:06 1996398

dix75, а что вы хотите сделать через WinAPI?
---
Здесь очень много функций - для рядового "чайника" они то и не нужны...
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
http://www.rsdn.ru/article/inet/inetapi.xml
---
Вообще эти функции возвращают идентификаторы на объект...
Код:

  System::Call "wininet::InternetOpen(t,i,t,t,i)i.r1"
  ${If} $1 != 0
    System::Call "wininet::InternetOpenUrl(ir1, t'http://example.ru/', t,i,i,i)i.r2"
    System::Call "wininet::InternetCloseHandle(ir2)"
    System::Call "wininet::InternetCloseHandle(ir1)"
  ${Else}
        MessageBox MB_OK "Error: $1" IDOK
  ${EndIf}


Salmo 30-09-2012 14:04 1996995

kotkovets, если не затруднит, подскажите, как можно организовать таймаут, задержку выполнения команд скрипта на N миллисекунд. Честно скажу, что справку пытался читать... :)

kotkovets 30-09-2012 14:15 1997002

Цитата:

Цитата Salmo
как можно организовать таймаут, задержку выполнения команд скрипта на N миллисекунд »

Код:

Sleep 100
задержка 100 миллисекунд

Salmo 30-09-2012 14:23 1997011

Цитата:

Цитата kotkovets
Sleep 100 »

ХА!...Я думал, что на NSIS будет что-то громоздкое, по сравнению с VBS, а оказалось все просто...

dix75 01-10-2012 13:06 1997678

Цитата:

Цитата kotkovets
Здесь очень много функций - для рядового "чайника" они то и не нужны... »

Почему для рядового?
на С++ это пишется на ура. Перетащить сей код на NSIS, вот где проблема.
Цитата:

Цитата kotkovets
Вообще эти функции возвращают идентификаторы на объект... »

Вот в этом то и была загвоздка.
На самом деле если посмотреть определенние
Код:

typedef LPVOID HINTERNET;
typedef void far  *LPVOID;

то видно, что это указатель на void

Да кстати более правильный вариант
Код:

        System::Call "wininet::InternetOpen(t,i,t,t,i)i.r1"
        ${If} $1 != 0
                System::Call "wininet::InternetOpenUrl(ir1, t'http://example.com', t,i,i,i)i.r2"
                ${If} $2 != 0
                        System::Call "wininet::InternetCloseHandle(ir2)"
                ${EndIf}
                System::Call "wininet::InternetCloseHandle(ir1)"
        ${EndIf}

т.е Данный код позволяет сделать скрытый запрос, без ожидания ответа.
Возможно стоит добавить его в help.

В общем спасибо за ответ.

kotkovets 01-10-2012 14:35 1997733

Цитата:

Цитата dix75
Вот в этом то и была загвоздка.
На самом деле если посмотреть определенние
Код:
typedef LPVOID HINTERNET;
typedef void far *LPVOID;
то видно, что это указатель на void »

у мелкомягких, как всегда не все однозначно :)
Цитата:

Цитата dix75
Почему для рядового?
на С++ это пишется на ура. Перетащить сей код на NSIS, вот где проблема. »

что на си пишется - я знаю, я про NSIS имел ввиду...

Creator000 02-10-2012 18:37 1998473

Как можно обвести вокруг контрола рамку?

kotkovets 02-10-2012 21:06 1998587

Цитата:

Цитата Creator000
Как можно обвести вокруг контрола рамку? »

Цитата:

Цитата из справки
Итак, можно создать следующие элементы управления при помощи макросов ${NSD_Create*}:
---
GroupBox — контейнер группы


andrei60 03-10-2012 18:12 1999094

Здравствуйте. Я очень недавно приступил к изучению NSIS. Пытаюсь начать делать portable проги. И тут же столкнулся со следующим. Нужно экспортировать из реестра что то типа HKEY_USERS\S-1-5-21-2998198832-1981029454-3828699296-1000\Software..., потом все portable приложение переносится на другую машину с другим SID-ом. И разумеется ничего не играет, импорт получается не туда, куда нужно. Как в этом случае лучше поступить? Отказаться от импорта-экспорта ключей в файл? Или, возможно, есть способ вмешиваться в процесс импорта-экспорта с какими то своими параметрами, "на лету" подменять имя ключа? Поискал в гугле и не нашел, здесь посмотрел, признаюсь не очень внимательно, очень большой объем. Надеюсь удалось внятно объяснить суть, помогите, пожалуйста, советом.

K.A.V. 03-10-2012 19:30 1999139

andrei60, а зачем сохранять именно с SID пользователя, есть привязка у приложения к учетной записи? Попробуйте использовать не ветку HKEY_USERS, а HKEY_CURRENT_USER

andrei60 03-10-2012 20:12 1999156

Точно! Вот я лошара. Я про HKEY_CURRENT_USER забыл совсем. Я когда снимки реестра делал, у меня эта ветка куда то испарилась отчего то, а я сам и не вспомнил про неё. Спасибо, K.A.V. ))

Creator000 03-10-2012 20:39 1999168

Посмотрел тему http://forums.winamp.com/showthread.php?t=293962 и вроде так и не сказали как сделать заголовок на странице nsdialog
подскажите, научите, пожалуйста.

Creator000 03-10-2012 22:52 1999247

у меня проблема. когда просто навожу мышкой на элемент рамка ломается
pic

K.A.V. 04-10-2012 08:53 1999360

Цитата:

Цитата Creator000
вроде так и не сказали как сделать заголовок на странице »

Если не прописывали инклудинк, то пропишите в начале скрипта
Код:

!include "WinMessages.nsh"
В функции создания элементов пропишите
Код:

SendMessage $HWNDPARENT ${WM_SETTEXT} 0 "STR:Мой новый заголовок"
Цитата:

Цитата Creator000
у меня проблема. когда просто навожу мышкой на элемент рамка ломается »

Это не рамка ломается, это слишком большой размер другого элемента вы указали при создании, толи у вас там Text, толи какой-нибудь чекбокс просто при наведении курсора становится поверх этой рамки

Creator000 04-10-2012 20:08 1999680

K.A.V., все прекрасно, только я наверно не правильно сказал. Мне нужно изменить
Простите, что задаю такие тупые вопросы, просто ничего не понимаю англоязычной документации с минимум комментариев. Если аналогично заголовку - ткните пальцем. Я пытался, у меня ничего не выходит.

K.A.V. 04-10-2012 21:19 1999716

Creator000, сделайте так
Узнайте ID элементов, откройте с помощью ResHacker ресурс инсталлера (диалог 105)
Затем эти ID подставляете в команды...

Код:

GetDlgItem $0 $HWNDPARENT 1037
 SendMessage $0 ${WM_SETTEXT} 0 "STR:Мой текст строки №1"

 GetDlgItem $0 $HWNDPARENT 1038
 SendMessage $0 ${WM_SETTEXT} 0 "STR:Мой текст строки №2"


kotkovets 04-10-2012 22:24 1999731

Цитата:

Цитата K.A.V.
Затем эти ID подставляете в команды... »

излишне в библиотеке уже есть готовый макрос:
те же яйца вид сбоку:
http://forum.oszone.net/post-1446111-524.html
страничка для просмотра чтения:
http://forum.oszone.net/thread-67386-53.html

Creator000 04-10-2012 22:39 1999743

K.A.V., спасибо Вам.

dix75 05-10-2012 14:14 1999991

Добрый день!
Как узнать есть ли в файле искомая строка.

делаю так
Код:

${LineFind} "prefs.txt" "" "1:-1" "un.Findt" 
        ${If} $R1 == "true"
                MessageBox MB_OK "Cool"
                ${Else}
                MessageBox MB_OK "Not Cool"
        ${EndIf}
Function un.Find
        ${WordFind} "$R9" "text" $R0
        IntCmp $R0 0 nofind
                StrCpy $R1 "true"
                Push "StopLineFind"
        nofind:
        Push $0
FunctionEnd

Все работает. Но если строки в файле нет 2 раза вылетает окно "Not Cool";
Если строка есть то вылетает "Not Cool" и "Cool"
Почему 2 раза, как это исправить

Пардон нашел ошибку

kotkovets 05-10-2012 17:14 2000075

dix75, ну можно так, "обнулять" переменную $R0 в цикле перед каждым использованием:
Код:

  StrCpy $R0 -1
  ${LineFind} "prefs.txt" "/NUL" "1:-1" "un.Findt"
  ${If} $R0 == "true"
        MessageBox MB_OK "cool"
  ${Else}
        MessageBox MB_OK "not cool"
  ${EndIf}

Function un.Findt
    ${WordFind} "$R9" "text" "#" $R0
    ${If} $R0 > 0
        StrCpy $R0 "true"
        Push "StopLineFind"
    ${Else}
        StrCpy $R0 -1
        Push $0
    ${EndIf}
FunctionEnd


Creator000 06-10-2012 00:41 2000300

А кто нибудь может дать пример скрипта в котором использовали nsdialog?

MKN 06-10-2012 09:37 2000343

Цитата:

Цитата Creator000
пример скрипта в котором использовали nsdialog »

Настройка темы\ Версия для печати\ Поиск "nsdialog" = тьма примеров
Google\ Поиск "nsdialog " = море страниц с примерами
Наконец, справка (уже в сотый раз). Начиная с http://nsis.sourceforge.net/Docs/nsDialogs/Readme.html
"Примеряй" на здоровье. :)

Creator000 06-10-2012 21:29 2000584

MKN, если бы :(

Limonica 08-10-2012 11:49 2001284

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

Цитата:

проверка архитектуры:
x86=x86 inst
x64=x64 inst

x86 inst:
...
...
....

x64 inst:
....
....
...
...
и аналогичный пример нужен на проверку ОС (XP\7).... надеюсь на оперативную помощь

Begin2Fly 08-10-2012 12:00 2001292

Код:

!include "x64.nsh"

${If} ${RunningX64}
    MessageBox MB_OK "ОС - 64-битная"
${Else}
    MessageBox MB_OK "ОС - 32-битная"
${EndIf}

По поводу определения ОС можно прочитать в справочнике NSIS из шапки в разделе 'Примеры кодов > Определение ОС'

Limonica 08-10-2012 16:26 2001444

Спасибо большое, сделала чуть иначе но принцип тот же, спасибо. Ещё вопрос есть ли плагин NSIS для создания нового пользователя?

А так же можете пояснить для чего этот плагин http://nsis.sourceforge.net/UAC_plug-in

Creator000 08-10-2012 17:55 2001500

Где можно почитать про авторвыбор разрядности системы?

Интересно, с помощью nsis можно сделать такой установщик? Установщик-командная строка.

K.A.V. 08-10-2012 18:36 2001524

Цитата:

Цитата Limonica
есть ли плагин NSIS для создания нового пользователя? »

UserMgr plug-in - Полное управление учетными записями (создание, удаление, изменение), создание/удалене групп, добавление/удаление пользователей из групп и т.д.

diakov 08-10-2012 20:14 2001581

Добрый вечер господа! Вот пример:

Есть бутон и соответственно функция нажатия такая:

Код:

Function ClickButton
  pop $btn
  InitPluginsDir
  ExecWait "$PLUGINSDIR\uninstall.exe"
  MessageBox MB_USERICON|MB_OK "Денсталляция завершена!"
FunctionEnd

Запускается деинсталлятор предыдущей версии проги, но если нажать в нем кнопку удалить (в самом запущенном деинсталляторе) то потому идет меседжбокс Денсталляция завершена, но если его закрыть (тоесть он не отрабатывает) то вылазить тот же меседжбокс но деинсталяция не отрабатывает...как то не красиво получается :)

Как сделать что бы если пользователь просто закрыл запущенный автономный деинсталлятор вылазил например меседж Денсталляция прервана или не состоялась!
Спасибо!

kotkovets 08-10-2012 22:02 2001669

Цитата:

Цитата diakov
Как сделать что бы если пользователь просто закрыл запущенный автономный деинсталлятор вылазил например меседж Денсталляция прервана или не состоялась! »

Здесь зависит, что возвращает деинсталлятор в случае удачного или неудачного завершения...
На примере запуск блокнота...
Код:

ExecWait notepad.exe $0
  MessageBox MB_OK "$0" IDOK

так вот, если закрыть блокнот, обычным способом, код возврата: $0 = 0
через диспетчер задач: $0 = 1
бывает приложения ничего не возвращают...
если свое приложение, можно заставить приложение нужную циферку возвращать в разных условиях...
читайте в справке: » Работа с процессами с помощью NSIS

Painkiller 08-10-2012 22:52 2001708

Народ, подскажите , направьте . Была раньше статья о реализации дополнительных ключей в NSIS . Сейчас страница недоступна =((

diakov 08-10-2012 22:56 2001709

kotkovets, все получилось если жму на крестик пишет 1039 а если кнопку выход 0. Все гуд спасибо!

Код:

ExecWait "$PLUGINSDIR\uninstall.exe" $0
  MessageBox MB_OK "$0" IDOK

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

Код:

Function ClickButton
  pop $btn
  InitPluginsDir
${ExecWait} "$PLUGINSDIR\uninstall.exe" $6
${If} $6 == 0
  MessageBox MB_ICONINFORMATION|MB_OK "Гусь отменил установку"
${ElseIf} $6 == 1039
  MessageBox MB_ICONINFORMATION|MB_OK "Гусь отменил установку"
${EndIf}
FunctionEnd

Получается в конце деинсталляции выскакивает ненужное сообщение как быть? :)

kotkovets 08-10-2012 23:19 2001722

Цитата:

Цитата Painkiller
Была раньше статья о реализации дополнительных ключей в NSIS »

маленький пример, с ключом /eng:
Код:

!include "mui2.nsh"
!include "filefunc.nsh"

OutFile "example.exe"
!insertmacro MUI_PAGE_INSTFILES

!insertmacro MUI_LANGUAGE Russian
!insertmacro MUI_LANGUAGE English

Function .onInit
  ClearErrors
  ${GetOptions} $CMDLINE /eng $R9
  IfErrors +2 ;если с ключом запускать, то флага ошибки нет...
  StrCpy $Language 1033
FunctionEnd

Section
  ${If} $Language == 1033
      MessageBox MB_OK "english version" IDOK
  ${ElseIf} $Language == 1049
      MessageBox MB_OK "русская версия" IDOK
  ${EndIf}
SectionEnd

Цитата:

Цитата diakov
Получается в конце деинсталляции выскакивает ненужное сообщение как быть? »

иногда никак... я же говорил!
проверяйте, что возвращает $6 - просто сообщением (в различных ситуациях), без логики - а то на вашем примере одинаковые по читаемости сообщения...
Если свой деинсталлятор, то можно заставить деинсталлятор записывать...
например в реестр... некое значение - при отмене или удачном завершении.
ну... а затем прочитать значение из реестра...

BuZzOFF 09-10-2012 07:40 2001850

Цитата:

Цитата Painkiller
Была раньше статья о реализации дополнительных ключей в NSIS »

Ссылка.

Creator000 09-10-2012 19:33 2002233

1 warning:
Generating version information for language "1049-Russian" without standard key "LegalCopyright"

Можно как нибудь использовать русский язык в описании?

yyv 10-10-2012 12:45 2002646

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

2. как вы реализуете подобные предложения?
"By clicking on Accept, you are accepting the EULA of domen and bla-bla-bla."
сейчас мы используем InstallOptions (те кастомные странички реализуем на ини файлах). Я знаю что это не удобно и устарело но ниже объясню почему делаем именно так.

мне приходиться разбивать данное предложение на несколько частей:
"By clicking on Accept, you are accepting the"
"EULA"
"of"
"domen"
" and bla-bla-bla."
и за тем в ини файле для каждой части делать свое поле и подбирать для этого поля координаты, что бы весь текст читался как одно предложение.
Теперь собственно почему ини файлы а не nsDialogs.
мы делаем инсталер с разными языками. И так как на разных языках мы будем иметь разную длину этих текстов, то приходиться для каждого языка делать отдельный ини файлик со своими координатами этих полей.
используя nsDialogs я так понял вместо 10 ини файлов и одной функции мне пришлось бы использовать 10 функций. Что мне кажется не очень удобным.
или может быть я что-то упускаю, и есть другие возможности реализации подобных конструкций?

с ув. Я

Creator000 10-10-2012 13:31 2002680

Почему есть такое предупреждение:
Цитата:

Generating version information for language "1049-Russian" without standard key "FileVersion"
Если я удалил строку "FileVersion"?

kotkovets 10-10-2012 14:24 2002711

yyv,
1. нет и да(гиморно), в любом случае будет выполняться стандартное действие...

2. Зачем 10 функций - http://forum.oszone.net/post-1553443-903.html
Langstring - задаете "переменную константу" для каждого из языков...
текст поля в nsDialogs легко изменять в зависимости от языка, тоже заданной языковой константой.
Код:

LangString height ${LANG_ENGLISH} "20"
 LangString height ${LANG_FRENCH} "25"
---
${NSD_CreateLabel} 0u 0u 100% $(height)u ""

Цитата:

Цитата yyv
мне приходиться разбивать данное предложение на несколько частей:
"By clicking on Accept, you are accepting the"
"EULA"
"of"
"domen"
" and bla-bla-bla."
и за тем в ини файле для каждой части делать свое поле и подбирать для этого поля координаты, что бы весь текст читался как одно предложение. »

Абсолютное нерациональное решение! ИМХО!

yyv 10-10-2012 14:28 2002712

Цитата:

Цитата kotkovets
Абсолютное нерациональное решение! ИМХО! »

Я с вами согласен... Но что делать, если мне в середине предложения необходимо вставить ссылку?
например у меня в предложении две ссылки.
все равно ведь придется разбивать предложение на составные блоки и собирать их как пазл?
размер для каждого языка/блока придется просчитать экспериментальным путем?
ведь мы не имеем никакой возможности сделать "авто размер" блока по содержимому?
или я что-то не понимаю?

kotkovets 10-10-2012 15:00 2002737

Цитата:

Цитата yyv
или я что-то не понимаю? »

не понимаете...
я же сказал, что в nsDialogs можно менять размеры контрола на "лету"(в отличии от InstallOptions - правкой ini на лету)
---
Есть на крайний случай полезная встроенная переменная - $LANGUAGE
Так вот эта переменная меняет значение в зависимости от языка...
например:
читать дальше »
Код:

!include "mui2.nsh"

OutFile "example.exe"
Page custom fnCustomInit

!insertmacro MUI_PAGE_INSTFILES

!insertmacro MUI_LANGUAGE Russian
!insertmacro MUI_LANGUAGE English

LangString TITLE ${LANG_RUSSIAN} "Эта надпись"
LangString TITLE ${LANG_ENGLISH} "This inscription in English"

;длина контрола от выбранного языка
LangString length ${LANG_ENGLISH} 100
LangString length ${LANG_RUSSIAN} 50

var Dialog
var Label

Function .onInit
  !insertmacro MUI_LANGDLL_DISPLAY
 FunctionEnd

Function fnCustomInit

    MessageBox MB_OK "$$LANGUAGE = $LANGUAGE$\n$$(length) = $(length)" IDOK ;смотрим как меняются значения переменных
 
    nsDialogs::Create 1018
    Pop $Dialog
    ${NSD_CreateLabel} 0 5u "$(length)u" 12u "$(TITLE)"
    Pop $Label
    nsDialogs::Show
FunctionEnd

section
sectionend


Все просто и лаконично!

yyv 10-10-2012 15:07 2002744

хорошо, просто что бы уточнить и резюмировать.
1 В моем случае разбивать на блоки все равно придется.
2 размер и координаты каждого блока для каждого языка я должен будут вычислить сам экспериментальным путем
я все правильно понял?

Creator000 10-10-2012 15:11 2002749

kotkovets, поделитесь секретом?

kotkovets 10-10-2012 15:14 2002755

Цитата:

Цитата yyv
В моем случае разбивать на блоки все равно придется. »

придется, константы забивать нужным текстом - к примеру знак $\n - переход на новую строку, значит...
значит увеличиваем высоту одного контрола... в зависимости от языка и длины текста...
Цитата:

Цитата yyv
2 размер и координаты каждого блока для каждого языка я должен будут вычислить сам экспериментальным путем
я все правильно понял? »

совершенно верно! но не 10 функций!
один раз рассчитать размеры для каждого из языков и все!
---
Цитата:

Цитата Creator000
kotkovets, поделитесь секретом? »

все секреты в справке и + "рассекричиваются только опытным путем"... раз так 100-500 :lol:

Creator000 10-10-2012 15:45 2002775

kotkovets,
ткните мне, пожалуйста, где написано в справке:
1. Как сделать так чтобы отображались русские буквы в LegalCopyrigt
2. Я удалил запись
VIAddVersionKey /LANG=${LANG_RUSSIAN} "FileDescription" "${PRODUCT_NAME} ${PRODUCT_VERSION}"
Почему программа говорит не понятно что?

С удовольствием почитаю, если бы это было.

И еще я создал деинсталлятор
Код:

WriteUninstaller "$INSTDIR\Uninstall.exe"
Но его имя с маленькой буквы: "uninstall.exe" Я хочу с большой.
Заметьте, я читал справку "Статьи от hb860 -> Деисталлятор". Как сделать с большой буквы там нет.

kotkovets 10-10-2012 15:55 2002786

Цитата:

Цитата Creator000
ткните »

Код:

VIProductVersion "1.2.3.4"
VIAddVersionKey "ProductName" "nsis"
VIAddVersionKey "LegalCopyright" "nsis"
VIAddVersionKey "CompanyName" "© xxxxxxxxx"
VIAddVersionKey "FileDescription" "${PRODUCT_NAME} ${PRODUCT_VERSION}"
VIAddVersionKey "FileVersion" "xxxx"


Creator000 10-10-2012 15:57 2002788

kotkovets,
Цитата:

Цитата Creator000
1. Как сделать так чтобы отображались русские буквы в LegalCopyrigt »


kotkovets 10-10-2012 16:05 2002795

Цитата:

Цитата Creator000
Как сделать так чтобы отображались русские буквы в LegalCopyrigt »

в win7 использовать юникодную версию nsis

Creator000 10-10-2012 16:09 2002801

kotkovets,
Юникод версия ведь не будет работать в старых операционных системах?

И про деисталятор подскажите, пожалуйста. Если Вам не трудно.

kotkovets 10-10-2012 16:23 2002814

Цитата:

Цитата Creator000
Юникод версия ведь не будет работать в старых операционных системах? »

блин, win2000 нормально работает, ниже операционку используют 0,1% фанов или на производстве.

yyv 10-10-2012 16:30 2002819

и еще буду благодарен за помощь
кнопка отмены на странице PAGE_INSTFILES
когда на нее нажимаю не выводиться предупреждение о закрытии
просто инсталер завершает работу
на всех предыдущих страницах это сообщение появляется...
подскажите где посмотреть...

Creator000 10-10-2012 16:41 2002828

kotkovets, у меня такая проблема случилась:
При установки у меня в Пуск делается папка с ярлыками. При деинстлляции она должна полностью удалиться. Но этого не происходит.
С помощью Unlocker я вижу, что папка занята двумя процессами Explorer.EXE. Причем они появляются, когда запускается деинсталлятор. И поэтому не удаляются.
А вот руками удаляются в легкою.
И вот мне нужно сделать так, чтобы деинсталлятор все же их удалял сам. Просить перезагрузку как минимум глупо из-за ярлыков. Причем, я уже сказал, удалить руками легко.
Нет какой-нибудь команды "удалить принудительно"? Ведь другие установщики как то удаляют все сразу.

P.S.
Извините за деинсталлятор. NSIS глюканул. Щас все норм.

kotkovets 10-10-2012 17:42 2002872

Цитата:

Цитата yyv
кнопка отмены на странице PAGE_INSTFILES
когда на нее нажимаю не выводиться предупреждение о закрытии
просто инсталер завершает работу »

покажите кусок скрипта, очень интересно...
по ходу когда страничка установки выполняется кнопка отмены недоступна...
назад нет возврата на предыдущую страничку...
если только сделать прерывание - abort, кнопка подсвечивается...
но прерывание уже было, завершена работа и закрытие установщика!
Где логика??? прерывать или не прерывать установку во время установки? установка уже прервана!

kotkovets 11-10-2012 01:13 2003121

Цитата:

Цитата Creator000
Можете поделиться секретом? »

SetShellVarContext current
или убрать в деинсталляторе SetShellVarContext all
по умолчанию current :biggrin:

jolly_roger@vk 11-10-2012 19:44 2003646

Здравствуйте!
Интересуют следующие вопросы:
1. Как, используя Modern UI 2, в зависимости, например, от выбора radiobutton настроить порядок последующего отображения страниц?
2. Можно ли в деинсталляторе использовать страницы инсталлятора и наоборот? И как осуществляется переход от одной страницы к другой?
3. Можно ли с помощью UpdateXML из скачанного xml-файла разом извлекать несколько значений? Если да, то как? Если нет, то как можно считать из xml-файла сразу несколько параметров?
Заранее благодарю.

kotkovets 11-10-2012 20:53 2003702

Цитата:

Цитата jolly_roger@vk
1. Как, используя Modern UI 2, в зависимости, например, от выбора radiobutton настроить порядок последующего отображения страниц? »

В справке читайте, как пропишите макросы страничек - такой и будет порядок
Цитата:

Цитата jolly_roger@vk
2. Можно ли в деинсталляторе использовать страницы инсталлятора и наоборот? И как осуществляется переход от одной страницы к другой? »

2. аналогично

3. Изучите хотя бы 2 первых вопроса - ибо это будет для вас... очень сложно..
---
модерн в доках почитайте (странички) - file://localhost/C:/Program%20Files/NSIS/Docs/Modern%20UI%202/Readme.html
(или в папке NSIS -> Docs\Modern UI 2 )

Creator000 12-10-2012 01:25 2003880

Вопрос №1:
У меня есть чексбокс. Он как то назван. Я хочу чтобы два слова в этом названии были оформлены другим шрифтом. Возможно ли это?

Вопрос №2:
У меня перед запуском деинсталлятора выполняется функция которая спрашивает удалять или нет. Я хочу изменить заголовок окна. Подскажите, как это сделать?

Вопрос №3
Я хочу чтобы у деинсталлятора в заголовке использовалась картинка не ico деинсталлятора, а ico инсталлятора.

MKN 12-10-2012 13:27 2004092

Цитата:

Цитата Creator000
есть чексбокс. Он как то назван. Я хочу чтобы два слова в этом названии были оформлены другим шрифтом. »

Т.е. , если название состоит из , скажем, пяти слов, два из них должны быть другим шрифтом ?
Можно текст рядом с чекбоксом составить из нескольких Label, выполненных разными шрифтами.
А ещё проще - рядом с чекбоксом поместить картинку с разношрифтовым текстом.
Ессно это всё предполагается делать на кастомной странице.

kotkovets 12-10-2012 14:04 2004123

Цитата:

Цитата MKN
А ещё проще - рядом с чекбоксом поместить картинку с разношрифтовым текстом. »

зачем? :rotate:
В переменную $checkbox плагин со стека возвращает дескриптор(хэндл) чекбокса,
которая винда создает при отрисовке чекбокса - уникальный номерок, есть номерок - делаем почти все, что захотим..
создаем шрифт - дескриптор шрифта в переменной $1 и применяем шрифт к чекбоксу...
читать дальше »
Код:

!include "mui2.nsh"

OutFile "example.exe"

Page custom fCustom
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE English

var dlg
var checkbox

Function fCustom
    nsDialogs::Create 1018
    Pop $dlg
    ${NSD_CreateCheckbox} 0 5u 70u 12u "checkbox"
    Pop $checkbox
    CreateFont $1 "Times New Roman" "11" "700" /UNDERLINE
    SendMessage $checkbox ${WM_SETFONT} $1 1
    nsDialogs::Show
FunctionEnd

Section
SectionEnd


Цитата:

Цитата Creator000
У меня перед запуском деинсталлятора выполняется функция которая спрашивает удалять или нет. Я хочу изменить заголовок окна. Подскажите, как это сделать?»

Если в сообщении, через WinAPI:
Код:

Function un.onInit
  System::Call "user32::MessageBox(i$hwndparent, t' Удалять....? ' ,t'Заголовок: bla...bla', i4)i.r0"
  StrCmp $0 7 0 +2
  abort
FunctionEnd


MKN 12-10-2012 15:13 2004169

Цитата:

Цитата kotkovets
создаем шрифт - дескриптор шрифта в переменной $1 и применяем шрифт к чекбоксу... »

Этот шрифт будет ведь применим ко всем словам в предложении описания одного чекбокса. Так ?
А надо (как предпролагается в хотелке) - к примеру, первое слово один шрифт, второе слово - другой шрифт, третье слово - другой цвет и т.д. - и всё это в одном предложении описания для одного чекбокса... Вот такакя загогулина...
Другой вопрос, нах это вообще нужно ?... :) Ну уж если понадобилось - то как ?

kotkovets 12-10-2012 15:25 2004185

Цитата:

Цитата MKN
А надо (как предпролагается в хотелке) - к примеру, первое слово один шрифт, второе слово - другой шрифт и т.д. и всё это в одном предложении описания чекбокса »

глупая хотелка: 2 слова: а может еще по буквам... :biggrin:
так что тут, согласен - только label подогнаными к друг другу...
принцип тот же... как выше примером с чекбоксами

MKN 12-10-2012 15:36 2004194

Цитата:

Цитата kotkovets
только label подогнаными к друг другу... »

Хрен ещё подгонишь точно, пробелы широкие остаются... Картинка с замороченным тесктом, была бы эффективнее :)

Такой ещё вопрос-предложение : как все уже поняли, с помощью WinAPI в NSIS, можно чудеса творить, на все случаи жизни... :)
Только не все это умеют...
Может коллекцию конкретных примеров полезного использования, в справочник добавить ? Особенно, если это упрощает и уменьшает классический код.
System::Call "user32:: сделаем то-то...

kotkovets 12-10-2012 15:55 2004210

Цитата:

Цитата MKN
Может коллекцию конкретных примеров полезного использования, в справочник добавить ? Особенно, если это упрощает и уменьшает классический код.
System::Call "user32:: »

эти коллекции в библиотеках стандартных(особено nsidialog.nsh) и мною написанных библиотек используются..
вопрос, что именно.. их дохрена и трошки... (примерно сколько делок в system32 умноженное на 2000)
---
кратко-подробно описан плагин system - остальное на сайт майкрософт за нужными функциями.

Creator000 12-10-2012 16:12 2004223

MKN, да я уже пытался лабелы подгонять. Криво встают. А насчет картинки попытаюсь. Это чисто эксперимент.
Цитата:

Цитата kotkovets
Если в сообщении, через WinAPI: »

Вот код.
Код:

Function un.onInit
MessageBox MB_YESNO|MB_ICONQUESTION "Вы действительно хотите удалить $(^Name)?"
 IDYES NoAbort
Abort
NoAbort:
 FunctionEnd

pic

Хочу просто название программы в заголовке в этой функции оставить.

Цитата:

Цитата Creator000
Вопрос №3 »

pic

Хочу поменять иконку. Это можно?





***
http://forums.winamp.com/showthread.php?t=282529
http://nsis.sourceforge.net/Shortcut..._Windows_Vista
Можете мне объяснить как сделать так как описано в этих статьях?
RequestExecutionLevel - я не смог от него добиться желаемого.
Единственное что я нашел

Код:

Section un.DeleteLabel
Delete "$DESKTOP\${PRODUCT_NAME}.lnk"
 SectionEnd 
Section Uninstall
SetShellVarContext all
RMDir /r "$INSTDIR"
 RMDir /r "$SMPROGRAMS\${PRODUCT_NAME}"
DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_U
NINST_KEY}"
DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY1} "${PRODUCT_UNINST_KEY1}"
 SectionEnd

В итоге
pic


А ведь я знаю, что есть установщики на NSIS которые создают ярлык на рабочем столе для одного пользователя. И все это удаляют. Как-то геморой. Почему нельзя просто удалить эти ярлыки? Разработчики лишнее на придумали.

MKN 12-10-2012 16:14 2004224

Цитата:

Цитата kotkovets
кратко-подробно описан плагин system - остальное на сайт майкрософт за нужными функциями. »

Примеров в том описании "с гулькин нос". А нужные функции на сайте MS - это тарабарская азбука для непосвященных...
Одно дело освоить NSIS, совсем другое - WinAPI.
Потому конкретные примеры для конкретных задач и были бы интересны.

yyv 12-10-2012 18:13 2004284

Цитата:

Цитата MKN
Хрен ещё подгонишь точно, пробелы широкие остаются... »

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

Creator000 12-10-2012 21:12 2004362

kotkovets, собственно, я уже не надеюсь что мне тут кто-нибудь ответит. Но просто скажу unicode-сборка проблему не решает, а только добавляет проблем с использованием русского языка.

Creator000 13-10-2012 00:16 2004442

yyv, у тебя IO?

yyv 15-10-2012 12:46 2005682

Цитата:

Цитата Creator000
yyv, у тебя IO? »

IO это INSTALL OPTIONS ?
Если так, то да.

kotkovets 15-10-2012 13:41 2005711

Creator000, хватит блин чушь писать...
тыц
Код:

!include "mui2.nsh"
OutFile "example.exe"

Page custom fn
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE English

var dlg
var lab
var lab1
var chk

Function fn
    !insertmacro MUI_HEADER_TEXT "Example" "for nsDialogs"
    nsDialogs::Create 1018
    Pop $dlg
   
    ${NSD_CreateCheckBox} 3u 5u 10u 10u ""
    Pop $chk
    ${NSD_OnClick} $chk Click_CheckBox
   
    ${NSD_CreateLabel} 13u 5u 29u 12u "Check"
    Pop $lab
    CreateFont $1 "Times New Roman" "11" "400"
    SendMessage $lab ${WM_SETFONT} $1 1
   
    ${NSD_CreateLabel} 39u 4u 18u 12u "Box"
    Pop $lab1
    SetCtlColors $lab1 0xFF0000 transparent
    CreateFont $1 "Veradana" "11" "400"
    SendMessage $lab1 ${WM_SETFONT} $1 1
   
    nsDialogs::Show
FunctionEnd

Function Click_CheckBox
  Pop $chk
  ${NSD_GetState} $chk $2
 
  ${If} $2 == 1
      MessageBox MB_ICONINFORMATION|MB_OK "чебокс отмечен" IDOK
  ${ElseIf} $2 == 0
      MessageBox MB_ICONINFORMATION|MB_OK "чебокс не отмечен" IDOK
  ${EndIf}
FunctionEnd

Section
SectionEnd


Salmo 15-10-2012 17:45 2005864

kotkovets, Добрый день. Вы, как-то, высказались по поводу Ваших планов : " будет время "нарисую" библиотеку заточенную для NSIS для управления чужим приложением(частично),
естественно придется много идей брать у AutoIt..."
http://forum.oszone.net/nextnewesttothread-218597.html
Что-нибудь получилось из задуманного? С уважением...

kotkovets 15-10-2012 21:13 2006054

Цитата:

Цитата Salmo
Что-нибудь получилось из задуманного? »

нет, очень много подводных камней...много чего не знаю - не допонимаю.
а позже и интерес пропал... как то так..
---
много чего получалось и скриптом - системными вызовами.
хотя... смотря, что вам нужно, конкретно..

Salmo 15-10-2012 22:04 2006100

Цитата:

Цитата kotkovets
много чего получалось и скриптом - системными вызовами. »

Эта информация собрана куда-нибудь в "кучу" или разбросана по просторам...?
Цитата:

Цитата kotkovets
что вам нужно, конкретно »

Ну хотя бы работа с окнами приложений, кликать по меню, подменю, кнопкам по координатам в окнах...

wolkow70 16-10-2012 13:03 2006431

kotkovets,
Столкнулся с такой проблемой при использовании хедера RegistryFunc.nsh после выполнения условия

${If} ${KeyExists}
здесь выполняются комманды
${EndIf}

меняются значения переменных $1 и $2 , в следствии чего идет ошибка дальше по ходу скрипта.
Изменение значений наблюдается именно после выхода из условия (в самой логике выполняется правильно).
При этом, после выхода из логики $1 имеет значение = наименование проверенного на условие ключа реестра, а $2 почему то = 2

PS: при замене $1 и $2 на другие, начиная с $3 ошибки пропадают.

yyv 16-10-2012 13:50 2006456

пытаюсь менять тексты в стандартных котролах на страничке установки
кнопки и верхний тайтл заменил нормально

Код:

  GetDlgItem $R2 $HWNDPARENT 1037
    SendMessage $R2  ${WM_SETTEXT} 1 "STR:Download and Install process"
   
    GetDlgItem $R2 $HWNDPARENT 1038
    SendMessage $R2  ${WM_SETTEXT} 1 "STR:Please wait while ${PRODUCT_NAME} is downloaded and installed"

пытаюсь также изменить текст над прогресбаром
и тут ничего не получается
ни этот вариант
Код:

  GetDlgItem $R2 $HWNDPARENT 1006
  SendMessage $R2  ${WM_SETTEXT} 0 "STR:Downloading ${PRODUCT_NAME} ${ORG_INSTALLER}"

ни этот не работают

Код:

FindWindow $R2 "#32770" "" $HWNDPARENT
  GetDlgItem $R3 $R2 1006
  SendMessage $R3  ${WM_SETTEXT} 0 "STR:Downloading ${PRODUCT_NAME} ${ORG_INSTALLER}"

Я так понимаю что это из-за того что прогресбар находиться на другом диалоге (106)
подскажите, есть ли возможность изменить этот текст?

kotkovets 16-10-2012 15:57 2006515

yyv, Зачем блин вся это возня ?
все стандартно в секциях:
Код:

SetDetailsPrint both
DetailPrint "Downloading ${PRODUCT_NAME} ${ORG_INSTALLER}"

заголовки:
Код:

!insertmacro MUI_HEADER_TEXT "МОЙ" "ацкий текст"
в справку стандартную загляньте (Перевод – Поляков А.В), полностью на русском!

yyv 16-10-2012 17:19 2006568

ваш вариант также не работает...
Я возможно плохо объяснил...
на картинке красным выделил тот текст который хотел бы изменить...

Инсталер не показывает деталей

показывается процесс скачивания файла и окно прячется
вот собственно эту надпись -и хотелось бы изменить

про заголовок.. Я как то даже не подумал что в секциях я могу его менять также как на кастомных страничках :)

kotkovets 16-10-2012 19:25 2006634

Цитата:

Цитата yyv
ваш вариант также не работает...
Я возможно плохо объяснил... »

Все работает... и прекрасно... и вписывать нужно до использования плагина...
и после использования изменить...
причем SetDetailsPrint имеет три свойства...
читать дальше »
Код:

!include "MUI2.nsh"

 !insertmacro MUI_PAGE_INSTFILES
 !insertmacro MUI_LANGUAGE English
 ShowInstDetails nevershow
 OutFile Details.exe

 Section
  SetDetailsPrint textonly
  DetailPrint text
  sleep 1000
  DetailPrint text_text
  sleep 1000
  DetailPrint text_text_text
  sleep 500
 SectionEnd


CyberMaster 17-10-2012 17:55 2007280

Как определить разрядность ОС? И в зависимости от разрядности (x32 или x64) записывать тот или иной ключ реестра?

kotkovets 17-10-2012 18:11 2007299

Цитата:

Цитата CyberMaster
Как определить разрядность ОС? »

Код:

  !include "x64.nsh"
  ;----
  ;----

  ${If} ${RunningX64}

      MessageBox MB_OK "running on x64"

  ${Else}

        MessageBox MB_OK "running on x32"

  ${EndIf}

справку почитайте - Определение ОС

yyv 17-10-2012 18:20 2007308

Цитата:

Цитата kotkovets
Все работает... и прекрасно... и вписывать нужно до использования плагина...
и после использования изменить... »

пробую использовать этот код в секции
читать дальше »
Код:

!insertmacro MUI_HEADER_TEXT "Download and Install process" "Please wait while ${PRODUCT_NAME} is downloaded and installed"

SetDetailsPrint textonly
DetailPrint "Downloading ${PRODUCT_NAME} ${ORG_INSTALLER}"
        !ifndef EMB_PROGRAMS
                !ifdef ORG_INSTALLER
DetailPrint "Downloading ${PRODUCT_NAME} ${ORG_INSTALLER}"                       
                        NSISdl::download "${ORG_INSTALLER}" "$TEMP\${INSTALLER}"
DetailPrint "Downloading ${PRODUCT_NAME} ${ORG_INSTALLER}"                       
                        Pop $R0 ;Get the return value           
                        HideWindow
               
                        StrCmp $R0 "success" seguir
                        StrCmp $R0 "cancel" canceled
                       
                        strcpy $DownloadFailed "1"           
                        goto error
                        seguir:
                !endif
        !endif



и текст не меняется... Постоянно висит донлоадинг инсталер.рар
мне же нужно изменить именно этот текст...
те это я так понимаю текст который выводит плагин...

CyberMaster 17-10-2012 19:59 2007386

Почитал справочник по NSIS, нашел там логическую конструкцию определения ключа реестра и необходимую библиотеку для этого (за нее отдельный респект), но как быть если нужно определить существует ли параметр в реестре, а не ключ?

Код:

        ${If} ${RunningX64}
                ${If} ${KeyExists} "${HKLM}\SOFTWARE\Wow6432Node\NSIS" "VersionBuild"
                        keyexist
                ${Else}
                        keynotexist
                ${EndIf}
        ${Else}
        ....
        ....
        ${EndIf}

Так что-ли?

kotkovets 17-10-2012 20:47 2007428

Цитата:

Цитата CyberMaster
но как быть если нужно определить существует ли параметр в реестре, а не ключ? »

Элементарно, читаем в справке: Работа с реестром в NSIS -> ReadRegStr
и ... используем флаг ошибки... все расписано давно...
Цитата:

Если прочитать данные невозможно, то в переменную user_var будет записано пустое значение - будет установлен флаг ошибки.
Код:

  clearerrors
  readregstr $0 HKLM "Software\Microsoft\Windows\CurrentVersion" "_ProgramFilesDir"
  iferrors 0 +2
  MessageBox MB_OK "erorr" IDOK

Цитата:

Цитата yyv
те это я так понимаю текст который выводит плагин... »

да

CrashTest 17-10-2012 23:36 2007523

Добрый вечер!
Однажды я видел в одном установщике функцию, при нажатии кнопки Отмены происходила удаление всех записей, ярлыков, файлов которые уже успели скопироваться из установщика.

Так вот я хочу реализовать это в nsis. Возможно ли это?

http://nsis.sourceforge.net/InstFile...ring_InstFiles
http://nsis.sourceforge.net/Uninstal...nstalled_files

Вот что я нашел. Но особо ничего не понял. Может быть вы мне поможете? Спасибо.

kotkovets 18-10-2012 00:08 2007543

CrashTest, в чем собственно то проблема, открываем справочник и читаем:
Интерфейс Modern UI -> Стандартные функции
читать дальше »
Код:

!include "MUI2.nsh"

!define MUI_ABORTWARNING
!define MUI_CUSTOMFUNCTION_ABORT Abort

!insertmacro MUI_PAGE_WELCOME

!define MUI_PAGE_CUSTOMFUNCTION_SHOW InstFilesShow
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

Name "Программы"
OutFile test.exe

Function Abort
  ;в этой функции пишем нужные команды
  MessageBox MB_OK "Установка отменена!"
 
FunctionEnd

Function InstFilesShow
  GetDlgItem $0 $HWNDPARENT 2
  EnableWindow $0 1
FunctionEnd

Section
  Sleep 3000
SectionEnd


CrashTest 18-10-2012 16:41 2007922

kotkovets, как я понимаю, в вашей функции команда Abort будет выполняться везде где только можно. а мне нужно только на странице установки файлов. и удалять только те файлы которые успели копироваться. а так она будет выполняться когда пользователь выходит из установщика, а мне надо когда пользователь прерывал установку. кнопка отмены вообще не активна.

kotkovets 18-10-2012 17:10 2007942

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

MKN 19-10-2012 16:01 2008619

Товарищи! Подскажите, как решить простую вроде бы задачу :
Необходимо, чтобы после запуска скрипта-инсталлятора, фокус был на кнопке, находящейся на кастомной странице.

Т.е. запустили инсталлятор, кликнули на клавиатуре ENTER и кнопка сработала.
(Но, с приведённым ниже кодом, вместо этого происходит переход на PAGE_INSTFILES )
Код:

!include "MUI2.nsh"
Page custom FocusTest
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"
Name "FocusTest."
OutFile "FocusTest.exe"
Var dlg
Var Button1

Function FocusTest
  nsDialogs::Create 1018
  Pop $dlg
  ${NSD_CreateButton} 25u 40u 250u 13u "На этой кнопке должен быть фокус после запуска инсталлятора"
  Pop $Button1

;так не работает :
  ${NSD_SetFocus} $Button1
;и так тоже не работает :
  ;System::Call "user32::SetFocus(iButton1)"


${NSD_OnClick} $Button1 Install
  nsDialogs::Show
FunctionEnd

Function Install
Pop $Button1
MessageBox MB_OK "        Нажали  кнопку"
;SendMessage $HWNDPARENT 0x408 1 0
FunctionEnd
Section
SetAutoClose true
SectionEnd

Или всё же в коде ошибка ?

CrashTest 19-10-2012 19:12 2008719

Что лучше WinVer2.nsh или x64.nsh для автовыбора разрядности системы? Я пользуюсь двумя, но мне кажется можно обойтись только WinVer2.nsh. Что посоветуете?

kotkovets 19-10-2012 20:38 2008746

Цитата:

Цитата CrashTest
Что лучше WinVer2.nsh или x64.nsh для автовыбора разрядности системы? »

смотря какие задачи решать...
меряться п..ками неуместно..:)

CrashTest 20-10-2012 00:47 2008845

Код:

InstallDir "$PROGRAMFILES/${PRODUCT_NAME}"

***
Function .onInit
${WinPlatformArchitecture} $R1
${If} $R1 == 64
StrCpy $INSTDIR "$PROGRAMFILES64\${PRODUCT_NAME}"
${EndIf}
FunctionEnd

^ - теперь на 64 разрядных системах папка по у молчанию показывается нормально, а не program files (86)


Добавляю следующий код:

Код:

${If} $Radio2_State == 1
StrCpy $INSTDIR "Выберите папку"
${ENDif}

то это не срабатывает? хочу чтобы переменная на втором выборе была изменена. в первом коде ведь работает.

kotkovets 20-10-2012 00:59 2008851

Цитата:

Цитата CrashTest
по у молчанию показывается нормально, а не program files (86) »

Достаточно написать это, вне секции и функции и все!
Код:

InstallDir $PROGRAMFILES64
Цитата:

Цитата CrashTest
StrCpy $INSTDIR "Выберите папку" »

что это? :o
условие сработает, если $Radio2_State == 1, если оно не равно - досвидос! :)
неужели блин трудно, перед логикой, проверить значение переменной
одной командой... для отладки...
Код:

MessageBox MB_OK "$$Radio2_State = $Radio2_State"

CrashTest 20-10-2012 01:07 2008853

Цитата:

Цитата kotkovets
Достаточно »

действительно. просто прочитал
Код:

Каталог программных файлов (program files). Обычно это C:\Program Files, но
определяется во время выполнения

и подумал установщик сам должен решать.

помогите мне еще автоматом закрывать деинсталлятор когда он отработал

Код:

Function un.onUninstSuccess
HideWindow
MessageBox MB_OK "Удаление успешно завершено!"
FunctionEnd

чето нифига

kotkovets 20-10-2012 01:31 2008860

Цитата:

Цитата CrashTest
и подумал установщик сам должен решать. »

он сам и решает - $PROGRAMFILES64
В 32-разрядной нет папки - program files (86) ..
Цитата:

Цитата CrashTest
чето нифига »

в секции удаления последней командой:
Код:

Section Uninstall
  ;---
  SetAutoClose true
SectionEnd

при условии, что далее страничек нет:
Код:

Function un.onUninstSuccess
HideWindow
MessageBox MB_OK "Удаление успешно завершено!"
;Quit
FunctionEnd


kotkovets 20-10-2012 11:57 2008955

Цитата:

Цитата MKN
фокус был на кнопке, находящейся на кастомной странице »

я тебе уже давал когда то такой макрос:
Код:

!define VK_TAB                0x9
!define keybd_event "!insertmacro macro_keybd_event"
!macro macro_keybd_event setkey intkey
  !ifndef keybd
  !define keybd
  !define KEYEVENTF_EXTENDEDKEY 0x0001
  !define KEYEVENTF_KEYUP      0x0002
  !endif
  System::Store S
  ${For} $0 1 ${intkey}
    System::Call "user32::keybd_event(i${setkey}, i0x45, i${KEYEVENTF_EXTENDEDKEY}|0, i0)"
    System::Call "user32::keybd_event(i${setkey}, i0x45, i${KEYEVENTF_EXTENDEDKEY}|${KEYEVENTF_KEYUP}, i0)"
  ${Next}
  System::Store L
!macroend

Ну для твоего кода вызов такой:
Код:

${keybd_event} ${VK_TAB} 2
т.е 2 раза эмулируем нажитие клавиши - Tab
Для других страничек опытным путем вычислияем сколько раз нужно нажать клавишу, что бы попасть на нужный контрол.

MKN 20-10-2012 12:21 2008963

kotkovets,
Этот вариант я помню. Только имитация нажатий - это обходной и громоздкий манёвр... Неужели нельзя более изящно навести фокус на нужную кнопку ?
Для чего тогда вообще нужно - ${NSD_SetFocus} ?

kotkovets 20-10-2012 12:33 2008966

Цитата:

Цитата MKN
Неужели нельзя более изящно навести фокус на нужную кнопку ? »

это очень мегаизящный вариант :) эмулировать нажатие любой клавиши - причем еще заданное n-раз!
Цитата:

Цитата MKN
Для чего тогда вообще нужно - ${NSD_SetFocus} ? »

Цитата:

Функция SetFocus отправляет сообщение WM_KILLFOCUS окну, которое теряет фокус клавиатуры, а сообщение WM_SETFOCUS окну, которое принимает фокус клавиатуры. Она также активизирует или окно, которое принимает фокус или родителя этого окна.
Если окно активное, но не имеет фокуса, любая нажатая клавиша произведет сообщение WM_SYSCHAR, WM_SYSKEYDOWN или WM_SYSKEYUP. Если клавиша VK_MENU также нажата, параметр lParam сообщения будет иметь установленным 30-й бит. Иначе, созданные сообщения не получат установки этого бита.
:) :) :)
ну не обрабатывает окно nsis посылку WM_SETFOCUS
Причем по логике всегда только одно окно в фокусе!
---

MKN 20-10-2012 12:45 2008974

kotkovets,
Вот тут тоже бились с установкой фокуса http://forums.winamp.com/showthread.php?t=187302
Только я смутно понял что получилось... Можно ли извлечь из этого нечто полезное для моего случая ?
И что такое - kernel32::CreateMutexA ?

kotkovets 20-10-2012 13:01 2008982

Цитата:

Цитата MKN
И что такое - kernel32::CreateMutexA ? »

мутекс... :biggrin:
---
Mutex позволяет проводить синхронизацию не только между потоками(thread), но и процессами(process), то есть между приложениями.
---
http://purebasic.ru/manual.php?id=1306&lng=rus
пример в справке - » Предотвращение множественности запуска приложени, т.е больше одной копии не запустим.
Цитата:

Цитата MKN
Вот тут тоже бились с установкой фокуса http://forums.winamp.com/showthread.php?t=187302 »

и что в итоге добились? :biggrin:

MKN 20-10-2012 13:03 2008985

Цитата:

Цитата kotkovets
и что в итоге добились? »

Я так понимаю, что ни хрена... :)

CrashTest 20-10-2012 13:45 2009004

У меня вопрос про ассоциации. Как я понял ассоциации можно сделать по разному.
А если установщик программы или сама программа может себя ассоциировать то мне нужно сделать так же или можно по своему?

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

Однако я распаковал скрипт установщика и там я не нашел записей для реестре для ассоциаций.

При установки пишет:

Код:

Установка ассоциаций с файлами ВВВВ...
Выполнение "C:\Program Files\Programma\Programma.exe" /RegisterFileTypes

Как я понимаю, установщик создает процесс программы, причем тихий, никаких окон нет, и видимо заходит в Настройки - Дополнительно и нажимает кнопку Регистрация.

А мне так можно научиться делать? И никаких записей в реестре в ручную. программа сама себя зарегистрирует.

CrashTest 20-10-2012 17:40 2009110

выяснил
если по нормальному
Код:

InstallDir "$PROGRAMFILES64\${PRODUCT_NAME}"
ключи в реестре не удаляются

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

Код:

InstallDir "$PROGRAMFILES64\  ${PRODUCT_NAME}"
можете помочь? я не экстрасенс, и в справке про это не написано

MKN 22-10-2012 11:58 2010059

kotkovets,
Как правильно детектировать Windows 8 ? В сегодняшнем WinVer.nsh её нет...
И есть ли не зависимый от WinVer.nsh, NSIS-OS plug-in, Version_plug-in и пр. , способ детектирования ОС ?

profcom 22-10-2012 12:44 2010080

Уважаемые участники форума существует ли версия InstallOptionsEx работающая с unicod NSIS ?

kotkovets 22-10-2012 12:44 2010081

Цитата:

Цитата MKN
Как правильно детектировать Windows 8 ? »

а чем она отличается от других версий? только циферями...
MinorVersion - младшей версией Windows...
MinorVersion Win8 = 2, в Win7 = 1
библиотека winver2.nsh из справки...

----
остальное доработаю по мере обновления справки.

MKN 22-10-2012 13:44 2010121

Цитата:

Цитата kotkovets
библиотека winver2.nsh из справки... »

А всё же, можно ли без библиотеки ? System::Call "user32:: и чего то для определения ОС... :)

kotkovets 22-10-2012 14:39 2010159

MKN, я же говорил, почти все все работает на апи в NSIS - открой winver или winver2
дабы не писать - System::Call "user32:, которое уже расписано библиотеках в виде макросов для удобства.
из winver2:
Код:

!macro FUNC_GetVersionEx STRUCT_SIZE
    System::Call "*$9(i${STRUCT_SIZE})"
    System::Call "kernel32::GetVersionEx(ir9)i.R0"
!macroend

!macro FUNC_OSVERSIONINFOEX
    System::Alloc ${OSVERSIONINFOEX_SIZE}
    Pop $9
    !insertmacro FUNC_GetVersionEx ${OSVERSIONINFOEX_SIZE}
    ${IfThen} $R0 = 0 ${|} !insertmacro FUNC_GetVersionEx ${OSVERSIONINFO_SIZE} ${|}
    System::Call "*$9(i.R2, i.r0, i.r1, i.r2, i.r3, &t128.r4, &i2.r5, &i2.r6, &i2.r7, &i1.r8, &i1)"
    System::Free $9
!macroend

теже яйца вид сбоку, и еще объявить штук 200 констант... так хочется в скрипте писать?
---
или подключить winver2.nsh и написать так:
Код:

${WinVersionMinor} $0
для стандартного winver:
Код:

${WinVerGetMinor} $0
а почему winver2 читай в справке. читать внимательно когда будем?
Цитата:

Цитата MKN
А всё же, можно ли без библиотеки ? »

через реестр, но это для меня ненадежный вариант - легко циферки подправить чем угодно...
исход известен...
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion

CrashTest 24-10-2012 10:40 2011179

вот если 32 и 64 разрядность то в установщике надо прописать ключи реестра для каждой разрядности отдельно. а для секции в реестре Uninstall для меню программы и компоненты надо для каждой разрядности прописывать отдельно или установщик сам разберется??

shut 24-10-2012 18:43 2011462

Здравствуйте.

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

Например:
У меня есть список файлов (одна строка - один файл), который меняется пару раз на день. На основе этого списка должена формироваться инсталяшка. Я хочу реализовать такой механизм, чтоб при начале компиляции генерился список файлов и потом подключался в соответствующую секцию includ'ом. Возможно ли это, или проще написать exe-шник который это сам делал а потом запускал компиляцию?

kotkovets 24-10-2012 19:25 2011481

Цитата:

Цитата CrashTest
вот если 32 и 64 разрядность то в установщике надо прописать ключи реестра для каждой разрядности отдельно. »

Вот вы попробуйте для начала.. а потом пишите
Цитата:

Цитата shut
У меня есть список файлов (одна строка - один файл), который меняется пару раз на день. На основе этого списка должена формироваться инсталяшка. Я хочу реализовать такой механизм, чтоб при начале компиляции генерился список файлов и потом подключался в соответствующую секцию includ'ом. Возможно ли это, или проще написать exe-шник который это сам делал а потом запускал компиляцию? »

Можно создавать файлик при компиляции
Код:

outfile "test.exe"

!delfile "C:\file.nsh" ;удаляем файл, если есть предыдущий
!tempfile "C:\file.nsh" ;создаем файл
!appendfile "C:\file.nsh" '!define msgBox "MessageBox MB_OK test_oszone"$\n' ;запись в файл

!include "C:\file.nsh"

Section
  ${msgBox}
SectionEnd

т.е пишем файлик строго в аля стиле NSIS!
но парсить какие файлы и создавать список можно попробовать командной строкой (консольными прогами винды)
типа dir.exe запущенной во время компиляции с определенными ключами(здесь я не силен, задайте на форуме этот вопрос в соответствущей теме)
Запуск файла можно так:
Код:

!system "%WINDIR%\notepad.exe"
ну а далее как примером выше. Вообще в NSIS команды препроцессора начинаются с - !
смотрите подробно в справке...
---
получается типа динамический скрипт... :)

CrashTest 24-10-2012 20:25 2011503

Цитата:

Цитата kotkovets
Вот вы попробуйте для начала.. а потом пишите »

А я попробовал и спрашиваю Вас.

Код:

${If} ${RunningX64}
File "64\files.exe"
SetRegView 32
WriteRegDWORD HKCU "Software\programs\files\Settings" "language" "1049"
WriteRegDWORD HKCU "Software\programs\files\Settings" "check-updates" "0"
WriteRegDWORD HKCU "Software\Aprograms\files\Settings" "warn-not-default-viewer" "0"
WriteRegStr HKCU "Software\programs\files\Settings" "version" "2.0.1"
MessageBox MB_OK "C:\Program Files (x86)"
SetRegView 64
WriteRegDWORD HKCU "Software\programs\files\Settings" "language" "1049"
WriteRegDWORD HKCU "Software\programs\files\Settings" "check-updates" "0"
WriteRegDWORD HKCU "Software\programs\files\Settings" "warn-not-default-viewer" "0"
WriteRegStr HKCU "Software\programs\files\Settings" "version" "2.0.1"
MessageBox MB_OK "C:\Program Files (x64)"
${Else}
File "g\App\prog\files.exe"
${EndIf}

Вот так будет работать? Может быть стоит SetRegView 32 поместить после оператора ${Else}? или без разницы?


Мой Вопрос:
Надо ли этот ключ распределять между SetRegView 32 и 64
Код:

WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\prog.exe"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "${PRODUCT_NAME}"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\Uninstall.exe"

???

Зачем это проверять, если вы можете дать точный ответ. И все равно я не смогу увидеть через какой редактор заносились записи.

kotkovets 24-10-2012 21:45 2011543

Цитата:

Цитата CrashTest
Вот так будет работать? Может быть стоит SetRegView 32 поместить после оператора ${Else}? или без разницы? »

а может стоит почитать в справочнике:
1. SetRegView: использование реестра от разрядности ОС
2. Логические конструкции в скриптах NSIS
---
На все эти вопросы ответы есть. + посмотреть содержимое файла NSIS\Include\x64.nsh

CrashTest 24-10-2012 22:05 2011556

kotkovets, тяжело так сказать... но я пишу насчет секций для удаления. их тоже заключать в setregview? не написано это в справке

kotkovets 24-10-2012 22:07 2011557

Цитата:

Цитата CrashTest
их тоже заключать в setregview? »

Конечно! это же отдельная программа!

CrashTest 24-10-2012 22:34 2011573

kotkovets, еще один вопросик.
а WriteUninstaller "$INSTDIR\Uninstall.exe"
тоже надо писать два раза для 32 и 64? деинсталляторы тоже могут отличаться по разрядности?

Цитата:

Цитата kotkovets
программа »

Я имел ввиду HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

Ключ реестра для «Установк и удаление программ»

shut 25-10-2012 12:40 2011868

Цитата:

Цитата kotkovets
ну а далее как примером выше. Вообще в NSIS команды препроцессора начинаются с - !
смотрите подробно в справке...
---
получается типа динамический скрипт... »

Мне как раз нужен динамический скрипт.
У меня ситуация следующая:
- сборка инсталятора производится на сервере (запускается в командной строке через telnet)
- выполняется exe шник, который выкачивает файлы, список файлов и настройки этих файлов (ini файл) из svn
- далее производится сборка... в конечный инсталятор должны добавится только те файлы которые прописаны в списке с параметрами из ini файла (где лежит файл, куда он должен копироваться и с каким именем)

Справку я прочитал и справочник. Просто не нашёл необходимой мне структуры типа

Код:

 
  !ifdef флаг_который_указывает_что_идёт_компиляция
    ; участок кода который выполнялся бы только при компиляции, а при выполнении игнорировался
  !endif

И подскажите, пожалуйста, где можно по-подробнее почитать про InstallOptionsEx (по-русски). В справочнике (1.4) пока раздел не доделан.
Интересует возможность динамического изменения страницы. То есть есть ли Events у этих контроллов (например при изменении состояния DropList делать одни Label видимые а другие нет)

Спасибо!

kotkovets 25-10-2012 16:19 2012040

Цитата:

Цитата shut
!ifdef »

это означает, что если объявлена константа (!define 'name'), то выполнить определенные
указанные действия - конструкция времени компилирования.
Цитата:

Цитата shut
И подскажите, пожалуйста, где можно по-подробнее почитать про InstallOptionsEx (по-русски). В справочнике (1.4) пока раздел не доделан.
Интересует возможность динамического изменения страницы. То есть есть ли Events у этих контроллов (например при изменении состояния DropList делать одни Label видимые а другие нет) »

Я не использую "семейство" InstallOptions, nsDialogs, на мой взгляд, в разы лучше..
Эти вопросы к K.A.V

shut 25-10-2012 16:53 2012066

Цитата:

Цитата kotkovets
это означает, что если объявлена константа (!define 'name'), то выполнить определенные
указанные действия - конструкция времени компилирования. »

... это понятно. Вопрос: есть ли константа, которая определяет, идёт компиляция или выполнение?

shut 25-10-2012 18:43 2012139

Цитата:

Цитата kotkovets
Я не использую "семейство" InstallOptions, nsDialogs, на мой взгляд, в разы лучше.. »

Подскажите как в DropList получить номер выбранной строки?
в ${NSD_OnChange} NSD_GetState возвращает всегда 0 , NSD_GetText возвращает строку
А мне нужен номер строки

kotkovets 25-10-2012 19:57 2012177

Цитата:

... это понятно.
Вопрос ниочем...я уже ответил
Цитата:

Цитата shut
Подскажите как в DropList получить номер выбранной строки? »

А с какой кстати и перепугу этот элемент должен возвращать номер строки?
Цитата:

Цитата shut
NSD_GetState возвращает всегда 0 »

Это событие для чекбоксов и радибутонов - возвращается статус отметки.
Цитата:

Цитата shut
NSD_GetText возвращает строку
А мне нужен номер строки »

все верно! этим то и пользуйтесь, что возвращает NSD_GetText
читать дальше »
Код:

!include "MUI2.nsh"

Page custom CustomInit
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

OutFile "view.exe"
ShowInstDetails show

var dlg
var drl

Function CustomInit
    nsDialogs::Create 1018
    Pop $dlg
    ${NSD_CreateDropList} 0u 0u 50u 11u ``
    pop $drl
    ${NSD_CB_AddString} $drl `7Z`
    ${NSD_CB_AddString} $drl `CAB`
    ${NSD_CB_AddString} $drl `ISO`
    ${NSD_CB_AddString} $drl `RAR`
    ${NSD_CB_SelectString} $drl `7Z`
    ${NSD_OnChange} $drl DropList
    nsDialogs::Show
FunctionEnd

Function DropList
  pop $drl
  ${NSD_GetText} $drl $0
  ${If} $0 == `7Z`
        StrCpy $1 1
        MessageBox MB_OK "$$1=$1$\n$\t$$0=$0" IDOK
  ${ElseIf} $0 == `CAB`
        StrCpy $1 2
        MessageBox MB_OK "$$1=$1$\n$\t$$0=$0" IDOK
  ${ElseIf} $0 == `ISO`
        StrCpy $1 3
        MessageBox MB_OK "$$1=$1$\n$\t$$0=$0" IDOK
  ${ElseIf} $0 == `RAR`
        StrCpy $1 4
        MessageBox MB_OK "$$1=$1$\n$\t$$0=$0" IDOK
  ${ElseIf} $0 == `ALL`
        StrCpy $1 5
        MessageBox MB_OK "$$1=$1$\n$\t$$0=$0" IDOK
  ${EndIf}
FunctionEnd

Section
SectionEnd


CrashTest 25-10-2012 20:50 2012201

Отрыл скрипт по своей проблеме.
Такой вопрос.
Код:

WriteRegStr HKCR ".djv" "" "DjVu.Document"
для чего нужны кавычки после djv?

CrashTest 25-10-2012 22:21 2012238

Код:

${If} $RadioButton2_State == 1
StrCpy $INSTDIR "$DESKTOP"
MessageBox MB_OK "Должно быть"
${EndIf}

Почему redaio1 так же меняется на $desktop? неужели я не понятно написал ${IF} RADIO2??

shut 26-10-2012 10:32 2012446

Цитата:

Цитата kotkovets
А с какой кстати и перепугу этот элемент должен возвращать номер строки?
Цитата shut:
NSD_GetState возвращает всегда 0 »
Это событие для чекбоксов и радибутонов - возвращается статус отметки.
Цитата shut:
NSD_GetText возвращает строку
А мне нужен номер строки »
все верно! этим то и пользуйтесь, что возвращает NSD_GetText
« скрыть
Код:
!include "MUI2.nsh"
Page custom CustomInit
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"
OutFile "view.exe"
ShowInstDetails show
var dlg
var drl
Function CustomInit
nsDialogs::Create 1018
Pop $dlg
${NSD_CreateDropList} 0u 0u 50u 11u ``
pop $drl
${NSD_CB_AddString} $drl `7Z`
${NSD_CB_AddString} $drl `CAB`
${NSD_CB_AddString} $drl `ISO`
${NSD_CB_AddString} $drl `RAR`
${NSD_CB_SelectString} $drl `7Z`
${NSD_OnChange} $drl DropList
nsDialogs::Show
FunctionEnd
Function DropList
pop $drl
${NSD_GetText} $drl $0
${If} $0 == `7Z`
StrCpy $1 1
MessageBox MB_OK "$$1=$1$\n$\t$$0=$0" IDOK
${ElseIf} $0 == `CAB`
StrCpy $1 2
MessageBox MB_OK "$$1=$1$\n$\t$$0=$0" IDOK
${ElseIf} $0 == `ISO`
StrCpy $1 3
MessageBox MB_OK "$$1=$1$\n$\t$$0=$0" IDOK
${ElseIf} $0 == `RAR`
StrCpy $1 4
MessageBox MB_OK "$$1=$1$\n$\t$$0=$0" IDOK
${ElseIf} $0 == `ALL`
StrCpy $1 5
MessageBox MB_OK "$$1=$1$\n$\t$$0=$0" IDOK
${EndIf}
FunctionEnd
Section
SectionEnd »

Разобрался. Номер выделенной строки можно получить...

Код:

!include "MUI2.nsh"

Page custom CustomInit
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

OutFile "view.exe"
ShowInstDetails show

var dlg
var drl

Function CustomInit
    nsDialogs::Create 1018
    Pop $dlg
    ${NSD_CreateDropList} 0u 0u 50u 11u ``
    pop $drl
    ${NSD_CB_AddString} $drl `7Z`
    ${NSD_CB_AddString} $drl `CAB`
    ${NSD_CB_AddString} $drl `ISO`
    ${NSD_CB_AddString} $drl `RAR`
    ${NSD_CB_SelectString} $drl `7Z`
    ${NSD_OnChange} $drl DropList
    nsDialogs::Show
FunctionEnd

Function DropList
  SendMessage $drl ${CB_GETCURSEL} 0 0 $R0
  MessageBox MB_OK "Номер выделенной строки: $R0"
FunctionEnd

Section
SectionEnd


kotkovets 26-10-2012 23:08 2012998

Цитата:

Цитата CrashTest
WriteRegStr HKCR "Software\Classes\DjVu.Document\shell\open\ddeexec\IfExec "" "[rem open]"»

А вы с кем общаетесь? заведите свой блог и там выкладываете свои монологи ... :lol:
Цитата:

Цитата CrashTest
WriteRegStr HKCR "Software\Classes\DjVu.Document\shell\open\ddeexec\IfExec "" "[rem open]"
что в этой строке не так? »

справку читайте до слез может поможет.. :biggrin:
правильно:
Код:

WriteRegStr HKCR "Software\Classes\DjVu.Document\shell\open\ddeexec\IfExec" "" "[rem open]"
---
не засоряйте тему! не нарушайте правила форума, которые вы не читали!
Иначе сообщу модератору..

CrashTest 27-10-2012 16:53 2013264

Прочитал
Код:

Часто возникает необходимость перезагрузки после инсталляции вашего приложения. Данная поддержка включается,
если у вас в инсталляторе включен флаг:


       
Код:

       
SetRebootFlag true


Код:

Так же, включается поддержка, если во время инсталяции, нужно удалить файл,
но файл, по каким либо причинам не удаляется, или вам нужно этот файл удалить после перегрузки ПК.


       
Код:

       
Delete /REBOOTOK файл


А можно сделать так чтобы установщик после установки/удаления показывал сообщение о том что необходим перезапуск?

Можно ли использовать вместе /r и /REBOOTOK?

kotkovets 27-10-2012 17:15 2013274

CrashTest, последнее китайское предупреждение!
Оформление->Интерфейс Модерн->» Страница "Завершения"
===
Прежде, чем писать тысячу раз подумайте, а стоит ли?
А вот шапку темы стоит почитать:
ВНИМАНИЕ! прежде, чем задать вопрос, почитайте, где Вы найдете ответы на большинство вопросов:
Справочник по NSIS - создан силами нашего сообщества.

---
на глупый вопрос - глупый ответ...

CrashTest 27-10-2012 17:36 2013294

kotkovets, я прочитал в справке много чего. а именно
Код:

Оформление->Интерфейс Модерн->» Страница "Завершения"
свой ответ не нашел.

в самом начале вы с удовольствием отвечали на самые откровенные идиотские вопросы и улыбались. я спрашиваю потому что этого не могу найти.
если это написано - просто скажите где. не проще будет? и все будут счастливы. глупый вопрос для вас.

kotkovets 27-10-2012 18:01 2013316

Цитата:

Цитата CrashTest
просто скажите где. не проще будет? и все будут счастливы. глупый вопрос для вас. »

здесь не форум смазливых барышень, а компьютерный форум...
Цитата:

Цитата CrashTest
свой ответ не нашел. »

вот я нашел, в вам религия не позволяет?
» IfRebootFlag: определяет флаг перезагрузки
---
прошу сюда не писать, а читать - полезнее будет - именно для вас персольно.

yyv 29-10-2012 15:06 2014309

как в НСИС в не юникодной сборке показать список?
В том смысле, что поставить точки, кружочки или галочки какие нить перед каждым элементом (сейчас использую тире, но это немного не устраивает)
конкретизирую, как в НСИС использовать Hex escape?
и еще...
Можно ли в нсис "украшать" MessageBox? вставить картинку, изменить размер, переименовать кнопки? или возможность использовать не стандартные сообщения? Может существуют какие нибудь плагины?

CrashTest 29-10-2012 20:37 2014546

есть чекбокс который устанавливает дополнительные файлы надо чтобы при удаление срабатывало условие если если это отмечено - удалять дополнительные файлы. если нет - то нет. делал это в секции Uninstall что то не работает.

MKN 30-10-2012 13:40 2015004

Цитата:

Цитата CrashTest
в секции Uninstall что то не работает »

И не должно. Как уже сто раз говорили, install.exe и uninstall.exe - две разные программы.
Если нужны зависимости при удалении, то можно добавить MUI_UNPAGE_COMPONENTS или, что ещё проще, запрос-сообщение перед удалением - что удалять, а что нет. И удалять, согласно выбора (сообразно индетификаторов кнопок).

diakov 01-11-2012 23:13 2016892

kotkovets, подскажите...
Код:

${Switch} ${extenstion}
        ${Case} "ASF"
                        StrCpy $IconIndex 0
                        ${Break}

                ${Case} "AVI"
                        StrCpy $IconIndex 2
                        ${Break}

                ${Case} "WMV"
                        StrCpy $IconIndex 17
                        ${Break}

                ${Case} "FLV"
                        StrCpy $IconIndex 111
                        ${Break}

                ${Case} "MKV"
                        StrCpy $IconIndex 30
                        ${Break}

                ${Case} "MOV"
                        StrCpy $IconIndex 8
                        ${Break}

                ${Case} "3GP"
                        StrCpy $IconIndex 48
                        ${Break}

                ${Case} "DIVX"
                        StrCpy $IconIndex 56
                        ${Break}

                ${Case} "MP4"
                        StrCpy $IconIndex 43
                        ${Break}

                ${Case} "MPG"
                        StrCpy $IconIndex 12
                        ${Break}

                ${Case} "MPEG"
                        StrCpy $IconIndex 11
                        ${Break}

                ${Case} "MPE"
                        StrCpy $IconIndex 10
                        ${Break}

                ${Case} "DAT"
                        StrCpy $IconIndex 3
                        ${Break}

                ${Case} "VOB"
                        StrCpy $IconIndex 14
                        ${Break}

                ${Case} "IFO"
                        StrCpy $IconIndex 40
                        ${Break}

                ${Case} "M1V"
                        StrCpy $IconIndex 4
                        ${Break}

                ${Case} "M2V"
                        StrCpy $IconIndex 5
                        ${Break}

                ${Case} "M4V"
                        StrCpy $IconIndex 70
                        ${Break}

                ${Case} "MMS"
                        StrCpy $IconIndex 14
                        ${Break}

                ${Case} "OGM"
                        StrCpy $IconIndex 29
                        ${Break}

                ${Case} "QT"
                        StrCpy $IconIndex 13
                        ${Break}

                ${Case} "TS"
                        StrCpy $IconIndex 99
                        ${Break}

                ${Case} "VP6"
                        StrCpy $IconIndex 101
                        ${Break}

                ${Case} "XVID"
                        StrCpy $IconIndex 109
                        ${Break}

                ${Case} "3G2"
                        StrCpy $IconIndex 47
                        ${Break}

                ${Case} "TP"
                        StrCpy $IconIndex 97
                        ${Break}

                ${Case} "AVI-Neo"
                        StrCpy $IconIndex 39
                        ${Break}

                ${Case} "BIK"
                        StrCpy $IconIndex 52
                        ${Break}

                ${Case} "D2V"
                        StrCpy $IconIndex 55
                        ${Break}

                ${Case} "DRC"
                        StrCpy $IconIndex 57
                        ${Break}

                ${Case} "IFV"
                        StrCpy $IconIndex 66
                        ${Break}

                ${Case} "MP2V"
                        StrCpy $IconIndex 78
                        ${Break}

                ${Case} "MPV2"
                        StrCpy $IconIndex 81
                        ${Break}

                ${Case} "MQV"
                        StrCpy $IconIndex 82
                        ${Break}

                ${Case} "PART"
                        StrCpy $IconIndex 86
                        ${Break}

                ${Case} "PSS"
                        StrCpy $IconIndex 87
                        ${Break}

                ${Case} "ROQ"
                        StrCpy $IconIndex 90
                        ${Break}

                ${Case} "SMK"
                        StrCpy $IconIndex 94
                        ${Break}

                ${Case} "TPR"
                        StrCpy $IconIndex 98
                        ${Break}

                ${Case} "TRP"
                        StrCpy $IconIndex 110
                        ${Break}

                ${Case} "DVR-MS"
                        StrCpy $IconIndex 114
                        ${Break}

                ${Case} "GVI"
                        StrCpy $IconIndex 115
                        ${Break}

                ${Case} "NSV"
                        StrCpy $IconIndex 117
                        ${Break}

                ${Case} "PMP"
                        StrCpy $IconIndex 118
                        ${Break}

                ${Case} "VP7"
                        StrCpy $IconIndex 120
                        ${Break}

                ${Case} "VC1"
                        StrCpy $IconIndex 138
                        ${Break}

                ${Case} "264"
                        StrCpy $IconIndex 127
                        ${Break}

                ${Case} "H264"
                        StrCpy $IconIndex 131
                        ${Break}
;....................................................................................
        ; audio
                ${Case} "MP3"
                        StrCpy $IconIndex 9
                        ${Break}

                ${Case} "AAC"
                        StrCpy $IconIndex 42
                        ${Break}

                ${Case} "WMA"
                        StrCpy $IconIndex 16
                        ${Break}

                ${Case} "CDA"
                        StrCpy $IconIndex 54
                        ${Break}

                ${Case} "FLAC"
                        StrCpy $IconIndex 41
                        ${Break}

                ${Case} "M4A"
                        StrCpy $IconIndex 69
                        ${Break}

                ${Case} "MID"
                        StrCpy $IconIndex 6
                        ${Break}

                ${Case} "MKA"
                        StrCpy $IconIndex 72
                        ${Break}

                ${Case} "MP2"
                        StrCpy $IconIndex 77
                        ${Break}

                ${Case} "MPA"
                        StrCpy $IconIndex 79
                        ${Break}

                ${Case} "MPC"
                        StrCpy $IconIndex 45
                        ${Break}

                ${Case} "APE"
                        StrCpy $IconIndex 44
                        ${Break}

                ${Case} "OFR"
                        StrCpy $IconIndex 85
                        ${Break}

                ${Case} "OGG"
                        StrCpy $IconIndex 28
                        ${Break}

                ${Case} "WV"
                        StrCpy $IconIndex 121
                        ${Break}

                ${Case} "AC3"
                        StrCpy $IconIndex 46
                        ${Break}

                ${Case} "DTS"
                        StrCpy $IconIndex 58
                        ${Break}

                ${Case} "WAV"
                        StrCpy $IconIndex 15
                        ${Break}

                ${Case} "AIFF"
                        StrCpy $IconIndex 50
                        ${Break}

                ${Case} "AIFC"
                        StrCpy $IconIndex 49
                        ${Break}

                ${Case} "AU"
                        StrCpy $IconIndex 51
                        ${Break}

                ${Case} "AMR"
                        StrCpy $IconIndex 123
                        ${Break}

                ${Case} "IT"
                        StrCpy $IconIndex 65
                        ${Break}

                ${Case} "M2A"
                        StrCpy $IconIndex 68
                        ${Break}

                ${Case} "MO3"
                        StrCpy $IconIndex 75
                        ${Break}

                ${Case} "MTM"
                        StrCpy $IconIndex 83
                        ${Break}

                ${Case} "S3M"
                        StrCpy $IconIndex 93
                        ${Break}

                ${Case} "MIDI"
                        StrCpy $IconIndex 71
                        ${Break}

                ${Case} "M1A"
                        StrCpy $IconIndex 67
                        ${Break}

                ${Case} "MOD"
                        StrCpy $IconIndex 76
                        ${Break}

                ${Case} "RMI"
                        StrCpy $IconIndex 89
                        ${Break}

                ${Case} "SND"
                        StrCpy $IconIndex 95
                        ${Break}

                ${Case} "UMX"
                        StrCpy $IconIndex 100
                        ${Break}

                ${Case} "XM"
                        StrCpy $IconIndex 108
                        ${Break}

                ${Case} "ARM"
                        StrCpy $IconIndex 112
                        ${Break}

                ${Case} "AVC-TS"
                        StrCpy $IconIndex 113
                        ${Break}

                ${Case} "SHN"
                        StrCpy $IconIndex 119
                        ${Break}

                ${Case} "WV"
                        StrCpy $IconIndex 121
                        ${Break}

                ${Case} "EC3"
                        StrCpy $IconIndex 129
                        ${Break}

                ${Case} "EAC3"
                        StrCpy $IconIndex 128
                        ${Break}

                ${Case} "EVO"
                        StrCpy $IconIndex 130
                        ${Break}

                ${Case} "LPCM"
                        StrCpy $IconIndex 132
                        ${Break}

                ${Case} "MLP"
                        StrCpy $IconIndex 133
                        ${Break}

                ${Case} "MT9"
                        StrCpy $IconIndex 134
                        ${Break}

                ${Case} "PCM"
                        StrCpy $IconIndex 135
                        ${Break}

                ${Case} "THD"
                        StrCpy $IconIndex 139
                        ${Break}
;....................................................................................
        ; subtitles

                ${Case} "SMI"
                        StrCpy $IconIndex 18
                        ${Break}

                ${Case} "RT"
                        StrCpy $IconIndex 31
                        ${Break}

                ${Case} "SUB"
                        StrCpy $IconIndex 32
                        ${Break}

                ${Case} "IDX"
                        StrCpy $IconIndex 33
                        ${Break}

                ${Case} "ASS"
                        StrCpy $IconIndex 34
                        ${Break}

                ${Case} "SSA"
                        StrCpy $IconIndex 35
                        ${Break}

                ${Case} "RSB"
                        StrCpy $IconIndex 36
                        ${Break}

                ${Case} "SRT"
                        StrCpy $IconIndex 37
                        ${Break}

                ${Case} "S2K"
                        StrCpy $IconIndex 38
                        ${Break}

                ${Case} "MKS"
                        StrCpy $IconIndex 73
                        ${Break}
;....................................................................................
        ; playlists
                ${Case} "ASX"
                        StrCpy $IconIndex 1
                        ${Break}

                ${Case} "WAX"
                        StrCpy $IconIndex 102
                        ${Break}

                ${Case} "M3U"
                        StrCpy $IconIndex 20
                        ${Break}

                ${Case} "PLS"
                        StrCpy $IconIndex 19
                        ${Break}

                ${Case} "WMX"
                        StrCpy $IconIndex 105
                        ${Break}

                ${Case} "WPL"
                        StrCpy $IconIndex 106
                        ${Break}

                ${Case} "WVX"
                        StrCpy $IconIndex 107
                        ${Break}

;....................................................................................
        ; real media
                ${Case} "RA"
                        StrCpy $IconIndex 21
                        ${Break}

                ${Case} "RM"
                        StrCpy $IconIndex 22
                        ${Break}

                ${Case} "RMJ"
                        StrCpy $IconIndex 23
                        ${Break}

                ${Case} "RMS"
                        StrCpy $IconIndex 24
                        ${Break}

                ${Case} "RAM"
                        StrCpy $IconIndex 25
                        ${Break}

                ${Case} "RMM"
                        StrCpy $IconIndex 26
                        ${Break}

                ${Case} "RMVB"
                        StrCpy $IconIndex 27
                        ${Break}

                ${Case} "RPM"
                        StrCpy $IconIndex 91
                        ${Break}

                ${Case} "RV"
                        StrCpy $IconIndex 82
                        ${Break}

;....................................................................................
        ; other
                ${Case} "FLC"
                        StrCpy $IconIndex 59
                        ${Break}

                ${Case} "FLI"
                        StrCpy $IconIndex 60
                        ${Break}

                ${Case} "FLIC"
                        StrCpy $IconIndex 61
                        ${Break}

                ${Case} "PVA"
                        StrCpy $IconIndex 88
                        ${Break}

                ${Case} "SWF"
                        StrCpy $IconIndex 96
                        ${Break}

                ${Case} "WM"
                        StrCpy $IconIndex 103
                        ${Break}

                ${Case} "K3G"
                        StrCpy $IconIndex 122
                        ${Break}

                ${Case} "M2T"
                        StrCpy $IconIndex 124
                        ${Break}

                ${Case} "MTS"
                        StrCpy $IconIndex 125
                        ${Break}

                ${Case} "SKM"
                        StrCpy $IconIndex 126
                        ${Break}

                ${Case} "PMF"
                        StrCpy $IconIndex 136
                        ${Break}

                ${Case} "M2TS"
                        StrCpy $IconIndex 116
                        ${Break}

                ${Case} "KPL"
                        StrCpy $IconIndex 0
                        ${Break}

                ${Case} "KSF"
                        StrCpy $IconIndex 0
                        ${Break}

При вставке такого кода компилятор выдает ошибку Out of memory скрипт загрузить весь не могу много символов в чем может быть проблему!

Вот как бы полная часть кода
Код:

!macro RegisterExtension extenstion
        ;create a class for extesion
        StrCpy $ClassName "The KMPlayer.${extenstion}"
        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"
        DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice"
        WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "Progid" "$ClassName"
        WriteRegStr HKCR "$ClassName\shell\open" "" "Îòêðûòü â KMPlayer"
        WriteRegStr HKCR "$ClassName\shell\open\command" "" "$OpenCommand"
        ${Switch} ${extenstion}
        ${Case} "ASF"
                        StrCpy $IconIndex 0
                        ${Break}

                ${Case} "AVI"
                        StrCpy $IconIndex 2
                        ${Break}

                ${Case} "WMV"
                        StrCpy $IconIndex 17
                        ${Break}

                ${Case} "FLV"
                        StrCpy $IconIndex 111
                        ${Break}

                ${Case} "MKV"
                        StrCpy $IconIndex 30
                        ${Break}

                ${Case} "MOV"
                        StrCpy $IconIndex 8
                        ${Break}

                ${Case} "3GP"
                        StrCpy $IconIndex 48
                        ${Break}

                ${Case} "DIVX"
                        StrCpy $IconIndex 56
                        ${Break}

                ${Case} "MP4"
                        StrCpy $IconIndex 43
                        ${Break}

                ${Case} "MPG"
                        StrCpy $IconIndex 12
                        ${Break}

                ${Case} "MPEG"
                        StrCpy $IconIndex 11
                        ${Break}

                ${Case} "MPE"
                        StrCpy $IconIndex 10
                        ${Break}

                ${Case} "DAT"
                        StrCpy $IconIndex 3
                        ${Break}

                ${Case} "VOB"
                        StrCpy $IconIndex 14
                        ${Break}

                ${Case} "IFO"
                        StrCpy $IconIndex 40
                        ${Break}

                ${Case} "M1V"
                        StrCpy $IconIndex 4
                        ${Break}

                ${Case} "M2V"
                        StrCpy $IconIndex 5
                        ${Break}

                ${Case} "M4V"
                        StrCpy $IconIndex 70
                        ${Break}

                ${Case} "MMS"
                        StrCpy $IconIndex 14
                        ${Break}

                ${Case} "OGM"
                        StrCpy $IconIndex 29
                        ${Break}

                ${Case} "QT"
                        StrCpy $IconIndex 13
                        ${Break}

                ${Case} "TS"
                        StrCpy $IconIndex 99
                        ${Break}

                ${Case} "VP6"
                        StrCpy $IconIndex 101
                        ${Break}

                ${Case} "XVID"
                        StrCpy $IconIndex 109
                        ${Break}

                ${Case} "3G2"
                        StrCpy $IconIndex 47
                        ${Break}

                ${Case} "TP"
                        StrCpy $IconIndex 97
                        ${Break}

                ${Case} "AVI-Neo"
                        StrCpy $IconIndex 39
                        ${Break}

                ${Case} "BIK"
                        StrCpy $IconIndex 52
                        ${Break}

                ${Case} "D2V"
                        StrCpy $IconIndex 55
                        ${Break}

                ${Case} "DRC"
                        StrCpy $IconIndex 57
                        ${Break}

                ${Case} "IFV"
                        StrCpy $IconIndex 66
                        ${Break}

                ${Case} "MP2V"
                        StrCpy $IconIndex 78
                        ${Break}

                ${Case} "MPV2"
                        StrCpy $IconIndex 81
                        ${Break}

                ${Case} "MQV"
                        StrCpy $IconIndex 82
                        ${Break}

                ${Case} "PART"
                        StrCpy $IconIndex 86
                        ${Break}

                ${Case} "PSS"
                        StrCpy $IconIndex 87
                        ${Break}

                ${Case} "ROQ"
                        StrCpy $IconIndex 90
                        ${Break}

                ${Case} "SMK"
                        StrCpy $IconIndex 94
                        ${Break}

                ${Case} "TPR"
                        StrCpy $IconIndex 98
                        ${Break}

                ${Case} "TRP"
                        StrCpy $IconIndex 110
                        ${Break}

                ${Case} "DVR-MS"
                        StrCpy $IconIndex 114
                        ${Break}

                ${Case} "GVI"
                        StrCpy $IconIndex 115
                        ${Break}

                ${Case} "NSV"
                        StrCpy $IconIndex 117
                        ${Break}

                ${Case} "PMP"
                        StrCpy $IconIndex 118
                        ${Break}

                ${Case} "VP7"
                        StrCpy $IconIndex 120
                        ${Break}

                ${Case} "VC1"
                        StrCpy $IconIndex 138
                        ${Break}

                ${Case} "264"
                        StrCpy $IconIndex 127
                        ${Break}

                ${Case} "H264"
                        StrCpy $IconIndex 131
                        ${Break}
;....................................................................................
        ; audio
                ${Case} "MP3"
                        StrCpy $IconIndex 9
                        ${Break}

                ${Case} "AAC"
                        StrCpy $IconIndex 42
                        ${Break}

                ${Case} "WMA"
                        StrCpy $IconIndex 16
                        ${Break}

                ${Case} "CDA"
                        StrCpy $IconIndex 54
                        ${Break}

                ${Case} "FLAC"
                        StrCpy $IconIndex 41
                        ${Break}

                ${Case} "M4A"
                        StrCpy $IconIndex 69
                        ${Break}

                ${Case} "MID"
                        StrCpy $IconIndex 6
                        ${Break}

                ${Case} "MKA"
                        StrCpy $IconIndex 72
                        ${Break}

                ${Case} "MP2"
                        StrCpy $IconIndex 77
                        ${Break}

                ${Case} "MPA"
                        StrCpy $IconIndex 79
                        ${Break}

                ${Case} "MPC"
                        StrCpy $IconIndex 45
                        ${Break}

                ${Case} "APE"
                        StrCpy $IconIndex 44
                        ${Break}

                ${Case} "OFR"
                        StrCpy $IconIndex 85
                        ${Break}

                ${Case} "OGG"
                        StrCpy $IconIndex 28
                        ${Break}

                ${Case} "WV"
                        StrCpy $IconIndex 121
                        ${Break}

                ${Case} "AC3"
                        StrCpy $IconIndex 46
                        ${Break}

                ${Case} "DTS"
                        StrCpy $IconIndex 58
                        ${Break}

                ${Case} "WAV"
                        StrCpy $IconIndex 15
                        ${Break}

                ${Case} "AIFF"
                        StrCpy $IconIndex 50
                        ${Break}

                ${Case} "AIFC"
                        StrCpy $IconIndex 49
                        ${Break}

                ${Case} "AU"
                        StrCpy $IconIndex 51
                        ${Break}

                ${Case} "AMR"
                        StrCpy $IconIndex 123
                        ${Break}

                ${Case} "IT"
                        StrCpy $IconIndex 65
                        ${Break}

                ${Case} "M2A"
                        StrCpy $IconIndex 68
                        ${Break}

                ${Case} "MO3"
                        StrCpy $IconIndex 75
                        ${Break}

                ${Case} "MTM"
                        StrCpy $IconIndex 83
                        ${Break}

                ${Case} "S3M"
                        StrCpy $IconIndex 93
                        ${Break}

                ${Case} "MIDI"
                        StrCpy $IconIndex 71
                        ${Break}

                ${Case} "M1A"
                        StrCpy $IconIndex 67
                        ${Break}

                ${Case} "MOD"
                        StrCpy $IconIndex 76
                        ${Break}

                ${Case} "RMI"
                        StrCpy $IconIndex 89
                        ${Break}

                ${Case} "SND"
                        StrCpy $IconIndex 95
                        ${Break}

                ${Case} "UMX"
                        StrCpy $IconIndex 100
                        ${Break}

                ${Case} "XM"
                        StrCpy $IconIndex 108
                        ${Break}

                ${Case} "ARM"
                        StrCpy $IconIndex 112
                        ${Break}

                ${Case} "AVC-TS"
                        StrCpy $IconIndex 113
                        ${Break}

                ${Case} "SHN"
                        StrCpy $IconIndex 119
                        ${Break}

                ${Case} "WV"
                        StrCpy $IconIndex 121
                        ${Break}

                ${Case} "EC3"
                        StrCpy $IconIndex 129
                        ${Break}

                ${Case} "EAC3"
                        StrCpy $IconIndex 128
                        ${Break}

                ${Case} "EVO"
                        StrCpy $IconIndex 130
                        ${Break}

                ${Case} "LPCM"
                        StrCpy $IconIndex 132
                        ${Break}

                ${Case} "MLP"
                        StrCpy $IconIndex 133
                        ${Break}

                ${Case} "MT9"
                        StrCpy $IconIndex 134
                        ${Break}

                ${Case} "PCM"
                        StrCpy $IconIndex 135
                        ${Break}

                ${Case} "THD"
                        StrCpy $IconIndex 139
                        ${Break}
;....................................................................................
        ; subtitles

                ${Case} "SMI"
                        StrCpy $IconIndex 18
                        ${Break}

                ${Case} "RT"
                        StrCpy $IconIndex 31
                        ${Break}

                ${Case} "SUB"
                        StrCpy $IconIndex 32
                        ${Break}

                ${Case} "IDX"
                        StrCpy $IconIndex 33
                        ${Break}

                ${Case} "ASS"
                        StrCpy $IconIndex 34
                        ${Break}

                ${Case} "SSA"
                        StrCpy $IconIndex 35
                        ${Break}

                ${Case} "RSB"
                        StrCpy $IconIndex 36
                        ${Break}

                ${Case} "SRT"
                        StrCpy $IconIndex 37
                        ${Break}

                ${Case} "S2K"
                        StrCpy $IconIndex 38
                        ${Break}

                ${Case} "MKS"
                        StrCpy $IconIndex 73
                        ${Break}
;....................................................................................
        ; playlists
                ${Case} "ASX"
                        StrCpy $IconIndex 1
                        ${Break}

                ${Case} "WAX"
                        StrCpy $IconIndex 102
                        ${Break}

                ${Case} "M3U"
                        StrCpy $IconIndex 20
                        ${Break}

                ${Case} "PLS"
                        StrCpy $IconIndex 19
                        ${Break}

                ${Case} "WMX"
                        StrCpy $IconIndex 105
                        ${Break}

                ${Case} "WPL"
                        StrCpy $IconIndex 106
                        ${Break}

                ${Case} "WVX"
                        StrCpy $IconIndex 107
                        ${Break}

;....................................................................................
        ; real media
                ${Case} "RA"
                        StrCpy $IconIndex 21
                        ${Break}

                ${Case} "RM"
                        StrCpy $IconIndex 22
                        ${Break}

                ${Case} "RMJ"
                        StrCpy $IconIndex 23
                        ${Break}

                ${Case} "RMS"
                        StrCpy $IconIndex 24
                        ${Break}

                ${Case} "RAM"
                        StrCpy $IconIndex 25
                        ${Break}

                ${Case} "RMM"
                        StrCpy $IconIndex 26
                        ${Break}

                ${Case} "RMVB"
                        StrCpy $IconIndex 27
                        ${Break}

                ${Case} "RPM"
                        StrCpy $IconIndex 91
                        ${Break}

                ${Case} "RV"
                        StrCpy $IconIndex 82
                        ${Break}

;....................................................................................
        ; other
                ${Case} "FLC"
                        StrCpy $IconIndex 59
                        ${Break}

                ${Case} "FLI"
                        StrCpy $IconIndex 60
                        ${Break}

                ${Case} "FLIC"
                        StrCpy $IconIndex 61
                        ${Break}

                ${Case} "PVA"
                        StrCpy $IconIndex 88
                        ${Break}

                ${Case} "SWF"
                        StrCpy $IconIndex 96
                        ${Break}

                ${Case} "WM"
                        StrCpy $IconIndex 103
                        ${Break}

                ${Case} "K3G"
                        StrCpy $IconIndex 122
                        ${Break}

                ${Case} "M2T"
                        StrCpy $IconIndex 124
                        ${Break}

                ${Case} "MTS"
                        StrCpy $IconIndex 125
                        ${Break}

                ${Case} "SKM"
                        StrCpy $IconIndex 126
                        ${Break}

                ${Case} "PMF"
                        StrCpy $IconIndex 136
                        ${Break}

                ${Case} "M2TS"
                        StrCpy $IconIndex 116
                        ${Break}

                ${Case} "KPL"
                        StrCpy $IconIndex 0
                        ${Break}

                ${Case} "KSF"
                        StrCpy $IconIndex 0
                        ${Break}
;....................................................................................
        ; ddefault icon
                ${Default}
                        StrCpy $IconIndex 0
                        ${Break}

        ${EndSwitch}
  WriteRegStr HKCR "$ClassName\DefaultIcon" "" "$IconFile,$IconIndex"
!macroend

!macro UnRegisterExtension extenstion
  StrCpy $ClassName "The KMPlayer.${extenstion}"
        ReadRegStr $0 HKCR "${extenstion}" ""
        StrCmp $0        $ClassName 0 +2
        DeleteRegKey HKCR "$ClassName"
        ReadRegStr $0 HKCR "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\${extenstion}\UserChoice" ""
        StrCmp $0        $ClassName 0 +2
        DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\${extenstion}\UserChoice"

        ReadRegStr $0 HKCR ".${extenstion}" ""
  StrCmp $0        $ClassName 0 +2
  DeleteRegKey HKCR "$ClassName"

  ReadRegStr $0 HKCR "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" ""
  StrCmp $0        $ClassName 0 +2
  DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice"
!macroend


diakov 02-11-2012 00:23 2016935

Получается что скрипт как бы зацикливаться на данном участке кода

Соответственно к чекбоксу привязал так
Код:

Section "-VIDEO"
  ${If} $Check1 == 1

                        !insertmacro RegisterExtension ASF

                        !insertmacro RegisterExtension AVI

                        !insertmacro RegisterExtension "WMV"

                        !insertmacro RegisterExtension "FLV"

                        !insertmacro RegisterExtension "MKV"

                        !insertmacro RegisterExtension "MOV"

                        !insertmacro RegisterExtension "3GP"

                        !insertmacro RegisterExtension "DIVX"

                        !insertmacro RegisterExtension "MP4"

                        !insertmacro RegisterExtension "MPG"

                !insertmacro RegisterExtension "MPEG"

                        !insertmacro RegisterExtension "MPE"

                        !insertmacro RegisterExtension "DAT"

                        !insertmacro RegisterExtension "VOB"

                        !insertmacro RegisterExtension "IFO"

                        !insertmacro RegisterExtension "M1V"

                        !insertmacro RegisterExtension "M2V"

                        !insertmacro RegisterExtension "M4V"

                        !insertmacro RegisterExtension "MMS"

                        !insertmacro RegisterExtension "OGM"

                        !insertmacro RegisterExtension "QT"

                        !insertmacro RegisterExtension "TS"

                        !insertmacro RegisterExtension "VP6"

                        !insertmacro RegisterExtension "XVID"

                        !insertmacro RegisterExtension "3G2"

                        !insertmacro RegisterExtension "TP"

                        !insertmacro RegisterExtension "AVI-Neo"

                        !insertmacro RegisterExtension "BIK"

                        !insertmacro RegisterExtension "D2V"

                        !insertmacro RegisterExtension "DRC"

                        !insertmacro RegisterExtension "IFV"

                        !insertmacro RegisterExtension "MP2V"

                        !insertmacro RegisterExtension "MPV2"

                        !insertmacro RegisterExtension "MQV"

                        !insertmacro RegisterExtension "PART"

                        !insertmacro RegisterExtension "PSS"

                        !insertmacro RegisterExtension "ROQ"

                        !insertmacro RegisterExtension "SMK"

                        !insertmacro RegisterExtension "TPR"

                        !insertmacro RegisterExtension "TRP"

                        !insertmacro RegisterExtension "DVR-MS"

                        !insertmacro RegisterExtension "GVI"

                        !insertmacro RegisterExtension "NSV"

                        !insertmacro RegisterExtension "PMP"

                        !insertmacro RegisterExtension "VP7"

                        !insertmacro RegisterExtension "264"

                        !insertmacro RegisterExtension "H264"

                        !insertmacro RegisterExtension "VC1"
      ${EndIf}


kotkovets 02-11-2012 01:22 2016961

Цитата:

Цитата diakov
При вставке такого кода компилятор выдает ошибку Out of memory скрипт загрузить весь не могу много символов в чем может быть проблему! »

В редакторе HM NIS переполнение...
компилируйте с помощью - makensisw.exe
или сразу консолью - makensis.exe

unatlib 02-11-2012 10:08 2017099

Помогите написать скрипт, пожалуйста.

Есть такая задача:
  • Имеем папку с системными шрифтами Arial, Calibri, Cambria, Consolas, Courier, Meiryo, Segoe UI, Tahoma, Times New Roman
  • Необходимо обновить их в системе.
  • Если в системе присутствует более свежая версия шрифта, то не заменять.
  • Почти все они заблокированы системой, поэтому замена должна быть с перезагрузкой компа
  • Если шрифта не было в системе, то корректно зарегистрировать его в реестре.

kotkovets 02-11-2012 11:53 2017157

unatlib.org.ru,
http://nsis.sourceforge.net/Register_Fonts

diakov 02-11-2012 13:44 2017243

kotkovets, почему при реализации такого варианта установки ассоциаций (как я писал выше) и такого варианта тихой установки:
Код:

${GetOptions} "$CMDLINE" "/port" $R0
  ${If} ${Silent} ;если тихий режим
    ${IfNot} ${Errors}
    StrCpy "$INSTDIR" "$EXEDIR\KMPlayer Portable"
      ;тут пишем все команды при распаковки портативной версии
      ;здесь будет код выполняться с ключом /port в тихом режиме
        StrCpy $Radio1 1 ;распаковка портативной версии
        StrCpy $Radio 0 ;запрет установки в обычном режиме
    ${Else}
    ${GetOptions} "$CMDLINE" "/inst" $R0
      SetOutPath "$INSTDIR"
        StrCpy $Radio1 0 ;запрет портативной версии
        StrCpy $Radio 1 ;установка в обычном режиме
        StrCpy $Check 1; асоц видео
        StrCpy $Check1 1 асоц аудио
          StrCpy $Check2 1 и т.д.
            StrCpy $Check3 1
            StrCpy $Check4 1
              StrCpy $Check5 1
                StrCpy $Check6 1
                StrCpy $Check7 1
    ClearErrors
  ${EndIf}

В тихом режиме ассоциации не устанавливаются, а в обычном все ок...

kotkovets 02-11-2012 14:49 2017327

пробуйте так:
Код:

ClearErrors
${GetOptions} "$CMDLINE" "/port" $R0
${IfNot} ${Errors}
  Меssagebox mb_ок 'х.з'
---
---

инструкция - ${IfNot} ${Errors} - сработает, когда нет флага ошибки..
инструкция - ${Else} - сработает в любых случаях, кроме, когда нет флага ошибки..

diakov 02-11-2012 15:07 2017349

В принципе так и стоит у меня в скрипте, просто я не скопировал...может дело в макросе установки ассоциация...не обрабатывается он в тихом режиме что ли...

unatlib 02-11-2012 16:07 2017403

Цитата:

Цитата kotkovets
http://nsis.sourceforge.net/Register_Fonts »

Попробовал
Код:

!include FontReg.nsh
!include FontName.nsh
!include WinMessages.nsh

!define APPNAME "Обновление шрифтов"
!define APPNAMEANDVERSION "Обновление шрифтов 1.0"

Name "${APPNAMEANDVERSION}"
OutFile "OutFile.exe"

!include "MUI.nsh"

!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH

!insertmacro MUI_LANGUAGE "English"
!insertmacro MUI_LANGUAGE "Russian"
!insertmacro MUI_RESERVEFILE_LANGDLL

Function .onInit
        !insertmacro MUI_LANGDLL_DISPLAY
FunctionEnd

 
Section "Fonts"
  StrCpy $FONT_DIR $FONTS
        !insertmacro InstallTTFFont 'ARIAL.TTF'
  SendMessage ${HWND_BROADCAST} ${WM_FONTCHANGE} 0 0 /TIMEOUT=5000
SectionEnd

Не работает :( Вижу прогресс бар копирования файла, но ничего на самом деле не копируется.

kotkovets 02-11-2012 16:39 2017429

Цитата:

Цитата unatlib.org.ru
Попробовал »

а в теме поискать? конечно это не совсем точно, но тем не менее..
266

unatlib 02-11-2012 17:06 2017443

Чтобы сразу отбросить лишние вопросы:
  • Справку читал
  • В теме искал
  • В гугле тоже искал

Пример с 266 страницы глючный слегка. Не хватает команды StrCpy $FONT_DIR $FONTS
Но всё равно это не то. Там добавление НОВОГО шрифта
С установкой нового шрифта вообще НИКАКИХ проблем. Даже инсталляторы не нужны для этого дела. WinRAR SFX хватает с зашитым вызовом fontinst.exe.

Не могу обновить уже установленные шрифты. Вот и полез в NSIS за помощью. Ведь должен он уметь?
NSIS вижу впервые в жизни. Готовых примеров не нашел. Из справки и статей не понял как обновлять системные файлы.

silione 04-11-2012 02:03 2018273

Делал давно инсталлятор и сейчас понадобился такой же скрипт. Писать с нуля очень уж нудно, а старый скрипт уже потерялся, остался только созданный с его помощью инсталлятор.

Наверно очень глупый вопрос задам, не пинайте сильно :)

Можно ли как-то вытащить скрипт из скомпилированного файла?

MKN 04-11-2012 10:58 2018349

silione,
Шапка темы\Ещё немного полезной информации: \читать дальше » ● Чем я могу распаковать инсталлятор, созданный в NSIS?
Цитата:

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

diakov 04-11-2012 15:30 2018538

kotkovets, подскажи хочу сэумулировать нажатие кнопки Активировать активатора:
Код:

Exec "$PLUGINSDIR\keygen.exe"
Sleep 1500
FindWindow $0 '#32770' 'AMS Software "ФотоШОУ v4.0"'
  IsWindow $0 +2 0
  MessageBox MB_OK|MB_ICONSTOP "Указанное окно не найдено"  idOK error
GetDlgItem $1 $0 7
; Получаем дескриптор кнопки "Далее"
MessageBox MB_OK|MB_ICONINFORMATION "После нажатия на кнопку ОК будет нажата кнопка 'Далее'"
SendMessage $1 ${BM_CLICK} 0 0
; Нажимаем кнопку
error:
        ${EndIf}

Инфа аутоита о бутоне такая


Как только не пробовал пишет Указанное окно не найдено

kotkovets 04-11-2012 16:14 2018583

Цитата:

Цитата diakov
Инфа аутоита о бутоне такая »

Ну так в чем дело или заслепило..
про класс главного окна..
Код:

FindWindow $0 '#32770' 'AMS Software "ФотоШОУ v4.0"'
класс же четко прописан: Autoit v3 GUI
где тут: #32770 ?????????
---
p.s
бездумный копипаст..

diakov 04-11-2012 16:24 2018589

Мож и заслепило..мож зациклился хз
Пробовал и класы менять
#32768 The class for a menu.
#32769 The class for the desktop window.
#32770 The class for a dialog box.
#32771 The class for the task switch window.
#32772 The class for icon titles.

И вместо класа ставить FindWindow $0 'Autoit v3 GUI' 'AMS Software "ФотоШОУ v4.0"' не работает все также Указанное окно не найдено! Так в чем же дело?

kotkovets 04-11-2012 16:32 2018600

Цитата:

Цитата diakov
И вместо класа ставить FindWindow $0 'Autoit v3 GUI' 'AMS Software "ФотоШОУ v4.0"' не работает все также Указанное окно не найдено! Так в чем же дело? »

Все работает..
не надо ля..ля .. :)
Код:

  Exec "$EXEDIR\Au3Info.exe"
  Sleep 1000
  FindWindow $0 "Au3Info" "(Frozen) AutoIt v3 Window Info" ;находим дескриптор окна
  ${Unless} $0 == 0
            ${NSD_GetText} $0 $1
            MessageBox MB_OK "дескриптор окна: $0$\ntitle: $1" IDOK
           
  ${Else}
    MessageBox MB_OK "каюк, нет стеклопакета.." IDOK
  ${EndUnless}


diakov 04-11-2012 16:36 2018604

Спасибо! Теперь разобрался! Заработало!

diakov 04-11-2012 22:03 2018870

kotkovets, читал в справке вашу статью Работа с процессами с помощью NSIS, но вот есть такая проблемка, и не нашел как реализовать, нада чтоб инсталлятор (в процесе установки) ждал запуска определенного exe-шника, и как только последний появится в процессах (запуститься) выполнял определенные действия с ним...что то типа ожидание запуска процесса но только не заданное время а до его фактического запуска.
Спасибо!

kotkovets 05-11-2012 00:05 2018952

Цитата:

Цитата diakov
(в процесе установки) ждал запуска определенного exe-шника »

а смысл? может он никогда не запустится! .. :biggrin:
Sleep - конечно не устраивает, подбирай время..
а подумать? инструмент есть..
ну в цикл проверку назначить..
ну а сколько, нужно таких циклов, если вдруг (не дай боже) не заведется?
обратно, тоже самое блин..
Цитата:

Цитата diakov
читал в справке вашу статью Работа с процессами с помощью NSIS »

ну раз читали, то:
1. инструкцию ${ProcessExists} - закидываем в цикл..
2. определяем сколько нужно циклов проверки, если исполнитель не заведется.. 50 - 100 раз.
можно конечно и бесконечный цикл..
3. Условие выхода из цикла - найденный процесс..

diakov 05-11-2012 00:11 2018958

Цитата:

Цитата kotkovets
а смысл? может он никогда не запустится! »

Смысл в том что при таком варианте:

Код:

Exec "$PLUGINSDIR\keygen.exe"
    Sleep 2500
FindWindow $0 "AutoIt v3 GUI" ""
StrCmp $0 "0" +3 0
MessageBox MB_ICONEXCLAMATION|MB_SETFOREGROUND|MB_OK "Генератор активации запущен!$\n Для активации ФотоШОУ 4.0 нажмите ОК!"
Goto +4
MessageBox MB_RETRYCANCEL|MB_SETFOREGROUND "Генератор активации не запущен! Нажмите кнопку ПОВТОР!" IDRETRY +2
Abort
Goto -6
GetDlgItem $1 $0 7
SendMessage $1 ${BM_CLICK} 0 0
MessageBox MB_ICONEXCLAMATION|MB_SETFOREGROUND|MB_OK "Активация завершена!"
${KillProcess} "keygen.exe" $4

Медленные компы почему то запускают позже этот самый keygen.exe...и соответственно если увеличить Sleep то на нормальных машинах keygen.exe запускается раньше и ревет музыка что дико напрягает, вот что бы было ожидание запуск и сразу эмуляция нажатие тогда было бы лучше....Или мож как то другим боком выйти из ситуации?

То есть Вы имеете ввиду что можно как то так:
Код:

${If} ${ProcessExists} "keygen.exe"
  Sleep 1000
FindWindow $0 "AutoIt v3 GUI" ""
GetDlgItem $1 $0 7
SendMessage $1 ${BM_CLICK} 0 0
${KillProcess} "keygen.exe" $4
${Else}
  Sleep 1000
${EndIf}
 ${If} ${ProcessExists} "keygen.exe"
 Sleep 1000
FindWindow $0 "AutoIt v3 GUI" ""
GetDlgItem $1 $0 7
SendMessage $1 ${BM_CLICK} 0 0
${KillProcess} "keygen.exe" $4
${Else}
  Sleep 1000
${EndIf}
 ${If} ${ProcessExists} "keygen.exe"
 Sleep 1000
FindWindow $0 "AutoIt v3 GUI" ""
GetDlgItem $1 $0 7
SendMessage $1 ${BM_CLICK} 0 0
${KillProcess} "keygen.exe" $4
${Else}
  Sleep 1000
${EndIf}


kotkovets 05-11-2012 00:35 2018979

Цитата:

Цитата diakov
Медленные компы почему то запускают позже этот самый keygen.exe...и соответственно если увеличить Sleep то на нормальных машинах keygen.exe запускается раньше и ревет музыка что дико напрягает, вот что бы было ожидание запуск и сразу эмуляция нажатие тогда было бы лучше....Или мож как то другим боком выйти из ситуации? »

Код:

  !include "ProcessFunc.nsh"
  Exec "$EXEDIR\Au3Info.exe"
  StrCpy $1 0
  ${Do}
    Sleep 150
    Intop $1 $1 + 1
    ${If} ${ProcessExists} "Au3Info.exe"
        StrCpy $1 1
        ${Break}
      ${EndIf}
  ${LoopUntil} $1 > 20 ;20 раз проверяем процесс
 
 ${If} $1 == 1
    FindWindow $0 "Au3Info" "(Frozen) AutoIt v3 Window Info"
    ${Unless} $0 == 0
          MessageBox MB_OK "есть окно" IDOK
    ${Else}
        MessageBox MB_OK "нет окна" IDOK
    ${EndUnless}
 ${EndIf}

Цитата:

Цитата diakov
GetDlgItem $1 $0 7»

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

diakov 05-11-2012 00:41 2018983

Спасибо буду пробовать!

kotkovets 05-11-2012 00:50 2018988

diakov,
подбирается время в цикле - экпериментально.. и количество раз, если не найден процесс
у меня хватило времени в цикле 150 мс, при кодировании видео, проц на 80% загружен...
время нахождения процесса в цикле (если не найден процесс) где то 150х30хВремя выполнения команд = 8-9с
можно предположить, что сейчас у меня комп 2 раза слабее в попугаях :), конфигурация компа под ником..

Painkiller 08-11-2012 23:03 2021892

kotkovets , можете ещё пару примеров написать работы с дополнительными ключами ??? Например создание ярлыка ??

MKN 09-11-2012 10:25 2022120

Цитата:

Цитата Painkiller
Например создание ярлыка ?? »

К слову о ярлыках. Интересует создание ярлыка для раб стола Windows 7 и 8 - СРАЗУ со свойством "Запуск от имени администратора"

Т.е. это то же, если бы пользователь, открыл "свойства" ярлыка, затем "дополнительно" и установил галку на
"Запуск от имени администратора".
Как реализовать эту цепочку действий для ярлыка, в скрипте ?

profcom 09-11-2012 13:34 2022225

kotkovets, не подскажите существует ли возможность очистить диалог 1018 уже после его показа? вернее удалить все контролы из него?

kotkovets 09-11-2012 14:16 2022265

Цитата:

Цитата Painkiller
kotkovets , можете ещё пару примеров написать работы с дополнительными ключами ??? »

смотрите в теме - примеров много..
Цитата:

Цитата profcom
вернее удалить все контролы из него? »

а какой в этом смысл? имхо! при переходе на другую странчику контролы "уничтожаются" и наоборот.
Цитата:

Цитата MKN
К слову о ярлыках. Интересует создание ярлыка для раб стола Windows 7 и 8 - СРАЗУ со свойством "Запуск от имени администратора" »

я такого способа не знаю..
и врядли он существует - внятный способ.

MKN 09-11-2012 18:04 2022472

Цитата:

Цитата kotkovets
и врядли он существует - внятный способ »

Странно... Неужели нет команд, чтобы пользователь сделал отметку свойств ярлыка - "Запуск от имени администратора"...
Вроде бы действия - куда уж проще...
Создаёт же как то такой ярлык, программка Elevated Shortcut http://winreview.ru/forum/viewtopic....f8048c39ea4fd5

kotkovets 09-11-2012 19:01 2022486

Цитата:

Цитата MKN
Вроде бы действия - куда уж проще... »

это на первый взгляд.. а внутри, программа выполняет команды и не мало, то что прописана в исходном коде..
Цитата:

Цитата MKN
программка Elevated Shortcut »

Вопрос про NSIS..
у меня нет исходника Elevated Shortcut, чтобы, хотя бы, пробнуть накатать плаг.

Painkiller 10-11-2012 03:11 2022718

kotkovets , можно ли изменить название кнопки "установить" на свое ????

MKN 10-11-2012 09:43 2022756

kotkovets,
А инфа отсюда подойдёт для решения задачи ? :
http://nsis.sourceforge.net/IShellLink_Set_RunAs_flag
http://blogs.msdn.com/b/oldnewthing/...9/6801084.aspx
http://stackoverflow.com/questions/6...-msi-installer
http://nsis.sourceforge.net/ShellLink_plug-in
Плагин теоретически должен был сработать, но как пишут здесь http://forums.winamp.com/showthread.php?t=278764
почему то и с этим оказалось проблемы...

kotkovets 10-11-2012 10:08 2022762

Цитата:

Цитата Painkiller
можно ли изменить название кнопки "установить" на свое ???? »

Код:

!include "MUI2.nsh"

InstallDir $EXEDIR

!insertmacro MUI_PAGE_WELCOME

  !define MUI_PAGE_CUSTOMFUNCTION_show textbutton
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

OutFile "test.exe"
ShowInstDetails show

Function textbutton
  GetDlgItem $0 $HWNDPARENT 1
  SendMessage $0 ${WM_SETTEXT} 0 STR:Поехали
FunctionEnd

Section
SectionEnd

Цитата:

Цитата MKN
почему то и с этим оказалось проблемы... »

так я же о чем..
внятный способ..
ладно вечером попробую..

Limonica 10-11-2012 13:12 2022815

Нужно запустить приложение exe без отображения консольного окна, ExecDos и ExecCmd не спасают, есть ещё варианты?

kotkovets 10-11-2012 18:54 2022995

Цитата:

Цитата Limonica
Нужно запустить приложение exe без отображения консольного окна »

» nsExec: запуск консольных утилит - подробней в шапке, в справке
Цитата:

Цитата Limonica
ExecDos и ExecCmd не спасают, есть ещё варианты »

смотря как автор написал свое приложение..
--
в самом прямом смысле..

kotkovets 12-11-2012 00:15 2023806

Цитата:

Цитата MKN
А инфа отсюда подойдёт для решения задачи ? : »

эти способы делают ярлык "запуск от администратора" (ПКМ по ярлыку -> свойства -> дополнительно)..
но не отключают запрос UAC..
кроме ElevatedShortcut от hb860 - http://winreview.ru/forum/viewtopic....f8048c39ea4fd5
http://snepi.ru/soft/sys/print:page,...eniya-uac.html
http://www.oszone.net/12653/Schtasks
---
если получится, так же, как ElevatedShortcut отпишусь.. :)

Limonica 13-11-2012 16:41 2024882

Всем привет, такая проблема, как заставить нсис воспринимать пробел, т.е. выполняется команда и в какомто месте нужно поставить пробел в cmd это "" две кавычки, либо " ", но нсис невкакую нехочит их принять ставит вместо пустого значения эти самые кавычки, как решить то? :drug:

profcom 13-11-2012 20:29 2025059

Limonica, не совсем понятно что вы хотите получить, неплохо было бы пример этой строки. Но попробуйте
Код:

'ваша команда '
А вообще все и так воспринимается, вот пример.
Код:

Name "Test"
OutFile "Test.exe"
Var File

Section
        FileOpen $File "$EXEDIR\test.txt" w
        FileWrite $File " "
        FileClose $File
SectionEnd


Limonica 14-11-2012 21:12 2025699

profcom, именно это мне и помогло, спасибо.

snezhinka 21-11-2012 16:35 2029717

помоги, пожалуйста, работаю с NSIS только неделю. Создаю свою страничку с двумя полями для указания пути к (двум) файлам. Работаю в HM NIS Edit 2.0.3. При запуске компоненты dirRequest не отображаются. В чём ошибка?

profcom 21-11-2012 22:19 2029933

snezhinka, хотелось бы по больше информации. А так гадать в чем проблема можно долго. Отображается ли сама кастомная страничка или только контролы не отображаются? Какая версия NSIS unicod или ansi (в unicod работать не будет)? И вообще желательно сам скрипт увидеть что бы найти ошибку.

shut 26-11-2012 11:01 2032986

Возможно сделать контрол типа CheckBoxList ? (список с чекбоксами и со скроллом)
Как?

shut 26-11-2012 13:47 2033091

Ткните, пожалуйста. Не могу найти.
Ситуация:
Кастом страница. Пользователь вводит данные, нажимает далее. Инстолятор проверяет данные и, если они не верны, пишет что "что-то там неправильно" и заставляет ещё раз заполнять форму. Вопрос.
Код:

Page custom fmPageModuleInstallCreate fmPageModuleInstallDestroy
 
Function fmPageModuleInstallCreate 
      ...
FunctionEnd
 
Function fmPageModuleInstallDestroy
  IfFileExists "$GModulesDir\Sys.bpl" ModuleInstallHasSys ModuleInstallNoSys
  ModuleInstallHasSys: 
    MessageBox MB_OK|MB_ICONEXCLAMATION "Что-то там неправильно"
    ; что здесь надо написать, чтоб форма повторно открылась?
  ModuleInstallNoSys:   
FunctionEnd


profcom 26-11-2012 14:08 2033110

Цитата:

Цитата shut
Кастом страница. Пользователь вводит данные, нажимает далее. Инстолятор проверяет данные и, если они не верны, пишет что "что-то там неправильно" и заставляет ещё раз заполнять форму. Вопрос. »

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

Код:

Page custom fmPageModuleInstallCreate fmPageModuleInstallDestroy

Function fmPageModuleInstallCreate 
      ; создаем все необходимые контролы
      ...
      ; проверяем изменения
      ${NSD_OnChange} $Textbox OnChange_Textbox
FunctionEnd

Function OnChange_Textbox
      ; проверка правильности заполнения
      ${If} ${FileExists} "$GModulesDir\Sys.bpl"
        MessageBox MB_OK|MB_ICONEXCLAMATION "Что-то там неправильно"
        ;очищаем поле ввода
        ${NSD_SetText} $Textbox ""
      ${EndIf}
FunctionEnd


shut 26-11-2012 15:04 2033169

profcom, не только textedit. Есть ещё много контролов, которые надо проверить. Проверять в рантайме каждый контрол на нескольких страницах достаточно накладно.
Спасибо, что откликнулись.

profcom 26-11-2012 15:40 2033204

Цитата:

Цитата shut
profcom, не только textedit. Есть ещё много контролов, которые надо проверить. Проверять в рантайме каждый контрол на нескольких страницах достаточно накладно.
Спасибо, что откликнулись. »

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

shut 26-11-2012 15:49 2033209

Я пробовал сделать в рантайме. Говорю - накладно. Если не будет варианта другого оставлю.

Второй вариант тоже не плох, но я не знаю какая страница будет следующей... шесть вариантов... и, по-моему, это не очевидно. Следующий разработчик после меня не разберёт, что я имел ввиду.

kotkovets 26-11-2012 22:59 2033518

Цитата:

Цитата shut
Кастом страница. Пользователь вводит данные, нажимает далее. Инстолятор проверяет данные и, если они не верны, пишет что "что-то там неправильно" и заставляет ещё раз заполнять форму. Вопрос. »

В функции fmPageModuleInstallDestroy, или на других любых кастомных страничек..
если не верно введенные параметры делаем прерывание одной инструкцией:
Abort
и все.. никаких извращений..

shut 27-11-2012 11:41 2033782

kotkovets, когда будите обновлять справочник? Могу написать статейку, где подробно опишу, как делать плагины с помощью Delphi.

Krinkels 27-11-2012 11:57 2033796

shut
ИМХО не имеет смысла. В сети куча сорцов. Разбирай не хочу. А написание плагина зависит только от желания программиста

shut 27-11-2012 12:11 2033811

Krinkels, разные ситуации бывают. Например, моему шефу приспичило окно для ввода пароля сделать достаточно креативным... похожего не нашёл и пришлось написать плагин.

MKN 27-11-2012 13:12 2033846

Цитата:

Цитата Krinkels
написание плагина зависит только от желания программиста »

Хотелось бы , чтобы и пожелания пользователей учитывались... :) Полезных плагинов действительно много, но часть из них устарела, а ещё больше плагинов, могущих расширить возможности NSIS и облегчить "кодописание" - ещё вообще не написано, и будет ли ... Посмотрите тему, оч. часто для разных ситуаций звучит фраза - "Тут надо писать отдельный плагин" :) Потому что пока в природе нет подходящего.

Krinkels 27-11-2012 13:15 2033851

shut
Бывает и такое. Но как по мне так это лишние сложности. Проще все это сделать на инно, там и инсталятор можно оформить по вкусу, и ввод пароля сделать более креативным. Но NSIS я люблю за отсутствие интерпретатора, и за малый вес конечного продукта

profcom 27-11-2012 14:40 2033909

Цитата:

Цитата shut
kotkovets, когда будите обновлять справочник? Могу написать статейку, где подробно опишу, как делать плагины с помощью Delphi. »

То же готов помочь, например перевод описания плагина nsis list готов добавить.

kotkovets 27-11-2012 21:27 2034225

Цитата:

Цитата MKN
Посмотрите тему, оч. часто для разных ситуаций звучит фраза - "Тут надо писать отдельный плагин" »

верно.. но писать плаг не так то просто..
Цитата:

Цитата shut
Могу написать статейку, где подробно опишу, как делать плагины с помощью Delphi. »

Цитата:

Цитата profcom
То же готов помочь, например перевод описания плагина nsis list готов добавить. »

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

XCV 03-12-2012 13:02 2037708

Цитата:

Цитата hb860
Вот так:
Код:
ReadRegStr $0 HKLM "Software\MyProgram" "SetupPath"
IfErrors 0 noerror
DetailPrint "Ключ не существует!"
Goto EndCheck
noerror:
DetailPrint "Ключ существует, значение SetupPath=$0"
EndCheck:
....продолжение кода скрипта »

извиняюсь что возвращаюсь к древнему посту, но интересует один вопрос, описанным выше методом можно определить существование конкретного параметра реестра, а можно ли определить существование ВЕТКИ реестра? тоесть так сказать "папочки" в реестре? тоесть надо определить существование определенной ветки реестра независимо от того есть в ней какие либо параметры или она просто пустая...

kotkovets 03-12-2012 22:59 2038109

Цитата:

Цитата XCV
интересует один вопрос, описанным выше методом можно определить существование конкретного параметра реестра, а можно ли определить существование ВЕТКИ реестра? тоесть так сказать "папочки" в реестре? »

В справочнике смотрите - » Работа с реестром с помощью NSIS

XCV 04-12-2012 18:02 2038626

Уважаемый kotkovets, решил воспользоваться вашим плагином WinVer2.nsh для определения разрядности оси, однако при компиляции получаю такую бяку:
читать дальше »

!insertmacro: FUNC_WindowsPlatformArchitecture
File: "System.dll"->"$PLUGINSDIR\System.dll" 11264 bytes
Plugin Command: Store S
!insertmacro: CallArtificialFunction
!define: "CallArtificialFunction_TYPE"="inst"
Call ":.FUNC_OSVERSIONINFOEXinst"
Goto: FUNC_OSVERSIONINFOEXinst_DONE
!define: "FUNC_OSVERSIONINFOEXinst_DEFINED"=""
!insertmacro: FUNC_OSVERSIONINFOEX
File: "System.dll"->"$PLUGINSDIR\System.dll" 0/11264 bytes
Plugin Command: Alloc 156
Pop: $9
!insertmacro: FUNC_GetVersionEx
File: "System.dll"->"$PLUGINSDIR\System.dll" 0/11264 bytes
Plugin Command: Call *$9(i156)
Plugin Command: Call kernel32::GetVersionEx(ir9)i.R0
!insertmacro: end of FUNC_GetVersionEx
!insertmacro: _IfThen
!insertmacro: end of _IfThen
Plugin Command: Call *$9(i.R2, i.r0, i.r1, i.r2, i.r3, &t128.r4, &i2.r5, &i2.r6, &i2.r7, &i1.r8, &i1)
File: "System.dll"->"$PLUGINSDIR\System.dll" 0/11264 bytes
Plugin Command: Free $9
!insertmacro: end of FUNC_OSVERSIONINFOEX
Return
!undef: "CallArtificialFunction_TYPE"
!insertmacro: end of CallArtificialFunction
!insertmacro: _If
!insertmacro: end of _If
Plugin Command: Alloc 64
Pop: $9
Plugin Command: Call kernel32::GetNativeSystemInfo(ir9)v
Plugin Command: Call *$9(&i2.R0)
Plugin Command: Free $9
!insertmacro: _If
!insertmacro: end of _If
!insertmacro: _Or
!insertmacro: end of _Or
Push: 64
!insertmacro: _Else
!insertmacro: end of _Else
Push: 32
!insertmacro: _EndIf
!insertmacro: end of _EndIf
!insertmacro: _EndIf
!insertmacro: end of _EndIf
Plugin Command: Store L
ClearErrors
Usage: Pop $(user_var: output)
Error in macro FUNC_WindowsPlatformArchitecture on macroline 18

не подскажете из-за чего?

dix75 05-12-2012 00:09 2038848

Доброй ночи!
Как реализовать поддержку различных видов файлов лицензии
Попробовал так

Код:

!insertmacro MUI_PAGE_WELCOME
Page license                                                                                                                       
!insertmacro MUI_PAGE_DIRECTORY
               
 LicenseLangString license ${LANG_ENGLISH} "${pkgdir}\license_en.rtf"
 LicenseLangString license ${LANG_VIETNAMESE} "${pkgdir}\license_vn.rtf"
 LicenseData $(license)

Выбор файлов отображается корректно, но весь текст на самом инсталяторе пропал
что делать

dix75 05-12-2012 16:38 2039258

Добрый день!

Можно ли в nsis вывести окно с текстом и ссылками на определенные ресурсы?

profcom 05-12-2012 17:15 2039300

Цитата:

Цитата dix75
Добрый день!
Можно ли в nsis вывести окно с текстом и ссылками на определенные ресурсы? »

Можно, плагин nsDialogs вам в помощь и справочник по nsis там все описано.

Или интересует что то типа окна сообщений?

dix75 05-12-2012 17:45 2039328

Цитата:

Цитата profcom
Или интересует что то типа окна сообщений? »

Мне нужно окно сообщений
Типа у Вас старая версия программы передийте по этой ссылке чтобы скачать новую версию

MKN 05-12-2012 18:48 2039376

Цитата:

Цитата dix75
Мне нужно окно сообщений
Типа у Вас старая версия программы передийте по этой ссылке чтобы скачать новую версию »

Напрашиваются следующие действия :
Детект установленной версии ПО
Обычное сообщение - "у вас такая то версия, не желаете ли обновиться ?" Да Нет
Если Да, то используем плагин - типа Inetc plug-in , с помощью которого скачиваем нужное.
(обсуждение здесь : http://forums.winamp.com/showthread.php?t=198596)

Можно конечно вывести отдельную кастомную страницу с вариациями ссылок и пр. Только надо ли ?

kotkovets 06-12-2012 00:39 2039568

XCV,
проблема у вас с кодировкой, в юникоде сохраняете хедер для юникодной NSIS.

dix75 06-12-2012 16:55 2040009

MKN, Спасибо

diakov 07-12-2012 13:57 2040629

Цитата:

Цитата dix75
Доброй ночи!
Как реализовать поддержку различных видов файлов лицензии
»

Я вот например для разных языков инсталлятора реализую так


Код:

!insertmacro MUI_PAGE_WELCOME
!define MUI_PAGE_CUSTOMFUNCTION_SHOW "LICENSE_SHOW" ;эту строку не перемещать!!!
!insertmacro MUI_PAGE_LICENSE "${NSISDIR}\COPYING" ;эту строку не менять!!!


!insertmacro MUI_LANGUAGE "Russian"
!insertmacro MUI_LANGUAGE "English"
 !insertmacro MUI_LANGUAGE "Ukrainian"

Function LICENSE_SHOW

  InitPluginsDir
  ${If} $LANGUAGE == 1049 ;если русский язык установщику
      File "/oname=$PLUGINSDIR\info.rtf" "${NSISDIR}\COPYING.rtf"
  ${ElseIf} $LANGUAGE == 1033 ;если английский язык установщика
      File "/oname=$PLUGINSDIR\info.rtf" "${NSISDIR}\COPYING1.rtf"
      ${ElseIf} $LANGUAGE == 1058 ;если украинский язык установщика
      File "/oname=$PLUGINSDIR\info.rtf" "${NSISDIR}\COPYING2.rtf"
  ${EndIf}


dix75 07-12-2012 19:06 2040826

Добрый вечер!

Как можно выдрать число из этой строки

"Extenstion35=bool"

${StrStrAdv} не работает почему-то

kotkovets 07-12-2012 19:42 2040858

Цитата:

Цитата dix75
Как можно выдрать число из этой строки »

если только из этой строки..
читаем и не задаем вопрос как попугаи --> » StrCpy: очень полезная команда
---
другой вариант:
Код:

!include "StrFunc.nsh"
!include "Logiclib.nsh"
${StrStr}

Name "FindWordStr"
OutFile "FindWordStr.exe"

Section
      ;находим подстроку в строке начинающая с заданого сочетания.
      ${StrStr} $0 "Extenstion35=bool" "35"
        MessageBox MB_OK "$0" IDOK
    Strlen $1 "35"  ;вычисляем длину указаного сочетания
    StrCpy `$0` `$0` $1 ;берем из подстроки длину указаного сочетания - в начале подстроки
      MessageBox MB_OK "$0" IDOK
SectionEnd

3 вариант:
Код:

!include "WordFunc.nsh"
;--
  ${StrFilter} "Extenstion35=bool" "1" "" "" $R0
  MessageBox MB_OK "$R0" IDOK


Limonica 08-12-2012 22:37 2041509

Ребят, нужен очень простой скрипт, помогите, смысл такой если есть права админа выполняется один скрипт, если нет другой, как правильно, но максимально просто реализовать, по типу:
Код:

IfFileExists "Проврка прав админа, посредством доступа к файлу, я хз ещё как" 0 ADMIN 
.....
....
......
....
Quit 

  ADMIN: 
.......
......
. .......
Quit

Нужно срочно, любые ответы нужны...

kotkovets 08-12-2012 23:53 2041540

Limonica, а причем здесь IfFileExists - проверка наличие файла..
в справочнике - » UserInfo: Определение типа учетной записи и правами
Код:

UserInfo::GetOriginalAccountType
Pop $2

;Определяет какими правами обладает текущий пользователь. Возвращаемые значения переменной $2:
;Admin - административными (полными правами)
;Power - правами опытных пользователей
;User - ограниченые права.
;Guest - правами "Гостя".


volk1234 09-12-2012 11:56 2041696

Тема закрыта!
Лимит страниц.
Продолжение тут:
.: NSIS - все вопросы :. часть 2.


Время: 00:03.

Время: 00:03.
© OSzone.net 2001-