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

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

kotkovets 09-12-2012 12:02 2041697

.: NSIS - все вопросы :. часть 2.
 


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


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


Текущая версия: NSIS 3.04 от 15 декабря 2018 года
Скачать | Архив сборок версии

Первая часть этой темы
Скачать первую часть этой темы одним архивом

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

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

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

Примеры скриптов на нашем форуме
Скрипт 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, если хотите скрыть некоторые файлы в вашей инсталляции.



Valdise 09-12-2012 13:47 2041760

Моё почтение гуру NSIS-а.
Подскажите, возможно-ли добавить описание в создаваемом ДЕинсталляторе?
Чтобы как у Инсталлятора (VIAddVersionKey), при наведении курсора на установщик появлялось описание:

"ProductName" "${PRODUCT_NAME}"
"FileDescription" "Удаление программы"
"ProductVersion" "${PRODUCT_VERSION}" и проч.

Заранее признателен.

kotkovets 09-12-2012 14:28 2041779

Цитата:

Цитата Valdise
Подскажите, возможно-ли добавить описание в создаваемом ДЕинсталляторе? »

Код:

VIProductVersion "1.1.1.1"
VIAddVersionKey "ProductName" "PRODUCT_NAME"
VIAddVersionKey "LegalCopyright" "PRODUCT Ltd."
VIAddVersionKey "CompanyName" "© PRODUCT AG"
VIAddVersionKey "FileDescription" "PRODUCT_NAME PRODUCT_VERSION"
VIAddVersionKey "FileVersion" "1"

Эту же информацию пишет автоматом в деинсталятор, тока проверил

Valdise 09-12-2012 14:50 2041792

Цитата:

Цитата kotkovets
Эту же информацию пишет автоматом в деинсталятор, тока проверил »

Спасибо за ответ, НО об этом я знаю и в вопросе писал...
Вопрос ещё раз: Можно-ли сделать так, чтобы надписи\подписи при наведении курсора, у Инсталлятора и ДЕинсталлятора были разными?

kotkovets 09-12-2012 15:05 2041801

Цитата:

Цитата Valdise
Можно-ли сделать так, чтобы надписи\подписи при наведении курсора, у Инсталлятора и ДЕинсталлятора были разными? »

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

profcom 10-12-2012 12:45 2042336

Подскажите пожалуйста как можно отследить нажатие кнопок аналогичных "назад" "далее"?

kotkovets 10-12-2012 14:21 2042412

profcom,
Цитата:

Цитата profcom
как можно отследить нажатие кнопок аналогичных "назад" "далее"? »

это типа понять и простить ? :)

profcom 10-12-2012 15:14 2042451

Цитата:

Цитата kotkovets
это типа понять и простить ? »

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

K.A.V. 10-12-2012 16:01 2042483

Цитата:

Цитата profcom
допустим мы изменили стандартный интерфейс и добавили еще кнопку. Так вот как привязать функцию к нажатию этой кнопки. »

Плагин ButtonEvent plug-in вам в помощь, уважаемый ;)

dix75 10-12-2012 16:30 2042501

Добрый день!

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

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

K.A.V. 10-12-2012 20:08 2042667

Цитата:

Цитата dix75
Иногда требуются админ права, чтобы инсталлятор отработал, каим образом можно сообщить пользователю , что нужны для инсталляции админ права. »

Показать обычное сообщение :)
Код:

UserInfo::GetAccountType
Pop $1
StrCmp $1 "Admin" +3 0
MessageBox MB_OK|MB_ICONEXCLAMATION `Для установки программы необходимо войти в систему с правами Администратора!`
quit

Цитата:

Цитата dix75
Сообщением типа у Вас нет админ прав и завершить инсталляцию, не очень современно. »

А что для вас современно? Здоровый диалог в пол экрана с картинкой на заднем фоне?

dix75 11-12-2012 13:04 2043032

Цитата:

Цитата K.A.V.
Показать обычное сообщение »

Спасибо

Добрый день!

Подскажите пожайлуста, возможно кто-нибудь знает как можно установить тулбар в ie без лишних запросов со стороны браузера.

MKN 11-12-2012 16:18 2043164

Подскажите пожалуйста - есть ли в nsDialogs макрос отметки (снятия отметки) секций ? Не обнаружил в доке такого...
Что то типа аналога ${SectionIsSelected} ${ID sec}
Если нет, то как минимальным кодом это можно реализовать ?

dix75 11-12-2012 16:28 2043173

Возможно ли узнать запущена прорамма или нет?

Просто убивать её критично и просить пользователя закрыть тоже неверно (пользователь не любит лишние вопросы)

profcom 11-12-2012 16:57 2043195

Цитата:

Цитата dix75
Возможно ли узнать запущена прорамма или нет? »

Элементарно, в справке есть статья с плагином по работе с процессами, а так же есть другие плагины с схожими функциями.
Отследите работает ли программа по ее процессу.

kotkovets 11-12-2012 17:22 2043215

Цитата:

Цитата MKN
Подскажите пожалуйста - есть ли в nsDialogs макрос отметки (снятия отметки) секций ? Не обнаружил в доке такого...
Что то типа аналога ${SectionIsSelected} ${ID sec} »

а зачем? ты не рисуешь собственный treeview
Есть встроенные средства в Section.nsh для собственного treeview
---
через nsDialogs я рисовал treeview

минимальным никак - забудь, особенно, если это еще чужой treeview

kotkovets 11-12-2012 19:05 2043290

habib2302, чет не туда... у автора скрипт спрашивайте.
на форуме он здесь прописан - в личку ему пишите.

habib2302 11-12-2012 20:14 2043328

kotkovets,
адресок на его профиль можно

kotkovets 11-12-2012 20:33 2043334

habib2302, поиск по теме в первой части --> diakov

diakov 12-12-2012 00:34 2043547

kotkovets, вот заинтересовался созданием портативок по подобию PortableApps.com, и вот дошло дело до создания лаунчера...как я понимаю данная технология заключается в том что когда прога запускается лаунчер вносит необходимые изменения в систему, а когда закрыть, тот самый лаунчер удаляет все следы присутствия в системе (за исключения, понятно самих профилей или настроек которые хранятся непосредственно в папке портабла) вот нарыл скрипт лаунчера фоксит немного что переделал под неро (только в шапке и appinfo.ini) что бы проверить запустится ли), тело скрипта не трогал! Так вот непонятно где в скрипте вносить данные (который должны вносится в систему при запуске ...а где при завершении работы проги...не могли бы объяснить, вот сам код:



Код:

!define PORTABLEAPPNAME "Nero Express Portable"
!define NAME "Nero Express Portable"
!define APPNAME "NeroExpressPortable"
!define VER "12.0.28.001"
!define WEBSITE "repachok.net"
!define DEFAULTEXE "NeroExpress.exe"
!define DEFAULTAPPDIR "Nero"
!define DEFAULTSETTINGSDIR "settings"
!define LAUNCHERLANGUAGE "Russian"

;=== Program Details
Name "${PORTABLEAPPNAME}"
OutFile "..\..\${NAME}.exe"
Caption "${PORTABLEAPPNAME}"
VIProductVersion "${VER}"
VIAddVersionKey ProductName "${PORTABLEAPPNAME}"
VIAddVersionKey CompanyName "repachok.net"
VIAddVersionKey LegalCopyright "REPACHOK GROUP"
VIAddVersionKey FileDescription "${PORTABLEAPPNAME}"
VIAddVersionKey FileVersion "${VER}"
VIAddVersionKey ProductVersion "${VER}"
VIAddVersionKey InternalName "${PORTABLEAPPNAME}"
VIAddVersionKey OriginalFilename "${NAME}.exe"
;VIAddVersionKey PrivateBuild ""
;VIAddVersionKey SpecialBuild ""

;=== Runtime Switches
CRCCheck On
WindowIcon Off
SilentInstall Silent
AutoCloseWindow True
RequestExecutionLevel user

; Best Compression
SetCompress Auto
SetCompressor /SOLID lzma
SetCompressorDictSize 32
SetDatablockOptimize On

;=== Include
;(Standard NSIS)
!include LogicLib.nsh
!include Registry.nsh
!include TextFunc.nsh
!insertmacro GetParameters
!include x64.nsh

;(NSIS Plugins)
!include TextReplace.nsh

;(Custom)
!include ReadINIStrWithDefault.nsh
!include ReplaceInFileWithTextReplace.nsh
;!include CheckForPlatformSplashDisable.nsh

;=== Program Icon
Icon "..\..\App\AppInfo\appicon.ico"

;=== Languages
;LoadLanguageFile "${NSISDIR}\Contrib\Language files\${LAUNCHERLANGUAGE}.nlf"
;!include PortableApps.comLauncherLANG_${LAUNCHERLANGUAGE}.nsh

Var PROGRAMDIRECTORY
Var SETTINGSDIRECTORY
Var ADDITIONALPARAMETERS
Var EXECSTRING
Var PROGRAMEXECUTABLE
Var INIPATH
Var SECONDARYLAUNCH
Var MISSINGFILEORPATH
Var LASTDRIVE
Var CURRENTDRIVE
Var FAILEDTORESTOREKEY
Var USERTYPE
Var RegKeyFDFExists
Var RegKeyPDFExists
Var RegKeyPDFIsBlank

Section "Main"
        ;=== Check if already running
        System::Call 'kernel32::CreateMutexA(i 0, i 0, t "${NAME}") i .r1 ?e'
        Pop $0
        StrCmp $0 0 CheckINI
                StrCpy $SECONDARYLAUNCH "true"

        CheckINI:
                ;=== Find the INI file, if there is one
                IfFileExists "$EXEDIR\${NAME}.ini" "" NoINI
                        StrCpy $INIPATH "$EXEDIR"

                ;=== Read the parameters from the INI file
                ${ReadINIStrWithDefault} $0 "$INIPATH\${NAME}.ini" "${NAME}" "${APPNAME}Directory" "App\${DEFAULTAPPDIR}"
                StrCpy $PROGRAMDIRECTORY "$EXEDIR\$0"
                ${ReadINIStrWithDefault} $0 "$INIPATH\${NAME}.ini" "${NAME}" "SettingsDirectory" "Data\${DEFAULTSETTINGSDIR}"
                StrCpy $SETTINGSDIRECTORY "$EXEDIR\$0"
                ${ReadINIStrWithDefault} $PROGRAMEXECUTABLE "$INIPATH\${NAME}.ini" "${NAME}" "${APPNAME}Executable" "${DEFAULTEXE}"
                ${ReadINIStrWithDefault} $ADDITIONALPARAMETERS "$INIPATH\${NAME}.ini" "${NAME}" "AdditionalParameters" ""

                IfFileExists "$PROGRAMDIRECTORY\$PROGRAMEXECUTABLE" FoundProgramEXE NoProgramEXE

        NoINI:
                ;=== No INI file, so we'll use the defaults
                StrCpy $PROGRAMEXECUTABLE "${DEFAULTEXE}"
                StrCpy $ADDITIONALPARAMETERS ""

                IfFileExists "$EXEDIR\App\${DEFAULTAPPDIR}\${DEFAULTEXE}" "" NoProgramEXE
                        StrCpy $PROGRAMDIRECTORY "$EXEDIR\App\${DEFAULTAPPDIR}"
                        StrCpy $SETTINGSDIRECTORY "$EXEDIR\Data\${DEFAULTSETTINGSDIR}"
                        Goto FoundProgramEXE

        NoProgramEXE:
                ;=== Program executable not where expected
                StrCpy $MISSINGFILEORPATH $PROGRAMEXECUTABLE
                MessageBox MB_OK|MB_ICONEXCLAMATION `$(LauncherFileNotFound)`
                Abort

        FoundProgramEXE:
                StrCmp $SECONDARYLAUNCH "true" GetPassedParameters
                FindProcDLL::FindProc "${DEFAULTEXE}"
                StrCmp $R0 "1" WarnAnotherInstance CheckSettings

        WarnAnotherInstance:
                MessageBox MB_OK|MB_ICONINFORMATION `$(LauncherAlreadyRunning)`
                Abort

        CheckSettings:
                ;=== Check for data files
                IfFileExists "$SETTINGSDIRECTORY\*.*" GetPassedParameters

                ;=== Copy the default settings files
                CreateDirectory "$SETTINGSDIRECTORY"
                CopyFiles /SILENT "$EXEDIR\App\DefaultData\settings\*.*" "$SETTINGSDIRECTORY"

        GetPassedParameters:
                ;=== Get any passed parameters
                ${GetParameters} $0
                StrCmp "'$0'" "''" "" LaunchProgramParameters

                ;=== No parameters
                StrCpy $EXECSTRING `"$PROGRAMDIRECTORY\$PROGRAMEXECUTABLE"`
                Goto AdditionalParameters

        LaunchProgramParameters:
                StrCpy $EXECSTRING `"$PROGRAMDIRECTORY\$PROGRAMEXECUTABLE" $0`

        AdditionalParameters:
                StrCmp $ADDITIONALPARAMETERS "" AdjustPaths

                ;=== Additional Parameters
                StrCpy $EXECSTRING `$EXECSTRING $ADDITIONALPARAMETERS`

        AdjustPaths:
                StrCmp $SECONDARYLAUNCH "true" LaunchAndExit
                ReadINIStr $LASTDRIVE "$SETTINGSDIRECTORY\${NAME}Settings.ini" "${NAME}Settings" "LastDrive"
                ${GetRoot} $EXEDIR $CURRENTDRIVE
                StrCmp $LASTDRIVE $CURRENTDRIVE RegistryBackup
                        ${ReplaceInFile} '$SETTINGSDIRECTORY\${NAME}.reg' '$LASTDRIVE\\' '$CURRENTDRIVE\\'

        ;StoreCurrentDriveLetter:
                WriteINIStr "$SETTINGSDIRECTORY\${NAME}Settings.ini" "${NAME}Settings" "LastDrive" "$CURRENTDRIVE"

        RegistryBackup:
                ;=== Backup the registry
                ${registry::KeyExists} "HKEY_CURRENT_USER\Software\Foxit Software\Foxit Reader-BackupBy${NAME}" $R0
                StrCmp $R0 "0" RestoreTheKey
                ${registry::KeyExists} "HKEY_CURRENT_USER\Software\Foxit Software\Foxit Reader" $R0
                StrCmp $R0 "-1" RestoreTheKey
                ${registry::MoveKey} "HKEY_CURRENT_USER\Software\Foxit Software\Foxit Reader" "HKEY_CURRENT_USER\Software\Foxit Software\Foxit Reader-BackupBy${NAME}" $R0
                Sleep 100

        RestoreTheKey:
                IfFileExists "$SETTINGSDIRECTORY\${NAME}.reg" "" BackupHKLM

                IfFileExists "$WINDIR\system32\reg.exe" "" RestoreTheKey9x
                        nsExec::ExecToStack `"$WINDIR\system32\reg.exe" import "$SETTINGSDIRECTORY\${NAME}.reg"`
                        Pop $R0
                        StrCmp $R0 '0' BackupHKLM ;successfully restored key

        RestoreTheKey9x:
                ${registry::RestoreKey} "$SETTINGSDIRECTORY\${NAME}.reg" $R0
                StrCmp $R0 '0' BackupHKLM ;successfully restored key
                StrCpy $FAILEDTORESTOREKEY "true"

        BackupHKLM:
                UserInfo::GetAccountType
                Pop $USERTYPE
                StrCmp $USERTYPE "Guest" LaunchNow
                StrCmp $USERTYPE "User" LaunchNow
                ${registry::MoveKey} "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\FoxitReader.Document" "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\FoxitReader.Document-BackupBy${NAME}" $R0
                ${registry::MoveKey} "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\FoxitReader.FDFDoc" "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\FoxitReader.FDFDoc-BackupBy${NAME}" $R0
                ${registry::MoveKey} "HKEY_CLASSES_ROOT\CLSID\{14E8BBD8-1D1C-4D56-A4DA-D20B75EB814E}" "HKEY_CLASSES_ROOT\CLSID\{14E8BBD8-1D1C-4D56-A4DA-D20B75EB814E}-BackupBy${NAME}" $R0
                ${registry::MoveKey} "HKEY_CLASSES_ROOT\CLSID\{A43F4073-BEBD-4142-B590-27A74384620B}" "HKEY_CLASSES_ROOT\CLSID\{A43F4073-BEBD-4142-B590-27A74384620B}-BackupBy${NAME}" $R0
                ${registry::KeyExists} "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.pdf" $R0
                ${If} $R0 == "0"
                        StrCpy $RegKeyPDFExists true
                        ${registry::Read} "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.pdf" "" $R0 $R1
                        ${If} $R0 == ""
                                StrCpy $RegKeyPDFIsBlank true
                        ${EndIf}
                ${EndIf}
                ${registry::KeyExists} "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.fdf" $R0
                ${If} $R0 == "0"
                        StrCpy $RegKeyFDFExists true
                ${EndIf}

        LaunchNow:
                Sleep 100
                ExecWait $EXECSTRING

        CheckRunning:
                Sleep 1000
                FindProcDLL::FindProc "$PROGRAMEXECUTABLE"
                StrCmp $R0 "1" CheckRunning

                StrCmp $FAILEDTORESTOREKEY "true" SetOriginalKeyBack
                ${registry::SaveKey} "HKEY_CURRENT_USER\Software\Foxit Software\Foxit Reader" "$SETTINGSDIRECTORY\${NAME}.reg" "" $0
                Sleep 100

        SetOriginalKeyBack:
                ${registry::DeleteKey} "HKEY_CURRENT_USER\Software\Foxit Software\Foxit Reader" $R0
                ${registry::KeyExists} "HKEY_CURRENT_USER\Software\Foxit Software\Foxit Reader-BackupBy${NAME}" $R0
                Sleep 100
                StrCmp $R0 "-1" CleanupHKLM
                ${registry::MoveKey} "HKEY_CURRENT_USER\Software\Foxit Software\Foxit Reader-BackupBy${NAME}" "HKEY_CURRENT_USER\Software\Foxit Software\Foxit Reader" $R0
                Sleep 100
                Goto CleanupHKLM

        CleanupHKLM:
                StrCmp $USERTYPE "Guest" RegistryCleanup
                StrCmp $USERTYPE "User" RegistryCleanup
                ${registry::DeleteKey} "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\FoxitReader.Document" $R0
                ${registry::MoveKey} "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\FoxitReader.Document-BackupBy${NAME}" "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\FoxitReader.Document" $R0
                ${registry::DeleteKey} "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\FoxitReader.FDFDoc" $R0
                ${registry::MoveKey} "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\FoxitReader.FDFDoc-BackupBy${NAME}" "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\FoxitReader.FDFDoc" $R0
                ${registry::DeleteKey} "HKEY_CLASSES_ROOT\CLSID\{14E8BBD8-1D1C-4D56-A4DA-D20B75EB814E}" $R0
                ${registry::MoveKey} "HKEY_CLASSES_ROOT\CLSID\{14E8BBD8-1D1C-4D56-A4DA-D20B75EB814E}-BackupBy${NAME}" "HKEY_CLASSES_ROOT\CLSID\{14E8BBD8-1D1C-4D56-A4DA-D20B75EB814E}" $R0
                ${registry::DeleteKey} "HKEY_CLASSES_ROOT\CLSID\{A43F4073-BEBD-4142-B590-27A74384620B}" $R0
                ${registry::MoveKey} "HKEY_CLASSES_ROOT\CLSID\{A43F4073-BEBD-4142-B590-27A74384620B}-BackupBy${NAME}" "HKEY_CLASSES_ROOT\CLSID\{A43F4073-BEBD-4142-B590-27A74384620B}" $R0
                ${If} $RegKeyPDFExists != true
                        ${registry::DeleteKey} "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.pdf" $R0
                ${EndIf}
                ${If} $RegKeyPDFIsBlank == true
                        ${registry::Read} "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.pdf" "" $R0 $R1
                        ${If} $R0 != ""
                                ${registry::DeleteValue} "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.pdf" "" $R0
                        ${EndIf}
                ${EndIf}
                ${If} $RegKeyFDFExists != true
                        ${registry::DeleteKey} "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.fdf" $R0
                ${EndIf}

        RegistryCleanup:
                ;=== Cleanup the registry
                ${registry::DeleteKeyEmpty} "HKEY_CURRENT_USER\Software\Foxit Software" $R0
                Goto TheEnd

        LaunchAndExit:
                Exec $EXECSTRING

        TheEnd:
                ${registry::Unload}
                newadvsplash::stop /WAIT
SectionEnd

Спасибо!

Тоесть как бы не понятно на каком этапе скрипта выполняются команды для внесения изменений в систему а на каком наоборот удаления этих изменений..

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

kotkovets 12-12-2012 01:40 2043574

В данном лаунчер - это NSIS, значит необходимые изменения вносим перед запуском приложения, т.е в самой
первой стандартной функции - .OnInit
запускаем процесс без ожидания процесса, если процесс не найден - закрываем лаунчер,
далее nsis ждет завершения процесса, по завершении процесса - удаляем следы.
лаунчер нужно сделать, чтобы запускался скрытно, в функции .OnInit
Код:

SetSilent silent
В принципе весь код можно всунуть в .OnInit по завершении всех инструкций пишем:
Код:

Quit
тогда необязательно писать - SetSilent silent
как то так - один из множества вариантов.

diakov 12-12-2012 09:34 2043686

Ну в принципе понятно...а после какой команды в .OnInit писать инструкции по заметанию следов?

MKN 12-12-2012 17:36 2044057

Цитата:

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

Простейший вариант псевдопортабла :
После запуска (по сути инсталляции) нужной программы, её "разворачивания" в ОС и запуска - из неё же , вслед запускается маленький exe-скрипт, контролирующий процесс запущенной программы . Как только программа закрывается, (т.е. процесс прекращён) , этот фискальный скрипт-uninstaller подчищает все следы установки программы, и самоликвидируется.
Ессно можно организовать установку-запуск программы и из фискального скрипта-uninstaller_а (пусть будет лаунчер).

kotkovets 12-12-2012 18:52 2044102

Цитата:

Цитата diakov
а после какой команды в .OnInit писать инструкции по заметанию следов? »

логично блин, рассуждайте, после найденного и завершенного нужного процесса - это два важных условия.

diakov 13-12-2012 14:42 2044597

Цитата:

Цитата kotkovets
завершенного нужного процесса »

Это понятно...но как в самой ф-ции .OnInit это определить (то есть если процесс завершен => удаление следов)
Мож как то прикрутить возможно из статьи вашей Запуск внешних приложений в режиме ожидания завершения приложения

K.A.V. 13-12-2012 16:20 2044658

Цитата:

Цитата diakov
.но как в самой ф-ции .OnInit это определить (то есть если процесс завершен => удаление следов) »

Справку то, пробовали читать нашу? Запуск процесса, пауза пару секунд, далее определяете, запущен ли процесс, и если не запущен - заметате следы

Справочник по NSIS => Примеры кодов => Работа с процессами

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

diakov 13-12-2012 16:37 2044666

Цитата:

Цитата K.A.V.
пауза пару секунд, далее определяете, запущен ли процесс, и если не запущен - заметате следы »

А если пользователь запустит портативную прогу и будет в ней работать часа 2-3 тогда сколько цыклов проверки по пару секунд нужно?

Может так например
Код:

${ExecWait} "приложение.exe [parametr1]...[parametr2]" $5
${If} $5 == 1 (1 - код возврата при закрытии приложения)
Заметаем следы
${EndIf}


K.A.V. 13-12-2012 17:14 2044684

Цитата:

Цитата diakov
А если пользователь запустит портативную прогу и будет в ней работать часа 2-3 тогда сколько цыклов проверки по пару секунд нужно? »

Цитата:

Цитата diakov
${ExecWait} "приложение.exe [parametr1]...[parametr2]" $5 »

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

Читайте справку

Вы пишите команды, не понимая их функционал...

diakov 13-12-2012 17:26 2044688

Цитата:

Цитата K.A.V.
Вы пишите команды, не понимая их функционал... »

K.A.V., если бы все всё понимали то тут бы не спрашивали и данной ветки бы не существовало!
Ну вообще это как бы правильно будет или можно как то по другому сделать?

K.A.V. 13-12-2012 17:31 2044694

Цитата:

Цитата diakov
K.A.V., если бы все всё понимали то тут бы не спрашивали »

Если бы все новички читали наш справочник, то...
Цитата:

Цитата diakov
то тут бы не спрашивали »

о командах, которые описаны в файле справке

Давайте не будем оффтопить, а то получится как с участником Creator (точно ник не помню), которому раз 20 за день говорили одно и то же - Читайте справочник, а он упорно не хотел видеть эти слова

Просто возьмите и пролистайте файл справки, найдёте что-то нужное, более чем уверен
И описания команд Exec и ExecWait там есть...

MKN 13-12-2012 18:49 2044736

Возможно ли изменить цвет полоски ProgressBar_а, скажем с зелёненького на красненький или синенький ? :)
Пытался делать по мотивам http://stackoverflow.com/questions/1...nsis-installer
Не работает...

K.A.V. 13-12-2012 19:30 2044761

Цитата:

Цитата MKN
Возможно ли изменить цвет полоски ProgressBar_а, скажем с зелёненького на красненький или синенький ?
Пытался делать по мотивам http://stackoverflow.com/questions/1...nsis-installer
Не работает...
»

У кого как ;)
Попытался сделать по тем же мотивам, получилось :)


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

Код:

; 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"

; MUI 1.67 compatible ------
!include "MUI2.nsh"
!include WinMessages.nsh
XPStyle on
; MUI Settings
!define MUI_ABORTWARNING
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"

; Welcome page
#!insertmacro MUI_PAGE_WELCOME
; Directory page
#!insertmacro MUI_PAGE_DIRECTORY
; Instfiles page
!insertmacro MUI_PAGE_INSTFILES

; Finish page
!insertmacro MUI_PAGE_FINISH

; Language files
!insertmacro MUI_LANGUAGE "Russian"

; MUI end ------


Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "setup.exe"
InstallDir "$TEMP"
ShowInstDetails show








; -------------------------
; Получаем Handle прогресса
Section -SetProgressColor
Var /Global HWNDProgress
FindWindow $0 "#32770" "" $HWNDPARENT
GetDlgItem $0 $0 1004
System::Call UxTheme::SetWindowTheme(ir0,w"",w"")
StrCpy $HWNDProgress $0
SectionEnd


 
 

Section "MainSection" SEC01
; ------------------------- Устанавливаем цвет прогресса
SendMessage $HWNDProgress 1033 0 0x00FFFF

sleep 500
sleep 500
sleep 500
sleep 500
sleep 500
sleep 500
sleep 500
sleep 500

; ------------------------- Устанавливаем цвет прогресса
SendMessage $HWNDProgress 1033 0 0xFF00FF

sleep 500
sleep 500
sleep 500
sleep 500
sleep 500
sleep 500
sleep 500
sleep 500
sleep 500
sleep 500
sleep 500
; ------------------------- Устанавливаем цвет прогресса
SendMessage $HWNDProgress 1033 0 0x80FF00

sleep 3000
SectionEnd




Section -Post
SectionEnd



Вообщем весь функционал в секциях, я там чуть изменил, сделал более удобно, создал переменную, и можно на проятжении всего скрипта менять цвет прогресс бара, ну так, для забавы :)

Limonica 13-12-2012 20:19 2044791

есть ли в NSIS какая то переменная для 64 систем в папку system32, $SYSDIR идёт в SysWOW64.

Habetdin 13-12-2012 22:45 2044875

Limonica, пример Wow64DisableWow64FsRedirection:
Код:

!include x64.nsh
${If} ${RunningX64}
  ${DisableX64FSRedirection}
  ; Нужный код...
  ; SetOutPath "$SYSDIR"
  ; File /r "Files64\*.*"
${EndIf}



Еще, может быть полезным для переключения между 32/64-битными разделами реестра для записи:
Код:

SetRegView 32
WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\My App.exe" "" "$SYSDIR\My App.exe"
SetRegView 64
WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\My App.exe" "" "$SYSDIR\My App.exe"


MKN 14-12-2012 09:03 2045052

Цитата:

Цитата K.A.V.
У кого как »

Я это пытался реализовать на кастомной странице в nsdialogs...
Цитата:

Цитата K.A.V.
ну так, для забавы »

Вообщем конечно забава, как и всё связанное с украшением-оформлением... Но для разнообразия и демонстрации - наглядно и красочно :)

K.A.V. 14-12-2012 10:03 2045074

Цитата:

Цитата MKN
Я это пытался реализовать на кастомной странице в nsdialogs... »

Ну, сам функционал я написал, думаю там уже не сложно будет под nsdialogs подогнать, или не работает? :)

Цитата:

Цитата MKN
Вообщем конечно забава, как и всё связанное с украшением-оформлением... Но для разнообразия и демонстрации - наглядно и красочно »

Это понятно, нужно выделяться из серой массы унылых инсталляторов :biggrin:

MKN 15-12-2012 10:35 2045687

Оказывается, умельцы с форума winamp.com смогли приспособить известную в Inno Setup, оформительскую botva2.dll для NSIS.
Примечательно, что для оформления, к примеру, кнопки, код занимает по сути, всего одну строку ! В отличии от загородки из кучи кода в NSIS...
Код:

!include "MUI2.nsh"

Page custom custom.Create
!insertmacro MUI_LANGUAGE "English"

OutFile Test_botva2dll.exe

Function custom.Create
    nsDialogs::Create 1018
    Pop $0
    InitPluginsDir
    File /oname=$PLUGINSDIR\botva2.dll botva2.dll
    File /oname=$PLUGINSDIR\Google.png Google.png
    System::Call "botva2::BtnCreate(ir0,i0,i0,i157,i15,t'$PLUGINSDIR\Google.png',i0,i0)i.R0"
    nsDialogs::Show
FunctionEnd

/*
    ;Functions declaration in Inno Setup Script
    botva2::BtnCreate(hParent:HWND; Left,Top,Width,Height:integer; FileName:PAnsiChar; ShadowWidth:integer; IsCheckBtn:boolean):HWND;
    botva2::BtnGetChecked(h:HWND):boolean;
    botva2::BtnGetEnabled(h:HWND):boolean;
    botva2::BtnGetPosition
    botva2::BtnGetText
    botva2::BtnGetVisibility
    botva2::BtnRefresh(h:HWND);
    botva2::BtnSetChecked(h:HWND; Value:boolean);
    botva2::BtnSetCursor(h:HWND; hCur:Cardinal);
    botva2::BtnSetEnabled(h:HWND; Value:boolean);
    botva2::BtnSetEvent(h:HWND; EventID:integer; Event:Longword);
    botva2::BtnSetFont(h:HWND; Font:Cardinal);
    botva2::BtnSetFontColor(h:HWND; NormalFontColor, FocusedFontColor, PressedFontColor, DisabledFontColor: Cardinal);
    botva2::BtnSetPosition(h:HWND; NewLeft, NewTop, NewWidth, NewHeight: integer);
    botva2::BtnSetText(h:HWND; Text:PAnsiChar);
    botva2::BtnSetTextAlignment(h:HWND; HorIndent, VertIndent:integer; Alignment:DWORD);
    botva2::BtnSetVisibility(h:HWND; Value:boolean);
    botva2::GetSysCursorHandle(id:integer):Cardinal;
    botva2::ImgApplyChanges(h:HWND);
    botva2::ImgGetVisibility(img:Longint):boolean;
    botva2::ImgLoad(Wnd :HWND; FileName :PAnsiChar; Left, Top, Width, Height :integer; Stretch, IsBkg :boolean) :Longint;
    botva2::ImgRelease(img :Longint);
    botva2::ImgSetPosition(img :Longint; NewLeft, NewTop, NewWidth, NewHeight :integer);
    botva2::ImgSetVisibility(img :Longint; Visible :boolean);
    botva2::gdipShutdown();
*/

Section
SectionEnd

Как бы использовать ВСЕ возможности этой DLL в NSIS ? Тут нужны спецы по API... Может помогут расшифровать эту DLL и показать на примерах её прочие возможности...

И , конечно здорово было бы иметь подобную DLL, заточенную конкретно под NSIS... Почему то никто до сих пор не сделал такой замечательной полезности ...

kotkovets 15-12-2012 12:38 2045747

Цитата:

Цитата MKN
Как бы использовать ВСЕ возможности этой DLL в NSIS ? Тут нужны спецы по API... Может помогут расшифровать эту DLL и показать на примерах её прочие возможности... »

а че ее расшифровывать, обычное API, что легко делать через system.dll
изучаешь API - и все тебе прелести, поэтому никто не делал, никто не хочет читать изучать - дай нам две строчки кода и отвали!

MKN 15-12-2012 14:02 2045785

Цитата:

Цитата kotkovets
изучаешь API - и все тебе прелести, поэтому никто не делал, никто не хочет читать изучать - дай нам две строчки кода и отвали! »

Не верная интерпретация вопроса. :) Специализированные плагины-DLL , макросы, хедеры и пр. : избавляют NSIS-пользователей (при чём, как новичков, так и гуру) от рутинных действий в написании тонн кода. Лень тут не при чём. :) На хрена пользоваться логарифмической линейкой, когда есть калькулятор (если конечно есть...). Здесь уже - целесообразность и здравый смысл.

Кто изучил и разбирается в API - молодец ! Кто делится этими познаниями с другими и на их базе создаёт инструментарий облегчающий жизнь NSIS-пользователям - два, нет, двадцать два раза - молодец ! :)
А позыв к углублённому познанию вопроса - дело тонкое и добровольно-индивидуальное. Тут, как поэта, муза должна посетить. А муза приходит не всегда и не к каждому... (что мы вообще знаем про NSIS-музу ? :) )

kotkovets 15-12-2012 14:38 2045806

MKN, предлагаю тебе написать, посидеть, попотеть - узнаешь много нового :)

MKN 15-12-2012 14:47 2045810

Цитата:

Цитата kotkovets
предлагаю тебе написать, посидеть, попотеть »

Дык я не ставлю под сомнение, что это труд. Порой нудный и не благодарный... Но резульат такого труда - всегда достоин уважения и вызывает только благодарность у пользователей, для которых собственно и трудился автор. Не только же для себя одного, и не в корзину ? :) Чтоб мы делали без сотен плагинов, которые их авторы, абсолютно альтруистично подарили пользователям.
А уж про сам NSIS и говорить нечего... :) Ессно только слова благодарности.

Salmo 17-12-2012 01:24 2046856

kotkovets, Здравствуйте, с уважением... Я совсем недавно начал знакомиться со NSIS в довольно узком сегменте свойств. Прочитал в справке о разработанной Вами библиотеке ProcessFunc.nsh для работы с процессами. В справке написано:"Гарантировано работает начиная от Windows 2000 и выше, независимо от разрядности системы х32 или х64." Означают ли эти слова, что средствами библиотеки возможен доступ по всем заявленным функциям к процессам, как 32 битным, так и 64 битным на системе 64 бит? Проверить не могу, такой машины нет...

kotkovets 17-12-2012 11:48 2047086

Цитата:

Цитата Salmo
Означают ли эти слова, что средствами библиотеки возможен доступ по всем заявленным функциям к процессам, как 32 битным, так и 64 битным на системе 64 бит? Проверить не могу, такой машины нет... »

конечно, проверял лично.
---
а также, написанная мною библиотека, полностью совместима с юникодной версией компилятора NSIS
для юникодной nsis файл ProcessFunc.nsh сохраняем в любой кодировке unicode.

Krinkels 18-12-2012 10:34 2047873

Цитата:

Цитата MKN
Как бы использовать ВСЕ возможности этой DLL в NSIS ? Тут нужны спецы по API... Может помогут расшифровать эту DLL и показать на примерах её прочие возможности... »

Друзья, тут можете скачать botva2 0.9.5.130 + примеры + описание api

Impeck 18-12-2012 14:26 2048013

Вложений: 1
подскажите, возможно ли сделать доп. страницу в инстолляторе c nsDialogs без верхней шапки и с картинкой по всей высоте (см. вложение).

MKN 18-12-2012 15:10 2048055

Impeck,
Отредактируй размер в modern.exe и помещай картинку куда угодно.

Valdise 20-12-2012 13:21 2049611

Моё почтение!
Подучите, пожалуйста, а то своим умишком ни как не дотямлю:
Как на доп. странице выбора компонентов, группы чекбоксов связать с Радиокнопками?
Например Радиокнопка "Для ВСЕХ", с ней связана пара отдельных чекбоксов; вторая Радио "Для текущего", с другими чекбоксами.
Как-бы соорудить, чтобы при выборе радиокнопки "Для ВСЕХ" становились активными ТОЛЬКО чекбоксы "ВСЕХ", а при выборе Радиобуттона "Для текущего" были активны ТОЛЬКО чекбоксы "текущего".

Т.е чтобы при выборе "ВСЕМ" отметить чекбоксы "Текущему" было-бы нельзя и наоборот.

snezhinka 20-12-2012 17:23 2049809

Подскажите, пожалуйста. Мне необходимо, чтобы перед установкой пользователь выбрал бы сам необходимый ему файл (путь к нему и название самого файла)..Возможно ли переделать MUI_PAGE_DIRECTORY или это решается только созданием своей страницы?

MKN 20-12-2012 17:59 2049837

Цитата:

Цитата snezhinka
необходимо, чтобы перед установкой пользователь выбрал бы сам необходимый ему файл »

Открытие файла можно организовать с помощью Dialogs plug-in (http://nsis.sourceforge.net/Dialogs_plug-in)

MaGoth 23-12-2012 16:30 2051672

Привет народ, :)
Вопрос имеется, можно ли привязать вывод этого:
Код:

!insertmacro MUI_PAGE_LICENSE ".\Text.rtf"
и подобного ему файлов на страницах установки, к выбранному в Нсис языку?

Максимум что смог добиться это безошибочной компиляции с выводом этих страниц, в которых в место текста пустота.

diakov 23-12-2012 18:07 2051731

Цитата:

Цитата MaGoth
можно ли привязать »

Код:

!insertmacro MUI_PAGE_WELCOME
!define MUI_PAGE_CUSTOMFUNCTION_SHOW "LICENSE_SHOW"
!insertmacro MUI_PAGE_LICENSE "${NSISDIR}\COPYING"
!insertmacro MUI_PAGE_FINISH

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}

  FindWindow $0 "#32770" "" $HWNDPARENT
  GetDlgItem $0 $0 1000
  CustomLicense::LoadFile "$PLUGINSDIR\info.rtf" $0
FunctionEnd


MaGoth 23-12-2012 20:23 2051823

diakov, Спасибо. :)
Вариант твой конечно интересный, но слишком громоздкий + много чего не нужного и лишнего используется...
Относительно, и пока на половину решил проблему так:

Код:

;Для блока страниц MUI_PAGE
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE "$(license)"
!insertmacro MUI_PAGE_README "$(Readme)"

...

;Далее, после блока MUI_LANGUAGE:
!insertmacro MUI_LANGUAGE "ENGLISH"
!insertmacro MUI_LANGUAGE "ROMANIAN"
!insertmacro MUI_LANGUAGE "GERMAN"
!insertmacro MUI_LANGUAGE "RUSSIAN"

...

;Прописал это:
LicenseLangString license ${LANG_ENGLISH}        ".\setup\en\Text_License.rtf"
LicenseLangString license ${LANG_ROMANIAN}        ".\setup\ro\Text_License.rtf"
LicenseLangString license ${LANG_GERMAN}        ".\setup\de\Text_License.rtf"
LicenseLangString license ${LANG_RUSSIAN}        ".\setup\ru\Text_License.rtf"

...

Протестировал вывод файла на трех языковых версиях, все отображается как нужно и в требуемом языке. Осталось только провернуть то же самое со строкой выделенной красным, есть у кого мысли на сей счет? Куда и что копать ?!

kotkovets 24-12-2012 13:10 2052395

Цитата:

Цитата MaGoth
Куда и что копать ?! »

точно также

MaGoth 24-12-2012 14:50 2052484

kotkovets, Было бы также не спрашивал, первым делом проверил, не работает. Похоже что присвоение второго значения для этой переменной не светит, ибо в "единицу времени" она может быть только одна, когда у меня их уже 2, и больше... Еще мысли есть?

Зы, И как напоминание, использую NSIS UTF.

kotkovets 24-12-2012 15:34 2052517

Цитата:

Цитата MaGoth
Похоже что присвоение второго значения для этой переменной »

само собой, я имел ввиду: по такой же схеме с другими названиями переменных и функции, наипросто просто! :)

MaGoth 24-12-2012 15:43 2052524

kotkovets, Дай пример, чет не въеду ни как про что ты...
Там ведь суть в чем, в том, что сам дубликат всей строки - не вариант, не зависимо от изменения в нем, названия функции имен используемых переменных и т.д.. Это я имел ввиду, говоря, что нельзя задать для переменной второй адрес каталога с требуемым файлом.


Зы, Если ничего не получится, то хоть польза будет от наших трудов, в справочнике откроешь новый раздел "Функции Нсис":
1. Простые.
2. Преопределенные (как используемая мною в примере, изменять ее, кстати тоже нельзя). :)

Limonica 24-12-2012 23:50 2052854

Всем привет, в Windows есть переменная %USERNAME% отображающая активного пользователя, есть ли такая переменная в NSIS или как можно получить имя оригинального пользователя не используя плагин UserMgr?

Begin2Fly 24-12-2012 23:54 2052857

Цитата:

Цитата Limonica
Всем привет, в Windows есть переменная %USERNAME% отображающая активного пользователя, есть ли такая переменная в NSIS или как можно получить имя оригинального пользователя не используя плагин UserMgr? »

Код:

ExpandEnvStrings $1 "%USERNAME%"
MessageBox MB_OK|MB_TOPMOST|MB_USERICON "$1 - текущий пользователь."


Limonica 25-12-2012 00:12 2052864

Спасибо конечно, но дело в том что на англоязычных системах как не странно нет переменной %USERNAME%, нужен альтернативный вариант..

MKN 25-12-2012 08:58 2052976

К слову сказать, но почему то не все переменные можно получить через ExpandEnvStrings - в Windows 7 и Windows 8. (в XP - всё получается)
В частности, для "%USERNAME%" всегда работает :
Код:

System::Call "advapi32::GetUserName(t .r0, *i ${NSIS_MAX_STRLEN} r1) i.r2"
DetailPrint "User name - $0"


MaGoth 25-12-2012 15:36 2053183

kotkovets, По моей проблеме ничего нового нет ? Я там в посте у себя поправочку сделал если что прочитай.

MKN 27-12-2012 11:05 2054379

Как то скучно в теме перед Новым Годом... Для разнообразия :
Попался код для проигрывания видео в процессе установки, на заднем FullScreen фоне. Видеофайл должен быть WMV формата.
http://www.mediafire.com/?jie4ce7ixjn4ez0
Интересно, каким образом изменить код, чтобы можно было проигрывать AVI и как бы организовать проигрывание в отдельном задаваемом окне на кастомной странице ?
Код:

OutFile WMV_Play.exe
Name WMV_Play

BGGradient 100010 100010 notext
XPStyle on

Function .onGUIInit
        SetPluginUnload alwaysoff
        FindWindow $0 "_Nb"
        System::Call "winmm::mciSendStringA(t 'open $\"$EXEDIR\video.wmv$\" alias vvv parent $0 style child', i 0, i 0, i 0)"
        System::Alloc 16
        Pop $1
        System::Call "user32::GetWindowRect(i $0, i $1)"
        System::Call "*$1(i.r2, i.r3, i.r4, i.r5)"
        System::Free $1
        System::Call "winmm::mciSendStringA(t 'put vvv destination at $2 $3 $4 $5', i 0, i 0, i 0)"
        System::Call "winmm::mciSendStringA(t 'window vvv stretch', i 0, i 0, i 0)"
        System::Call "winmm::mciSendStringA(t 'play vvv repeat',i 0, i 0, i 0)"
FunctionEnd

Function .onGUIEnd
        System::Call "winm::mciSendStringA(t 'stop vvv',i 0, i 0, i 0)"
        System::Call "winm::mciSendStringA(t 'close vvv',i 0, i 0, i 0)"
FunctionEnd

Section
SectionEnd


Krinkels 27-12-2012 15:52 2054536

MKN
ИМХО для NSIS это лишняя ненужность. Но чисто для интереса сделать можно :)

З.Ы. Пробовал сделать плагин аналог botva2.dll, но дальше загрузки изображения в память не дошел :)

Krinkels 27-12-2012 16:37 2054565

Вложений: 1
Плагин для инно для воспроизведения видео, хавает все для чего есть кодеки в системе

Limonica 29-12-2012 15:16 2055666

Необходимо завершить процесс ориентируясь на его путь, пример "$TEMP\main.exe", как это можно реализовать в NSIS, соответствующие плагины по работе с процессами, завершают процесс только по имени, у кого какие мысли по этому поводу...

K.A.V. 29-12-2012 15:50 2055682

Цитата:

Цитата Limonica
Необходимо завершить процесс ориентируясь на его путь, пример "$TEMP\main.exe", как это можно реализовать в NSIS, соответствующие плагины по работе с процессами, завершают процесс только по имени, у кого какие мысли по этому поводу... »

Есть мысль ознакомиться с нашим справочником по NSIS

Примеры кодов => Работа с процессами с помощью NSIS
В конце статьи есть "Перечисление запущенных процессов", таким способом думаю получится ;)

Salmo 30-12-2012 23:39 2056412

kotkovets, Здравствуйте. Скажите, пожалуйста, получилось осуществить эту идею?
http://forum.oszone.net/nextnewesttothread-218597.html
Ваше сообщение в конце страницы...

habib2302 06-01-2013 18:12 2060346

люди.дайте справку или полное описание всех плагинов лля NSIS на русском языке

alert30 07-01-2013 07:01 2060801

habib2302, держите

Painkiller 08-01-2013 01:04 2061512

Народ, подскажите! Как из dll взять иконку на создаваемый ярлык ???
Пробовал так
Код:

CreateShortCut "$SENDTO\CAB распаковать.lnk" "$SYSDIR\wscript.exe" '"$INSTDIR\AllInOne.vbs" "/OUT"' "$OUTDIR\XTools.dll,9"
и
Код:

CreateShortCut "$SENDTO\CAB распаковать.lnk" "$SYSDIR\wscript.exe" '"$INSTDIR\AllInOne.vbs" "/OUT"' "$INSTDIR\XTools.dll,9"
и
Код:

CreateShortCut "$SENDTO\CAB распаковать.lnk" "$SYSDIR\wscript.exe" '"$INSTDIR\AllInOne.vbs" "/OUT"' "$INSTDIR\XTools.dll,-9"
Не пашит (((

K.A.V. 08-01-2013 02:30 2061555

Painkiller, справку читайте внимательней, пример из справки:

Ярлык с файлом иконки:
Код:

CreateShortCut "$DESKTOP\Справочник по NSIS.lnk" "$WINDIR\NSIS_Help.chm" "" "$WINDIR\Explorer.exe" "2"
Т.е. индекс иконки прописывается отдельно от имени файла, в следующих кавычках

MKN 11-01-2013 16:45 2064376

Может кому пригодится код, позволяющий создать на кастомной странице активную гиперссылку с "тултипом" :
Код:

!include "MUI2.nsh"

Page custom nsDialogsPage
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

Name "link_click_tooltips"
OutFile "link_click_tooltips.exe"
XPStyle on
Var Link
Var tipS

Function OnTimer
${Unless} $tips <> 0
System::Call USER32::CreateWindowEx(i0x00000008,t"tooltips_class32",i,i0x80000000,i,i,i,i,i,i,i0,i)i.s
  Pop $tipS
${EndUnless}
  System::Alloc 16
Pop $0
  System::Call USER32::GetCursorPos(ir0)
  System::Call *$0(i.r1,i.r2)
  System::Free $0
  System::Call USER32::WindowFromPoint(ir1,ir2)i.r1
${If} $1 = $Link
  StrCpy $R1 "oszone.net - лучший ресурс !"
  FindWindow $3 "#32770" "" $HWNDPARENT
  System::Call *(i0x28,i0x010,i$3,i0x409,i,i,i,i,i0,tR1)i.R1
  SendMessage $tipS 1028 0 $R1
  SendMessage $tipS 1033 0 $R1
  SendMessage $tipS 1025 1 0
  SendMessage $tipS 1041 1 $R1
  System::Free $R1
  SetCtlColors $Link  0xFF0000 transparent
  System::Call USER32::LoadCursor(i,i32649)i.s
  System::Call USER32::SetCursor(is)
${Else}
  SendMessage $tipS 1025 0 0
  SetCtlColors $Link  0x0000FF transparent
${EndIf}
  System::Call user32::RedrawWindow(i$Link,i0,i0,i0x0105)
FunctionEnd

Function nsDialogsPage
nsDialogs::Create 1018
  Pop $0
  ${NSD_CreateLabel} 130u 50u 100% 15u "oszone.net"
  Pop $Link
  SetCtlColors $Link  0x0000FF transparent
  System::Call user32::SetClassLong(i$Link,i-12,i0)
  ${NSD_OnClick} $Link OnClick
  ${NSD_CreateTimer} OnTimer 50
nsDialogs::Show
FunctionEnd

Function OnClick
ExecShell "open" "http://forum.oszone.net/thread-248731.html"
FunctionEnd

Section
SectionEnd


MKN 15-01-2013 11:46 2067088

Среди API функций, есть функция FindExecutable, которая находит имя приложения, связанного с заданным типом файла.
К примеру, эту функцию можно задействовать для определения браузера по умолчанию, что часто необходимо.
Алгоритм нахождения такой : в браузере, как правило, открываются файлы htm и html. Создаём временно такой файл, "натравливаем" на него функцию и ищем приложение, которое открывает этот тип файлов.
Код:

Name "opens_by_default"
Caption "opens_by_default"
OutFile "opens_by_default.exe"

Section
StrCpy $R1 htm
FileOpen $0 "$TEMP\opens_by_default.$R1" "w"
FileClose $0
System::Call "Shell32::FindExecutable(t '$TEMP\opens_by_default.$R1', i 0, t .r1)"
Delete "$TEMP\opens_by_default.$R1"
MessageBox MB_OK '$R1 файлы по умолчанию открывает  : $1 '
SectionEnd

Таким же образом можно получить данные о программах, открывающих другие типы файлов. Для этого указываем в коде нужное расширение файла.

K.A.V. 16-01-2013 00:16 2067716

Цитата:

Цитата MKN
Может кому пригодится код, позволяющий создать на кастомной странице активную гиперссылку с "тултипом" : »

Цитата:

Цитата MKN
Среди API функций, есть функция FindExecutable, которая находит имя приложения, связанного с заданным типом файла. »

Можно сразу такие полезняшки оформлять в виде странички из справочника, а мы потом добавим :)

Цитата:

Цитата MKN
Может кому пригодится код »

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

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

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

MKN 16-01-2013 10:47 2067882

Вложений: 1
K.A.V.,
Для справочника инфу ведь надо как то правильно оформлять...

Вот ещё занятный пример:

Установка на кнопку стандартной страницы, таймера с индикацией обратного отсчёта, т.е. задержка активности кнопки перед продолжением установки.

Например, для кнопки "Install" для PAGE_WELCOME или для кнопки "I Agree" для PAGE_LICENSE.
Где можно применить - например, чтобы пользователь перед установкой прочитал чего нибудь полезное, а не сразу клацал кнопками продолжения установки.
Для этого есть спец. DLL ( местонахождение DLL - рядом со скриптом, ессно при наличии в коде !AddPluginDir ".\" ) :

Код:

!AddPluginDir ".\"
Name "Delay the next button"
OutFile "Delay the next button.exe"
Caption "Delay the next button"
!include MUI2.nsh

!define MUI_CUSTOMFUNCTION_ABORT OnUserAbort

;таймер кнопки "Install" для PAGE_WELCOME
;!define MUI_PAGE_CUSTOMFUNCTION_SHOW LicensePage
;!insertmacro MUI_PAGE_WELCOME
; или
;таймер кнопки "I Agree" для PAGE_LICENSE
!define MUI_PAGE_CUSTOMFUNCTION_SHOW LicensePage
!insertmacro MUI_PAGE_LICENSE "${__FILE__}"

!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE English

Function LicensePage
        GetDlgItem $0 $HWNDPARENT 1
        Delay::DelayButton /NOUNLOAD $0 10 ""
        Pop $1
FunctionEnd
Function .onGUIEnd
        Delay::Free
FunctionEnd
Function OnUserAbort
        Delay::Free
FunctionEnd
Section
SectionEnd

Значение задержки можно изменять (как - это очевидно в коде )

MKN 17-01-2013 17:10 2068932

ToolTips (всплывающие подсказки) на стандартной странице выбора компонентов (PAGE_COMPONENTS)

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

Код:

!define MUI_COMPONENTSPAGE_NODESC
!include MUI2.nsh
!include LogicLib.nsh

!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE English

outfile "PAGE_COMPONENTS_ToolTip.exe"

Section Section1 ID_Sec1
SectionEnd
Section Section2 ID_Sec2
SectionEnd
Section Section3 ID_Sec3
SectionEnd
Section Section4 ID_Sec4
SectionEnd

var ttip

!define WS_POPUP 0x80000000
!define TTF_SUBCLASS    0x010
!define /math TTM_ACTIVATE ${WM_USER} + 1
!define /math TTM_ADDTOOL ${WM_USER} + 4
!define /math TTM_SETTOOLINFO ${WM_USER} + 9
!define /math TTM_TRACKACTIVATE ${WM_USER} + 17
!define /math TTM_TRACKPOSITION ${WM_USER} + 18
!define /math TTM_POP ${WM_USER} + 28
!define /math TTM_POPUP ${WM_USER} + 34

Function .onMouseOverSection
${If} $0 = -1
killtip:
    SendMessage $ttip ${TTM_ACTIVATE} 0 0
    Return
${EndIf}
StrCpy $2 ""
${If} $ttip = 0
    System::Call 'USER32::CreateWindowEx(i${WS_EX_TOPMOST},t"tooltips_class32",i,i${WS_POPUP},i,i,i,i,i0,i,i,i)i.r2'
    StrCpy $ttip $2
${EndIf}

StrCpy $1 ""
${Select} $0
${Case} ${ID_Sec1}
    StrCpy $1 "Это секция 1"
${Case} ${ID_Sec2}
    StrCpy $1 "Это секция 2"
${Case} ${ID_Sec3}
    StrCpy $1 "Это секция 3"
${Case} ${ID_Sec4}
    StrCpy $1 "Это секция 4 **************************************** Это секция 4"
${EndSelect}

FindWindow $3 "#32770" "" $HWNDPARENT
System::Call '*(i40,i${TTF_SUBCLASS},i$3,i0x408,i,i,i,i,i0,tr1)i.r1'
SendMessage $2 ${TTM_ADDTOOL} 0 $1
SendMessage $ttip ${TTM_SETTOOLINFO} 0 $1
SendMessage $ttip ${TTM_ACTIVATE} 1 0
SendMessage $ttip ${TTM_TRACKACTIVATE} 1 $1
System::Free $1
${If} $2 <> 0
System::Call 'USER32::IsWindowVisible(ir3)i.r0'
${IfThen} $0 = 0 ${|} goto killtip ${|}
${EndIf}
FunctionEnd
Section
SectionEnd


diakov 18-01-2013 00:55 2069220

MKN, может разтолкуеш роботу этого плага http://nsis.sourceforge.net/ToolTips_plug-in
В нем мне кажется все как то проще...вот пытаюсь его привязать к радиобутону в Page custom
в PageInit ставлю код:

Код:

FindWindow $0 "#32770" "" $HWNDPARENT
  GetDlgItem $5 $0 1201 #  id радибутона 1201  instance соответственно 5
  ToolTips::Classic $5 "Вот и он....!"

Но так почему то не работает..мож что то упускаю? :)

K.A.V. 18-01-2013 01:25 2069233

Цитата:

Цитата diakov
Но так почему то не работает..мож что то упускаю? »

C помощью чего создаёте страничку? nsDialogs? Вы хотя бы кусок своего кода приводите...

Вот пример с nsDialogs с чекбоксом

Код:

!include "MUI2.nsh"
!include "FileFunc.nsh"
!include "LogicLib.nsh"
!include "WinMessages.nsh"
!include "nsDialogs.nsh"

Page custom func
!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
Var Label
Var MyVar
 
Function func
 nsDialogs::Create 1018
 pop $0

 GetDlgItem $0 $HWNDPARENT 1037
 SendMessage $0 ${WM_SETTEXT} 0 "STR:Мой текст строки №1"

 GetDlgItem $0 $HWNDPARENT 1038
 SendMessage $0 ${WM_SETTEXT} 0 "STR:Мой текст строки №2"

 
${NSD_CreateCheckbox} 25u 27u 68u 14u "checkbox"
 pop $checkbox
 
  ToolTips::Classic $checkbox "Вот и он....!"

 
 
 ${NSD_CreateLabel} 0 5u 100u 10u ""
 pop $Label

 
 nsDialogs::Show
FunctionEnd
 
 


Section
;SetAutoClose true
SectionEnd


MKN 18-01-2013 08:53 2069304

Цитата:

Цитата diakov
В нем мне кажется все как то проще... »

Проще - для кастомной страницы. А со стандартными надо поизгиляться. :) Тем вышеприведённые коды и интересны. ИМХО...
А вообще вся "фишка" в функции CreateWindowEx. Но создание tooltips, это так, между прочим... Ведь с её помощью можно создавать разнообразные объекты на страницах, особенно интересно, что на стандартных. Но вариации параметров мне далеко не все понятны.

Хотел бы попросить kotkovets, сделать как нибудь подробный разбор этой полезнейшей функции (наверное и сопутствующих GetWindowRect , MapWindowPoints, SetWindowPos и т.д.) - применимо к использованию в NSIS.
Док по ним ужасно мутный для "рядового" понимания.... И примеры на Cи...

diakov 18-01-2013 19:31 2069810

K.A.V., а можно сделать в ToolTips перенос по строкам, чтобы все не в одну строчку было?

K.A.V. 19-01-2013 01:05 2070031

Цитата:

Цитата diakov
K.A.V., а можно сделать в ToolTips перенос по строкам, чтобы все не в одну строчку было? »

Ну подставьте в строку символ $\n
В классическом тултипе не срабатывает переноска строк, в модерне переносит :)

kotkovets 19-01-2013 01:07 2070033

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

MKN 19-01-2013 10:36 2070146

Вложений: 1
Попытаюсь примерами "подогреть" интерес к NSIS System Plug-in и в частности к функции CreateWindowEx .

Пример 1 : Создаём на странице окно и помещаем в это окно WebBrowser :
(можно просматривать страницы, как в интернете, так и локально обычные htm html )

Код:

!AddPluginDir ".\"
!include MUI2.nsh

Page custom fnc_Create
;!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

Name "test2_CreateWindowEx"
Caption "test2 CreateWindowEx"
OutFile "test2_CreateWindowEx.exe"

Var dlg

Function fnc_Create
nsDialogs::Create 1018
Pop $dlg
       
System::Call `*(i,i,i,i)i(1,34,200,100).R0`
System::Call `user32::MapDialogRect(i$HWNDPARENT,iR0)`
System::Call `*$R0(i.s,i.s,i.s,i.s)`
System::Free $R0
FindWindow $R0 "#32770" "" $HWNDPARENT
System::Call `user32::CreateWindowEx(i,t"STATIC",in,i${DEFAULT_STYLES}|${SS_GRAYFRAME},i1,i1,i400,i200,iR0,i1100,in,in)i.R0`

WebCtrl::ShowWebInCtrl $R0 "http://www.google.ru"
;или
;WebCtrl::ShowWebInCtrl $R0 "$EXEDIR\index.htm"

nsDialogs::Show
FunctionEnd

Section
SectionEnd

Коротко, что для чего :
Функция CreateWindowEx создает разнообразные окна с расширенным стилем для разнообразных объектов.
"STATIC" - (статический элемент) Обозначает простое текстовое поле, окно или прямоугольник, используемый для надписей, окно или другие отдельные органы управления.
Координаты и размеры окна в данном примере, меняются в значениях - i1,i1,i400,i200
Стиль прямоугольника окна можно изменять (в примере это ${SS_GRAYFRAME} Наглядно видно что происходит, если менять например, на SS.BLACKRECT , SS_GRAYRECT и т.д. , не подгружая WebCtrl ),
Можно задавать тип объекта (создать кнопку, чекбокс, тултип, картинку, область текста и др.. )

Функция MapDialogRect конвертирует (преобразует) заданные единицы измерения диалогового окна - в экранные единицы (пиксели).

Команда WebCtrl:: работает со специальной DLL (это модернизированный nsWeb плагин )

kotkovets 19-01-2013 14:57 2070292

Цитата:

Цитата diakov
можно сделать в ToolTips перенос по строкам, чтобы все не в одну строчку было? »

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

!define TTM_SETMAXTIPWIDTH  0x418

Function .onMouseOverSection
${If} $0 = -1
killtip:
    SendMessage $ttip ${TTM_ACTIVATE} 0 0
    Return
${EndIf}
StrCpy $2 ""
${If} $ttip = 0
    System::Call 'USER32::CreateWindowEx(i${WS_EX_TOPMOST},t"tooltips_class32",i,i${WS_POPUP},i,i,i,i,i0,i,i,i)i.r2'
    StrCpy $ttip $2
    SendMessage $ttip ${TTM_SETMAXTIPWIDTH} 0 0xFFFFFF
${EndIf}

Цитата:

Цитата K.A.V.
Ну подставьте в строку символ $\n
В классическом тултипе не срабатывает переноска строк, в модерне переносит »

так при любом раскладе переносятся строки как нужно, при помощи символа - $\n
---
зы.
в моем примере уже автоматом добавляется это свойство тултипу

diakov 20-01-2013 00:56 2070679

Цитата:

Цитата kotkovets
так при любом раскладе переносятся строки как нужно, при помощи символа - $\n »

Если применять к ToolTips::Modern то срабатывает, а если к ToolTips::Classic то нет...

kotkovets 20-01-2013 11:39 2070851

Цитата:

Цитата diakov
Если применять к ToolTips::Modern то срабатывает, а если к ToolTips::Classic то нет... »

я не пользуюсь этим плагом - глючный...

diakov 20-01-2013 12:22 2070877

kotkovets, есть такой вопрос...вот например мозила создает папку профиля вот так
С:\Users\Пользователь\AppData\Roaming\Mozilla\Firefox\Profiles\5z4z2uxh.default\
Тоесть у каждого индивидуальная папка 5z4z2uxh.default, возможно ли как то получить в переменную этот путь, скажем прочить путь входящего в папку файла или как такое можно провернуть? Чтобы при установке можно было дописать в нее некоторые файлы.

Например как в описаном K.A.V. методе...только получается что в моем случае путь задан неявно...
Код:

${GetParent} "C:\Program Files\Winamp\uninstwa.exe" $R0
$R0="C:\Program Files\Winamp"


kotkovets 20-01-2013 13:02 2070908

diakov, а подумать?
например переменная $APPDATA при SetShellVarContext current возвращает такой путь:
Код:

Section
  SetShellVarContext current
  MessageBox MB_OK "$APPDATA\Mozilla\Firefox\Profiles" IDOK
SectionEnd

Вот уже есть путь к папке профиля Mozilla...
дальше просто в этой папке ищем папки по маске *uxh.default
Код:

OutFile test.exe
!include Logiclib.nsh

ShowInstDetails show

Function FindProfiles
    MessageBox MB_OK "$APPDATA\Mozilla\Firefox\Profiles\$1" IDOK
FunctionEnd


Section
  SetShellVarContext current
  FindFirst $0 $1 "$APPDATA\Mozilla\Firefox\Profiles\*uxh.default"
  ${DoUntil} $1 == ""
      Call FindProfiles
      FindNext $0 $1
  ${Loop}
  FindClose $0
SectionEnd

В функции FindProfiles делаем нужные действия...
под свои конкретные задачи скрипт переделать легко! действуй!

diakov 20-01-2013 13:08 2070911

Благодарствую сейчас буду экспериментировать.

MKN 20-01-2013 18:05 2071072

Применеие в NSIS функции CreateWindowEx

Пример 2. Размещение текста на странице.

Код:

StrCpy $R0 "Текст Текст Текст Текст"
FindWindow $0 "#32770" "" $HWNDPARENT
System::Call 'USER32::CreateWindowEx(i0,t "STATIC",t "$R0",i ${WS_CHILD}|${WS_VISIBLE},i140,i50,i200,i100,i $0,i222,i0,i0) $R2'

Этот пример малоинтересен для кастомной страницы, но полезен для стандартных страниц - для размещения текста в любом месте страницы.

Теперь, изменим создаваемый элемент управления (встроенного класса ) "STATIC" - на класс "EDIT"
Цитата:

EDIT (ОКНО РЕДАКТИРОВАНИЯ ТЕКСТА) - Окно, внутри которого пользователь может напечатать с клавиатуры текст. Пользователь дает ему фокус клавиатуры, инициируя мышью или перемещая в него, каретку путем нажатия клавиши ТАБУЛЯЦИИ (TAB).
Пользователь может вводить текст, когда окно редактирования текста отображает мигающую каретку
К знакомым уже стилям окна (WS_CHILD и WS_VISIBLE ) добавим WS_VSCROLL - для создания в окне вертикальной полосы просмотра (прокрутки) .
Ещё раз про установленные стили окна:
Цитата:

WS_CHILD - Дочернее окно.

WS_VISIBLE - Создается окно, которое сразу становится видимым. По умолчанию окна создаются невидимыми,
и для их отображения требуется вызывать функцию ShowWindow .
Установим следующие стили поля редактирования для класса EDIТ : ES_MULTILINE ES_WANTRETURN ES_AUTOVSCROLL
Цитата:

ES_MULTILINE - Многостроковое окно редактирования текста. По умолчанию - одностроковое окно.

ES_WANTRETURN - Определяет, чтобы код возврата каретки был вставлен тогда, когда пользователь нажимает клавишу ENTER при вводе текста в многострочное поле.

ES_AUTOVSCROLL - Автоматически перемещает текст вверх на одну страницу, при нажатии клавиши ENTER на последней строке.
В итоге сделаем на странице "кусочек" текстового редактора :
Код:

!include MUI2.nsh

Page custom fnc_Create
;!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

OutFile "test3_CreateWindowEx.exe"
Var dlg

Function fnc_Create
nsDialogs::Create 1018
Pop $dlg
StrCpy $R0 "Текст Текст Текст Текст"
FindWindow $0 "#32770" "" $HWNDPARENT
System::Call 'user32::CreateWindowEx(i0,t "EDIT",t "$R0",i ${WS_VISIBLE}|${WS_CHILD}|${WS_VSCROLL}|${ES_MULTILINE}|${ES_WANTRETURN}|${ES_AUTOVSCROLL},i50,i100,i200,i60,i $0,i222,i0,i0) $R2'
nsDialogs::Show
FunctionEnd

Section
SectionEnd

В этом "псевдоредакторе" можно вызвать контестное меню для вставки , копирования и т.д., но не ясно как сохранять текст, точнее как передавать текст в скрипт, далее для обработки... У кого какие мысли по поводу ?

kotkovets 20-01-2013 19:06 2071117

Цитата:

Цитата MKN
но не ясно как сохранять текст, точнее как передавать текст в скрипт, далее для обработки... У кого какие мысли по поводу »

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

System::Call 'user32::CreateWindowEx(i0,t "EDIT",t "$R0",i ${WS_VISIBLE}|${WS_CHILD}|${WS_VSCROLL}|${ES_MULTILINE}|${ES_WANTRETURN}|${ES_AUTOVSCROLL},i50,i100,i200,i60,i $0,i222,i0,i0)i.R2'
ну далее пользуемся макросами nsDialogs:
${NSD_GetText} $R2 $R3
MessageBox MB_OK "$R3" IDOK

---
nsDialogs - все делает также, но только для "своих" страничек, данный код полезен только, если нужно сделать диалог на стандартных страничках.

MKN 20-01-2013 21:31 2071242

kotkovets,
Подскажи пожалуйста - каким образом создать окно с рамкой, к примеру, для той же вставки текста ?
Пытался использовать для этого WS_BORDER и WS_DLGFRAME - без результата...

И такой вопрос - возможно ли поместить на странице отображение реального времени, т.е. попросту часы ?

Awral 20-01-2013 22:57 2071318

Здравствуйте. Сделал файл win.bmp из папки NSIS\Contrib\Graphics\Wizard на всю ширину инсталлятора. Теперь не виден текст. Вопрос: как убрать эту картинку на задний план, чтобы был виден текст?

kotkovets 20-01-2013 23:57 2071356

Цитата:

Цитата MKN
Пытался использовать для этого WS_BORDER и WS_DLGFRAME - без результата.. »

Код:

!define WS_BORDER 0x00800000

Function fnc_Create
nsDialogs::Create 1018
Pop $dlg
System::Call 'user32::CreateWindowEx(i0,t "EDIT",t "Текст Текст Текст Текст",\
                      i${DEFAULT_STYLES}|${WS_VSCROLL}|${ES_MULTILINE}|${ES_WANTRETURN}|${ES_AUTOVSCROLL}|${WS_BORDER},\
                      i50,i100,i200,i60,i$dlg,i222,i0,i0) i.R2'
 SendMessage $dlg ${WM_GETFONT} 0 0 $R9
 SendMessage $R2 ${WM_SETFONT} $R9 0

nsDialogs::Show
FunctionEnd

константа WS_BORDER нигде не объявлена поэтому объявляем.. http://msdn.microsoft.com/ru-ru/libr...(v=vs.85).aspx
константа DEFAULT_STYLES объявлена в nsDialogs.nsh, т.е достаточно прописать !include MUI2.nsh
---
FindWindow $0 "#32770" "" $HWNDPARENT - абсолютно ненужная здесь команда, дескриптор родительского окна в переменной $dlg
---
Цитата:

Цитата MKN
возможно ли поместить на странице отображение реального времени, т.е. попросту часы ? »

вполне... через таймер..
обновление..
к примеру в одну секунду...
читать дальше »
Код:

!include MUI2.nsh
!include "FileFunc.nsh"

Page custom fnc_Create
!insertmacro MUI_LANGUAGE "English"

OutFile "test_time-timer.exe"
Var dlg

!define WS_BORDER 0x00800000

Function fnc_Create
nsDialogs::Create 1018
Pop $dlg
${GetTime} "" "L" $0 $1 $2 $3 $4 $5 $6
System::Call 'user32::CreateWindowEx(i0,t "EDIT",t "$3  $4:$5:$6",\
                      i${DEFAULT_STYLES}|${WS_VSCROLL}|${ES_MULTILINE}|${ES_WANTRETURN}|${ES_AUTOVSCROLL}|${WS_BORDER},\
                      i50,i100,i200,i60,i$dlg,i222,i0,i0) i.R2'
 SendMessage $dlg ${WM_GETFONT} 0 0 $R9
 SendMessage $R2 ${WM_SETFONT} $R9 0                     
${NSD_CreateTimer} OnTimer 1000
nsDialogs::Show
  ${NSD_KillTimer} OnTimer
FunctionEnd

Function OnTimer
  ${GetTime} "" "L" $0 $1 $2 $3 $4 $5 $6
  ${NSD_SetText} $R2 "$3  $4:$5:$6"
FunctionEnd

Section
SectionEnd


Так как, созданному элементу таким способом присваивается системный шрифт - не очень красиво...
установим элементу шрифт родительского окна, сразу после создания диалога:
Код:

SendMessage $dlg ${WM_GETFONT} 0 0 $R9
 SendMessage $R2 ${WM_SETFONT} $R9 0


kotkovets 21-01-2013 00:18 2071366

Цитата:

Цитата Awral
Здравствуйте. Сделал файл win.bmp из папки NSIS\Contrib\Graphics\Wizard на всю ширину инсталлятора. Теперь не виден текст. Вопрос: как убрать эту картинку на задний план, чтобы был виден текст? »

текст добавлять по скрипту выше (раньше, команды выполняются последовательно), чем картинка..
как то так вкратце - важно последовательность действий

MKN 21-01-2013 10:53 2071520

kotkovets, благодарю за примеры !
Цитата:

Цитата kotkovets
установим элементу шрифт родительского окна, сразу после создания диалога »

А каким образом указать на шрифт, не установленный (не устанавливая его) в системе ?
Для этого , вроде как можно использовать функцию AddFontResourceEx или AddFontMemResourceEx
Но как это применимо в NSIS ?

ps В дельфи это пытались сделать так : http://www.delphimaster.net/view/4-1136633780/all
а так вроде на си http://www.gamedev.net/topic/551900-...esource-files/
http://www.codeguru.com/cpp/g-m/gdi/...talling-It.htm

Painkiller 21-01-2013 20:08 2071902

Народ, не подскажите как через nsis добавить апплет в установку удаления программ . Пример есть UninstallTool.cpl. Что с ним делать. Закинуть в sistem32 и что дальше??

Awral 21-01-2013 22:52 2071988

kotkovets, спасибо. Переставил блок ;Image control после ;Text в файле Welcome.nsh. Теперь все отобразилось нормально. Но появилась проблема. Можно ли как нибудь убрать фон, который присутствует у текста?

Я так понимаю за цвет фона отвечает строка
Код:

SetCtlColors $mui.WelcomePage.Text "" "${MUI_BGCOLOR}"
в файле Welcome.nsh. Но вот как установить прозрачный фон я не знаю =(

kotkovets 21-01-2013 23:52 2072016

Цитата:

Цитата Awral
в файле Welcome.nsh. Но вот как установить прозрачный фон я не знаю =( »

по моему так:
Код:

SetCtlColors $mui.WelcomePage.Text 0 transparent

Salmo 22-01-2013 04:30 2072083

Добрый день... Есть ли возможность в NSIS создавать не модальные окна сообщений? Скрипт до распаковки совершает длительное действие над текстовым файлом в цикле, - как этот процесс визуально обозначить? Повесить на это время баннер или сообщение.

profcom 22-01-2013 10:21 2072161

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

MKN 22-01-2013 13:38 2072287

Цитата:

Цитата profcom
при помощи функции CreateWindowEx мы создали кнопку, как мы можем отследить ее нажатие в реальном времени? »

Я знаю вариант только с помощью ButtonEvent плагина (ButtonEvent.dll) :
Заодно назовём это
Пример 3 Использование функции CreateWindowEx для создания кнопки. ( + создание MessageBox с помощью API )
Код:

!AddPluginDir ".\"
!include MUI2.nsh

Page custom fnc_Create
;!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

!define IDC_ABOUT 1300

OutFile "test3_CreateWindowEx.exe"
Var dlg

Function fnc_Create
nsDialogs::Create 1018
Pop $dlg
       
System::Call `*(i,i,i,i)i(1,34,200,100).R0`
System::Call `user32::MapDialogRect(i$HWNDPARENT,iR0)`
System::Call `*$R0(i.s,i.s,i.s,i.s)`
System::Free $R0
FindWindow $R0 "#32770" "" $HWNDPARENT
System::Call 'user32::CreateWindowEx(i0,t"Button",t"About",i${BS_PUSHBUTTON}|${WS_CHILD}|${WS_VISIBLE}|${WS_TABSTOP},i20,i10,i100,i30,i$HWNDPARENT,i${IDC_ABOUT},ir0,i0)i.R0'
GetFunctionAddress $0 FuncAbout
ButtonEvent::AddEventHandler /NoUnload ${IDC_ABOUT} $0

nsDialogs::Show
FunctionEnd

Function FuncAbout
    System::Call 'user32::MessageBox(i$HWNDPARENT,t"Была нажата кнопка About",t"About",i0x40)'
FunctionEnd

Section
SectionEnd


Цитата:

BS_PUSHBUTTON - Создается обычная кнопка.

WS_TABSTOP - Этот стиль указывает орган управления, на который можно переключиться при помощи клавиши <Tab>.
Данный стиль может быть использован только дочерними окнами в диалоговых панелях .

MessageBox function :
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
Наверняка можно обойтись без плагина...

kysk 22-01-2013 13:55 2072303

Ребят привет, помогите пожалуйста убрать с страницы установки Кнопочку "Детали.."
Не могу найти где она правится...

alert30 22-01-2013 14:40 2072356

kysk, http://forum.oszone.net/post-1884707.html#post1884707

kysk 22-01-2013 15:00 2072371

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

alert30 22-01-2013 15:10 2072382

kysk, может это:
вопрос - http://forum.oszone.net/post-1361791.html#post1361791
ответ - ниже http://forum.oszone.net/post-1361863.html#post1361863

kysk 22-01-2013 15:27 2072408

alert30, а куда прописывать этот скрипт?

K.A.V. 22-01-2013 15:28 2072409

Цитата:

Цитата kysk
Ребят один момент есть, как сделать чтобы при запуске инсталятора играла музыка и заканчевалась вплоть до его закрытия. »

Уважаемый, скачайте пожалуйста наш Справочник по NSIS на русском языке, там читайте следующую страничку:

Описание плагинов => NewAdvSplash: изображение перед запуском

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

Цитата:

Цитата kysk
alert30, а куда прописывать этот скрипт? »

Перевод справки NSIS => Стандартные функции

kysk 22-01-2013 16:04 2072453

Нечего не выходит с добавлением трека... Можно лично от вас готовый код, может что-то не то делаю.

MKN 22-01-2013 16:53 2072481

Для проигрывания аудио во время установки можно использовать такой известный код :
Код:

  !define SND_NAME "sound.mp3"

  OutFile "sound.exe"

  !include "MUI2.nsh"
  !insertmacro MUI_PAGE_WELCOME
  !insertmacro MUI_PAGE_DIRECTORY
  !insertmacro MUI_PAGE_INSTFILES
  !insertmacro MUI_LANGUAGE "English"
  !define MUI_ABORTWARNING
  InstallDir "$TEMP"

Function .onInit
  InitPluginsDir
  SetOutPath $PLUGINSDIR
  File "${SND_NAME}"
  System::Call 'msvfw32.dll::MCIWndCreate(i 0, i 0,i 0x0070, t "$PLUGINSDIR\${SND_NAME}") i .r0'
  SendMessage $0 0x0465 0 "STR:play repeat"
  System::Call 'user32.dll::ShowWindow(i r0, i 0)'
FunctionEnd

Section
SectionEnd

sound.mp3 - ваш файл.

K.A.V. 22-01-2013 16:54 2072482

Цитата:

Цитата kysk
Нечего не выходит с добавлением трека... Можно лично от вас готовый код, может что-то не то делаю. »

Можно лично от вас код, который Вы сами написали, и который не работает?

kysk 22-01-2013 17:06 2072489

Я писал по этой теме: http://forum.oszone.net/thread-67386-44.html

K.A.V. 22-01-2013 17:18 2072497

Цитата:

Цитата kysk
Я писал по этой теме: http://forum.oszone.net/thread-67386-44.html »

Что вы хотели сказать данной ссылкой?

Вы спросили:
Цитата:

Цитата kysk
как сделать чтобы при запуске инсталятора играла музыка »

На что я вам дал информацию, по которой можно реализовать нужный вам функционал

Вы мне отвечаете:
Цитата:

Цитата kysk
Нечего не выходит с добавлением трека »

Вы пробовали сами что-то написать? Так покажите, что наработали и мы укажем вам на ваши ошибки

А словосочетание
Цитата:

Цитата kysk
Можно лично от вас готовый код»

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

kysk 22-01-2013 17:22 2072501

!define SND_NAME "sound.mp3" - здесь же прописывается путь к аудио файлу? так: "D:\sound.wav" -- Ошибка MCI - пишет что данный файл не найден.. что делать?

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

MKN 22-01-2013 17:34 2072514

Цитата:

Цитата kysk
здесь же прописывается путь к аудио файлу? так: "D:\sound.wav" »

Не так. Это только имя твоего файла. Например, bla-bla.mp3
Кстати , этот код проигрывает и MIDI файлы. Чтобы не маяться дурью и не утяжелять дистр MP3 файлом, лучше уж проигрывать MIDI.

Например: !define SND_NAME "hotel_california.mid"

kysk 22-01-2013 17:39 2072518

Хм.. Куда тогда прописывается путь?

MKN 22-01-2013 17:50 2072526

Цитата:

Цитата kysk
Куда тогда прописывается путь? »

Путь уже задан - $PLUGINSDIR. Не заморачивайся, просто скопируй код, укажи свой файл и кури справочник. :)

kysk 22-01-2013 17:53 2072532

Ребят ну че никто не может обьяснить? Ну ткните пальцем, не врубаюсь я нифига у мну одни ошибки кидает пишет типо строка File "${SND_NAME}" содержит ошибку! Фиг его знает что делать, поткинь чистый код без всяких там включений инсталятора, финиша, старта страниц. Чисто код и куда его ставить.

MKN 22-01-2013 17:57 2072535

kysk,
Цитата:

Цитата K.A.V.
Мы можем набросать готовый код, но только в том случае, если видим, что лично Вы что-то пытаетесь сами написать своими руками »

Что означает - ты свой код наконец то покажешь или нет?

kysk 22-01-2013 18:06 2072545

====Вот скрипт инсталла====

; HM NIS Edit Wizard helper defines
!define PRODUCT_NAME "setup"
!define PRODUCT_VERSION "1.0"
!define PRODUCT_PUBLISHER "web"
!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 ------
!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"

;Проигрывание музыки------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Начало
!define SND_NAME "sound.wav"
OutFile "sound.exe"

; Welcome page
!insertmacro MUI_PAGE_WELCOME
; License page
!insertmacro MUI_PAGE_LICENSE "C:\Documents and Settings\Admin\Рабочий стол\лиц\1.txt"
; Directory page
!insertmacro MUI_PAGE_DIRECTORY
; Instfiles page
!insertmacro MUI_PAGE_INSTFILES
; Finish page
!insertmacro MUI_PAGE_FINISH

; Uninstaller pages
!insertmacro MUI_UNPAGE_INSTFILES

; Language files
!insertmacro MUI_LANGUAGE "Russian"

; MUI end ------


Function .onInit -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Сам скрипт
InitPluginsDir
SetOutPath $PLUGINSDIR
File "${SND_NAME}"
System::Call 'msvfw32.dll::MCIWndCreate(i 0, i 0,i 0x0070, t "$PLUGINSDIR\${SND_NAME}") i .r0'
SendMessage $0 0x0465 0 "STR:play repeat"
System::Call 'user32.dll::ShowWindow(i r0, i 0)'
FunctionEnd

Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "setup.exe"
InstallDir "$PROGRAMFILES\setup"
ShowInstDetails show
ShowUnInstDetails show

Section "MainSection" SEC01
SectionEnd

Section -AdditionalIcons
SetOutPath $INSTDIR
WriteIniStr "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}"
CreateDirectory "$SMPROGRAMS\setup"
CreateShortCut "$SMPROGRAMS\setup\Website.lnk" "$INSTDIR\${PRODUCT_NAME}.url"
CreateShortCut "$SMPROGRAMS\setup\Uninstall.lnk" "$INSTDIR\uninst.exe"
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


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
Delete "$INSTDIR\${PRODUCT_NAME}.url"
Delete "$INSTDIR\uninst.exe"

Delete "$SMPROGRAMS\setup\Uninstall.lnk"
Delete "$SMPROGRAMS\setup\Website.lnk"

RMDir "$SMPROGRAMS\setup"

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

MKN 22-01-2013 18:25 2072566

kysk,
А где у тебя находится файл sound.wav ? Он должен быть рядом с твоим скриптом.
Убери строку OutFile "sound.exe", у тебя же есть OutFile "setup.exe"
убери _______ за Function .onInit

kysk 22-01-2013 18:50 2072576

Сделал как ты говорил, спасибо получилось только теперь, он открывает какой-то мини проигрываетль и пишет что типо какой-то драйвер не найден)

Пробую этим способом:

Function .myGuiInit
File "D:\song.wav"
BgImage::Sound "$TEMP\song.wav"
FunctionEnd

Function .onGUIEnd
Delete "$TEMP\song.wav"
FunctionEnd

Инстал запускается но почему то не проигрывает трек, что здесь не правильно? Может нет строчки запуска трека?

kysk 22-01-2013 19:12 2072588

Ребят подскажите такую тему: Как сделать на финишной страницы или вообще можно это сделать например:

Текст: хотите прикупить вещи "заходите" к нам!

"заходите" - это будет ссылкой на сайт только нажав на нее откроется сайт.

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

Awral 22-01-2013 21:29 2072661

Цитата:

Цитата kotkovets
по моему так:

Код:

SetCtlColors $mui.WelcomePage.Text 0 transparent
»

Спасибо огромное! Все получилось!

profcom 22-01-2013 21:51 2072684

Цитата:

Цитата MKN
Я знаю вариант только с помощью ButtonEvent плагина (ButtonEvent.dll) : »

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

Цитата:

Цитата kysk
Ребят подскажите такую тему: Как сделать на финишной страницы или вообще можно это сделать например:
Текст: хотите прикупить вещи "заходите" к нам! »

Рисуй кастомную страницу. И все получиться.

kysk 23-01-2013 12:53 2073057

А можно как нибудь запретить скачивание файлов в $temp при запуске инсталятора?

profcom 23-01-2013 22:19 2073554

Цитата:

Цитата kysk
А можно как нибудь запретить скачивание файлов в $temp при запуске инсталятора? »

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

kysk 24-01-2013 11:06 2073799

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

MKN 24-01-2013 11:16 2073807

Цитата:

Цитата kysk
чтобы скрыть от пользователя своии временные файлы инсталятора »

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

kysk 24-01-2013 12:00 2073853

Нечего бояться, просто интересен функционал nsis'a
Но он и без того большой

Painkiller 24-01-2013 18:54 2074173

Народ, прошу помощи!!
Не срабатывает регистрация dll в x64 , а в x32 все ок . Причём в ручную dll регистрируется
Код:


SetOutPath "$INSTDIR"
File /r "C:\NSIS\XTools\XTools\*.*"
${If} ${RunningX64}
RegDLL "CopyFileNameExt64.dll"
Delete  "CopyFileNameExt32.dll"
RegDLL "HashTab64.dll"
Delete  "HashTab32.dll"
${Else}
RegDLL "CopyFileNameExt32.dll"
Delete  "CopyFileNameExt64.dll"
RegDLL "HashTab32.dll"
Delete "HashTab64.dll"
${EndIf}


Begin2Fly 24-01-2013 19:08 2074184

Painkiller, подтверждаю, замечал подобное на 64-битной Windows 7. Списал всё на устарелость NSIS. Региструю через nsExec::Exec 'regsvr32.exe /s "$INSTDIR\ax.dll"'.

Painkiller 24-01-2013 19:35 2074195

Еще заметил что не работает Plugins "KillProcDLL" на x64. Альтернативу бы его найти рабочую ??
taskkill что ли использовать =))

Begin2Fly 24-01-2013 19:37 2074198

Painkiller, опять же, занимался этим вопросом. Решение:
Код:

!include "nsProcess.nsh"
...
${nsProcess::KillProcess} "myprocess.exe" $R0


Painkiller 24-01-2013 20:07 2074213

Цитата:

Цитата Begin2Fly
Begin2Fly »

Цитата:

Цитата Begin2Fly
Painkiller, опять же, занимался этим вопросом. Решение:
Код:
!include "nsProcess.nsh"
...
${nsProcess::KillProcess} "myprocess.exe" $R0 »

Я уже реализовал через taskkill , но за такой вариант тоже спасибо )

Awral 25-01-2013 20:49 2075003

kotkovets, при компиляции ругается на строчку
Код:

!define WS_BORDER 0x00800000

kotkovets 26-01-2013 00:18 2075179

Цитата:

Цитата Awral
kotkovets, при компиляции ругается на строчку
Код:
!define WS_BORDER 0x00800000 »

если ругается, значит где-то объявлена в хедерах, по умолчанию - это константа нигде не объявлена...
можно просто записать вместо ${WS_BORDER} в коде цифрами - 0x00800000
Код:

System::Call 'user32::CreateWindowEx(i0,t "EDIT",t "Текст Текст Текст Текст",\
                      i${DEFAULT_STYLES}|${WS_VSCROLL}|${ES_MULTILINE}|${ES_WANTRETURN}|${ES_AUTOVSCROLL}|0x00800000,\
                      i50,i100,i200,i60,i$dlg,i222,i0,i0) i.R2'

или в начале кода записать так:
Код:

!ifndef WS_BORDER
  !define WS_BORDER 0x00800000
!endif

что означает, если больше нигде в хидерах не объявлена константа WS_BORDER, то нужно объявить эту константу.
Цитата:

Цитата Awral
Как все таки сделать границы, как на странице лицензии у поля с текстом? »

читайте доки - NSIS\Docs\nsDialogs

Awral 26-01-2013 00:25 2075184

kotkovets, Уже разобрался. Она была объявлена в самом начале кода. Поэтому и ругалась на повторное объявление. Спасибо =)

linkuha@vk 27-01-2013 19:15 2076257

помогите, пожалуйста:

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

прочел всю тему, всю справку, подобные примеры не нашел - видел только с выполнением msi и exe в секциях.

K.A.V. 27-01-2013 19:34 2076272

Цитата:

Цитата linkuha@vk
прочел всю тему, всю справку »

Да ладно? Хотите сказать, в Справочнике по NSIS нет описания принципа секций?

В справочнике: Статьи от hb860 => Секции и выбор компонентов
Попутно читаем про переменные и про команду File (В справочнике: Перевод справки NSIS => File)

linkuha@vk 27-01-2013 22:12 2076400

про секции я знаю, все сделал.
но я не включал MUI_PAGE_INSTFILES, т.к. я хочу чтобы в любом случае был выбор компонентов
и мне пишет "Установка успешно выполнена!", но ничего не устанавливается.

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

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

kotkovets 28-01-2013 00:44 2076499

Цитата:

Цитата linkuha@vk
но в статусе установки хотелось бы наблюдать не список распакованных файлов, а то какой компонент сейчас устанавливается, или все вместе. такое возможно?) »

справку читайте и поиском по сайту блин пользуйтесь...
http://forum.oszone.net/post-1515790-845.html

MKN 29-01-2013 12:57 2077553

В nsDialogs есть функция обратного вызова для кнопки "Назад" - nsDialogs::OnBack function_address.
А есть ли нечто подобное для кнопки "Далее" (Next) ? Я не обнаружил...
К примеру, надо организовать вызов какой либо функции перед переходом со страницы на страницу (скажем у меня 10 кастомных страниц и я перед переходом-открытием каждой последующей, хочу сначала делать нечто, при нажатии кнопки "Далее", на предыдущей странице, и только потом должна открыться последующая страница)
Как это можно реализовать ? И для стандартных страниц тоже...

kotkovets 29-01-2013 14:28 2077668

Цитата:

Цитата MKN
А есть ли нечто подобное для кнопки "Далее" (Next) ? Я не обнаружил... »

и не нужно, все равно далее откроется следующая страничка по скрипту...
Цитата:

Цитата MKN
К примеру, надо организовать вызов какой либо функции перед переходом со страницы на страницу (скажем у меня 10 кастомных страниц и я перед переходом-открытием каждой последующей, хочу сначала делать нечто, при нажатии кнопки "Далее", на предыдущей странице, и только потом должна открыться последующая страница) »

до команды nsDialogs::show (время показания странички) остальное все ДО, элементы диалога ты создаешь до...
Цитата:

Цитата MKN
И для стандартных страниц тоже... »

в справочнике: Оформление-> Интерфейс Модерн -> Стандартные функции

profcom 29-01-2013 15:11 2077714

Цитата:

Цитата MKN
А есть ли нечто подобное для кнопки "Далее" (Next) ? Я не обнаружил... »

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

MKN 29-01-2013 15:12 2077716

Цитата:

Цитата kotkovets
все равно далее откроется следующая страничка по скрипту... »

Мне нужно , чтобы сначала не страничка открылась, а сработала функция , которая укажет, как этой страничке открыться...
К примеру, чтобы следующая страница открывалась согласно моих параметров для функции AnimateWindow.
Если для первой страницы AnimateWindow работает как положено, то следующая, после клика Next, почему то игнорирует AnimateWindow...

И если уж говорить про AnimateWindow, то возможно ли её применение для окон созданных с помощью CreateWindowEx ?
Ни черта не получается анимировать созданные дополнительные окна, и ессно инфы нигде "ни гу-гу" ...
Если бы это удалось, то можно было бы оч. интересно оформлять элементы страниц...

K.A.V. 29-01-2013 15:28 2077733

Цитата:

Цитата MKN
К примеру, надо организовать вызов какой либо функции перед переходом со страницы на страницу »

Цитата:

Цитата kotkovets
до команды nsDialogs::show »

Точнее до инициализации диалога, т.е. до команды nsDialogs::Create

Цитата:

Цитата MKN
Мне нужно , чтобы сначала не страничка открылась, а сработала функция , которая укажет, как этой страничке открыться... »

В чем проблема то, MKN? Или мы чего-то с Вячеславом не понимаем?

Код:


!include "MUI2.nsh"
!include "FileFunc.nsh"
!include "LogicLib.nsh"
!include "WinMessages.nsh"
!include "nsDialogs.nsh"

Page custom Dialog_1
Page custom Dialog_2
Page custom Dialog_3

!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

Name "TEST.exe"
OutFile "TEST.exe"


 
Function Dialog_1
 nsDialogs::Create 1018
 pop $0
# Создание элементов диалога
 nsDialogs::Show
FunctionEnd




Function Dialog_2
# А В этом диалоге ЗДЕСЬ выполняется функция перед созданием диалога
call MyFunc

 nsDialogs::Create 1018
 pop $0
# Создание элементов диалога
 nsDialogs::Show
FunctionEnd

Function MyFunc
# Команды
FunctionEnd



Function Dialog_3
 nsDialogs::Create 1018
 pop $0
# Создание элементов диалога
 nsDialogs::Show
FunctionEnd


 
 


Section
SetAutoClose true
SectionEnd


MKN 29-01-2013 15:31 2077736

K.A.V.,
Так я уже делал... Не работает. Видно не всё так просто.
Вот код :
Код:

!define AW_HOR_POSITIVE 0x00000001
!define AW_HOR_NEGATIVE 0x00000002
;!define AW_VER_POSITIVE 0x00000004
;!define AW_VER_NEGATIVE 0x00000008
!define AW_CENTER 0x00000010
!define AW_HIDE  0x00010000
!define AW_ACTIVATE 0x00020000
!define AW_SLIDE 0x00040000
!define AW_BLEND        0x00080000

Function Cancel
    System::Call `user32::AnimateWindow(i$HWNDPARENT,i500,i${AW_SLIDE}|${AW_HOR_POSITIVE}|${AW_HIDE})`
FunctionEnd
!define MUI_CUSTOMFUNCTION_ABORT Cancel

Function .onInstSuccess
    System::Call `user32::AnimateWindow(i$HWNDPARENT,i1000,i${AW_BLEND}|${AW_HIDE})`
FunctionEnd

!include MUI2.nsh
;!include "FileFunc.nsh"
;!include "LogicLib.nsh"
;!include "WinMessages.nsh"

Page custom page1
;Page custom page2
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

OutFile "test_window_move.exe"
Var dlg
!define WS_BORDER 0x00800000

Function page1
nsDialogs::Create 1018
Pop $dlg
System::Call `user32::AnimateWindow(i$HWNDPARENT,i500,i${AW_SLIDE}|${AW_CENTER}|${AW_ACTIVATE})`

System::Call 'user32::CreateWindowEx(i0,t "STATIC",t "К этому окну позарез надо применить AnimateWindow ",\
                      i${DEFAULT_STYLES}|${WS_BORDER},\
                      i50,i100,i200,i60,i$dlg,i222,i0,i0) i.R2'

SendMessage $dlg ${WM_GETFONT} 0 0 $R9
SetCtlColors $R2 `0x0000FF` `0x99FFFF`
nsDialogs::Show
FunctionEnd

/*Function page2
call MyFunc
nsDialogs::Create 1018
Pop $dlg
nsDialogs::Show
FunctionEnd

Function MyFunc
System::Call `user32::AnimateWindow(i$HWNDPARENT,i500,i${AW_SLIDE}|${AW_HOR_POSITIVE}|${AW_ACTIVATE})`
FunctionEnd*/

Section
SectionEnd

Посмотрите сначала, как это работает с первой страницей, а потом раскомментите вторую и посмотрите, как НЕ работает анимация 2 страницы...

И просьба к kotkovets, - подскажи пожалуйста, как анимировать с помощью AnimateWindow, созданное CreateWindowEx окно ?

profcom 29-01-2013 17:13 2077818

Цитата:

Цитата MKN
подскажи пожалуйста, как анимировать с помощью AnimateWindow, созданное CreateWindowEx окно ? »

Есть подозрение что это не работает с дочерними окнами. По этому же и не работает анимация страниц, работает лишь с главным окном.

Был абсолютно не прав, у вас в скрипте просто ошибка, анимация не применяется из за неправильной строки. В функции страницы 1 вместо $HWNDPARENT надо применить $dlg.
Код:

Function page1
nsDialogs::Create 1018
Pop $dlg

System::Call 'user32::CreateWindowEx(i0,t "STATIC",t "К этому окну позарез надо применить AnimateWindow ",\
                      i${DEFAULT_STYLES}|${WS_BORDER},\
                      i50,i100,i200,i60,i$dlg,i222,i0,i0) i.R2'
System::Call `user32::AnimateWindow(i$dlg,i500,i${AW_SLIDE}|${AW_CENTER}|${AW_ACTIVATE})`

SendMessage $dlg ${WM_GETFONT} 0 0 $R9
SetCtlColors $R2 `0x0000FF` `0x99FFFF`
nsDialogs::Show
FunctionEnd


MKN 29-01-2013 17:31 2077836

Цитата:

Цитата profcom
у вас в скрипте просто ошибка »

Опаньки... А я прощёлкал этот момент и полез в такие оконные дебри... Спасибо !
Интересно сработает, если созданных окон несколько ?

K.A.V. 29-01-2013 17:40 2077845

MKN, как вариант с 2-ым диалогом могу предложить такое решение, добавить эффект исчезания, а потом появления
Т.к. вроде бы, функция анимации создаёт саму анимацию именно в действии, т.е. если окно уже показано, то к нему нельзя применить эффект опять появления
Сначала скрываем, а потом показываем, впринципе так даже получше будет мне кажется :)
Код:

!define AW_HOR_POSITIVE 0x00000001
!define AW_HOR_NEGATIVE 0x00000002
;!define AW_VER_POSITIVE 0x00000004
;!define AW_VER_NEGATIVE 0x00000008
!define AW_CENTER 0x00000010
!define AW_HIDE  0x00010000
!define AW_ACTIVATE 0x00020000
!define AW_SLIDE 0x00040000
!define AW_BLEND        0x00080000

Function Cancel
    System::Call `user32::AnimateWindow(i$HWNDPARENT,i500,i${AW_SLIDE}|${AW_HOR_POSITIVE}|${AW_HIDE})`
FunctionEnd
!define MUI_CUSTOMFUNCTION_ABORT Cancel

Function .onInstSuccess
    System::Call `user32::AnimateWindow(i$HWNDPARENT,i1000,i${AW_BLEND}|${AW_HIDE})`
FunctionEnd

!include MUI2.nsh
;!include "FileFunc.nsh"
;!include "LogicLib.nsh"
;!include "WinMessages.nsh"

Page custom page1
Page custom page2
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

OutFile "test_window_move.exe"
Var dlg
!define WS_BORDER 0x00800000

Function page1
nsDialogs::Create 1018
Pop $dlg
System::Call `user32::AnimateWindow(i$HWNDPARENT,i500,i${AW_SLIDE}|${AW_CENTER}|${AW_ACTIVATE})`

System::Call 'user32::CreateWindowEx(i0,t "STATIC",t "К этому окну позарез надо применить AnimateWindow ",\
                      i${DEFAULT_STYLES}|${WS_BORDER},\
                      i50,i100,i200,i60,i$dlg,i222,i0,i0) i.R2'

SendMessage $dlg ${WM_GETFONT} 0 0 $R9
SetCtlColors $R2 `0x0000FF` `0x99FFFF`

System::Call `user32::AnimateWindow(i$dlg,i500,i${AW_SLIDE}|${AW_CENTER}|${AW_ACTIVATE})`


nsDialogs::Show
FunctionEnd

Function page2
call MyFunc
nsDialogs::Create 1018
Pop $dlg
# Для видимости перелистывания диалога
 ${NSD_CreateCheckbox} 25u 27u 68u 14u "checkbox"
 ${NSD_CreateLabel} 0 5u 100u 10u "sdfsdfsdf"
#
nsDialogs::Show
FunctionEnd

Function MyFunc
System::Call `user32::AnimateWindow(i$HWNDPARENT,i500,i${AW_SLIDE}|${AW_HOR_NEGATIVE}|${AW_HIDE})`
System::Call `user32::AnimateWindow(i$HWNDPARENT,i500,i${AW_SLIDE}|${AW_HOR_POSITIVE}|${AW_ACTIVATE})`
FunctionEnd


Section
SectionEnd

Цитата:

Цитата MKN
И как быть , если созданных окон несколько ? »

Подставлять handle другого окна в вызов функции, не? :)

Цитата:

Цитата MKN
Только цвет теперь в созданном окне пропадает после анимации... »

поменяйте местами вызов функции анимации с присваением цвета, выделил жирным

profcom 29-01-2013 17:42 2077848

Цитата:

Цитата MKN
И как быть , если созданных окон несколько и к каждому надо применить свою анимацию и цвет ? »

Тогда будет правильней записать строку так :
Код:

System::Call `user32::AnimateWindow(i$R2,i500,i${AW_SLIDE}|${AW_CENTER}|${AW_ACTIVATE})`
это для созданного окна функцией CreateWindowEx в вашем случае.

MKN 29-01-2013 17:42 2077850

K.A.V.,
Действительно, оригинально получается (как затвор передёргивается :) )
С цветом уже понял...

Цитата:

Цитата profcom
Тогда будет правильней записать строку так : »

А вот с $R2 я начинал и выглядит это логично, но номер этот почему то не проходит... Нет анимации...

profcom 29-01-2013 17:46 2077855

Цитата:

Цитата MKN
А вот с $R2 я начинал и номер этот почему то не проходит... Нет анимации... »

У меня проходит, увеличь время показа с 500 до 2500 например и будет нагляднее.

MKN 29-01-2013 17:50 2077859

Цитата:

Цитата profcom
увеличь время показа с 500 до 2500 например и будет нагляднее. »

Не получается - просто появляется окно с небольшой задержкой без анимации... Интересно, почему так у меня ?
При таком нехорошем раскладе, как менять хэндлы созданных окон для анимации, если их будет несколько на одной странице ?

K.A.V. 29-01-2013 19:08 2077929

Цитата:

Цитата MKN
При таком нехорошем раскладе, как менять хэндлы созданных окон для анимации, если их будет несколько на одной странице ? »

Смари сюда :)

Создаём ещё одно такое же "окошко" выше первого:

Код:

System::Call 'user32::CreateWindowEx(i0,t "STATIC",t "К этому AnimateWindow ",\
                      i${DEFAULT_STYLES}|${WS_BORDER},\
                      i50,i10,i200,i60,i$dlg,i223,i0,i0) i.R2'
ShowWindow $R2 0
System::Call `user32::AnimateWindow(i$R2,i1000,i${AW_SLIDE}|${AW_VER_NEGATIVE}|${AW_ACTIVATE})`

Затем, мы делаем элемент скрытым командой ShowWindow, т.к. AnimateWindow не сработает, если мы попытаемся показать элемент, который уже показан :)
И потом только мы прописываем вызов функции анимации на созданный элемент

Как-то так ;)


Полный код:
читать дальше »

Код:

!define AW_HOR_POSITIVE 0x00000001
!define AW_HOR_NEGATIVE 0x00000002
!define AW_VER_POSITIVE 0x00000004
!define AW_VER_NEGATIVE 0x00000008
!define AW_CENTER 0x00000010
!define AW_HIDE  0x00010000
!define AW_ACTIVATE 0x00020000
!define AW_SLIDE 0x00040000
!define AW_BLEND        0x00080000

Function Cancel
    System::Call `user32::AnimateWindow(i$HWNDPARENT,i500,i${AW_SLIDE}|${AW_HOR_POSITIVE}|${AW_HIDE})`
FunctionEnd
!define MUI_CUSTOMFUNCTION_ABORT Cancel

Function .onInstSuccess
    System::Call `user32::AnimateWindow(i$HWNDPARENT,i1000,i${AW_BLEND}|${AW_HIDE})`
FunctionEnd

!include MUI2.nsh
;!include "FileFunc.nsh"
;!include "LogicLib.nsh"
;!include "WinMessages.nsh"

Page custom page1
Page custom page2
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

OutFile "test_window_move.exe"
Var dlg
!define WS_BORDER 0x00800000

Function page1
nsDialogs::Create 1018
Pop $dlg
System::Call `user32::AnimateWindow(i$HWNDPARENT,i500,i${AW_SLIDE}|${AW_CENTER}|${AW_ACTIVATE})`

System::Call 'user32::CreateWindowEx(i0,t "STATIC",t "К этому окну позарез надо применить AnimateWindow ",\
                      i${DEFAULT_STYLES}|${WS_BORDER},\
                      i50,i100,i200,i60,i$dlg,i222,i0,i0) i.R2'
SendMessage $dlg ${WM_GETFONT} 0 0 $R9
SetCtlColors $R2 `0x0000FF` `0x99FFFF`
System::Call `user32::AnimateWindow(i$dlg,i500,i${AW_SLIDE}|${AW_CENTER}|${AW_ACTIVATE})`


System::Call 'user32::CreateWindowEx(i0,t "STATIC",t "К этому AnimateWindow ",\
                      i${DEFAULT_STYLES}|${WS_BORDER},\
                      i50,i10,i200,i60,i$dlg,i223,i0,i0) i.R2'
ShowWindow $R2 0
System::Call `user32::AnimateWindow(i$R2,i1000,i${AW_SLIDE}|${AW_VER_NEGATIVE}|${AW_ACTIVATE})`

 

nsDialogs::Show
FunctionEnd

Function page2
call MyFunc
nsDialogs::Create 1018
Pop $dlg
# Для видимости перелистывания диалога
 ${NSD_CreateCheckbox} 25u 27u 68u 14u "checkbox"
 ${NSD_CreateLabel} 0 5u 100u 10u "sdfsdfsdf"
#
nsDialogs::Show
FunctionEnd

Function MyFunc
System::Call `user32::AnimateWindow(i$HWNDPARENT,i500,i${AW_SLIDE}|${AW_HOR_NEGATIVE}|${AW_HIDE})`
System::Call `user32::AnimateWindow(i$HWNDPARENT,i500,i${AW_SLIDE}|${AW_HOR_POSITIVE}|${AW_ACTIVATE})`
FunctionEnd

Section
SectionEnd


MKN 30-01-2013 12:17 2078379

Создаём прямоугольную область со скругленными углами (закругляем углы окна) с помощью функции CreateRoundRectRgn :
(можно вообще сделать окно страницы в виде эллипса или круга...)

Код:

!include MUI2.nsh

Page custom page1
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

OutFile "CreateRoundRectRgn.exe"
Var dlg
 
 Function page1
nsDialogs::Create 1018
Pop $dlg
System::Call "*(i, i, i, i)i.r0"; создать новую структуру
System::Call "User32::GetClientRect(i$HWNDPARENT, ir0)"; Получить новые координаты структуры - в $0
System::Call "*$0(i, i, i.r1, i.r2)"
 ;Функция GetClientRect извлекает координаты рабочей области окна. Рабочие координаты определяют левый верхний
 ;и нижний правый углы рабочей области. Поскольку рабочие координаты определены относительно левого верхнего угла
 ;рабочей области окна, координаты левого верхнего угла - (0,0).
System::Free $0, освободить оперативную память
IntOp $1 $1 + 5
IntOp $2 $2 + 30
 ;Отрегулируйте значения координат в CreateRoundRectRgn, как Вам надо
System::Call "Gdi32::CreateRoundRectRgn(i0,i0,ir1,ir2,i30,i40)i.r0"
System::Call "User32::SetWindowRgn(i$HWNDPARENT, ir0, i1)"
/*
int nLeftRect , // x -координата верхнего левого угла области
int nTopRect , // y -координата верхнего левого угла области
 
int nRightRect , // x -координата нижнего правого угла области
int nBottomRect , // y -координата нижнего правого угла области
   
int nWidthEllipse , // ширина эллипса для закругленных углов
int nHeightEllipse  // высота эллипса для закругленных углов

Параметры
nLeftRect - определяет x -координату верхнего левого угла области.
nTopRect - определяет y - координату верхнего левого угла области.
nRightRect - определяет x -координату нижнего правого угла области.
nBottomRect - определяет y -координату нижнего правого угла области.
nWidthEllipse - определяет ширину эллипса, используемого для создания закругленных углов.
nHeightEllipse - определяет высоту эллипса, используемого для создания закругленных углов.
*/
nsDialogs::Show
FunctionEnd

Section
SectionEnd

Интересно, можно ли закруглить углы окнам, созданным с помощью CreateWindowEx ?

kotkovets 30-01-2013 23:18 2078907

Цитата:

Цитата MKN
Интересно, можно ли закруглить углы окнам, созданным с помощью CreateWindowEx »

нет, для этого есть функции рисования (GDI) и отрисовки окон - в порядке обработки очередности сообщений винды,
а именно в событии WM_PAINT, ну что ли так:
http://radiofront.narod.ru/htm/prog/...api/paint.html
через нсисовский system это практически нереально..
проблема system - нормальная реализация обратных функций (калбеков)
в остальном system - хорош..

MKN 31-01-2013 10:41 2079168

Reposition Window - изменяем позицию (месторасположение) окна.
Может пригодится, когда окно инсталлятора закрывает собой другое окно, например запущенного приложения (или наоборот). Окно в нужный момент сместится-"отпрыгнет" в сторону.
Код:

!include MUI2.nsh
Page custom page1
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

OutFile "repositionWindow.exe"
Var dlg
Var btn
!define stRECT "(i, i, i, i) i"
!define SPI_GETWORKAREA            0x0030

Function page1
nsDialogs::Create 1018
Pop $dlg
${NSD_CreateButton} 80u 14u 120u 14u "Переместить окно"
pop $btn
${NSD_OnClick} $btn BtnClick
nsDialogs::Show
FunctionEnd

Function repositionWindow
        ; Создать RECT структуру.  Внутри этой структуры координаты углов. Верхний левый угол определяется двумя координатами left и top.
        ;Нижний правый соответственно определяется двумя оставшимися координатами - right и bottom.
        System::Call "*${stRECT} .r1"
       
        ; Получить окно прямоугольника.Функция GetWindowRect отыскивает размеры рамки ограничивающей прямоугольник
        ;определяемого окна. Размеры даны в экранных координатах, которые расположены относительно левого верхнего угла экрана.
        System::Call "User32::GetWindowRect(i, i) i ($HWNDPARENT, r1) .r2"
       
        ; Получить координаты
        System::Call "*$1${stRECT} (.r2, .r3, .r4, .r5)"

        ; Рассчитать ширину / высоту нашего окна
        IntOp $2 $4 - $2 ; $2 - ширина
        IntOp $3 $5 - $3 ; $3 - высота
       
        ; Определить размер рабочего стола без панели задач
        System::Call "User32::SystemParametersInfo(i, i, i, i) i (${SPI_GETWORKAREA}, 0, r1, 0) .r4"
       
        ; Получить координаты
        System::Call "*$1${stRECT} (.r4, .r5, .r6, .r7)"
       
        System::Free $1

        ; правую сторону экрана разделить на 4
        IntOp $0 $6 / 4
        IntOp $8 $2 / 4
        IntOp $0 $0 - $8
        ; нижнюю часть экрана разделить на 4
        IntOp $1 $7 / 4
        IntOp $8 $3 / 4
        IntOp $1 $1 - $8
       
        ;Установить новую позицию окна
        System::Call "User32::SetWindowPos(i, i, i, i, i, i, i) b ($HWNDPARENT, 0, $0, $1, 0, 0, 0x201)"
FunctionEnd

Function BtnClick
  pop $btn
  MessageBox MB_OK "Приготовились к прыжку ?" IDOK
  Call repositionWindow
FunctionEnd

Section
SectionEnd

Можно заставить прыгать и окна, созданные с помощью CreateWindowEx, более простым кодом, но возник вопрос - как вернуть окно на место, в исходную позицию, после повторного клика кнопки ? ( для любого кол-ва окон и кнопок)
Код :
Код:

!include MUI2.nsh
Page custom page1
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

OutFile "repositionWindowEx.exe"
Var dlg
Var btn
!define WS_BORDER 0x00800000

Function page1
nsDialogs::Create 1018
Pop $dlg
${NSD_CreateButton} 150u 14u 120u 14u "Переместить Window 1"
pop $btn
${NSD_OnClick} $btn BtnClick

System::Call 'user32::CreateWindowEx(i0,t "STATIC",t "Window 1",\
                      i${DEFAULT_STYLES}|${WS_BORDER},\
                      i50,i100,i200,i60,i$dlg,i222,i0,i0) i.R2'
SetCtlColors $R2 `0x0000FF` `0x99FFFF`
nsDialogs::Show
FunctionEnd

Function repositionWindow
        System::Call "User32::SetWindowPos(i, i, i, i, i, i, i) b ($R2, 0, 3, 3, 0, 0, 0x201)"
FunctionEnd

Function BtnClick
  pop $btn
  Call repositionWindow
FunctionEnd

Section
SectionEnd


kotkovets 31-01-2013 20:26 2079615

Цитата:

Цитата MKN
но возник вопрос - как вернуть окно на место, в исходную позицию...»

Но ты же с помощью CreateWindowEx создавал диалог и координаты известны..
Код:

...i50,i100...,i$dlg,i222,i0,i0) i.R2
Цитата:

Цитата MKN
как вернуть окно на место, в исходную позицию, после повторного клика кнопки ? ( для любого кол-ва окон и кнопок) »

из структуры рект родителя и дочернего окна - точнее, разницой первого члена структуры рект родителя и дочернего окна...
Код:

  System::Call "*(i,i,i,i)i.r1"
  System::Call "*(i,i,i,i)i.r3"
  System::Call "User32::GetWindowRect(iR2,ir1)"
  System::Call "User32::GetWindowRect(i$dlg,ir3)"
  System::Call "*$1(i.r2)"
  System::Call "*$3(i.r4)"
  Intop $5 $2 - $4

Эта разница постоянна, а вот если она изменится, то можно менять позицию окна..
т.е в данном примере разница равна 50..
читать дальше »
Код:

!include MUI2.nsh
Page custom page1
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

OutFile "repositionWindowEx.exe"
Var dlg
Var btn
!define WS_BORDER 0x00800000

Function page1
nsDialogs::Create 1018
Pop $dlg
${NSD_CreateButton} 150u 14u 120u 14u "Переместить Window 1"
pop $btn
${NSD_OnClick} $btn BtnClick

System::Call 'user32::CreateWindowEx(i0,t "STATIC",t "Window 1",\
                      i${DEFAULT_STYLES}|${WS_BORDER},\
                      i50,i100,i200,i60,i$dlg,i222,i0,i0) i.R2'
SetCtlColors $R2 `0x0000FF` `0x99FFFF`
nsDialogs::Show
FunctionEnd

Function BtnClick
  pop $btn
  System::Call "*(i,i,i,i)i.r1"
  System::Call "*(i,i,i,i)i.r3"
  System::Call "User32::GetWindowRect(iR2,ir1)"
  System::Call "User32::GetWindowRect(i$dlg,ir3)"
  System::Call "*$1(i.r2)"
  System::Call "*$3(i.r4)"
  Intop $5 $2 - $4
  ${If} $5 != 50
    System::Call "User32::SetWindowPos(iR2,i,i50,i100,i,i,i0x201)"
  ${Else}
    System::Call "User32::SetWindowPos(iR2,i,i3,i3,i,i,i0x201)"
  ${EndIf}
  System::Free $1
  System::Free $3
FunctionEnd

Section
SectionEnd


linkuha@vk 31-01-2013 22:33 2079696

извините, может тупой вопрос, но все же:

используя ShowInstDetails hide, остается только кнопка "Показать детали", нажав на кнопку, открывается список деталей установки.
каким способом можно сделать, чтобы была кнопка "Скрыть детали", убирала отчет и опять появляласть кнопка "Показать детали"?

kotkovets 31-01-2013 22:36 2079700

Цитата:

Цитата linkuha@vk
каким способом можно сделать, чтобы была кнопка "Скрыть детали", убирала отчет и опять появляласть кнопка "Показать детали"? »

это сделано стандартно..
скорее просто так и не сделаешь..

Lex_from_Belarus 01-02-2013 01:09 2079778

Добрый вечер, подскажите пожалуйста. Есть программа к которой сделан патч, при установке патча путь берётся из реестра, но программа к которой устанавливается патч прописывается в разных месте в 32 битной винде в одном месте, а в 64 битной в другом. Как лучше реализовать чтение из реестра в InstallDirRegKey ?

K.A.V. 01-02-2013 05:32 2079819

Цитата:

Цитата Lex_from_Belarus
Как лучше реализовать чтение из реестра в InstallDirRegKey ? »

Можете просто менять значение переменной $INSTDIR при запуске инсталлятора

Вот, например, таким способом...
Читаем значение из первой ветки (типа 32 бит система) и, если в параметре путь в папку программы и есть файл "проверка файла.exe" в директории, то назначаем переменной $INSTDIR значение ключа реестра
Если файл не существует, читаем из другой ветки в реестре (типа 64 бит система) и по той же схеме
А если при чтении из второго ключа программа установки не найдёт указанный вами файл, то будет ошибка установки (можете сами убрать потом)

Код:

Function .onInit
ReadRegStr $0 HKLM "Software\32 bit TEST" "TEST"
IfFileExists "$0\проверка файла.exe" 0 +3
StrCpy $INSTDIR $0
goto ok
ReadRegStr $0 HKLM "Software\64 bit TEST" "TEST"
IfFileExists "$0\проверка файла.exe" 0 +3
StrCpy $INSTDIR $0
goto ok
MessageBox MB_OK|MB_ICONSTOP "Программа не установлена"
quit
ok:
FunctionEnd


ASiRU 01-02-2013 14:09 2080142

Помогите плиз, сложилась такая ситуация:
Есть готовый SFX архив который отлично работает, переспросил не случайно ли нажали и запускает INSTAL.BAT который уже сам дальше занимается установкой и настройкой приложения.
Однако поменялись условия и теперь нужно два варианта настройки данного приложения,
получилось 2 батника каждый настраевает по своему.
Нужно менять диалог например "будем ставить дополнительные примочки?", да - запускаем install1.bat, нет - запускаем install2.bat или отмена если случайно нажали.
SFX такое может реализовать только ключами к запуску - не подходит (шибко "умные" пользователи)
Можно реализовать еще одним батником - но это не красиво выглядит, менюха из cmd корявенько выглядит
Нужно переключаться на полновесные инсталяторы, а я в этом нуб нубом.
Хотелось бы: инсталер распаковывает в указанный темп файлы, предложить окно выбора 1 ставим так, 2 ставим так, 3 выход, пульнуть запуск соотвецтвующего батника и погаснуть, дальше все будет отрабатывать батник.
Если это не сильно сложно может кто нибудь написать скрипт на такой прикол?
или посоветуйте чем такое можно собрать самому?

alert30 01-02-2013 14:26 2080155

ASiRU, теперь дублируете вопрос после создания темы?

ASiRU 01-02-2013 14:35 2080162

Вопрос совсем изменен, тут если возможно прошу скрипт для NSIS, ответ из темы не подходит по описанным выше причинам, от SFX приходится отказываться. Ту тему попрошу закрыть.

profcom 01-02-2013 15:33 2080215

Цитата:

Цитата ASiRU
Вопрос совсем изменен, тут если возможно прошу скрипт для NSIS, ответ из темы не подходит по описанным выше причинам, от SFX приходится отказываться. Ту тему попрошу закрыть. »

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

Кстати в sfx можно то же использовать два варианта установки без ключей. Простая установка и установка с зажатым Shift.

profcom 01-02-2013 16:01 2080237

Цитата:

Цитата ASiRU
Если это не сильно сложно может кто нибудь написать скрипт на такой прикол? »

Вот примерчик, а дальше делать можно как душе угодно.
Код:

!include MUI2.nsh
!include nsDialogs.nsh

Name "Варианты"
OutFile "Test.exe"
Caption "Установка моей программы"

!insertmacro MUI_LANGUAGE "Russian"
Page custom FuncLive FuncPost

Var Dialog
Var GroupBox1
Var RadioButton1
Var RadioButton2

Function FuncLive
nsDialogs::Create /NOUNLOAD 1018
  Pop $Dialog
  !insertmacro MUI_HEADER_TEXT "Варианты установки" "Выберите вариант установки"
 
  ${NSD_CreateGroupBox} 69u 25u 131u 56u "Варианты установки"
  Pop $GroupBox1
 
  ${NSD_CreateRadioButton} 73u 35u 68u 14u "Вариант 1"
  Pop $RadioButton1
 
  ${NSD_CreateRadioButton} 73u 52u 68u 14u "Вариант 2"
  Pop $RadioButton2
 
nsDialogs::Show $Dialog
FunctionEnd

Function FuncPost
${NSD_GetState} $RadioButton1 $0
${If} $0 == ${BST_CHECKED}
        ; выполняю первый батник если он был отмечен
        MessageBox MB_OK "Сейчас будет выполнен батник 1"
        nsExec::Exec '"$EXEDIR\bat1.bat"'
${EndIf}

${NSD_GetState} $RadioButton2 $0
${If} $0 == ${BST_CHECKED}
        ; выполняю второй батник если он был отмечен
        MessageBox MB_OK "Сейчас будет выполнен батник 2"
        nsExec::Exec '"$EXEDIR\bat2.bat"'
${EndIf}
FunctionEnd

Section
SectionEnd


MKN 01-02-2013 16:51 2080281

ASiRU,
Попробуй : http://rghost.ru/43465395
рядом с Custom_BAT.exe (или Custom_BAT_hide.exe) должны находится два твоих BAT файла, с именами a.bat и b.bat
(ессно можно было использовать маску... ). Остальное ясно из фейса. На W7 запускать от имени админа.
Custom_BAT_hide.exe - для скрытого запуска батников ( запуск плагом nsExec )

Lex_from_Belarus 01-02-2013 23:12 2080517

Цитата:

Цитата K.A.V.
Можете просто менять значение переменной $INSTDIR при запуске инсталлятора
Вот, например, таким способом...
Читаем значение из первой ветки (типа 32 бит система) и, если в параметре путь в папку программы и есть файл "проверка файла.exe" в директории, то назначаем переменной $INSTDIR значение ключа реестра
Если файл не существует, читаем из другой ветки в реестре (типа 64 бит система) и по той же схеме
А если при чтении из второго ключа программа установки не найдёт указанный вами файл, то будет ошибка установки (можете сами убрать потом)
Код:
Function .onInit
ReadRegStr $0 HKLM "Software\32 bit TEST" "TEST"
IfFileExists "$0\проверка файла.exe" 0 +3
StrCpy $INSTDIR $0
goto ok
ReadRegStr $0 HKLM "Software\64 bit TEST" "TEST"
IfFileExists "$0\проверка файла.exe" 0 +3
StrCpy $INSTDIR $0
goto ok
MessageBox MB_OK|MB_ICONSTOP "Программа не установлена"
quit
ok:
FunctionEnd »

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

K.A.V. 02-02-2013 09:12 2080673

Цитата:

Цитата Lex_from_Belarus
а что сделать чтобы »

Нужно начать читать наш справочник и знакомиться с NSIS, вам здесь не будут постоянно готовые коды писать, по крайней мере я

Код:

Function .onInit
 ReadRegStr $0 HKLM "Software\32 bit TEST" "TEST"
 IfFileExists "$0\проверка файла.exe" 0 +3
 StrCpy $INSTDIR $0
 goto ok
 ReadRegStr $0 HKLM "Software\64 bit TEST" "TEST"
 IfFileExists "$0\проверка файла.exe" 0 +3
 StrCpy $INSTDIR $0
 goto ok
 StrCpy $INSTDIR "C:\Program Files\Моя программа путь по умолчанию"
 ok:
FunctionEnd


Lex_from_Belarus 02-02-2013 13:26 2080779

Цитата:

Цитата K.A.V.
Нужно начать читать наш справочник и знакомиться с NSIS, вам здесь не будут постоянно готовые коды писать, по крайней мере я »

огромное спасибо, я так и пробовал, но не убрал "goto ok". :clapping:

ASiRU 04-02-2013 12:31 2082224

profcom MKN
Спасибо огромное за участие и предоставленные примеры. Буду раскуривать эту петрушку дальше.

Awral 04-02-2013 22:26 2082627

Как изменить чекбокс на любой из тех, которые лежат в папке ${NSISDIR}\Contrib\Graphics\Checks?
Строка ниже не помогает. Вставляю ее сразу после объявления страницы лицензии (!insertmacro MUI_PAGE_LICENSE license.rtf)
Код:

!define MUI_LICENSEPAGE_CHECKBITMAP "${NSISDIR}\Contrib\Graphics\Checks\simple-round2.bmp"

kotkovets 05-02-2013 14:40 2082979

Цитата:

Цитата Awral
Как изменить чекбокс на любой из тех, которые лежат в папке ${NSISDIR}\Contrib\Graphics\Checks?
Строка ниже не помогает »

никак стандартно.. и т.д нестандартно, нет такой константы - MUI_LICENSEPAGE_CHECKBITMAP..
вы сами себе объявили..

MKN 05-02-2013 17:03 2083080

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

K.A.V. 05-02-2013 18:49 2083168

Цитата:

Цитата MKN
Вопрос : возможно ли штатным образом зафиксировать окончание процесса распаковки файлов в $TEMP »

После команды распаковки файлов в $TEMP, пропиши распаковку своего файла "Опа окончание распаковки.tmp" и проверяй его наличие, не?
Или я не правильно понял суть вопроса? :)

DruOleg 05-02-2013 18:59 2083176

Привет всем.
Прошу помочь с валидацией вводимой информации. (nsDialogs)

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

Код:

Function fnCustomInit

!insertmacro MUI_HEADER_TEXT "Параметры сервера" "Укажите данные для данного сервера"
nsDialogs::Create 1018
Pop $Dialog

${NSD_CreateLabel} 0 0 120u 15u "Новое имя компьютера:"
${NSD_CreateText} 120u 0 180u 13u "$srvname_old"
Pop $srvname_new
${NSD_OnChange} $srvname_new checkSrvName

${NSD_CreateLabel} 0 20u 120u 13u "Название населенного пункта:"
${NSD_CreateText} 120u 20u 180u 13u "Город"
Pop $clientDistrictName

${NSD_CreateLabel} 0 40u 120u 13u "Уникальный ID (1-99):"
${NSD_CreateText} 120u 40u 180u 13u "99"
Pop $clientDistrictId

${NSD_CreateLabel} 0 60u 120u 13u "Время синхронизации (ЧЧ:ММ:СС):"
${NSD_CreateText} 120u 60u 180u 13u "01:00:00"
Pop $clientDistrictTime

${NSD_CreateLabel} 0 80u 120u 13u "IP-адрес 1:"
${NSD_CreateText} 120u 80u 180u 13u "10.128.1.65"
Pop $SchoolURL

${NSD_CreateLabel} 0 100u 120u 13u "IP-адрес 2:"
${NSD_CreateText} 120u 100u 180u 13u "10.164.216.8"
Pop $URL

${NSD_CreateHline} 0 120u 100% 0

${NSD_CreateLabel} 0 125u 180u 13u "Текущее имя компьютера - $srvname_real"

nsDialogs::Show

FunctionEnd



Т.е. нужна, например, проверка - что в поле с ID указано число, а не текст.
Через логически функции это сделать можно, но как запретить переход на след страницу или возврат к предыдущей, пока не поправишь?

K.A.V. 05-02-2013 19:49 2083215

Цитата:

Цитата DruOleg
Т.е. нужна, например, проверка - что в поле с ID указано число, а не текст. »

Можно сделать таким методом:
1. Подсчитываем количество символов в строке, в которой у нас хранится ID (команда StrLen)
2. Обрабатываем строку командой ${StrFilter}, указывая, что нужно отфильтровать и оставить только цифры
3. Подсчитываем количество символов в отфильтрованной строке (команда StrLen)
4. Сравниваем количество символов до фильтра и после, если количество символов не равное, значит в поле ID была указана буква (команда StrCmp)
Может быть, есть и другой способ, не знаю, может кто чего другого посоветует, но я бы так сделал :)

Цитата:

Цитата DruOleg
но как запретить переход на след страницу или возврат к предыдущей, пока не поправишь? »

Можете сделать неактивным кнопки "Назад" и "Далее" перед показом диалога, а в функции фильтра поля ID прописать команду на включение кнопок (если в поле всё норм) командой EnableWindow

kotkovets 05-02-2013 19:53 2083216

Цитата:

Цитата DruOleg
Т.е. нужна, например, проверка - что в поле с ID указано число, а не текст.
Через логически функции это сделать можно, но как запретить переход на след страницу или возврат к предыдущей, пока не поправишь? »

В функции при закрытии странички проверяем, чтобы строка пустая не была, иначе прерывание.
Дорабатываем контрол - только на ввод цифр и не более двух символов..
читать дальше »
Код:

!include "MUI2.nsh"
OutFile "winreview.exe"

Page custom fnCustomInit fnCustomDestroy
!insertmacro MUI_PAGE_INSTFILES

var Dialog
var clientDistrictId

Function fnCustomInit
  !insertmacro MUI_HEADER_TEXT "Параметры сервера" "Укажите данные для данного сервера"
  nsDialogs::Create 1018
      Pop $Dialog

    ${NSD_CreateLabel} 0 40u 120u 13u "Введите ID (1-99):"
    pop $0

    ${NSD_CreateNumber} 120u 40u 20u 13u "99"
    Pop $clientDistrictId
    ${NSD_SetTextLimit} $clientDistrictId 2
   
  nsDialogs::Show
FunctionEnd

Function fnCustomDestroy
    ${NSD_GetText} $clientDistrictId $R1
    Strlen $R2 $R1
    StrCmp $R2 0 0 +3
    MessageBox MB_OK "Введите ID !" IDOK
    Abort
FunctionEnd

Section
SectionEnd


Awral 06-02-2013 13:10 2083623

Подскажите. В хедере кода прописываю вот эту строку:
Код:

!define MUI_HEADERIMAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Header\nsis.bmp"
Но после компиляции никаких изменений нету - в качестве изображения шапки инсталлятора показывается иконка файла инсталлятора, которая прописана в коде:
Код:

!define MUI_ICON "D:\Инсталлятор\images\install.ico"
Файл ресурсов использую UIs\modern.exe. В нем положение картинки шапки немного подредактировал, хотя и по стандартному такая же проблема была.

Использую EclipseNSIS, MUI2

Помогите пожалуйста поменять картинку шапки инсталлятора! Заранее спасибо!

MKN 06-02-2013 13:17 2083628

Происходит такая странность : хотя по умолчанию и отмечена RadioButton1, но при клике на Button1, событие её отметки оказывается не зафиксировано.
Если же разок кликнуть по уже отмеченной RadioButton1 - сразу всё ОК. И при переключении на RadioButton2 - всё ОК.
В чём причина отсутствия реакции на дефолтовую отметку ?
Код:

!include MUI2.nsh
OutFile "RBSelect_test.exe"
Page custom Page
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"
Var dlg
Var RadioButton1
Var RadioButton2
Var Check1
Var Check2
Var Button1
Var /Global Event

Function Page
  nsDialogs::Create 1044
  Pop $dlg
  ${NSD_CreateRadioButton} 31u 73u 60u 14u "RadioButton1"
  Pop $RadioButton1
  ${NSD_SetState} $RadioButton1 1
  ${NSD_OnClick} $RadioButton1 fnRadioButton1

  ${NSD_CreateRadioButton} 31u 96u 60u 14u "RadioButton2"
  Pop $RadioButton2
  ${NSD_OnClick} $RadioButton2 fnRadioButton2
  ${NSD_AddStyle} $RadioButton1 ${WS_GROUP}
 
  ${NSD_CreateButton} 31u 161u 92u 13u "Button"
  Pop $Button1
  ${NSD_OnClick} $Button1 fnButton1
  nsDialogs::Show
FunctionEnd

Function fnRadioButton1
${NSD_SetState} $RadioButton1 1
${NSD_GetState} $RadioButton1 $Check1
${If} $Check1 == 1
  StrCpy $Event "Отмечен RadioButton1"
${EndIf}
FunctionEnd

Function fnRadioButton2
${NSD_GetState} $RadioButton2 $Check2
${If} $Check2 == 1
StrCpy $Event "Отмечен RadioButton2"
${EndIf}
FunctionEnd

Function fnButton1
Pop $Button1
MessageBox MB_OK "$Event"
SetAutoClose true
FunctionEnd

Section
SectionEnd


Begin2Fly 06-02-2013 13:43 2083647

MKN, потому что функция fnRadioButton[1/2] со всеми вытекающими отрабатывает только после клика по RadioButton[1/2], которого после запуска инсталлятора ещё не было.
Простая команда Call fnRadioButton1 перед nsDialogs::Show решит проблему.

MKN 06-02-2013 16:05 2083764

Цитата:

Цитата Begin2Fly
отрабатывает только после клика по RadioButton[1/2] »

Действительно, не учёл... Благодарю за замечание. Тогда лучше вызывать fnRadioButton1/2 из fnButton1 - в зависимости от отметки RadioButton1/2.
(Потому, как приведённый пример, частный случай для двух кнопок. Если же их не 2 , а 32...)

ASiRU 06-02-2013 18:45 2083903

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

!define PRODUCT_NAME "Notes"
!define PRODUCT_VERSION "v3"
!define pkgdir "C:\1\"

!include "MUI2.nsh"
!include "TextFunc.nsh"
SetCompress off

!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\7.ico"
!define TVM_SETBKCOLOR 0x111D 
!define TVM_SETTEXTCOLOR 0x111E

!define MUI_COMPONENTSPAGE_NODESC
!define MUI_COMPONENTSPAGE_TEXT_TOP "Текст"
!define MUI_COMPONENTSPAGE_TEXT_INSTTYPE "Выберите установку:"
!define MUI_COMPONENTSPAGE_TEXT_COMPLIST "Выберите настройки закладок ${PRODUCT_NAME}"
!define MUI_COMPONENTSPAGE_CHECKBITMAP "${NSISDIR}\Contrib\Graphics\Checks\colorful.bmp"
!define MUI_PAGE_CUSTOMFUNCTION_SHOW "CompShowProc"
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"
InstType "Полная установка"

Name "${PRODUCT_NAME}"
Caption "Установка ${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "${PRODUCT_NAME} ${PRODUCT_VERSION}.exe"

Function CompShowProc
 FindWindow $0 "#32770" "" $HWNDPARENT
 GetDlgItem $0 $0 1032
 SendMessage $0 ${TVM_SETBKCOLOR} 0 0xFFF0F0   
 SendMessage $0 ${TVM_SETTEXTCOLOR} 0 0x2828FF 
 CreateFont $1 "Comic Sans Ms" 9 0             
 SendMessage $0 ${WM_SETFONT} $1 0   
FunctionEnd

SubSection /e "Клиент ${PRODUCT_NAME}"

Section "Настройка клиента и закладок" test
        SectionIn 1
        SectionIn RO

        SetOutPath "D:\NotesTemp"
        File /r "${pkgdir}\Notes\" 
        ExecWait "msiexec.exe /i $\"******"
 
        SetOutPath "D:\NotesTemp"
        File "${pkgdir}\addfile\add_file_ini.txt"
        ${FileJoin} "D:\Notes\notes.ini" "D:\NotesTemp\add_notes_ini.txt" ""
 
        SetOutPath "D:\Notes\"
        File "${pkgdir}\addfile\setup.txt"
 
        SetOutPath "D:\Notes\Data\"
        File /r "${pkgdir}\addfile\bookmark_mail\"

        SetOutPath "D:\NotesTemp"
        File "${pkgdir}\addfile\INSTALmail.BAT" 
        ExecWait "D:\NotesTemp\INSTALmail.BAT" 
SectionEnd

Section /o "Настройка закладок 2" test1
        SectionIn 1
        SetOutPath "D:\Notes\Data\"
        File /r "${pkgdir}\addfile\bookmark_sed\"
SectionEnd\

SubSectionEnd

Section #Удаление временных файлов
        RMDir /r "D:\NotesTemp"
SectionEnd

Основываясь на примере из справки "Страница выбора компонентов установки" начал его пилить под себя и практически все задуманное получилось.
От одного батника избавился полностью, там было добавление строк в .txt и копирование фалов.
А вот у второго осталась одна последняя строчка к которой незнаю как подступиться.
Код:

if %userdomain% == ACME echo UserName=%username% >> D:\Notes\setup.txt
Не подскажите как можно реализовать прозвон домена и если совпадает, то пульнуть имя юзера в .txt ??
И вопрос второй косметический, в окне компонентов есть пунк который показывает требуемое место на диске, можно ли ему как то присвоить свое статичное значение или выключить вообще?? (Это не кретично, но не красиво выходит, инсталер не учитывает работу .msi который отрабатывает в процесе)

kotkovets 06-02-2013 18:50 2083912

Цитата:

Цитата Awral
Помогите пожалуйста поменять картинку шапки инсталлятора! Заранее спасибо! »

чтобы отображалась картинка, нужно сначала прописать:
Код:

!define MUI_HEADERIMAGE
а затем прописать:
Код:

!define MUI_HEADERIMAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Header\nsis.bmp"
читайте в справочнике: Оформление->Интерфейс Модерн->» Заголовок инсталлятора

profcom 06-02-2013 19:40 2083943

Цитата:

Цитата ASiRU
Не подскажите как можно реализовать прозвон домена и если совпадает, то пульнуть имя юзера в .txt ? »

самое простое решение должно сработать так
Код:

nsExec::Exec `"$WINDIR\System32\cmd.exe" /C if %userdomain% == ACME echo UserName=%username% >> D:\Notes\setup.txt`
Можно конечно и все реализовать без cmd.
Код:

Function Test
Var /GLOBAL log
ExpandEnvStrings $1 %userdomain%
ExpandEnvStrings $2 %username%
StrCmp $1 ACME 0 +4
FileOpen $log "D:\Notes\setup.txt" w
FileWrite $log "$2"
FileClose $log
FunctionEnd


profcom 06-02-2013 20:07 2083971

Цитата:

Цитата ASiRU
И вопрос второй косметический, в окне компонентов есть пунк который показывает требуемое место на диске, можно ли ему как то присвоить свое статичное значение или выключить вообще?? (Это не кретично, но не красиво выходит, инсталер не учитывает работу .msi который отрабатывает в процесе) »

Для секций есть такая команда AddSize вызывается внутри секции добавляет для секции дополнительно необходимое пространство в кб. Подробнее можно прочитать в оригинальной справке. Например AddSize 1024.

ASiRU 07-02-2013 10:24 2084349

profcom Спасибо, буду пробовать дальше )

MKN 07-02-2013 17:05 2084634

Фоновое изображение на стандартных страницах (на всех или по выбору)

открыть код
Код:

!include MUI.nsh
!include WinMessages.nsh
 
 ;size 497x314
!define BITMAP_FILE bg.bmp
 
Name "Background Bitmap"
OutFile "bgbitmap.exe"
InstallDir "$TEMP"
ShowInstDetails show
 
!define MUI_COMPONENTSPAGE_NODESC
!define MUI_FINISHPAGE_NOAUTOCLOSE
!define MUI_CUSTOMFUNCTION_GUIINIT MyGUIInit
 
!define LR_LOADFROMFILE    0x0010
!define LR_CREATEDIBSECTION 0x2000
!define IMAGE_BITMAP        0
!define SS_BITMAP          0x0000000E
!define WS_CHILD            0x40000000
!define WS_VISIBLE          0x10000000
!define HWND_TOP            0
!define SWP_NOSIZE          0x0001
!define SWP_NOMOVE          0x0002
!define IDC_BITMAP          1500
!define stRECT "(i, i, i, i) i"
 
Var hBitmap
 
!define MUI_PAGE_CUSTOMFUNCTION_SHOW WelcomePageShow
!insertmacro MUI_PAGE_WELCOME
;!define MUI_PAGE_CUSTOMFUNCTION_SHOW LicensePageShow
;!insertmacro MUI_PAGE_LICENSE bgbitmap.nsi
!define MUI_PAGE_CUSTOMFUNCTION_SHOW DirectoryPageShow
!insertmacro MUI_PAGE_DIRECTORY
!define MUI_PAGE_CUSTOMFUNCTION_SHOW ComponentsPageShow
!insertmacro MUI_PAGE_COMPONENTS
!define MUI_PAGE_CUSTOMFUNCTION_SHOW InstFilesPageShow
!insertmacro MUI_PAGE_INSTFILES
!define MUI_PAGE_CUSTOMFUNCTION_SHOW FinishPageShow
!insertmacro MUI_PAGE_FINISH
 !insertmacro MUI_LANGUAGE English
 
; Destroy a window.
!macro DestroyWindow HWND IDC
  GetDlgItem $R0 ${HWND} ${IDC}
  System::Call `user32::DestroyWindow(i R0)`
!macroend
 
; Give window transparent background.
!macro SetTransparent HWND IDC
  GetDlgItem $R0 ${HWND} ${IDC}
  SetCtlColors $R0 0xFFFFFF transparent
!macroend
 
; Refresh window.
!macro RefreshWindow HWND IDC
  GetDlgItem $R0 ${HWND} ${IDC}
  ShowWindow $R0 ${SW_HIDE}
  ShowWindow $R0 ${SW_SHOW}
!macroend
 
Function MyGUIInit
  InitPluginsDir
  ReserveFile `${BITMAP_FILE}`
  File `/ONAME=$PLUGINSDIR\bg.bmp` `${BITMAP_FILE}`
 
  ; Получение параметров родительского окна
  System::Call `*${stRECT} .R0`
  System::Call `user32::GetClientRect(i $HWNDPARENT, i R0)`
  System::Call `*$R0${stRECT} (, , .R1, .R2)`
  System::Free $R0
 
  ; Создание нового окна и помещение в него изображения
  System::Call `kernel32::GetModuleHandle(i 0) i.R3`
  System::Call `user32::CreateWindowEx(i 0, t "STATIC", t "", i ${SS_BITMAP}|${WS_CHILD}|${WS_VISIBLE}, i 0, i 0, i R1, i R2, i $HWNDPARENT, i ${IDC_BITMAP}, i R3, i 0) i.R1`
  System::Call `user32::SetWindowPos(i R1, i ${HWND_TOP}, i 0, i 0, i 0, i 0, i ${SWP_NOSIZE}|${SWP_NOMOVE})`
  System::Call `user32::LoadImage(i 0, t "$PLUGINSDIR\bg.bmp", i ${IMAGE_BITMAP}, i 0, i 0, i ${LR_CREATEDIBSECTION}|${LR_LOADFROMFILE}) i.s`
  Pop $hBitmap
  SendMessage $R1 ${STM_SETIMAGE} ${IMAGE_BITMAP} $hBitmap
 
  ; Установка прозрачности фона
  !insertmacro SetTransparent $HWNDPARENT 3
  !insertmacro SetTransparent $HWNDPARENT 1
  !insertmacro SetTransparent $HWNDPARENT 2
  !insertmacro SetTransparent $HWNDPARENT 1034
  !insertmacro SetTransparent $HWNDPARENT 1037
  !insertmacro SetTransparent $HWNDPARENT 1038
 
;Удаление не нужных контролов (элементов управления)
  !insertmacro DestroyWindow  $HWNDPARENT 1256
  !insertmacro DestroyWindow  $HWNDPARENT 1028
  !insertmacro DestroyWindow  $HWNDPARENT 1039
FunctionEnd
 
;Обновление контролов родительского окна. Необходимо для некоторых элементов управления,
;если они имеют прозрачный фон.
Function RefreshParentControls
  !insertmacro RefreshWindow  $HWNDPARENT 1037
  !insertmacro RefreshWindow  $HWNDPARENT 1038
FunctionEnd
 
Function WelcomePageShow
  SetCtlColors $MUI_HWND 0xFFFFFF transparent
  !insertmacro SetTransparent $MUI_HWND 1200
  !insertmacro SetTransparent $MUI_HWND 1201
  !insertmacro SetTransparent $MUI_HWND 1202
 FunctionEnd
 
/*; For license page.
Function LicensePageShow
  FindWindow $MUI_HWND "#32770" "" $HWNDPARENT
  SetCtlColors $MUI_HWND 0xFFFFFF transparent
  !insertmacro SetTransparent $MUI_HWND 1040
  !insertmacro SetTransparent $MUI_HWND 1000
  !insertmacro SetTransparent $MUI_HWND 1006
  !insertmacro SetTransparent $MUI_HWND 1034
  !insertmacro SetTransparent $MUI_HWND 1035
  Call RefreshParentControls
 FunctionEnd*/
 
Function DirectoryPageShow
  FindWindow $MUI_HWND "#32770" "" $HWNDPARENT
  SetCtlColors $MUI_HWND 0xFFFFFF transparent
  !insertmacro SetTransparent $MUI_HWND 1019
  !insertmacro SetTransparent $MUI_HWND 1001
  !insertmacro SetTransparent $MUI_HWND 1024
  !insertmacro SetTransparent $MUI_HWND 1008
  !insertmacro SetTransparent $MUI_HWND 1023
  !insertmacro SetTransparent $MUI_HWND 1006
  !insertmacro SetTransparent $MUI_HWND 1020
  ; Remove group box text. $R0 still contains HWND of 1020
  SendMessage $R0 ${WM_SETTEXT} 0 STR:
  ; Refresh controls.
  Call RefreshParentControls
 FunctionEnd
 
Function ComponentsPageShow
  FindWindow $MUI_HWND "#32770" "" $HWNDPARENT
  SetCtlColors $MUI_HWND 0xFFFFFF transparent
  !insertmacro SetTransparent $MUI_HWND 1017
  !insertmacro SetTransparent $MUI_HWND 1022
  !insertmacro SetTransparent $MUI_HWND 1021
  !insertmacro SetTransparent $MUI_HWND 1023
  !insertmacro SetTransparent $MUI_HWND 1006
  !insertmacro SetTransparent $MUI_HWND 1032
  Call RefreshParentControls
 FunctionEnd
 
Function InstFilesPageShow
  FindWindow $MUI_HWND "#32770" "" $HWNDPARENT
  SetCtlColors $MUI_HWND 0xFFFFFF transparent
  !insertmacro SetTransparent $MUI_HWND 1027
  !insertmacro SetTransparent $MUI_HWND 1004
  !insertmacro SetTransparent $MUI_HWND 1006
  !insertmacro SetTransparent $MUI_HWND 1016
  Call RefreshParentControls
 FunctionEnd
 
Function FinishPageShow
  SetCtlColors $MUI_HWND 0xFFFFFF transparent
  !insertmacro SetTransparent $MUI_HWND 1200
  !insertmacro SetTransparent $MUI_HWND 1201
  !insertmacro SetTransparent $MUI_HWND 1202
  !insertmacro SetTransparent $MUI_HWND 1203
  !insertmacro SetTransparent $MUI_HWND 1204
  !insertmacro SetTransparent $MUI_HWND 1205
  !insertmacro SetTransparent $MUI_HWND 1206
 FunctionEnd
 
; Free loaded resources. Destroy the bitmap.
Function .onGUIEnd
  System::Call `gdi32::DeleteObject(i s)` $hBitmap
 FunctionEnd
 
Section "Section1"
SectionEnd


Картинку фона ессно используйте свою - bg.bmp размером 497x314

Lex_from_Belarus 07-02-2013 23:22 2084919

Так ещё одна загвоздка с radiobutton
Имеется структура выбора компонентов:

-Группа секций 1
--Секция 11 ID_11
--Секция 12 ID_12
--Секция 13 ID_13
-Группа секций 2
--Секция 21 ID_21
--Секция 22 ID_22
--Секция 23 ID_23

используя код из справочника, всё хорошо выбирает.
читать дальше »

!insertmacro StartRadioButtons $1
!insertmacro RadioButton ${ID_1}
!insertmacro RadioButton ${ID_2}
!insertmacro RadioButton ${ID_3}
!insertmacro EndRadioButtons

НО хотелось бы чтобы по нажатию на чекбокс "Группа секций 1", происходило убирание голчек с секций 11, 12, 13, т.е. со всей группы.
Подскажите что добавить чтобы можно было управлять группой.

K.A.V. 08-02-2013 05:25 2085047

Lex_from_Belarus, воспользуйтесь поиском по фразе .onSelChange, мы в предыдущей теме что только не делали с секциями...

Вам нужно создать функцию .onSelChange, в неё прописать проверку статусов секций из своей группы (команда SectionGetFlags), и, если там будет статус "отмечена" (команда StrCmp) (одна или 3, как вам нужно), то тогда применяете команду SectionSetFlags

Lex_from_Belarus 08-02-2013 16:22 2085590

Цитата:

Цитата K.A.V.
Lex_from_Belarus, воспользуйтесь поиском по фразе .onSelChange, мы в предыдущей теме что только не делали с секциями...
Вам нужно создать функцию .onSelChange, в неё прописать проверку статусов секций из своей группы (команда SectionGetFlags), и, если там будет статус "отмечена" (команда StrCmp) (одна или 3, как вам нужно), то тогда применяете команду SectionSetFlags »

нда, посидев и почитав, понял, что замутить нереально с такой реализацией
!insertmacro StartRadioButtons $1
!insertmacro RadioButton ${ID_1}
!insertmacro RadioButton ${ID_2}
!insertmacro RadioButton ${ID_3}
!insertmacro EndRadioButtons

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

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

MKN 08-02-2013 16:40 2085623

Lex_from_Belarus,
Сделай свою комбинацию на кастомной странице (с помощью nsDialogs). Там любую комбинацию можно реализовать.

Lex_from_Belarus 08-02-2013 17:08 2085670

MKN, да я если честно вообще не понимаю, как за столько лет существования nsis с отсутствующим в нём radiobutton не нарисовали кастомной страницы с дизайном стандартной. а сам не хочу писать потому как знают что кривая будет страница в плане сходства с оригиналом, а сколько надо сделать чтобы её реализовать и заставить работать. жуть.

Кстати может у кого есть нарисованный кастом под компоненты?

MKN 08-02-2013 18:10 2085734

Lex_from_Belarus,
Примеров уже было много. Просмотри 1 часть темы, наверняка найдёшь подходящее, останется только подкорректировать под свои нужды.

habib2302 08-02-2013 20:17 2085816

люди.подскажите как сделать вот такую страницу компонентов

profcom 08-02-2013 22:07 2085885

Цитата:

Цитата habib2302
люди.подскажите как сделать вот такую страницу компонентов »

Справку по nsDialogs почитать и сделать.

andryz80 09-02-2013 02:42 2086086

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



Код:

Section Uninstall

SetOutPath "$PROGRAMFILES"
Delete "$INSTDIR\${PRODUCT_NAME}.url"
Delete "$INSTDIR\uninst.exe"
RMDir /r "$INSTDIR\Makros"
Delete "$INSTDIR\titel.bmp"
Delete "$INSTDIR\Sprint-Layout60.chm"
Delete "$INSTDIR\LAYOUT60.INI"
Delete "$INSTDIR\Layout60.exe"
Delete "$SMPROGRAMS\Sprint Layout 6\Uninstall.lnk"
Delete "$SMPROGRAMS\Sprint Layout 6\Website.lnk"
Delete "$SMPROGRAMS\Sprint Layout 6\Help.lnk"
Delete "$DESKTOP\Sprint Layout.lnk"
Delete "$SMPROGRAMS\Sprint Layout 6\Sprint Layout.lnk"
RMDir /r "$SMPROGRAMS\Sprint Layout 6" RMDir /r "$INSTDIR"
DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"
SetAutoClose true
SectionEnd


windows 7 64 бита в чем моя ошибка.

и еще дайте пример как зарегистрировать расширение файла (ассоциацию)

MKN 09-02-2013 10:57 2086170

andryz80,
Про всё уже не раз сказано и приведены примеры. См. 1 часть темы.

Lex_from_Belarus 09-02-2013 12:53 2086235

А кто-нибудь знает как запустить файл установки во время установки моего установщика в режиме совместимости Win7 (просто прога не устанавливается просто так на Win8, а врежиме совместимости всё OK)
Надо использовать, а вот с каким параметром не знаю.
ExecWait '"$INSTDIR\someprogram.exe"' $0

MKN 09-02-2013 13:40 2086268

Lex_from_Belarus,
Не знаю как в W8, а в W7 параметры совместимости устанавливаются в
[HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers]
Может попробовать перед запуском, сначала туда "прописывать" программу-установщик ?

andryz80 09-02-2013 17:52 2086437

покопался на форуме нарыл вот SetShellVarContext all добавил

Код:


SetShellVarContext all
Delete "$SMPROGRAMS\Sprint Layout 6\Uninstall.lnk"
Delete "$SMPROGRAMS\Sprint Layout 6\Website.lnk"
Delete "$SMPROGRAMS\Sprint Layout 6\Help.lnk"
Delete "$DESKTOP\Sprint Layout.lnk"
Delete "$SMPROGRAMS\Sprint Layout 6\Sprint Layout.lnk"
RMDir /r "$SMPROGRAMS\Sprint Layout 6"
RMDir /r "$INSTDIR"

все удаляется кроме папки RMDir /r "$SMPROGRAMS\Sprint Layout 6" не работает. может кто в курсе?

а вот как регить ассоциации не нашел. точнее не нашел универсального средства, что бы для ХР или семерки или 64разрядных работало и там и там

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

andryz80 09-02-2013 23:31 2086673

вот нашел регистрацию расширений но много чего не понятно.
можете кто нибудь прокомментировать что за записи в реестр делает макрос?

Код:

!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

и еще как при деинсталяции удалять ассоциацию?

Awral 10-02-2013 00:13 2086707

Помогите мне пожалуйста загрузить текст из rtf файла. Суть:
1. При компиляции к инсталлятору подключается rtf файл с текстом
2. При запуске инсталлятора из этого файла читается содержимое и выводится в Label.
Суть такая же, как и с окном лицензии. Это возможно реализовать? Заранее спасибо.

kotkovets 10-02-2013 13:08 2086979

Цитата:

Цитата Awral
Помогите мне пожалуйста загрузить текст из rtf файла»

Цитата:

Цитата Awral
При запуске инсталлятора из этого файла читается содержимое и выводится в Label. »

Ну какой черт здесь label ? хрень всякую несете.. не понимая, что для чего..
нужно создавать контрол RichEdit20A
читать дальше »
Код:

!include "MUI2.nsh"
!include "LoadRTF.nsh"
outfile test.exe

Page custom funcrtfreade
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

var dlg
var RichDesc

Function funcrtfreade
  nsDialogs::Create 1018
  Pop $dlg
  nsDialogs::CreateControl "RichEdit20A" ${ES_READONLY}|${DEFAULT_STYLES}|${WS_TABSTOP}|\
                                        ${WS_VSCROLL}|${ES_MULTILINE}|${ES_WANTRETURN} ${WS_EX_STATICEDGE} \
                                        0 0 100% 75% ''

  pop $RichDesc
  ${LoadRTF} "$EXEDIR\test.rtf" $RichDesc
  nsDialogs::Show
FunctionEnd

Section
SectionEnd


примеров до хрена

MKN 10-02-2013 18:24 2087203

Цитата:

Цитата andryz80
помогите. или хотя бы носом мокните где почитать. »

Информации полно, только погугли... Рассказ про ассоциирование файлов не возможен без теории.
Вот немного основной информации :
открыть текст

О файловых ассоциациях

Файловые ассоциации контролируют такую функциональность:
Какое приложение будет запущено, когда пользователь дважды щёлкает по файлу.
Какая иконка показывается для файлов этого типа.
Как файловый тип показывается в Проводнике Windows.
Какие команды показываются в контекстном меню файлов этого типа.
Другие возможности пользовательского интерфейса, типа всплывающих подсказок, деталей для подробного и табличного режимов просмотра.

Раздел HKEY_CLASSES_ROOT является точной копией раздела HKEY_ LOCAL_MACHINE\SOFTWARE\Classes и содержит в себе информацию о всех зарегистрированных в системе типах файлов. Именно из этого раздела берется информация для представления в окне "Типы файлов".
Если вы создадите новый ключ в HKCR, то Windows создаст его в разделе HKLM\SOFTWARE\Classes. Другими словами, будет создана общесистемная ассоциация файла.
Если вы хотите создать пользовательскую ассоциацию, то ее нужно явно создавать в разделе HKCU\SOFTWARE\Classes.

Вначале в разделе HKEY_CLASSES_ROOT идет список всех расширений (с точками вначале!), зарегистрированных в системе, каждое из которых является названием раздела реестра. В каждом таком подразделе обязательно есть параметр "По умолчанию". В нем записано как бы "внутреннее" название расширения, которое "в ходу" у системы.

В разделе HKEY_CLASSES_ROOT также присутствует раздел с именем этого внутреннего названия расширения (расположенный ниже в окне Редактора реестра), в котором находятся параметры, определяющие контекстное меню правой кнопки мыши этого расширения. В параметре "По умолчанию" этого раздела записано "официальное" название типа файлов с таким расширением, которое, например, присутствует в списке окна "Типы файлов".

В разделе, имя которого соответствует расширению с точкой вначале, также могут находиться различные ключи, определяющие интеграцию данного типа файлов в Проводник.
В частности, если создать здесь раздел с именем, соответствующим внутреннему названию расширения, а в нем - раздел с именем ShellNew со строковым параметром NullFile, то в выпадающий список "Создать" будет помещено "официальное" название типа файлов. При выборе в списке этого типа будет создан пустой файл с расширением, соответствующим этому названию.

Если в папку Windows\ShellNew поместить файл с этим расширением, а в разделе ShellNew создать не параметр NullFile, а параметр FileName и в его значении указать имя этого файла, то при выборе этого типа файлов в списке "Создать" в текущей папке будет создана копия файла, помещенного в папку Windows\ShellNew.

В разделе с именем "внутреннего" названия расширения могут находиться разделы DefaultIcon, параметр которого "По умолчанию" определяет иконку этого типа файлов
и shell, в котором располагаются команды контекстного меню правой кнопки мыши данного типа файлов. Название действия, которое отображается в контекстном меню, может быть либо названием подраздела раздела shell, либо значением параметра "По умолчанию" этого подраздела (в последнем случае название самого подраздела не имеет значения).

В разделе с именем команды контекстного меню располагается подраздел command .
В параметре "По умолчанию" там указан полный путь к программе, которая должна выполнить данное действие.

Установка необязательных подключей и атрибутов расширения файла :

Записи расширений типов файлов в реестре имеют несколько опциональных подключей и атрибутов. Все значения имеют тип REG_SZ.

Content Type тип содержимого MIME этого типа файла.

OpenWithList Этот подключ содержит одно или несколько приложений, которые появляются в диалоговом окне "Открыть с помощью" для файлового типа.

OpenWithProgids Этот подключ содержит список альтернативных ProgID для этого типа файла. Программы с этими ProgID также появляются в диалоге "Открыть с помощью". Когда приложение берёт контроль над типом файла, меняя значение по-умолчанию, оно также должно занести себя в этот список.

PerceivedType Принадлежность к категории для типов файлов. Например - image, audio, document и т.д.


Регистрация типа файла

Оболочка использует подключи реестра программных идентификаторов (programatic identifier или ProgID), чтобы ассоциировать тип файла с приложением, и чтобы контролировать поведение ассоциации.
Записи ProgID, используемые для файловых ассоциаций, хранятся в ключе реестра HKEY_CLASSES_ROOT.

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

HKEY_CLASSES_ROOT\App.jpeg (ваш ProgID)
HKEY_CLASSES_ROOT\.jpg = App.jpeg (проецирование расширения на ProgID)
HKEY_CLASSES_ROOT\.jpeg = App.jpeg (проецирование второго расширения на тот же ProgID)

Правильный формат ProgID является таким [Поставщик или приложение].[Компонент].[Версия] - три части, соединённые точками, без пробелов, например: Word.Document.6. Часть [Версия] является необязательной, но рекомендуемой.

Подключ ProgID должен включать следующие элементы :
(Default) - значение по-умолчанию для ProgID в название формата файлов для этого ProgID, пригодное для показа пользователю. Это поле устарело в Windows 2000 и выше. Вместо него следует использовать значение FriendlyName
Тем не менее, вы должны установить это поле для совместимости со старыми программами. Для согласованности - здесь должны быть те же данные, что и в поле FriendlyName

FriendlyTypeName - Название типа файлов (friendly name) этого ProgID, пригодного к показу пользователю. Для согласованности - здесь должны быть те же данные, что и в значении по-умолчанию (см. выше).

InfoTip - краткое описание, которое Оболочка будет показывать для этого ProgID. Запись InfoTip показывается, когда пользователь задерживает мышь над файлом этого типа.

DefaultIcon - иконка по-умолчанию, для файловых типов, ассоциированных с этим ProgID. Это значение может быть либо REG_SZ, либо REG_EXPAND_SZ, но оно должно иметь формат полного имени файла со значением ресурса через запятую, например: %SystemRoot%\shell32.dll,-154.


Но и это далеко не всё... Для полного счастья при ассоциировании надо также чтобы :
Приложение, которое устанавливается для всех пользователей компьютера, было зарегистрировано под ключом реестра HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\App Paths.
В Windows 7 и выше, приложение также может быть установлено только для одного пользователя регистрацией в ключе реестра HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\App Paths.

Записи под ключом App Paths в основном используются для таких целей:
Чтобы указать соответствие между именем исполняемого файла приложения и полным путём к приложению.
Чтобы добавлять информацию к переменной окружения PATH индивидуально для приложения и процесса.

Также в реестре создаётся ключ с списком нужных ассоциаций :
[HKEY_LOCAL_MACHINE\SOFTWARE\ACD Systems\App\Capabilities\FileAssociations]
и регистрации ассоциаций для приложения :
[HKEY_LOCAL_MACHINE\SOFTWARE\RegisteredApplications]
"App"="Software\\App\\Capabilities"

В Windows 7 для ассоциирования важен ключ :
HKEY_CURRENT_USER "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "ProgId" "App.${extenstion}"

А ещё бывают востребованы параметры для обработки событий для типов файлов, для индексации типов файлов и пр....

В Windows 8 обстановка с ассоциированием ещё круче...
Цитата:

В Windows 8 программы не могут сами изменять ассоциации для типов файлов, которые уже связаны с другими программами! Это верно как при установке программы, так и впоследствии, однако в обоих случаях работает сопоставление с незанятыми типами файлов.
http://feedproxy.google.com/~r/outsi...3/ZER2_GwZjOU/
Хотя не всё так уныло, как описано в статье. Некоторые программы успешно справляются с ассоциированием файлов при установке, не смотря на то что "их" тип файлов, по умолчанию уже занят системой. Например, AdobeReader.

andryz80 10-02-2013 23:13 2087476

ужасс как все запутаноо. а может есть кусок универсального кода?

задача то у меня простая. что бы файлы с расширением lay открывались программой sprintlayout
но что бы и на ХР и на семерке работало


а по поводу почему папка не удаляется никто не поможет?

MKN 11-02-2013 11:06 2087726

Цитата:

Цитата andryz80
ужасс как все запутаноо »

Для твоего случая всё гораздо проще. Достаточно так :
Код:


!include "x64.nsh"
OutFile "LayAss.exe"
InstallDir "$PROGRAMFILES\Sprint-Layout 6 Setup"
;RequestExecutionLevel admin

Function .onInit
${If} ${RunningX64}
SetRegView 32
${EndIf}
FunctionEnd

Section
WriteRegStr HKLM "SOFTWARE\Classes\.lay" "" "Layout.File.6"
WriteRegStr HKLM "SOFTWARE\Classes\Layout.File.6" "" "Редактор печатных плат"
WriteRegStr HKLM "SOFTWARE\Classes\Layout.File.6\DefaultIcon" "" "$INSTDIR\lay.ico"
WriteRegStr HKLM "SOFTWARE\Classes\Layout.File.6\shell" "" "open"
WriteRegStr HKLM "SOFTWARE\Classes\Layout.File.6\shell\Open\command" "" "$\"$INSTDIR\layout 6.0.exe$\" $\"%1$\""
WriteRegStr HKCU "Software\Microsoft\Windows NT\CurrentVersion\EXTENSIONS" "lay" "$\"$\"$INSTDIR\layout 6.0.exe$\" ^.lay$\""
SectionEnd

Иконку lay.ico, помести в папку с прогой (или куда угодно, подкорректировав путь), обрати внимание на имя папки установки, в разных вариантах дистр-вов может быть по разному... Проверял на W7x64
Цитата:

Цитата andryz80
а по поводу почему папка не удаляется никто не поможет? »

Папка твоя со всем содержимым (и зачем по очереди удалять из неё ярлыки ?) , просто обязана удалиться :
Код:

Section Uninstall
SetShellVarContext all
RMDir /r "$SMPROGRAMS\Sprint Layout 6"
SectionEnd

если нет ошибки в коде или не начудил с правами....

DruOleg 11-02-2013 14:31 2087861

Прошу помочь с ведением лога установки.

Для записи в лог использую плагин:
http://nsis.sourceforge.net/NSISLog_plug-in
С ним все ок.

Но стоит вопрос записи времени каждого действия:
читать дальше »

14-12-2012 13:56:43 Наличие fbclient.dll - Ok
14-12-2012 13:56:44 Наличие gbak.exe - Ok
14-12-2012 13:56:45 Наличие IBEScript.exe - Ok
14-12-2012 13:56:46 Проверка Firebird .NET Data Provider 2.0.1 - Ok
14-12-2012 13:56:47 Проверка FoxPro OLE DB Provider - есть


Использую плагин:
http://nsis.sourceforge.net/Time_plug-in

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

nsislog::log "$LogFileWay" ""
${time::GetLocalTime} $0
nsislog::log "$LogFileWay" "$0  ********************"
${time::GetLocalTime} $0
nsislog::log "$LogFileWay" "$0  ****** Запуск ******"



Очень неудобно каждый раз писать в переменную и потом выводить...
Может есть какое то более универсальное решение?

K.A.V. 11-02-2013 14:49 2087878

DruOleg, в справочнике не смотрели страничку по пути "Примеры кодов => LOG-файл установки"?
В тот метод можно прикрутить время

DruOleg 11-02-2013 14:52 2087883

Цитата:

Цитата K.A.V.
DruOleg, в справочнике не смотрели страничку по пути "Примеры кодов => LOG-файл установки"?
В тот метод можно прикрутить время »

Мне не подошел этот метод. Поэтому использую плагин.

profcom 11-02-2013 14:55 2087887

Прошу помочь найти ошибку версия nsis ANSI. Ошибка заключалась в необходимой инициализации перед вызовом функции.
Код:

System::Alloc 64 # (4+4+8+8+8+8+8+8+8=64 байта) # выделяем буфер
Pop $1 # определяем адрес выделенного буфера
System::Call "*$1(i64)" # инициализация структуры
System::Call "Kernel32::GlobalMemoryStatusEx(ir1)"
System::Call "*$1(i.r2, i.r3, l.r4, l.r5, l.r6, l.r7, l.r8, l.r9, l.r10)" # считываем данные со структуры
System::Free $1 # освобождаем буфер


K.A.V. 11-02-2013 15:01 2087893

Цитата:

Цитата DruOleg
Мне не подошел этот метод. Поэтому использую плагин. »

1. Тогда объясните причину, почему не подошел?
2. Вы сами прописываете ручками в коде, какие данные занести в LOG файл и плагин просто прописывает текст в файл по указанию переменной?

profcom 11-02-2013 15:04 2087901

Цитата:

Цитата DruOleg
Очень неудобно каждый раз писать в переменную и потом выводить...
Может есть какое то более универсальное решение? »

Есть универсальное решение и называется оно макросы, если не хочешь что то писать много раз напиши один раз макрос и вставь вначале кода. Пример:
Код:

!macro Log _msg
${time::GetLocalTime} $0
nsislog::log "$LogFileWay" "$0 ${_msg}"
!macroend
!define Log "!insertmacro Log"

Section
${Log} "********************"
${Log} "****** Запуск ******"
SectionEnd


DruOleg 11-02-2013 15:37 2087942

Цитата:

Цитата K.A.V.
1. Тогда объясните причину, почему не подошел?
2. Вы сами прописываете ручками в коде, какие данные занести в LOG файл и плагин просто прописывает текст в файл по указанию переменной? »

1. Мне показалось, что его слишком сложно подключать - добавлять простыню кода в конец рабочего файла. Это может вызвать путаницу.
2. Да, это основной аргумент - пишу в лог только то, что мне нужно.

Lex_from_Belarus 11-02-2013 16:38 2087982

Подскажите пожалуйста, а на основании этого лога можно сделать Uninstall. Ну проще говоря, при установке есть 20 компонентов, устанавливается допустим из них штук 15. Потом при удалении хотелось бы сделать возможность удалить допустим 10, т.е. должно остаться 5 штук. Или есть проще вариант. Вариант с прописыванием файлов вручную не вариант, т.к. файлов в каждом компоненте много и они пересекаются в одних и тех же папках.

profcom 11-02-2013 17:13 2088005

Цитата:

Цитата Lex_from_Belarus
Подскажите пожалуйста, а на основании этого лога можно сделать Uninstall. Ну проще говоря, при установке есть 20 компонентов, устанавливается допустим из них штук 15. Потом при удалении хотелось бы сделать возможность удалить допустим 10, т.е. должно остаться 5 штук. Или есть проще вариант. Вариант с прописыванием файлов вручную не вариант, т.к. файлов в каждом компоненте много и они пересекаются в одних и тех же папках. »

Честно говоря вообще не понятно, что вы хотите сделать? Два uninstall ? или один но который не все подчищает за собой?

MKN 11-02-2013 17:23 2088015

Цитата:

Цитата Lex_from_Belarus
Вариант с прописыванием файлов вручную не вариант, »

Отчего же ? Ты ведь уже потрудился , прописывая установку 20 компонентов.
Используй !insertmacro MUI_UNPAGE_COMPONENTS и пропиши всё что пожелаешь для выбора при удалении ,
на основании предварительной проверки уже установленных компонентов... (А это всего - по 3-4 строки кода для проверки наличия каждого компонента - есть ли такой то файл или ключ и если нет, то сделать недоступным чекбокс отсутствующего компонента... )
Вредный совет : А, если лень, то можно и без проверки, укажи все 20 - обычно ошибки при этом не бывает, хотя так будет бестолково и не правильно... :)
По моему , так гораздо проще и быстрее, чем возиться с логом...

Lex_from_Belarus 11-02-2013 20:42 2088161

Цитата:

Цитата profcom
Честно говоря вообще не понятно, что вы хотите сделать? Два uninstall ? или один но который не все подчищает за собой? »

хочется один uninstall, который может удалять как и устанавливать с выбором компонентов. какие-то удалил, какие-то установил.

Цитата:

Цитата MKN
Отчего же ? Ты ведь уже потрудился , прописывая установку 20 компонентов.
Используй !insertmacro MUI_UNPAGE_COMPONENTS и пропиши всё что пожелаешь для выбора при удалении ,
на основании предварительной проверки уже установленных компонентов... (А это всего - по 3-4 строки кода для проверки наличия каждого компонента - есть ли такой то файл или ключ и если нет, то сделать недоступным чекбокс отсутствующего компонента... )
Вредный совет : А, если лень, то можно и без проверки, укажи все 20 - обычно ошибки при этом не бывает, хотя так будет бестолково и не правильно...
По моему , так гораздо проще и быстрее, чем возиться с логом... »

да я над этим вариантом думал, но файлов больно много, а иногда они меняются, а это сверять каждый файл нужно :(

andryz80 12-02-2013 01:16 2088367

блин папка не удаляется и файлы не ассоциируется

может мне весь код выложить?

вот весь код. вот что я делаю не так? ассоциации нет и папка не удаляется.
при том все из папки удаляется а она сама нет

Код:

!define PRODUCT_NAME "Sprint Layout"
!define PRODUCT_VERSION "6.0"
!define PRODUCT_PUBLISHER "Abacom"
!define PRODUCT_WEB_SITE "http://www.abacom-online.de"
!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\Layout60.exe"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"

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


Function .onInit
${If} ${RunningX64}
SetRegView 32
${EndIf}
FunctionEnd


Section  -Associations
WriteRegStr HKLM "SOFTWARE\Classes\.lay" "" "Layout.File.6_0"
WriteRegStr HKLM "SOFTWARE\Classes\Layout.File.6" "" "???????? ???????? ????"
WriteRegStr HKLM "SOFTWARE\Classes\Layout.File.6\DefaultIcon" "" "$INSTDIR\lay.ico"
WriteRegStr HKLM "SOFTWARE\Classes\Layout.File.6\shell" "" "open"
WriteRegStr HKLM "SOFTWARE\Classes\Layout.File.6\shell\Open\command" "" "$\"$INSTDIR\layout60.exe$\" $\"%1$\""
WriteRegStr HKCU "Software\Microsoft\Windows NT\CurrentVersion\EXTENSIONS" "lay" "$\"$\"$INSTDIR\layout60.exe$\" ^.lay$\""
SectionEnd

; MUI Settings
!define MUI_ABORTWARNING
!define MUI_ICON "C:\Инсталятор sprint layout\SprintLayout\icons.ico"
!define MUI_UNICON "C:\Инсталятор sprint layout\SprintLayout\Delete_win7.ico"

; Welcome page
!insertmacro MUI_PAGE_WELCOME
; License page
!define MUI_LICENSEPAGE_CHECKBOX
!insertmacro MUI_PAGE_LICENSE "C:\Инсталятор sprint layout\SprintLayout\license.txt"
; Directory page
!insertmacro MUI_PAGE_DIRECTORY
; Instfiles page
!insertmacro MUI_PAGE_INSTFILES
; Finish page
!define MUI_FINISHPAGE_RUN "$INSTDIR\Layout60.exe"
!insertmacro MUI_PAGE_FINISH

; Uninstaller pages
!insertmacro MUI_UNPAGE_INSTFILES

; Language files
!insertmacro MUI_LANGUAGE "Russian"

; MUI end ------

Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "Sprint Layout 6.0 setup.exe"
InstallDir "$PROGRAMFILES\Sprint Layout"
InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" ""
ShowInstDetails show
ShowUnInstDetails show

Section "MainSection" SEC01
  SetOutPath "$INSTDIR"
  SetOverwrite ifnewer
  File "C:\Инсталятор sprint layout\SprintLayout\Layout60.exe"
  CreateDirectory "$SMPROGRAMS\Sprint Layout 6"
  CreateShortCut "$SMPROGRAMS\Sprint Layout 6\Sprint Layout.lnk" "$INSTDIR\Layout60.exe"
  CreateShortCut "$DESKTOP\Sprint Layout.lnk" "$INSTDIR\Layout60.exe"
  File "C:\Инсталятор sprint layout\SprintLayout\LAYOUT60.INI"
  File "C:\Инсталятор sprint layout\SprintLayout\Sprint-Layout60.chm"
  CreateShortCut "$SMPROGRAMS\Sprint Layout 6\Help.lnk" "$INSTDIR\Sprint-Layout60.chm"
  File "C:\Инсталятор sprint layout\SprintLayout\titel.bmp"
  File /r "C:\Инсталятор sprint layout\SprintLayout\Makros"
SectionEnd

Section -AdditionalIcons
  WriteIniStr "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}"
  CreateShortCut "$SMPROGRAMS\Sprint Layout 6\Website.lnk" "$INSTDIR\${PRODUCT_NAME}.url"
  CreateShortCut "$SMPROGRAMS\Sprint Layout 6\Uninstall.lnk" "$INSTDIR\uninst.exe"
 
SectionEnd

Section -Post
  WriteUninstaller "$INSTDIR\uninst.exe"
  WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\Layout60.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\Layout60.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

SetShellVarContext all

и еще как ассоциацию потом удалять то при деинсталляции?

profcom 12-02-2013 08:54 2088464

andryz80, если уж собирались выкладывать весь код, то и выкладывайте весь, а не кусок.

MKN 12-02-2013 09:27 2088475

andryz80,
Вот сейчас установил прогу на комп с XP. Запустил отдельно файлик ассоциирования с .lay. Всё ОК.
Могу лишь предложить, добавить ещё пользовательские ключи (у меня на этом компе нет пользователей) :
для XP
WriteRegStr HKCU "Software\Classes\Applications\layout 6.0.exe" "" ""
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.lay\OpenWithProgids" "" ""
WriteRegStr HKCU "Software\Classes\Applications\layout 6.0.exe\shell\open\command" "" "$\"$INSTDIR\layout 6.0.exe$\" $\"%1$\""
для W7 +
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.lay\UserChoice" "ProgId" "Layout.File.6"
Для работы под пользователем это важно и про это уже говорилось.

Для удаления своей неубиваемой папки, попробуй добавить ключ перезагрузки - ( будет так : RMDir /r /REBOOTOK "$SMPROGRAMS\Sprint Layout 6" )
После анинсталла перезагрузись и проверь удаление папки. Если и это не поможет, то придётся позвать батюшку и освятить твой скрипт... :)

andryz80 12-02-2013 12:14 2088579

Прощу прощения я не заметил, что код не весь вот вроде весь
под XP на виртуалке я пробовал и все работает как надо а вот под семеркой все проблемы вылезают.

Код:

!define PRODUCT_NAME "Sprint Layout"
!define PRODUCT_VERSION "6.0"
!define PRODUCT_PUBLISHER "Abacom"
!define PRODUCT_WEB_SITE "http://www.abacom-online.de"
!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\Layout60.exe"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"

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


Function .onInit
${If} ${RunningX64}
SetRegView 32
${EndIf}
FunctionEnd


Section  -Associations
WriteRegStr HKLM "SOFTWARE\Classes\.lay" "" "Layout.File.6_0"
WriteRegStr HKLM "SOFTWARE\Classes\Layout.File.6" "" "Редактор печатных плат"
WriteRegStr HKLM "SOFTWARE\Classes\Layout.File.6\DefaultIcon" "" "$INSTDIR\lay.ico"
WriteRegStr HKLM "SOFTWARE\Classes\Layout.File.6\shell" "" "open"
WriteRegStr HKLM "SOFTWARE\Classes\Layout.File.6\shell\Open\command" "" "$\"$INSTDIR\Layout60.exe$\" $\"%1$\""
WriteRegStr HKCU "Software\Microsoft\Windows NT\CurrentVersion\EXTENSIONS" "lay" "$\"$\"$INSTDIR\Layout60.exe$\" ^.lay$\""

SectionEnd

; MUI Settings
!define MUI_ABORTWARNING
!define MUI_ICON "C:\Инсталятор sprint layout\SprintLayout\icons.ico"
!define MUI_UNICON "C:\Инсталятор sprint layout\SprintLayout\Delete_win7.ico"

; Welcome page
!insertmacro MUI_PAGE_WELCOME
; License page
!define MUI_LICENSEPAGE_CHECKBOX
!insertmacro MUI_PAGE_LICENSE "C:\Инсталятор sprint layout\SprintLayout\license.txt"
; Directory page
!insertmacro MUI_PAGE_DIRECTORY
; Instfiles page
!insertmacro MUI_PAGE_INSTFILES
; Finish page
!define MUI_FINISHPAGE_RUN "$INSTDIR\Layout60.exe"
!insertmacro MUI_PAGE_FINISH

; Uninstaller pages
!insertmacro MUI_UNPAGE_INSTFILES

; Language files
!insertmacro MUI_LANGUAGE "Russian"

; MUI end ------

Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "Sprint Layout 6.0 setup.exe"
InstallDir "$PROGRAMFILES\Sprint Layout"
InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" ""
ShowInstDetails show
ShowUnInstDetails show

Section "MainSection" SEC01
  SetOutPath "$INSTDIR"
  SetOverwrite ifnewer
  File "C:\Инсталятор sprint layout\SprintLayout\Layout60.exe"
  CreateDirectory "$SMPROGRAMS\Sprint Layout 6"
  CreateShortCut "$SMPROGRAMS\Sprint Layout 6\Sprint Layout.lnk" "$INSTDIR\Layout60.exe"
  CreateShortCut "$DESKTOP\Sprint Layout.lnk" "$INSTDIR\Layout60.exe"
  File "C:\Инсталятор sprint layout\SprintLayout\LAYOUT60.INI"
  File "C:\Инсталятор sprint layout\SprintLayout\Sprint-Layout60.chm"
  CreateShortCut "$SMPROGRAMS\Sprint Layout 6\Help.lnk" "$INSTDIR\Sprint-Layout60.chm"
  File "C:\Инсталятор sprint layout\SprintLayout\titel.bmp"
  File /r "C:\Инсталятор sprint layout\SprintLayout\Makros"
  File "C:\Инсталятор sprint layout\SprintLayout\lay.ico"
SectionEnd

Section -AdditionalIcons
  WriteIniStr "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}"
  CreateShortCut "$SMPROGRAMS\Sprint Layout 6\Website.lnk" "$INSTDIR\${PRODUCT_NAME}.url"
  CreateShortCut "$SMPROGRAMS\Sprint Layout 6\Uninstall.lnk" "$INSTDIR\uninst.exe"
 
SectionEnd

Section -Post
  WriteUninstaller "$INSTDIR\uninst.exe"
  WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\Layout60.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\Layout60.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

SetShellVarContext all
 
  RMDir /r "$SMPROGRAMS\Sprint Layout 6"
  RMDir  /r "$INSTDIR"
 
  Delete "$DESKTOP\Sprint Layout.lnk"
 
  DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
  DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"
 
  SetAutoClose true
SectionEnd

Да и кстати у меня на семерке один пользователь админ и UAC отключен

profcom 12-02-2013 17:12 2088817

andryz80, Я конечно не специалист в ассоциациях, но на мой взгляд должно быть так для win7
Код:

WriteRegStr HKEY_CURRENT_USER "Software\Classes\.lay" "" "Layout.File.6"
WriteRegStr HKEY_CURRENT_USER "Software\Classes\Layout.File.6\shell\open\command" "" "$\"$INSTDIR\layout 6.0.exe$\" $\"%1$\""


MKN 12-02-2013 18:09 2088842

Скрываваем в окне: опции-значки Minimize\Maximize (Свернуть\ Свернуть в окно. Это, которые в верхнем правом углу окна.)
Код:

!include MUI.nsh
OutFile "Remove MinimizeMaximize.exe"

Function myGUIInit 
  System::Call 'user32::GetWindowLong(i $hwndparent,i -16)i.r0'
  intop $1 0x30000 ~
  intop $0 $0 & $1
  System::Call 'user32::SetWindowLong(i $hwndparent,i -16,i $0)i'
FunctionEnd

!define MUI_CUSTOMFUNCTION_GUIINIT myGUIInit

!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

Section
SectionEnd


Lex_from_Belarus 12-02-2013 21:46 2089019

подскажите а как правильно установить шрифт, я так понимаю прото установить в папку fonts недостаточно?

profcom 12-02-2013 23:00 2089101

Цитата:

Цитата Lex_from_Belarus
подскажите а как правильно установить шрифт, я так понимаю прото установить в папку fonts недостаточно? »

Недостаточно конечно. Тебе очевидно к первоисточник NSIS документации.

Lex_from_Belarus 12-02-2013 23:54 2089139

Цитата:

Цитата profcom
Недостаточно конечно. Тебе очевидно к первоисточник NSIS документации. »

а что делать с otf шрифтами?
там вроде только ttf и fon

profcom 13-02-2013 00:20 2089164

Цитата:

Цитата Lex_from_Belarus
а что делать с otf шрифтами?
там вроде только ttf и fon »

Честно говоря в тонкостях не разбирался. Думаю варианта два пробовать установить с теми макросами что есть (или для ttf или fon), если не получиться дописать тот хедер под установку otf. Может конечно есть еще варианты, но я не сталкивался с такой необходимостью.

andryz80 13-02-2013 02:07 2089199

переписал заново и не помогло
под ХР работает все как надо а вот на семерке не удаляется папка
и еще почему то ярлык на рабочем столе а так же тот файл который ассоциирован не отображают иконку. просто как неизвестный файл и все но ассоциации работают

неуже ли меню пуск как то отличается на семерке от ХР?

Код:

;Sprint Layot 6.0

!define PRODUCT_NAME "Sprint Layout"
!define PRODUCT_VERSION "6.0"
!define PRODUCT_PUBLISHER "Abacom"
!define PRODUCT_WEB_SITE "http://www.abacom-online.de"
!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\Layout60.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"
!include "x64.nsh"

; MUI Settings
!define MUI_ABORTWARNING
!define MUI_ICON "C:\Èíñòàëÿòîð sprint layout\SprintLayout\icons.ico"
!define MUI_UNICON "C:\Èíñòàëÿòîð sprint layout\SprintLayout\Delete_win7.ico"

; Welcome page
!insertmacro MUI_PAGE_WELCOME

; License page
!define MUI_LICENSEPAGE_RADIOBUTTONS
!insertmacro MUI_PAGE_LICENSE "C:\Èíñòàëÿòîð sprint layout\SprintLayout\License.txt"

; Directory page
!insertmacro MUI_PAGE_DIRECTORY
; Start menu page
var ICONS_GROUP
!define MUI_STARTMENUPAGE_NODISABLE
!define MUI_STARTMENUPAGE_DEFAULTFOLDER "Sprint Layout"
!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\Layout60.exe"
!insertmacro MUI_PAGE_FINISH

; Uninstaller pages
!insertmacro MUI_UNPAGE_INSTFILES

; Language files
!insertmacro MUI_LANGUAGE "Russian"

; MUI end ------

Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "setupSprintLayout.exe"
InstallDir "$PROGRAMFILES\Sprint Layout"
InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" ""
ShowInstDetails show
ShowUnInstDetails show


;RequestExecutionLevel admin

Function .onInit
${If} ${RunningX64}
SetRegView 32
${EndIf}
FunctionEnd

Section
SetShellVarContext all
WriteRegStr HKLM "SOFTWARE\Classes\.lay" "" "Layout.File.6"
WriteRegStr HKLM "SOFTWARE\Classes\Layout.File.6" "" "ðåäàêòîð ïå÷àòíûõ ïëàò"
WriteRegStr HKLM "SOFTWARE\Classes\Layout.File.6\DefaultIcon" "" "$INSTDIR\lay.ico"
WriteRegStr HKLM "SOFTWARE\Classes\Layout.File.6\shell" "" "open"
WriteRegStr HKLM "SOFTWARE\Classes\Layout.File.6\shell\Open\command" "" "$\"$INSTDIR\Layout60.exe$\" $\"%1$\""
WriteRegStr HKCU "Software\Microsoft\Windows NT\CurrentVersion\EXTENSIONS" "lay" "$\"$\"$INSTDIR\Layout60.exe$\" ^.lay$\""

WriteRegStr HKEY_CURRENT_USER "Software\Classes\.lay" "" "Layout.File.6"
WriteRegStr HKEY_CURRENT_USER "Software\Classes\Layout.File.6\shell\open\command" "" "$\"$INSTDIR\Layout60.exe$\" $\"%1$\""
SectionEnd

Section "MainSection" SEC01
  SetShellVarContext all
  SetOutPath "$INSTDIR"
  SetOverwrite on
  File "C:\Èíñòàëÿòîð sprint layout\SprintLayout\Layout60.exe"
  File "C:\Èíñòàëÿòîð sprint layout\SprintLayout\LAYOUT60.INI"
  File "C:\Èíñòàëÿòîð sprint layout\SprintLayout\Sprint-Layout60.chm"
  File "C:\Èíñòàëÿòîð sprint layout\SprintLayout\titel.bmp"
  File /r "C:\Èíñòàëÿòîð sprint layout\SprintLayout\Makros"

; Shortcuts
  !insertmacro MUI_STARTMENU_WRITE_BEGIN Application
  SetShellVarContext all
 
  CreateDirectory "$SMPROGRAMS\$ICONS_GROUP"
  CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\Sprint Layout.lnk" "$INSTDIR\Layout60.exe"
  CreateShortCut "$DESKTOP\Sprint Layout.lnk" "$INSTDIR\Layout60.exe"
  CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\Help.lnk" "$INSTDIR\Sprint-Layout60.chm"
  !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\Layout60.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\Layout60.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
  SetShellVarContext all
  !insertmacro MUI_STARTMENU_GETFOLDER "Application" $ICONS_GROUP
  Delete "$INSTDIR\${PRODUCT_NAME}.url"
  Delete "$INSTDIR\uninst.exe"
  RMDir /r "$INSTDIR\Makros"
  Delete "$INSTDIR\titel.bmp"
  Delete "$INSTDIR\Sprint-Layout60.chm"
  Delete "$INSTDIR\LAYOUT60.INI"
  Delete "$INSTDIR\Layout60.exe"

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

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


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


profcom 13-02-2013 08:34 2089261

andryz80, Скинь на какой нибудь файлообменник всю программу и скрипт, попробую помочь.

Lex_from_Belarus 13-02-2013 09:34 2089282

Цитата:

Цитата profcom
Честно говоря в тонкостях не разбирался. Думаю варианта два пробовать установить с теми макросами что есть (или для ttf или fon), если не получиться дописать тот хедер под установку otf. Может конечно есть еще варианты, но я не сталкивался с такой необходимостью. »

так с регистрацией вроде всё ОК, но вот сами шрифты никак не копируются в папку Фонтс, с уверенностью почти в 100% могу предположить что не могу скопироваться из-за отстутствия прав, хотя учётка админская и в Вин8 с этим строго, даже когда просто файл копируешь на диск "С", постоянно подтверждение. Так вот как получить права полные для копирования?

MKN 13-02-2013 09:40 2089283

Цитата:

Цитата Lex_from_Belarus
как получить права полные для копирования? »

Можно использовать AccessControl plug-in
Можно с помощью команд, системных или спец утилит. (Как, уже было где то на форуме - поищи "Как получить доступ к файлу или папке" )

Lex_from_Belarus 13-02-2013 09:41 2089284

Цитата:

Цитата MKN
Lex_from_Belarus,
Не знаю как в W8, а в W7 параметры совместимости устанавливаются в
[HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers]
Может попробовать перед запуском, сначала туда "прописывать" программу-установщик ? »

полсушайте, я или туплю и непрвильно что-то делаю или фигня происходит с добавлением в реестр в эту ветку тоже из-за прав

в секции делаю (хотя пробовал по разному):
Section
SectionIn 1
SetOutPath $INSTDIR
File /r "${pkgdir}"
WriteRegStr HKCU Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers "$INSTDIR\program.exe" "~WIN7RTM"
ExecWait "$INSTDIR\program.exe /S"
SectionEnd

Я тут правильно пишу?

profcom 13-02-2013 09:46 2089288

Цитата:

Цитата Lex_from_Belarus
с уверенностью почти в 100% могу предположить что не могу скопироваться из-за отстутствия прав, хотя учётка админская и в Вин8 с этим строго, даже когда просто файл копируешь на диск "С", постоянно подтверждение. Так вот как получить права полные для копирования? »

Если проблема только в этом, должно решаться так: дать инсталятору соответствующие права прописав в начале скрипта.
Код:

RequestExecutionLevel highest
или
Код:

RequestExecutionLevel admin

MKN 13-02-2013 10:43 2089324

Считываем информацию со страницы PAGE_DIRECTORY о наличии свободного/необходимого объёма дискового пространства.
Скрываем отображение этой информацию на странице PAGE_DIRECTORY.

Код:

!include MUI.nsh
OutFile "GetWindowText-id.exe"
InstallDir "$TEMP"
Var RSPACE
Var ASPACE

!define MUI_PAGE_CUSTOMFUNCTION_SHOW ShowDirectoryPage
!insertmacro MUI_PAGE_DIRECTORY

Function ShowDirectoryPage
;Считать информацию о наличии свободного/необходимого объёма дискового пространства
FindWindow $0 "#32770" "" $HWNDPARENT
GetDlgItem $1 $0 1023 ; IDC_SPACEREQUIRED
System::Call 'User32::GetWindowText(i $1, t .R0, i 256)'
GetDlgItem $1 $0 1024 ; IDC_SPACEAVAILABLE
System::Call 'User32::GetWindowText(i $1, t .R1, i 256)'
StrCpy $RSPACE $R0
StrCpy $ASPACE $R1

;Скрыть отображение информации о наличии свободного/необходимого объёма дискового пространства
GetDlgItem $1 $0 1023 ; IDC_SPACEREQUIRED
System::Call 'user32.dll::ShowWindow(i, i) v($1, 0)'
GetDlgItem $1 $0 1024 ; IDC_SPACEAVAILABLE
System::Call 'user32.dll::ShowWindow(i, i) v($1, 0)'
FunctionEnd

!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

Section
MessageBox MB_OK "$ASPACE"
MessageBox MB_OK "$RSPACE"
SetOutPath "$TEMP"
File "${NSISDIR}\makensisw.exe"
Delete "$TEMP\makensisw.exe"
SectionEnd


dix75 13-02-2013 13:34 2089441

Добрый день!

С помощью NSIS создается деинсталлятор ко всему прочему.
Как сделать так, чтобы этот деинсталлятор пользователь запускал с правами администратора.
могу ли я внутри скрипта NSIS это прописать?

Может быть можно поставить на деинсталлятор атрибут запускать с правами администратора

profcom 13-02-2013 13:53 2089458

Цитата:

Цитата dix75
Добрый день!
С помощью NSIS создается деинсталлятор ко всему прочему.
Как сделать так, чтобы этот деинсталлятор пользователь запускал с правами администратора.
могу ли я внутри скрипта NSIS это прописать? »

Двумя постами выше вашего вопроса это уже обсуждали. Прочитайте в справке значение атрибута RequestExecutionLevel.

andryz80 13-02-2013 13:57 2089462

profcom, вот на свой яндексдиск архив забросил забрать с яндексдиска

Lex_from_Belarus 13-02-2013 15:26 2089529

Цитата:

Цитата Lex_from_Belarus
Цитата MKN:
Lex_from_Belarus,
Не знаю как в W8, а в W7 параметры совместимости устанавливаются в
[HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers]
Может попробовать перед запуском, сначала туда "прописывать" программу-установщик ? »
полсушайте, я или туплю и непрвильно что-то делаю или фигня происходит с добавлением в реестр в эту ветку тоже из-за прав
в секции делаю (хотя пробовал по разному):
Section
SectionIn 1
SetOutPath $INSTDIR
File /r "${pkgdir}"
WriteRegStr HKCU Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers "$INSTDIR\program.exe" "~WIN7RTM"
ExecWait "$INSTDIR\program.exe /S"
SectionEnd
Я тут правильно пишу? »

нда , с админскими правами всё равно не пишет в реестр, а шрифты установились с помощью RequestExecutionLevel admin

может я в коде не то что-то написал?

MKN 13-02-2013 15:56 2089555

Lex_from_Belarus,
Всё стандартно :
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers
глобальные права администратора и совместимости
и
HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers
юзерские права администратора и совместимости

Вопрос рассматривался, в частности здесь :
http://answers.microsoft.com/en-us/w...3-c06b1c616002

Иногда добавляют ключи доп параметров, например :
[HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers]
“C:\\Program Files (x86)\\Adobe\\Your_Exe_File.exe”=”RUNASADMIN”

"Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" - заключи у себя в кавычки !

ps Font обычно инсталлируют так :
Код:

SetOutPath "$FONTS"
File "SYMBOL.TTF" 
WriteRegStr HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts" "Symbol (TrueType)" "SYMBOL.TTF"
System::Call `gdi32::AddFontResource(t)i("$FONTS\SYMBOL.TTF").R0`
${If} $R0 > 0
MessageBox MB_OK "Шрифт был успешно установлен!"
${Else}
MessageBox MB_OK "Не удалось установить шрифт!"
${EndIf}

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

andryz80 14-02-2013 00:14 2089991

Урррааа. все папка проклятая ужаляется и все работает и даже аасоциации
просто вначале добавил


Код:

RequestExecutionLevel highest
RequestExecutionLevel admin

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

Код:

Section
SetShellVarContext all
WriteRegStr HKLM "SOFTWARE\Classes\.lay" "" "Layout.File.6"
WriteRegStr HKLM "SOFTWARE\Classes\Layout.File.6" "" "редактор печатных плат"
WriteRegStr HKLM "SOFTWARE\Classes\Layout.File.6\DefaultIcon" "" "$INSTDIR\lay.ico"
WriteRegStr HKLM "SOFTWARE\Classes\Layout.File.6\shell" "" "open"
WriteRegStr HKLM "SOFTWARE\Classes\Layout.File.6\shell\Open\command" "" "$\"$INSTDIR\Layout60.exe$\" $\"%1$\""
WriteRegStr HKCU "Software\Microsoft\Windows NT\CurrentVersion\EXTENSIONS" "lay" "$\"$\"$INSTDIR\Layout60.exe$\" ^.lay$\""

WriteRegStr HKEY_CURRENT_USER "Software\Classes\.lay" "" "Layout.File.6"
WriteRegStr HKEY_CURRENT_USER "Software\Classes\Layout.File.6\shell\open\command" "" "$\"$INSTDIR\Layout60.exe$\" $\"%1$\""
SectionEnd


profcom 14-02-2013 00:21 2089998

Цитата:

Цитата andryz80
Урррааа. все папка проклятая ужаляется и все работает и даже аасоциации
просто вначале добавил »

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

Цитата andryz80
но есть одно, что не получается. посоветуйте как при деинсталляции удалить ассоциацию файлов.
и еще одна неприятная мелочь. при ассоциации почему то у файлов ассоциированых иконка неизвестного файла. »

Ассоциацию отменять удаление ключей из реестра которыми ассоциируешь.
На счет иконки завтра напишу в чем беда времени не хватило.

andryz80 14-02-2013 01:33 2090029

Цитата:

Цитата profcom
На счет иконки завтра напишу в чем беда времени не хватило. »

надеюсь это исправимо? спасибо огромное буду ждать.

Lex_from_Belarus 14-02-2013 09:45 2090128

А подскажите пожалуйста, как прибить окна выполняющегося инсталятора, когда выполняется вот эта команда?
ExecWait "$INSTDIR\program.exe /S"

Тут в частности вылазит, когда программа установлена, сообщение о том что надо удалить старую, а мне бы хотелось, чтобы постоянно просто устанавливалось никому ничего не говоря.

MKN 14-02-2013 10:31 2090164

Цитата:

Цитата Lex_from_Belarus
как прибить окна выполняющегося инсталятора, когда выполняется вот эта команда?
ExecWait "$INSTDIR\program.exe /S" »

Странно, что у тебя при тихой установке, появляются окна...
В зависимости от организации твоего скрипта можно использовать разные приёмы :

При условии запуска Silent установки - от просто AutoCloseWindow true и HideWindow, до радикального

Код:

Function .onGUIInit
    System::Call "User32::SetWindowPos(i, i, i, i, i, i, i) b ($HWNDPARENT, 0, -10000, -10000, 0, 0, ${SWP_NOOWNERZORDER}|${SWP_NOSIZE})"
FunctionEnd

или, раз у тебя :
Цитата:

Цитата Lex_from_Belarus
Тут в частности вылазит, когда программа установлена, сообщение о том что надо удалить старую »

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

Lex_from_Belarus 14-02-2013 11:59 2090233

MKN, нет, ситуация такова, что program.exe - это не моя программа, но тоже установщик nsis. просто как библотека установится должна, а она уже выдаёт окна, например об уже установленной версии.

andryz80 14-02-2013 12:17 2090253

profcom, и еще вопросик можно ли эту иконку при ассоциации сделать с внешнего файла iconka.ico а не тот, что в ехешнике самой программы?

profcom 14-02-2013 20:27 2090563

Цитата:

Цитата Lex_from_Belarus
MKN, нет, ситуация такова, что program.exe - это не моя программа, но тоже установщик nsis. просто как библотека установится должна, а она уже выдаёт окна, например об уже установленной версии. »

Это говорит о том что скрипт этой программы сконструирован не правильно, и тут два варианта или самому создавать нормальный установщик или например писать на NSIS или Autoit маленький скрипт который будет запускаться со стартом вашего не хорошего установщика и отлавливать появление этого окна, тут же его скрывать и посылать ему закрыться. Как то так должно быть на мой взгляд. Второй вариант быстрее, но менее правильный так ка возможно короткое мерцание при появлении окна.

profcom 15-02-2013 09:38 2090855

Цитата:

Цитата andryz80
profcom, и еще вопросик можно ли эту иконку при ассоциации сделать с внешнего файла iconka.ico а не тот, что в ехешнике самой программы? »

На сколько я понимаю что так сделать нельзя, но возможно вашу желаемую иконку запихнуть в dll и ссылаться на нее. В конечном счете код для вашего инсталятора должен выглядеть так:
Код:

!include "FileFunc.nsh"
Section
File "C:\Инсталятор sprint layout\SprintLayout\Icon.dll"
WriteRegStr HKLM "SOFTWARE\Classes\.lay" "" "Layout.File.6"
WriteRegStr HKLM "SOFTWARE\Classes\Layout.File.6" "" "редактор печатных плат"
WriteRegStr HKLM "Software\Classes\Layout.File.6\shell\open\command" "" "$\"$INSTDIR\Layout60.exe$\" $\"%1$\""
WriteRegStr HKLM "SOFTWARE\Classes\Layout.File.6\DefaultIcon" "" "$INSTDIR\Icon.dll,1"
WriteRegStr HKLM "SOFTWARE\Classes\Layout.File.6\shell" "" "open"
WriteRegStr HKLM "SOFTWARE\Classes\Layout.File.6\shell\Open\command" "" "$\"$INSTDIR\Layout60.exe$\" $\"%1$\""
WriteRegStr HKCU "Software\Microsoft\Windows NT\CurrentVersion\EXTENSIONS" "lay" "$\"$\"$INSTDIR\Layout60.exe$\" ^.lay$\""

${RefreshShellIcons}
SectionEnd

Вот ваша dll.

MKN 15-02-2013 10:03 2090862

Цитата:

Цитата andryz80
можно ли эту иконку при ассоциации сделать с внешнего файла iconka.ico а не тот, что в ехешнике самой программы? »

Можно, и пример уже был приведён. Откуда вообще сомнения ? :) (Многие программы используют конкретные иконки для своих ассоциаций. )
DLL используют, когда в неё помещают наборы разных иконок, с разным разрешением, битностью и т.д.
Тогда ссылаются на id нужной иконки в DLL.

profcom 15-02-2013 12:02 2090932

Цитата:

Цитата MKN
Можно, и пример уже был приведён. Откуда вообще сомнения ? »

У меня сомнения возникли в связи с тем что с его иконкой icons.ico это не проходит(возможно есть требование к разрешению или битности), а вот с dll получается.

MKN 15-02-2013 12:17 2090945

Цитата:

Цитата profcom
с его иконкой icons.ico это не проходит »

Я использовал обыкновенную стандартную ico 32x32x32бит
Если путь указан верно и используется действительно файл ico, а не нечто иное с расширением ico - то работать просто обязано. :)

andryz80 15-02-2013 14:25 2091087

похоже все дело в самой иконке. в файле ico не одна иконка а три разного размера может потому и не заработала. попробовал с обычной иконкой все пашет на ура

andryz80 16-02-2013 01:18 2091651

прошу еще помощи
команда WriteRegStr записывает в реестр
я так понял DeleteRegKey это наоборот. и синтаксис у нее такой же?

почему то компилятор ругается

K.A.V. 16-02-2013 09:32 2091738

Цитата:

Цитата andryz80
прошу еще помощи
команда WriteRegStr записывает в реестр
я так понял DeleteRegKey это наоборот. и синтаксис у нее такой же?
почему то компилятор ругается »

Когда же люди начнут читать русскоязычную справку??? :read:

Справочник по NSIS => Перевод справки NSIS => Работа с реестром

MKN 16-02-2013 11:08 2091781

Подскажите - каким образом создать таймер, отсчитывающий время в ч:м:с с момента старта, т.е. начиная с 00:00:00 ?
С ${GetTime} что то номер не выходит...

K.A.V. 16-02-2013 11:15 2091785

Цитата:

Цитата MKN
Подскажите - каким образом создать таймер, отсчитывающий время в ч:м:с с момента старта, т.е. начиная с 00:00:00 ?
С ${GetTime} что то номер не выходит... »

хм, чет не понял, тебе нужно просто подсчитать разницу во времени? Ну т.е. сколько работал инсталлер с момента запуска и до определённого времени/завершения установки?

Если так, то есть прекрасный плагин Time plug-in, там есть математические операции со временем

MKN 16-02-2013 11:30 2091793

Цитата:

Цитата K.A.V.
тебе нужно просто подсчитать разницу во времени? »

Главное, не подсчитать, а отображать отсчёт реального время с нулевого момента старта и до стоп момента.
Т.е. идёт процесс - наглядно отображается время с нуля-начала процесса.
Процесс закончился - отображение исчезло (+ , если возможно, заненсение результата в переменную)

K.A.V. 16-02-2013 11:52 2091803

Цитата:

Цитата MKN
Главное, не подсчитать, а отображать отсчёт реального время с нулевого момента старта и до стоп момента. »

а, ну тогда здесь нужно отдельный поток создавать...
Попробуй плагин ThreadTimer plug-in, там в callback функции пропиши определение времени, затем сообщения "WM_SETTEXT" на элемент, который будет таймер отображать
Сам не пробовал (сейчас времени нет), чисто теория :)

MKN 16-02-2013 12:01 2091811

Цитата:

Цитата K.A.V.
плагин ThreadTimer plug-in »

И это не то... Он не реальное время отсчитывает, а просто циферки...

Может как то самим организовать отсчёт ? : для минут и секунд заявим 3 переменные, которые будут обозначать разряды времени :
$1 - десятки минут ( от 0 до 5 ), $2 - единицы минут (от 0 до 9), $3 - "сдвоенный" разряд, отсчёта секунд от 00 до 59. (или всё же лучше разделить разряды секунд на десятки и единицы ? Но по моему не обязательно...)

и начнём посекундный отсчёт, с занесением ( и одновременно отображением) значений в эти переменные по следующей логике :
как только отсчёт секунд достигнет 59, через следующую секунду $3 обнуляется до 00 , а в $2 - разряда единиц минут заносится - 1, и отсчёт секунд начинается вновь c 00 до 59
Когда цикл счёта секунд до 59+1 вновь завершится, к единицам минут добавится ещё единичка и так до 9, после чего добавляется единица в разряд десятков минут, т.е. в $1.
И так до достижения 59 мин 59 секунд. А больше вообщем то и не надо, и такое то значение вряд ли когда понадобится на практике...
(хотя в идеале часы тоже надо бы учесть...)

K.A.V. 16-02-2013 12:37 2091828

Цитата:

Цитата MKN
И это не то... Он не реальное время отсчитывает, а просто циферки... »

Да гад ты, всё-таки заставил меня написать код :biggrin:
Я тебе его дал для создания отдельного потока, без которого обновлять элементы (менять циферки, пока идёт распаковка файлов к примеру) не получится

Короче вот смотри код, смотри на заголовок окна ;) А там уже добавишь высчитывание диапазона времени, если нужно (плагином Time plug-in)

Код:

; 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"

; MUI 1.67 compatible ------
!include "MUI.nsh"
!include WinMessages.nsh
XPStyle on
; MUI Settings
!define MUI_ABORTWARNING
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"

; Welcome page
!insertmacro MUI_PAGE_WELCOME
; Directory page
#!insertmacro MUI_PAGE_DIRECTORY
; Instfiles page
!insertmacro MUI_PAGE_INSTFILES

; Finish page
!insertmacro MUI_PAGE_FINISH

; Language files
!insertmacro MUI_LANGUAGE "Russian"


!include "FileFunc.nsh"
!insertmacro GetTime
var day
var month
var year
var name_day
var hour
var minute
var seconds
var HWND_Timer

; MUI end ------


Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "setup.exe"
InstallDir "$TEMP"
ShowInstDetails show


; Получаем Handle
Section -TEST

#GetDlgItem $HWND_Timer $HWNDPARENT 1028
#SendMessage $HWND_Timer ${WM_SETTEXT} "" "STR:TEST"

    GetFunctionAddress $0 FuncTimer
    ThreadTimer::Start /NOUNLOAD 1000 -1 $0
SectionEnd

Function FuncTimer
${GetTime} "" "L" $day $month $year $name_day $hour $minute $seconds
SendMessage $HWNDPARENT ${WM_SETTEXT} "" "STR:$hour:$minute:$seconds"
FunctionEnd




Section
sleep 2000 
SectionEnd
Section
sleep 100 
SectionEnd
Section
sleep 300 
SectionEnd
Section
sleep 499 
SectionEnd
Section
sleep 5000 
SectionEnd
Section
sleep 100 
SectionEnd
Section
sleep 2000 
SectionEnd
Section
sleep 300 
SectionEnd
Section
sleep 100 
SectionEnd





















Section -Post
SectionEnd


Это тебе как в пример, блин пока писал, ты тут понаписал много чего про цифры :lol:
Сейчас прочитаю и вникну в суть

---
Цитата:

Цитата MKN
Может как то самим организовать отсчёт ? : для минут и секунд заявим 3 переменные, которые будут обозначать разряды времени :
$1 - десятки минут ( от 0 до 5 ), $2 - единицы минут (от 0 до 9), $3 - "сдвоенный" разряд, отсчёта секунд от 0 до 59.
и начнём посекундный отсчёт, с занесением ( и одновременно отображением) значений в эти переменные по следующей логике :
как только отсчёт секунд достигнет 59, через следующую секунду $3 обнуляется до 00 , а в $2 - разряда единиц минут заносится - 1, и отсчёт секунд начинается вновь c 00 до 59
Когда цикл счёта секунд до 59+1 вновь завершится, к единицам минут добавится ещё единичка и так до 9, после чего добавляется единица в разряд десятков минут, т.е. в $1.
И так до достижения 59 мин 59 секунд. А больше вообщем то и не надо, и такое то значение вряд ли когда понадобится на практике...
(хотя в идеале часы тоже надо бы учесть...) »

ё-моё, разве тот варинат, который я предложил, не устраивает???
Тот плагин "Time", там можно подсчитать разницу во времени, т.е. смотри:
запускается инсталлер - команда определения времени
в той функции, которую я тебе выше написал (для отображения часов в реальном времени) там прописываем команду на математическую операцию (из текущего времени вычитаем то, которое было на момент запуска инсталлера) и таким образом получаем то время, которое работает инсталлер на текущий момент
Решил изобрести велосипед?? :)

MKN 16-02-2013 12:49 2091833

K.A.V.,
Не, мы кажись не поняли друг друга...
Сначала. Чего я хотел : идёт процесс (или не идёт, всё равно) , в окне инсталлера наблюдаем оконце с таймером, который я запускаю как душе угодно. Или вовсе автономно или когда начнётся процесс установки.
Таймер после запуска начинает отсчёт с 00:00. Ключевой момент - от 00: 00. Для начала - всё. Вот, как то так... :)

K.A.V. 16-02-2013 13:27 2091860

MKN, да блин, какая разница то? Используй плагин time и делай математическую операцию :biggrin:
Ведь всё к одному и тому-же сходится один фиг :yes:

Держи, дружище ;)
Копайся :drug:
Код:


!include "MUI2.nsh"
!include "FileFunc.nsh"
!include "LogicLib.nsh"
!include "WinMessages.nsh"
!include "nsDialogs.nsh"

!include "FileFunc.nsh"
!insertmacro GetTime
var day
var month
var year
var name_day
var hour
var minute
var seconds
var S_day
var S_month
var S_year
var S_name_day
var S_hour
var S_minute
var S_seconds
!include "Time.nsh"

Page custom func
!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
Var Label
Var button
var TimerStarted






 
Function func
 nsDialogs::Create 1018
 pop $0

 GetDlgItem $0 $HWNDPARENT 1037
 SendMessage $0 ${WM_SETTEXT} 0 "STR:Мой текст строки №1"

 GetDlgItem $0 $HWNDPARENT 1038
 SendMessage $0 ${WM_SETTEXT} 0 "STR:Мой текст строки №2"

 
 ${NSD_CreateButton} 25u 27u 150u 15u "Жми давай!"
 pop $button
 ${NSD_OnClick} $button StartTimer
 
 ${NSD_CreateLabel} 0 5u 200u 200u "Здесь будет времечко ;)"
 pop $Label
    GetFunctionAddress $0 FuncTimer
    ThreadTimer::Start /NOUNLOAD 1000 -1 $0
 
 nsDialogs::Show
FunctionEnd


Function StartTimer
# Добавил переменную, потому что при старте сразу идёт отображение времени
StrCpy $TimerStarted 1
${GetTime} "" "L" $S_day $S_month $S_year $S_name_day $S_hour $S_minute $S_seconds
    GetFunctionAddress $0 FuncTimer
    ThreadTimer::Start 1000 -1 $0
FunctionEnd 

Function FuncTimer
# Добавил переменную, потому что при старте сразу идёт отображение времени
StrCmp $TimerStarted "1" +2 0
abort
SendMessage $button ${WM_SETTEXT} "" "STR:Жми ещё для сброса таймера!"
${GetTime} "" "L" $day $month $year $name_day $hour $minute $seconds
${time::MathTime} "second($day.$month.$year $hour:$minute:$seconds) - second($S_day.$S_month.$S_year $S_hour:$S_minute:$S_seconds) =date" $0
StrCpy $0 $0 "" -8  ; Здесь мы отсекаем строку даты, оставляя только часы/минуты/секунды
SendMessage $Label ${WM_SETTEXT} "" "STR:Время: $hour:$minute:$seconds (с момента запуска прошло: $0)"
FunctionEnd
 


Section
;SetAutoClose true
SectionEnd


MKN 16-02-2013 13:36 2091866

K.A.V.,
Однако, как хитро запутанно... :) Благодарю !

Awral 17-02-2013 00:13 2092319

Здравствуйте! Нижепредставленый код загружает в RichDesc содержимое из rtf файла. Но на компьютере конечного пользователя требуется наличие этого файла.
Можно ли его при компиляции также прикрепить этот файл и загружать его в RichDesc из инсталлятора, а не из папки?
Это для того, чтобы не таскать вместе с инсталлятором rtf файлы.

Код:

nsDialogs::CreateControl "RichEdit20A" ${ES_READONLY}|${DEFAULT_STYLES}|${WS_TABSTOP}|${WS_VSCROLL}|${ES_MULTILINE}|${ES_WANTRETURN} ${WS_EX_CLIENTEDGE} 0 15u 100% 120u''
pop $RichDesc
${LoadRTF} readme.rtf $RichDesc

Заранее спасибо

kotkovets 17-02-2013 00:51 2092343

Цитата:

Цитата Awral
этот файл и загружать его в RichDesc из инсталлятора, а не из папки? »

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

    InitPluginsDir
    SetOutPath "$PluginsDir"
    File "readme.rtf"
    ${LoadRTF} "$PluginsDir\readme.rtf" $RichDesc


Lex_from_Belarus 17-02-2013 20:48 2092930

Подскажите что я делаю не так. Есть код:

читать дальше »
!include "FileFunc.nsh"
Var prog

Section "Program"
SectionIn 1
ReadRegStr $0 HKLM "Software\microsoft\windows\currentversion\uninstall\Program" "UninstallString"
${GetParent} "$0" $prog
IfFileExists $prog\Uninstall.exe 0 +2
Goto ok
ReadRegStr $0 HKLM "Software\wow6432node\microsoft\windows\currentversion\uninstall\Program" "UninstallString"
${GetParent} "$0" $prog
IfFileExists $prog\Uninstall.exe 0 +2
Goto ok
SetOutPath $INSTDIR
File /r "${pkgdir}\Program.exe"
ExecWait "$INSTDIR\Program.exe /S"
ok:
SectionEnd


Этим кодом я хочу проверить установлена ли библиотека и если нет, то установить. В UninstallString прописан путь к Uninstaller программы полностью вместе с файлом, поэтому использую ${GetParent}, чтобы отсечь Uninstall.exe и получить просто путь, ну а далее проверка есть лигтштыефдд в папке, если есть значит пропустить, но почему-то этот код не катит, постоянно идёт установка, хотя по пути в реестре всё есть. Проверка в реестре 2 раза, т.к. при установке в 32 битной и 64 битной системе путь в реестре разный.

kotkovets 18-02-2013 00:34 2093082

Цитата:

Цитата Lex_from_Belarus
использую ${GetParent}, чтобы отсечь Uninstall.exe »

ну и нахрен это делать, если потом по коду дописывается Uninstall.exe... тупо...
Lex_from_Belarus, че за хрень, а не нормальный код..
Код:

IfFileExists $prog\Uninstall.exe 0 +2
 Goto ok

че так не написать, что означает, если есть Uninstall.exe, то пропустить ниже по коду 4 команды, относительно процедуры IfFileExists
Код:

IfFileExists $prog\Uninstall.exe +4
 SetOutPath $INSTDIR
 File /r "${pkgdir}\Program.exe"
 ExecWait "$INSTDIR\Program.exe /S"

Заодно, для отладки кода, проверяется, а какой путь, содержимое переменной: "$0"
Код:

MessageBox MB_OK "$$0 = $0" IDOK
Справку читайте на русском языке, где все расписано..

Lex_from_Belarus 18-02-2013 10:40 2093212

IfFileExists $prog\Uninstall.exe +4
ну и как вы себе это представляете?
я же написал что в uninstallstring в реестре хранится путь с фалом, т.е, например c:\program files\program\uninstall.exe.

MessageBox вставляю для проверки везде пишет всё ОК, т.е. и реестр правильно читает и отсекает в пути имя файла, т.е. оставляет просто путь, но вот после ifFileExists идёт дальше а не перескакивает на ОК, как буд-то ifFileExists не срабатывает, т.е. всё остальное проходит, а на ifFileExists косяк.

MKN 18-02-2013 11:43 2093232

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

OutFile "Elapsed Time.exe"

Section
System::Call 'kernel32::GetTickCount(v)i.r0'
; код
Sleep 1200
System::Call 'kernel32::GetTickCount(v)i.r1'
IntOp $0 $1 - $0
        IntOp $1 $0 / 1000
        IntOp $0 $0 % 1000
        IntOp $2 $1 / 60
        IntOp $1 $1 % 60
        IntOp $3 $2 / 60
        IntOp $2 $2 % 60
MessageBox MB_OK "Elapsed Time $3 hours $2 min $1 sec $0 ms"
SectionEnd

Миллисекунды могут "гулять" в мизерном диапазоне...
Вопрос : возможно ли при этом способе визуализировать отсчёт времени в процессе выполнения кода ?

K.A.V. 18-02-2013 15:31 2093399

Цитата:

Цитата MKN
Время исполнения кода можно подсчитывать и таким способом, с помощью функции GetTickCount »

У меня при таком раскладе показывает сколько Windows работает с момента запуска :)

profcom 18-02-2013 15:42 2093408

Цитата:

Цитата MKN
Вопрос : возможно ли при этом способе визуализировать отсчёт времени в процессе выполнения кода ? »

Для кастомных страниц конечно легко визуализировать или необходимо на стандартных?

Цитата:

Цитата K.A.V.
У меня при таком раскладе показывает сколько Windows работает с момента запуска »

Так не должно быть, ведь в начале берется время работы windows и потом после паузы снова берется время работы. После чего из второго вычитается первое и преобразовывается в формат часы, минуты, секунды.
У меня так работает с маленьким расхождением в миллисекундах.

MKN 18-02-2013 16:39 2093466

Цитата:

Цитата profcom
Для кастомных страниц конечно легко визуализировать »

Для кастомных. Как это будет выглядеть ?
Цитата:

Цитата K.A.V.
показывает сколько Windows работает с момента запуска »

Странно...
А если с выделением-очисткой памяти :
Код:

System::Alloc 400
pop $2
System::Call 'kernel32::GetTickCount()i .r0'
System::Free $2


K.A.V. 18-02-2013 17:33 2093510

Цитата:

Цитата MKN
Странно... »

У меня команда была забита в onInit функции (забивал в предыдущий пример с отображением времени в заголовке) :)
Если в секции с паузой, то всё норм

profcom 18-02-2013 20:02 2093655

Цитата:

Цитата MKN
Для кастомных. Как это будет выглядеть ? »

Ну как то так на мой взгляд, дальше по воображению можно поставить значение куда угодно. Это лишь пример как использовать.
Код:

!include nsDialogs.nsh
OutFile "Time.exe"

Var Stime
Var Ttime
Var DIALOG
Var TEXT

Page custom Time TimeEnd

Function .onInit
System::Call 'kernel32::GetTickCount(v)i.r0'
StrCpy $Stime $0
FunctionEnd

Function Time
nsDialogs::Create 1018
        Pop $DIALOG
       
        ${NSD_CreateLabel} 10u 10u 100% 10u "Прошло $3 часов $2 минут $1 секунд"
        Pop $TEXT
       
        ${NSD_CreateTimer} ChekTime 100
       
nsDialogs::Show
FunctionEnd

Function TimeEnd
${NSD_KillTimer} ChekTime
FunctionEnd

Function ChekTime
System::Call 'kernel32::GetTickCount(v)i.r1'
IntOp $0 $1 - $Stime
        IntOp $1 $0 / 1000
        IntOp $0 $0 % 1000
        IntOp $2 $1 / 60
        IntOp $1 $1 % 60
        IntOp $3 $2 / 60
        IntOp $2 $2 % 60
StrCpy $Ttime "Прошло $3 часов $2 минут $1 секунд"

${NSD_SetText} $TEXT "$Ttime"
FunctionEnd

Section
SectionEnd


profcom 18-02-2013 21:16 2093710

Вот еще набросал примерчик для стандартной функций установки используя плагин ThreadTimer для создания параллельного потока . В принципе куда угодно можно отобразить время.
Код:

OutFile "Time2.exe"
!include "MUI.nsh"

Var Stime
Var Ttime

!insertmacro MUI_PAGE_INSTFILES

Function .onInit
System::Call 'kernel32::GetTickCount(v)i.r0'
StrCpy $Stime $0
GetFunctionAddress $1 ChekTime
ThreadTimer::Start 100 -1 $1
FunctionEnd

Section
DetailPrint "Команда 1"
Sleep 10000
DetailPrint "Команда 2"
Sleep 10000
DetailPrint "Команда 3"
Sleep 10000
DetailPrint "Команда 4"
Sleep 10000
ThreadTimer::Stop
SectionEnd

Function ChekTime
System::Call 'kernel32::GetTickCount(v)i.r1'
IntOp $0 $1 - $Stime
        IntOp $1 $0 / 1000
        IntOp $0 $0 % 1000
        IntOp $2 $1 / 60
        IntOp $1 $1 % 60
        IntOp $3 $2 / 60
        IntOp $2 $2 % 60
StrCpy $Ttime "Прошло $3 часов $2 минут $1 секунд"
!insertmacro MUI_HEADER_TEXT "Установка" "$Ttime"
FunctionEnd


profcom 18-02-2013 21:57 2093758

Цитата:

Цитата Lex_from_Belarus
Подскажите что я делаю не так. Есть код: »

Правильно вам делали замечания, пишите проще что бы самому не запутаться. И желательно изучите логические конструкции в русском справочнике, пригодиться еще не раз.
Код:

!include LogicLib.nsh

Section "Program"
SectionIn 1
ReadRegStr $0 HKLM "Software\microsoft\windows\currentversion\uninstall\Program" "UninstallString"
ReadRegStr $1 HKLM "Software\wow6432node\microsoft\windows\currentversion\uninstall\Program" "UninstallString"
${IfNot} ${FileExists} "$0"
${AndIfNot} ${FileExists} "$1"
        SetOutPath $INSTDIR
        File /r "${pkgdir}\Program.exe"
        ExecWait "$INSTDIR\Program.exe /S"
${EndIf}
SectionEnd


MKN 19-02-2013 09:00 2094037

Озадачился я тут такой задачкой : Необходимо получить Callback при наведении указателя мыши и клике левой кнопкой мыши на любом объекте с известным ID, на любой страницы .
Т.е. - навёл мышь на объект, кликнул ЛКМ - произошло действие. Есть ли универсальное решение для такой задачи ?

Также интересно - возможно ли при вышеописанном действии, выделять границы объекта (на время нахождения указателя мыши в пределах границы объекта) ?

kotkovets 19-02-2013 09:02 2094039

Цитата:

Цитата MKN
Есть ли универсальное решение для такой задачи ? »

нет, только плагин.

MKN 19-02-2013 09:11 2094045

kotkovets,
А возможен ли обходной маневр - если вычислить координаты нужного объекта, а при клике ЛКМ, тут же вычисляется позиция курсора и вызывается функция сравнения "пересечения" границ координат указателя и объекта - что и вызывает событие при "пересечении" ?
Или это получится громозда, а не код...

MKN 20-02-2013 16:27 2095155

Изменяем месторасположение полосы прогресс бара (индикатора процесса установки) на странице PAGE_INSTFILES

Код:

!include "MUI2.nsh"
!define MUI_PAGE_CUSTOMFUNCTION_SHOW instfilesshow
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"
OutFile "PositionProgBar.exe"
ShowInstDetails nevershow

Function instfilesshow
FindWindow $9 "#32770" "" $HWNDPARENT
GetDlgItem $8 $9 0x3EC
System::Call '*(i,i,i,i)i.r7'
System::Call 'USER32::GetClientRect(ir9,ir7)'
System::Call '*$7(i,i,i.r0,i.r1)'
System::Call 'USER32::GetWindowRect(ir8,ir7)'
System::Call '*$7(i.r2,i.r3,i.r4,i.r5)'
System::Free $7
; высота полоски прогресс бара
IntOp $5 $5 - $3 ;
;IntOp $5 $5 + 20
StrCpy $2 10
IntOp $4 $0 - 20
IntOp $0 $5 / 2
IntOp $1 $1 / 2
IntOp $1 $1 - $0
!define SWP_NOZORDER 4
System::Call 'USER32::SetWindowPos(ir8,i0,ir2,ir1,ir4,ir5,i${SWP_NOZORDER})'
FunctionEnd

Section
Sleep 500
SectionEnd

Функция GetClientRect извлекает координаты рабочей области окна. Рабочие координаты определяют левый верхний и
нижний правый углы рабочей области. Поскольку рабочие координаты определены относительно левого верхнего угла рабочей области окна, координаты левого верхнего угла - (0,0).

Функция GetWindowRect отыскивает размеры рамки ограничивающей прямоугольник определяемого окна.
Размеры даны в экранных координатах, которые расположены относительно левого верхнего угла экрана.

Функция SetWindowPos изменяет размер, позицию и Z-последовательность дочернего, выскакивающего или верхнего уровня окна.
Дочерние, выскакивающие и верхнего уровня окна размещаются по порядку согласно их появлению на экране.
Самое верхнее окно принимает самый высокий ранг и становится первым окном в Z-последовательности.

SWP_NOZORDER - Сохраняет текущую Z-последовательность (игнорирует параметр hWndInsertAfter - дескриптор порядка размещения).

Waterclo 21-02-2013 04:38 2095622

Уважаемые!
Обнаружил полезный пример:
Цитата:

Цитата MKN
Установка на кнопку стандартной страницы, таймера с индикацией обратного отсчёта, т.е. задержка активности кнопки перед продолжением установки. »

Подскажите, как установить таймер обратного отсчёта на кнопку сообщения (MessageBox MB_OK...), чтобы сообщение закрылось и установка завершилась, если не нажать на кнопку до истечения времени.

MKN 21-02-2013 09:16 2095670

Цитата:

Цитата Waterclo
как установить таймер обратного отсчёта на кнопку сообщения (MessageBox MB_OK...), чтобы сообщение закрылось и установка завершилась, если не нажать на кнопку до истечения времени. »

Можно, почти то же самое, но проще. "Почти" - это без визуализации отсчёта, отсчёт идёт, но скрытно... Уже был пример от kotkovets, :
Код:

!include "MUI2.nsh"
!insertmacro MUI_LANGUAGE "English"
OutFile "MessageBoxTimeout.exe"
!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

Можно конечно попробовать ждать появления окна MessageBox MB_OK, найти в нём ID кнопки и "повесить" на него Delay::DelayButton.

Waterclo 21-02-2013 15:30 2095935

Цитата:

Цитата MKN
пример от kotkovets »

Спасибо, проглядел я этот пример. Однако, это не совсем то что нужно. Мне надо закрыть сообщение без предупреждений, что оно закроется:
Код:

MessageBox MB_OK|MB_ICONEXCLAMATION "Продолжить установку?" IDOK Start
Если нажать OK, то установка продолжится, а если время истекло, то переход на Exit. Такой вариант вполне годится.
А вообще, было бы интересно узнать подробнее, как поставить таймер на кнопку в таком сообщении.

Awral 21-02-2013 21:25 2096263

Здравствуйте! Как изменить текст, который отображается над прогрессбаром на странице установки? Там показываются файлы, которые сейчас распаковываются. А мне нужно поставить свой текст. Это возможно?

Заранее спасибо

profcom 21-02-2013 23:50 2096356

Цитата:

Цитата Awral
Здравствуйте! Как изменить текст, который отображается над прогрессбаром на странице установки? Там показываются файлы, которые сейчас распаковываются. А мне нужно поставить свой текст. Это возможно?
Заранее спасибо »

Конечно возможно, если справку читать. Тебе нужно установить атрибут SetDetailPrint. Пример:
Код:

SetDetailsPrint none
File "secret file.dat"
SetDetailsPrint both

А для отображение там своего текста пиши:
Код:

DetailPrint "бла бла бла"

MKN 22-02-2013 11:27 2096546

Цитата:

Цитата Waterclo
Мне надо закрыть сообщение без предупреждений, что оно закроется »

Так и не предупреждай о закрытии. :)
Цитата:

Цитата Waterclo
Если нажать OK, то установка продолжится, а если время истекло, то переход на Exit.»

Сделай так, как тебе надо, исходя из Return Code. Ещё раз код :
Код:

!include "MUI2.nsh"
!insertmacro MUI_LANGUAGE "English"
OutFile "MsgBoxTimeout.exe"

!macro MsgBox out text title flags
;обыкновенное сообщение
;System::Call "user32::MessageBox(i $HWNDPARENT, t '${text}', t '${title}', i ${flags}) i.s"

 
;сообщение с таймером с примером значения задержки - 2с
System::Call "user32::MessageBoxTimeout(i $HWNDPARENT, t '${text}', t '${title}', i ${flags}, i 0, i 2000) i.s"

Pop ${out}
!macroend

Section
!insertmacro MsgBox $0 "    Текст сообщения    " "  Заголовок  " 0x40|0x0
MessageBox MB_OK "Return Code: $0"
SectionEnd

Что в примере кода обозначает 0x40|0x0 :

Кнопки в сообщении и надписи действий на кнопках
0x0 - ОК
0x1 - ОК Отмена
0x2 - Прервать Повтор Пропустить
0x3 - Да Нет Отмена
0x4 - Да Нет
0x5 - Повтор Отмена
0x6 - Отмена Повторить Продолжить
0x4000 - ОК Справка

Значок сообщения :
0x10 - Белый X-крест в красном круге
0x20 - Вопросительный знак в "всплывающем облаке"
0x30 - Восклицательный знак в жёлтом треугольнике
0x40 - Восклицательный знак в "всплывающем облаке"

Инфо : http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

MKN 25-02-2013 17:34 2098700

Ещё раз о таймере... Отсчитать время можно также с помощью функции timeGetTime
Эта функция якобы менее ресурсоёмкая, сравнительно с GetTickCount...
Код:

OutFile "Elapsed Time-timeGetTime.exe"
Section
System::Call "winmm::timeGetTime() i .r0 ?r"
Sleep 1200
System::Call "winmm::timeGetTime() i .r1 ?r"
System::Free 0

IntOp $0 $1 - $0
        IntOp $1 $0 / 1000
        IntOp $0 $0 % 1000
        IntOp $2 $1 / 60
        IntOp $1 $1 % 60
        IntOp $3 $2 / 60
        IntOp $2 $2 % 60
MessageBox MB_OK "Elapsed Time $3 hours $2 min $1 sec $0 ms"
SectionEnd

А если нужна высокая точность подсчёта, то рекомендуют применять функцию QueryPerformanceCounter ,
которая извлекает текущее значение счетчика высокого разрешения.
Только зачем это нужно на практике не ясно... Эту функцию чаще применяют для всякой Random_изации, что есть тоже не понятное явление для практики...
Обычного подсчёта мне добиться не удалось... Синтаксис был такой ("основной" ,без вычитания...) :
Код:

System::Call "kernel32::QueryPerformanceCounter(*l.r0)"
System::Free 0
System::Int64Op $0 / 1000000  ;; конвертация полученого значения в иное измерение (вроде как наносекунды в секунды)
Pop $1 # почему 1  ?


kotkovets 25-02-2013 19:45 2098774

Цитата:

Цитата MKN
System::Free 0
Pop $1 # почему 1 ? »

Код:

System::Call "kernel32::QueryPerformanceCounter(*l.r1)i.R0"
sleep 500
System::Call "kernel32::QueryPerformanceCounter(*l.r2)"
System::Int64Op $2 - $1
pop $3
  MessageBox MB_OK "$$2 = $2$\n$$1 = $1$\n$$3 = $3$\nвозврат QueryPerformanceCounter = $R0" IDOK

QueryPerformanceCounter - возвращает булево значение, т.е $R0 = 1 --> функция отработала нормально
Что функция возвратила в буфер - не понятно, может тут и числа быть с плавающей запятой, который NSIS
не умеет работать (хотя стандарный плаг Math (для мат. вычислений) умеет.
Дерзай! :)

andryz80 26-02-2013 21:21 2099681

возникла задача сделать небольшую програмку

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

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

все таки не нашел как менять атрибуты

K.A.V. 26-02-2013 21:36 2099697

andryz80, Справочник по NSIS

GetDrives: перечисляем устройства хранения информации
Locate: поиск файлов/папок и не только...

Аттрибуты файлам устанавливаются командой SetFileAttributes
Код:

SetFileAttributes "$WINDIR\explorer.exe" HIDDEN|READONLY
Аттрибуты, которые можно установить: NORMAL, ARCHIVE, HIDDEN, OFFLINE, READONLY, SYSTEM, TEMPORARY
ИХ можно комбинировать, т.е. для файла указывать сразу несколько аттрибутов, только разделить их нужно вертикальной чертой (пример выше)

andryz80 26-02-2013 22:07 2099730

а атрибуты папок какой командой менять?

andryz80 26-02-2013 23:00 2099777

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

kotkovets 26-02-2013 23:10 2099788

Цитата:

Цитата andryz80
а атрибуты папок какой командой менять? »

Что не понятного?
Цитата:

Цитата K.A.V.
SetFileAttributes "$WINDIR\explorer.exe" HIDDEN|READONLY »

пишем путь к папке и удивляемся...!
Цитата:

Цитата andryz80
дл борьбы с вирусом, который на флешке прячет файлы »

бред... :biggrin:

andryz80 26-02-2013 23:36 2099805

почему бред?

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

вроде должно сработать

Waterclo 27-02-2013 12:04 2100137

Цитата:

Цитата kotkovets
Что функция возвратила в буфер - не понятно »

Вот в том всё и дело! Я вообще сообразить не в состоянии, по причине довольно скудных познаний в таких NSISько строительных операциях.
SOS! Мне надо как-то привести к общему знаменателю кусок кода, только никак не могу собразить как это заставить перейти на Start: - после нажатия OK, а без нажатия - на Exit:, если функция в любом случае возвращает 1, нажимай ОК или не нажимай:
Код:

!include "MUI.nsh"
SilentInstall Silent
OutFile "Install.exe"
!insertmacro MUI_LANGUAGE Russian
!macro MsgBox out text title flags
System::Call "user32::MessageBoxTimeout(i $HWNDPARENT, t '${text}', t '${title}', i ${flags}, i 0, i 5000) i.s"
Pop ${out}
!macroend
Section "MessageBox"
!insertmacro MsgBox $0 "Продолжим установку?" "Оконо закроется через 5 сек." 0x40|0x40

Start:
nsDialogs::SelectFileDialog open "" "Приложение (*.exe;*.msi)|*.exe;*.msi|Файлы (*.reg;*.bat;*.cmd;*.js;*vbs)|*.reg;*.bat;*.cmd;*.js;*vbs|"
Pop $1
StrCmp $1 "" Cancel
MessageBox MB_OK|MB_ICONINFORMATION "Выбран файл $1"
ExecWait "$1"
Goto Retry
Cancel:
MessageBox MB_RETRYCANCEL|MB_ICONQUESTION "Выберите файл." IDRETRY Start
Retry:
MessageBox MB_YESNO|MB_DEFBUTTON2|MB_ICONQUESTION "Установим что-то ещё?" IDYES Start IDNO Exit
Exit:
SetAutoClose true
SectionEnd

Вот ещё вопрос:
Цитата:

Цитата MKN
Можно конечно попробовать ждать появления окна MessageBox MB_OK, найти в нём ID кнопки и "повесить" на него Delay::DelayButton. »

Тут тоже интересно, нигде не могу найти какие функции обеспечивает Delay.dll. А можно ли вешать таймер на активную кнопку?

MKN 27-02-2013 16:49 2100403

Waterclo,
Для различия кодов возврата надо использовать сообщение типа 0x1 (или иное "несколькокнопочное", с учётом конкретных кодов возврата)
Код:

!include "MUI2.nsh"
!insertmacro MUI_LANGUAGE "English"
OutFile "MsgBoxTimeout.exe"

!macro MsgBox out text title flags
System::Call "user32::MessageBoxTimeout(i $HWNDPARENT, t '${text}', t '${title}', i ${flags}, i 0, i 2000) i.s"
Pop ${out}
!macroend

Section
!insertmacro MsgBox $0 "    Текст сообщения    " "  Заголовок  " 0x40|0x1
;MessageBox MB_OK "Return Code: $0"
${If} $0 != 1
  MessageBox MB_OK "Прошло 2 с. Значит Exit или ещё чего там..."
  Quit
${EndIf}
MessageBox MB_OK "нажали ОК, значит делаем то то"
SectionEnd

Delay.dll - любительское творение и чего умеет, кроме ранее описанного, не известно.
А вешать таймер отсчёта на кнопку в сообщении - хлопотно и наверняка громоздко. И стоит ли оно того... Может конечно кто и заинтересуется и напишет плаг, но маловероятно...

MKN 27-02-2013 18:03 2100465

Для определения оборудования в NSIS , используют обычно HwInfo plug-in (а других просто нет...) ( http://nsis.sourceforge.net/HwInfo_plug-in )
Но возможности его весьма убоги. Есть ещё CPUFeatures, определяет массу параметров CPU (почему то кроме названия проца... )
И похоже, что другого, тем более универсального, инструментария - нет...
Кое что конечно можно получить с помощью API и выудить из реестра... Только это довольно-таки громоздко в коде.
Например, определяем сетевой адаптер и некоторые его параметры :
Код:

OutFile "LanDetect.exe"
SetPluginUnload  alwaysoff
!define maxsize 4096

Section
 System::Alloc ${maxsize}
 pop $3
 System::Call 'iphlpapi::GetAdaptersInfo(i r3r4, *l ${maxsize} r2)i.r1'
 ;MessageBox MB_OK "GetAdaptersInfo return is $1"
 System::Call '*$4(i.r4,i,&t260.r5, &t132.r6, i.r7, l.r8)'
 Math::Script "hex={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};"
 Math::Script "s=''; a=r8; b=r7; #{b-->0,s=s+hex[a/16%16]+hex[a%16]+#[b>0,'-','']; a=a/256;}; r9=s;"
 MessageBox MB_OK "Adapter name is $5$\ndesc $6$\naddr len $7$\naddr $8$\nMacAddr: $9"
 System::Free 0
Math::Script ""
SectionEnd

Или вот хороший способ получить информацию о памяти :
Код:

OutFile "MemInfo.exe"
Section
System::Alloc 64
Pop $1
System::Call "*$1(i64)"
; Функция GlobalMemoryStatus позволяет получить информацию про текущее использование системой как физической, так и ;виртуальной памяти.
;Информация, возвращаемая функцией GetMemoryStatusEx, постоянно изменяется. Нет никакой гарантии, что два последовательных ;вызова этой функции вернут одинаковые значения.
System::Call "Kernel32::GlobalMemoryStatusEx(i r1)"
System::Call "*$1(i.r2, i.r3, l.r4, l.r5, l.r6, l.r7, l.r8, l.r9, l.r10)"
System::Free $1
; convert the Total Physical Memory which is in bytes to Mbytes
System::Int64Op $4 / 1048576
Pop $4
System::Int64Op $5 / 1048576
Pop $5
System::Int64Op $6 / 1048576
Pop $6
System::Int64Op $7 / 1048576
Pop $7
System::Int64Op $8 / 1048576
Pop $8
System::Int64Op $9 / 1048576
Pop $9
MessageBox MB_OK "Structure size: $2 bytes"
MessageBox MB_OK "Memory load: $3%"
MessageBox MB_OK "Total physical memory: $4 Mb"
MessageBox MB_OK "Free physical memory: $5 Mb"
MessageBox MB_OK "Total page file: $6 Mb"
MessageBox MB_OK "Free page file: $7 Mb"
MessageBox MB_OK "Total virtual: $8 Mb"
MessageBox MB_OK "Free virtual: $9 Mb"
SectionEnd

В то же время, для целей получения разнообразной информации, существует занятный Header http://nsis.sourceforge.net/WMI_header
Возможности его широки и не объятны, только не понимает он к сожалению по русски.
К примеру, при определении сетевых адаптеров, видим сплошные кракозябры в описании...
Код:

OutFile WMI.exe
RequestExecutionLevel Admin
!include MUI2.nsh
!include WMI.nsh
!include LogicLib.nsh
!insertmacro MUI_LANGUAGE "English"

Section "test"
#List network adapters:
${WMIGetInfo} root\CIMV2 Win32_NetworkAdapter name callback_Function
SectionEnd
 
Function callback_Function
#$R0 = result number, $R1 = total results, $R2 = result name
detailprint "$R0/$R1=$R2"
FunctionEnd

Можно ли это как то исправить ?

Aster 28-02-2013 13:11 2101043

Друзья, насколько НСИС дружит с Вин8 ?
Возможно вопрос уже задавался... Если что, извиняюсь...

MKN 28-02-2013 13:40 2101058

Цитата:

Цитата Aster
насколько НСИС дружит с Вин8 ? »

NSIS скрипты в W8 работают нормально.

Aster 28-02-2013 13:53 2101068

MKN, благодарю, не подскажете ещё, взаимодействия с реестром также корректно работают? Создание ключей, удаление ключей в реестре и т.д

MKN 28-02-2013 15:06 2101132

Aster,
Быстрее и проще проверить самому. :) И с реестром всё хорошо работает. Что и как сделаешь, то и получишь. :)
Делай всё согласно доку и нашему Справочнику - и всё будет так, как надо.

K.A.V. 28-02-2013 16:30 2101187

Цитата:

Цитата MKN
Возможности его широки и не объятны, только не понимает он к сожалению по русски. »

Цитата:

Цитата MKN
Можно ли это как то исправить ? »

Смари сюда :)

Код:

Function callback_Function
#$R0 = result number, $R1 = total results, $R2 = result name
System::Call "user32::OemToChar(tR2, t.r2)"
detailprint "$R0/$R1=$R2"
FunctionEnd

В переменную $2 будет скидываться перекодированная строка :)

MKN 28-02-2013 16:40 2101196

Цитата:

Цитата K.A.V.
В переменную $2 будет скидываться перекодированная строка »

Не.. Всё как было так и осталось... И чего делать ? (У меня так... Позже на другой машине проверю)

K.A.V. 28-02-2013 17:40 2101232

Цитата:

Цитата MKN
Не.. Всё как было так и осталось... И чего делать ? (У меня так... Позже на другой машине проверю) »

Может ты в переменных попутал чего? У меня всё норм преобразовывает...Перекидывает не в $R2, а в $2


MKN 28-02-2013 17:45 2101236

Цитата:

Цитата K.A.V.
Перекидывает не в $R2, а в $2 »

Точно, попутал. Теперь всё ОК.

Давно интересует такой вопрос - может ли NSIS работать с окнами класса Internet Explorer_Server ? (Это что то связанное с GetIHTMLDocument2 )
( К примеру, Corel их вовсю применяет в своих инсталлерах , да и др. ПО тоже. )

Valdise 01-03-2013 10:09 2101609

Цитата:

Цитата Valdise
Как на доп. странице выбора компонентов, группы чекбоксов связать с Радиокнопками? »

Ни кто мыслишки не подкинул, так что самого Муза посетила :yes:

Код:

;-Создание ярлыков из INI-файла
;-!Радиокнопка ВСЕМ
!insertmacro MUI_INSTALLOPTIONS_READ $INI_VALUE "io_Shortcut_XXX.ini" "Field 3" "State"
StrCmp $INI_VALUE "1" "" +2
SetShellVarContext all ;current- для текущего ПО УМОЛЧАНИЮ!!!
;-!Радиокнопка ТЕКУЩЕМУ
!insertmacro MUI_INSTALLOPTIONS_READ $INI_VALUE "io_Shortcut_XXX.ini" "Field 4" "State"
StrCmp $INI_VALUE "1" "" +2
SetShellVarContext current

Т.е при выборе одной из радиокнопок сценарий переключается для одного из - all или current
P.S Может кому понадобится, поэтому хвастаюсь :)

MKN 01-03-2013 17:21 2101969

Изменяем стандартную страницу выбора компонентов PAGE_COMPONENTS без правки ресурсов

Код:

!define PRODUCT_NAME "COMPONENTSPRE"
!define PRODUCT_VERSION "1.0"
Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "COMPONENTSPRE.exe"
InstallDir "$TEMP"
!include "MUI2.nsh"

!define SWP_SHOWWINDOW 0x00000040

!define MUI_PAGE_HEADER_TEXT "Текст 1"
!define MUI_PAGE_HEADER_SUBTEXT "Текст 2"
!define MUI_COMPONENTSPAGE_TEXT_TOP "Текст 3"

!define MUI_PAGE_CUSTOMFUNCTION_PRE COMPPRE
!define MUI_PAGE_CUSTOMFUNCTION_SHOW SETCTLPOS
!insertmacro MUI_PAGE_COMPONENTS

!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

Section "Section1" SEC01
SectionEnd

Section "Section2" SEC02
SectionEnd

Section "Section3" SEC03
SectionEnd

Function COMPPRE
SectionSetText ${SEC01} "Component1"
SectionSetText ${SEC02} "Component2"
SectionSetText ${SEC03} "Component3"
FunctionEnd

Function SETCTLPOS
FindWindow $R0 "#32770" "" $HWNDPARENT
GetDlgItem $0 $R0 1021
System::Call 'user32::DestroyWindow(ir0)'
GetDlgItem $0 $R0 1022
System::Call 'user32::DestroyWindow(ir0)'
GetDlgItem $0 $R0 1023
System::Call 'user32::DestroyWindow(ir0)'
GetDlgItem $0 $R0 1042
System::Call 'user32::DestroyWindow(ir0)'
GetDlgItem $0 $R0 1043
System::Call 'user32::DestroyWindow(ir0)'
GetDlgItem $0 $R0 1017
System::Call "user32::SetWindowPos(ir0,i0,i0,i30,i450,i180,i${SWP_SHOWWINDOW})"
GetDlgItem $0 $R0 1032
System::Call "user32::SetWindowPos(ir0,i0,i0,i52,i450,i158,i${SWP_SHOWWINDOW})"
FunctionEnd


MKN 01-03-2013 18:20 2102006

Подскажите пожалуйста - как с помощью WMI вызова узнать версию файла шрифта ?
(вроде бы надо как то использовать Win32_FontInfoAction Version. Но как ? )

kotkovets 02-03-2013 12:41 2102473

Вложений: 1
Цитата:

Цитата MKN
(вроде бы надо как то использовать Win32_FontInfoAction Version. Но как ? ) »

можно так в скрипте vbs:
Код:

On Error Resume Next
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_FontInfoAction",,48)
For Each objItem in colItems
    Wscript.Echo "ActionID: " & objItem.ActionID
    Wscript.Echo "Caption: " & objItem.Caption
    Wscript.Echo "Description: " & objItem.Description
    Wscript.Echo "Direction: " & objItem.Direction
    Wscript.Echo "File: " & objItem.File
    Wscript.Echo "FontTitle: " & objItem.FontTitle
    Wscript.Echo "Name: " & objItem.Name
    Wscript.Echo "SoftwareElementID: " & objItem.SoftwareElementID
    Wscript.Echo "SoftwareElementState: " & objItem.SoftwareElementState
    Wscript.Echo "TargetOperatingSystem: " & objItem.TargetOperatingSystem
    Wscript.Echo "Version: " & objItem.Version
Next

хотя версия не возвращается почему-то и там и там.. работает практически аналогично..
эксперементально на nsis

MKN 02-03-2013 13:08 2102492

kotkovets,
А как натравить скрипт на конкретный TTF ? (рядом находящиеся не видит...)
И очень очень долго идёт обработка (у меня минуты три, а что находит - не понятно...)
Вот так после обработки :
Код:

===============root\CIMV2=====================
GlobalUserInterface.CompositeFont{A3051CD0-2F64-3813-A88D-B8DCCDE8F8C7}
Global User Interface
GlobalUserInterface.CompositeFont
=======
GlobalSerif.CompositeFont{A3051CD0-2F64-3813-A88D-B8DCCDE8F8C7}
Global Serif
GlobalSerif.CompositeFont
=======
GlobalSansSerif.CompositeFont{A3051CD0-2F64-3813-A88D-B8DCCDE8F8C7}
Global Sans Serif
GlobalSansSerif.CompositeFont
=======
GlobalMonospace.CompositeFont{A3051CD0-2F64-3813-A88D-B8DCCDE8F8C7}
Global Monospace
GlobalMonospace.CompositeFont
=======
===================end======================
Готово

Может WMI вообще не пригоден для работы с шрифтами ? И может использовать API FontResource функции ? Правда никто не знает как...

kotkovets 02-03-2013 13:36 2102510

Цитата:

Цитата MKN
А как натравить скрипт на конкретный TTF ? »

по ходу только трассируется по умолчанию шрифт..
я не спец по vbs..
спроси в другой теме..
попробую перевести на nsis , ну если узнаешь как на VBS делать..:)

Waterclo 03-03-2013 08:41 2103034

MKN, спасибо всё получилось, как я хотел.
Цитата:

Цитата MKN
!insertmacro MsgBox $0 " Текст сообщения " " Заголовок " 0x40|0x1 »

Один вопрос остался, как в " Текст сообщения ", если он окажется очень длинным, сделать перенос строк? С символом "\n" не получается.

MKN 03-03-2013 10:47 2103078

Цитата:

Цитата Waterclo
С символом "\n" не получается. »

Используй $\r$\n

diakov 03-03-2013 13:53 2103175

Подскажите как выйти из ситуации, вот код:
Код:

Function ClickButton
pop $btn
IfFileExists "$SYSDIR\drivers\sptd.sys" 0 NotFiles
MoreInfo::GetFileVersion "$SYSDIR\drivers\sptd.sys"
Pop $1
${StrFilter} "$1" "1" "." "()" $0
MessageBox MB_ICONEXCLAMATION|MB_OK "Версия $0"
Goto Done
NotFiles:
MessageBox MB_ICONEXCLAMATION|MB_OK "Нет файла"
Done:
FunctionEnd

Если на 32 системе то показывает версию, а если на 64 то нет, хотя сам файл в папке на х64 проводник видет.

MKN 03-03-2013 15:48 2103236

diakov,
возможно дело в Redirection (перенаправлении)
попробуй в Function .onInit :
${If} ${RunningX64}
${DisableX64FSRedirection} # или ${EnableX64FSRedirection}
${EndIf}

diakov 04-03-2013 21:34 2104215

Подскажите такое, есть код:
Код:

Function ClickButton1
pop $btn1
IfFileExists "$SYSDIR\drivers\sptd.sys" 0 NotFiles
MoreInfo::GetFileVersion "$SYSDIR\drivers\sptd.sys"
Pop $1
${StrFilter} "$1" "1" "." "()" $0
MessageBox MB_USERICON|MB_YESNO 'Обнаружена установленная версия драйвера SPTD $0.$\n Хотите обновить драйвер до версии 1.83? $\n$\n (В конце установки ПК будет автоматически перезагружен.)' /SD IDYES IDNO Done
${If} ${RunningX64}
ExecWait '"$PLUGINSDIR\SPTD64.exe" add /q'
${Else}
ExecWait '"$PLUGINSDIR\SPTD86.exe" add /q'
${EndIf}
WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce" "Setup" '"$EXEPATH"'
MessageBox MB_ICONEXCLAMATION|MB_OK "После нажатия на кнопку ОК компьютер автоматически перезагрузится."
Reboot
Goto Done
NotFiles:
${If} ${RunningX64}
ExecWait '"$PLUGINSDIR\SPTD64.exe" add /q'
${Else}
ExecWait '"$PLUGINSDIR\SPTD86.exe" add /q'
${EndIf}
WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce" "Setup" '"$EXEPATH"'
MessageBox MB_ICONEXCLAMATION|MB_OK "После нажатия на кнопку ОК компьютер автоматически перезагрузится."
Reboot
Done:
FunctionEnd

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

kotkovets 04-03-2013 23:40 2104337

Цитата:

Цитата diakov
MessageBox MB_ICONEXCLAMATION|MB_OK "После нажатия на кнопку ОК компьютер автоматически перезагрузится."
Reboot
Goto Done »

нормально нужен писать код, а не выше бред - Goto Done
который никогда... эээ...
почему бред - не буду описывать, ибо справка есть..
пишите на логических констукциях - потеряться и запутаться стремится к нулю

diakov 05-03-2013 10:57 2104519

kotkovets, а если так:
Код:

Function ClickButton1
pop $btn1
IfFileExists "$SYSDIR\drivers\sptd.sys" 0 NotFiles
MoreInfo::GetFileVersion "$SYSDIR\drivers\sptd.sys"
Pop $1
${StrFilter} "$1" "1" "." "()" $0
MessageBox MB_USERICON|MB_YESNO 'Обнаружена установленная версия драйвера SPTD $0.$\n Хотите обновить драйвер до версии 1.83? $\n$\n (В конце установки ПК будет автоматически перезагружен.)' IDYES +2 IDNO
Abort
${If} ${RunningX64}
ExecWait '"$PLUGINSDIR\SPTD64.exe" add /q'
${Else}
ExecWait '"$PLUGINSDIR\SPTD86.exe" add /q'
${EndIf}
WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce" "Setup" '"$EXEPATH"'
MessageBox MB_ICONEXCLAMATION|MB_OK "После нажатия на кнопку ОК компьютер автоматически перезагрузится."
Reboot
NotFiles:
${If} ${RunningX64}
ExecWait '"$PLUGINSDIR\SPTD64.exe" add /q'
${Else}
ExecWait '"$PLUGINSDIR\SPTD86.exe" add /q'
${EndIf}
WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce" "Setup" '"$EXEPATH"'
MessageBox MB_ICONEXCLAMATION|MB_OK "После нажатия на кнопку ОК компьютер автоматически перезагрузится."
Reboot
FunctionEnd

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

dix75 06-03-2013 13:40 2105425

Господа, подскажите пожалуйста
Возможно ли при установки приложени дополнять установщик своими ключами
Например

Цитата:

myprogram.exe -c=full
myprogram.exe -c=short
И если да, то как с ними работать?

K.A.V. 06-03-2013 16:07 2105553

Цитата:

Цитата dix75
Возможно ли при установки приложени дополнять установщик своими ключами »

попугаи mode on
Читайте справочник

Справочник по NSIS => » GetOptions: обрабатываем значение ключа в параметре запуска инсталлятора
Это как определить, указан ли конкретный ключ при запуске инсталлера, а насчет
Цитата:

Цитата dix75
как с ними работать? »

зависит уже исключительно от ваших потребностей и фантазии

diakov 09-03-2013 10:52 2107231

Ребят может кто то подскажет что с моим кодом нет так?

MKN 12-03-2013 10:45 2109138

Иногда в NSIS коде встречается такое : ${SegmentFile} ${SegmentInit} ${SegmentPreExecPrimary} и др ${Segment ***
Что это и для чего ?

alert30 12-03-2013 14:59 2109335

MKN, гугл рулит, и вот нашел что-то: http://portableapps.com/manuals/Port...custom-segment
Пока на английском.

MKN 12-03-2013 15:17 2109348

alert30,
Это я уже читал (переводил). Яснсти нет. (Что за Custom.nsh ? Где он есть, что содержит ? )
Или ${Segment - это местная для portableapps, специфика ?

kotkovets 12-03-2013 18:52 2109544

Цитата:

Цитата MKN
${SegmentFile} »

это в основном макрос или константа, объявляется в самом теле скрипта, либо (если очень много команд) в
заголовочном файле *.nsh
Естественно заголовочный файл включается в тело скрипта:
Код:

!include "путь к файлу nsh"

Tamias Ive 12-03-2013 21:59 2109752

В скрипте есть несколько секций. Как сделать так, чтоб в зависимости от разрядности системы (32-bit, 64-bit) выполнялись те или иные секции, а ненужные даже не отображались в окне выбора компонентов.

Сорри если ответ уже был, но перечитывать 350 страниц форума нет возможности.

kotkovets 12-03-2013 23:45 2109858

Цитата:

Цитата Tamias Ive
В скрипте есть несколько секций. Как сделать так, чтоб в зависимости от разрядности системы (32-bit, 64-bit) выполнялись те или иные секции, а ненужные даже не отображались в окне выбора компонентов.
Сорри если ответ уже был, но перечитывать 350 страниц форума нет возможности. »

Да пожалуйста:
Код:

!include "MUI2.nsh"
!include "x64.nsh"
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE english
ShowInstDetails show
outfile test.exe

Section "x86" sec_86
SectionEnd

Section "x64" sec_64
SectionEnd

Function .OnInit
  ${If} ${RunningX64} ;running on x64
      !insertmacro UnselectSection ${sec_86} ;снимаем отметку с секции х86
      !insertmacro SetSectionFlag ${sec_86} ${SF_SUBSECEND} ;скрываем секцию х86
  ${Else} ;running on x86
      !insertmacro UnselectSection ${sec_64}
      !insertmacro SetSectionFlag ${sec_64} ${SF_SUBSECEND}
  ${EndIf}
FunctionEnd

хотя я так не делаю - НЕУДОБНО!
в любой секции пишу вот такой макрос:
Код:

${If} ${RunningX64}
    ;тут всегда выполняются команды, если разрядность системы 64-битная
${Else}
    ;тут всегда выполняются команды, если иная разрядность системы
${EndIf}


Tamias Ive 13-03-2013 00:25 2109870

kotkovets, спасибо.
А есть возможность сделать тоже самое, только добавить определение версии Windows. Нужно, чтобы определялась Windows 8.

wolkow70 13-03-2013 07:49 2109985

Кто нибудь может подсказать как изменить текст на странице стартового меню?
пробую так:

Код:

var $mui.StartMenuPage.Text

Function SHOWSTARTMENU
${If} $GMODE = 1

StrCpy $mui.StartMenuPage.Text "$(MUI_STARTMENUPAGE_TEXT_TOP)"

${NSD_SetText} $mui.StartMenuPage.Text \
"Выберите папку в меню $\"Пуск$\", куда будут помещены ярлыки программы. Вы также можете ввести другое имя папки. Для продолжения нажмите кнопку $\"Создать$\""
GetDlgItem $0 $HWNDPARENT 1
${NSD_SetText} $0 "Создать"
${EndIf}
FunctionEnd

На кнопке надпись изменяется, а текст нет.

K.A.V. 13-03-2013 08:31 2109998

Цитата:

Цитата Tamias Ive
А есть возможность сделать тоже самое, только добавить определение версии Windows. Нужно, чтобы определялась Windows 8. »

Изучайте Справочник по NSIS

Цитата:

Цитата wolkow70
Кто нибудь может подсказать как изменить текст на странице стартового меню? »

Справочник по NSIS => Оформление => Интерфейс Modern => Страница меню "Пуск"
Либо используйте SendMessage (WM_SETTEXT) с указанием handle элемента, ID элемента узнайте сами, смотря с помощью чего вы там страничку делаете
wolkow70, Вы вроде бы не первый день с NSIS работаете, а справочник так и не пробовали весь полностью прочитать?

wolkow70 13-03-2013 08:42 2110002

Цитата:

Цитата K.A.V.
Вы вроде бы не первый день с NSIS работаете, а справочник так и не пробовали весь полностью прочитать? »

Справочник я читал, там дана такая рекоммендация:

Код:

Команда MUI_STARTMENUPAGE_TEXT_TOP помещает текст над списком меню "Пуск".
!define MUI_STARTMENUPAGE_TEXT_TOP "Здесь может быть Ваш текст описания выбора в меню $\"Пуск$\" папки:"

Меня интересует можно ли это реализовать чрез ${NSD_SetText} в функции, так как текст должен меняться только в G-mode.
поэтому и пробовал прописать

StrCpy $mui.StartMenuPage.Text "$(MUI_STARTMENUPAGE_TEXT_TOP)"

K.A.V. 13-03-2013 08:47 2110004

Цитата:

Цитата wolkow70
StrCpy $mui.StartMenuPage.Text "$(MUI_STARTMENUPAGE_TEXT_TOP)"
${NSD_SetText} $mui.StartMenuPage.Text \ »

Вы поняли, что назначаете этой переменной?

В команде ${NSD_SetText} должно же быть указание handle, а по вашему коду полчается что? А ничего, вы сначала переменной $mui.StartMenuPage.Text назначаете текст, который уже определён в $(MUI_STARTMENUPAGE_TEXT_TOP), затем указываете эту переменную ($mui.StartMenuPage.Text) в команде ${NSD_SetText} :o
Хотя за место неё должно быть указание handle элемента, разве не?

Т.е. по вашему коду должно быть тип такого (где $TextHandle - дескриптор элемента с текстом):
Код:

${NSD_SetText} $TextHandle $mui.StartMenuPage.Text

wolkow70 13-03-2013 09:04 2110016

Цитата:

Цитата K.A.V.
Хотя за место неё должно быть указание handle элемента »

Применительно к другим страницам такая команда (например ${NSD_SetText} $mui.DirectoryPage.Text) работает.
Оказалось, что в отличии от других страниц в хедере StartMenu.nsh переменная $mui.StartMenuPage.Text стандартно не объявлена.
Поэтому пришлось ее объявлять и действительно ей придется предварительно назначать handle, пока я не разобрался как это делается.
Для других страниц в хедерах содержатся такие команды типа:
GetDlgItem $mui.DirectoryPage.Text $mui.DirectoryPage 1006

K.A.V. 13-03-2013 09:35 2110036

Цитата:

Цитата wolkow70
Поэтому пришлось ее объявлять и действительно ей придется предварительно назначать handle, пока я не разобрался как это делается.
Для других страниц в хедерах содержатся такие команды типа: »

Откройте *.nsh файл, где прописываются настройки для данного диалога старт-меню (для Modern UI это файл System.nsh, для Modern UI 2 это StartMenu.nsh)

Для Modern UI
читать дальше »

Ищем команду в System.nsh
Код:

Pop $MUI_HWND
После неё вставляем:

Код:

  var /global mui.StartMenuPage.Text 
  GetDlgItem $mui.StartMenuPage.Text $MUI_HWND 1003
  SendMessage $mui.StartMenuPage.Text ${WM_SETTEXT} 0 "STR:Handle этого элемента с текстом теперь в переменной mui.StartMenuPage.Text"



Для Modern UI 2
читать дальше »

Ищем команду в StartMenu.nsh
Код:

Pop $mui.StartMenuPage
После неё вставляем:

Код:

 
  var /global mui.StartMenuPage.Text 
  GetDlgItem $mui.StartMenuPage.Text $mui.StartMenuPage 1003
  SendMessage $mui.StartMenuPage.Text ${WM_SETTEXT} 0 "STR:Handle этого элемента с текстом теперь в переменной mui.StartMenuPage.Text"


Теперь можете использовать переменную $mui.StartMenuPage.Text, в ней - handle элемента с текстом ;)

wolkow70 13-03-2013 10:31 2110064

K.A.V.,
Все заработало.
Вот эта строка
SendMessage $mui.StartMenuPage.Text ${WM_SETTEXT} 0 "STR:Handle этого элемента с текстом теперь в переменной mui.StartMenuPage.Text"
оказалось не нужна.
Работает так:

var /global mui.StartMenuPage.Text
GetDlgItem $mui.StartMenuPage.Text $mui.StartMenuPage 1003
${NSD_SetText} $mui.StartMenuPage.Text \
"Выберите папку в меню $\"Пуск$\ ...."

Странно, но Au3Info.exe показывает ID 1006, но правильно работает с 1003.

K.A.V. 13-03-2013 10:38 2110070

Цитата:

Цитата wolkow70
Вот эта строка
SendMessage $mui.StartMenuPage.Text ${WM_SETTEXT} 0 "STR:Handle этого элемента с текстом теперь в переменной mui.StartMenuPage.Text"
оказалось не нужна. »

Это конечно же не нужно, просто для примера вам привёл (я же выше говорил о WM_SETTEXT)...

Цитата:

Цитата wolkow70
Странно, но Au3Info.exe показывает ID 1006, но правильно работает с 1003. »

Главное у нас заработало, да и ладно :biggrin:
а так, для назначения текста там же dll используется, пролистинте чуть выше по коду в *.nsh файле, может та dll что-то делает :)

kotkovets 13-03-2013 18:54 2110496

Цитата:

Цитата Tamias Ive
Нужно, чтобы определялась Windows 8 »

ну и в чем дело?
Код:

outfile test.exe
!include "WinVer.nsh"

Section ""
  ${WinVerGetMajor} $0
  ${WinVerGetMinor} $1
  StrCpy $0 $0$1
  ${If} $0 > 61
      MessageBox MB_OK "Win8" IDOK
  ${Else}
      MessageBox MB_OK "not Win8" IDOK
  ${EndIf}
SectionEnd


MKN 15-03-2013 11:10 2111656

В примере лог конструкций Справки сказано " для

${Case5} и далее пять значений :
Цитата:

Здесь макрос ${Case} может срабатывать до пяти значений переменной $0
Почему 5 (4,3,2) - вроде как логично и понятно... Но почему, когда указываешь, к примеру : ${Case6} и далее шесть значений - ошибка ?
Или 5 - это и есть ограничение для макроса ? (а где про это вообще сказано ? ) Тогда в вышеприведённой цитате хорошо бы указывать - "не более пяти значений". Так было бы более конкретно и понятно... Вроде бы мелочь, но...
А если надо выбирать из 25 значений ?

wolkow70 15-03-2013 15:15 2111781

Цитата:

Цитата MKN
Или 5 - это и есть ограничение для макроса ? »

Да, на пять сравнений только выполняется.

Из хедера LogicLib.nsh:

Код:

  !macro _Case5 _a _b _c _d _e
    !verbose push
    !verbose ${LOGICLIB_VERBOSITY}
    ${CaseElse}                                          ; Perform the CaseElse
    !define ${_Logic}Else _LogicLib_Label_${LOGICLIB_COUNTER}                    ; Get a label for the next Else and perform the new Case
    !insertmacro _IncreaseCounter
    !insertmacro _== `${${_Logic}Select}` `${_a}` +5 ""
    !insertmacro _== `${${_Logic}Select}` `${_b}` +4 ""
    !insertmacro _== `${${_Logic}Select}` `${_c}` +3 ""
    !insertmacro _== `${${_Logic}Select}` `${_d}` +2 ""
    !insertmacro _== `${${_Logic}Select}` `${_e}` "" ${${_Logic}Else}
    !verbose pop
  !macroend
  !define Case5 `!insertmacro _Case5`


kotkovets 15-03-2013 15:55 2111821

MKN, а правкой хидера можно и больше...
Ну добавь в логику ещё
{case5} и уже 10...
И так далее...

Aster 20-03-2013 18:44 2115098

Привет всем.
Вопрос простой: подскажите, пожалуйста, какой командой удалять ярлыки с рабочего стола?

Команда Delete "$DESKTOP\имя ярылка.lnk" не срабатывает...

K.A.V. 20-03-2013 19:02 2115117

Цитата:

Цитата Aster
Вопрос простой: подскажите, пожалуйста, какой командой удалять ярлыки с рабочего стола?
Команда Delete "$DESKTOP\имя ярылка.lnk" не срабатывает... »

Команда верная, либо вы что-то не правильно прописываете, либо ещё чего...

А вообще, телепатов здесь нет...
Операционная система? Разрядность?

Может, дело в этом? Shortcuts removal fails on Windows Vista

kotkovets 20-03-2013 19:04 2115123

Цитата:

Цитата Aster
Команда Delete "$DESKTOP\имя ярылка.lnk" не срабатывает »

смотря, где десктоп "лежит"..
Код:

outfile test.exe

Section
    MessageBox MB_OK "$DESKTOP" IDOK
    SetShellVarContext all
    MessageBox MB_OK "$DESKTOP" IDOK
SectionEnd


Aster 21-03-2013 02:09 2115333

K.A.V., ну у меня WinXP.

При таких командах ярлык с рабочего стола удалился.

SetShellVarContext all
Delete "$DESKTOP\имя ярлыка.lnk"

Спасибо за помощь!

KasIIysk 24-03-2013 16:43 2117476

Ребята помогите с ссылкой http://winreview.ru/NSIS/472/Sozdani...mandnoj-stroki , на новый сайт статью не перенели, это вроде бульдозера сайт, а тут ни у кого в закромах родины не осталось?

Создание своего инсталлятора на NSIS. Реализация дополнительных ключей командной строки вот название статьи

kotkovets 24-03-2013 17:06 2117496

Цитата:

Цитата KasIIysk
тут ни у кого в закромах родины не осталось? »

http://yadi.sk/d/G4dGLjPa3VTFp

wolkow70 27-03-2013 14:37 2119915

Закрепление ярлыка программы на Панели задач в ОС Vista/Windows 7

В составе некоторых современных дистрибутивов появилась полезная утилита pin2taskbar.exe, позволяющая в процессе установки или деинсталляции приложений закрепить значок программы на Панели задач в ОC Vista/Windows 7 или изъять его. Я взял такую утилиту из оригинального дистрибутива KMPlayer.

Выложил для скачивания здесь:
http://rusfolder.com/35691315

Применение утилиты в скриптах NSIS может быть реализовано примерно таким образом:

Код:

!include "WinVer.nsh"
Var AppExe

Function .OnInit
StrCpy $AppExe "KMPlayer.exe" ; здесь присваиваем переменной имя исполняемого файла программы
FunctionEnd

Function PinToTaskbar
SetOutPath "$TEMP"
File pin2taskbar.exe
ExecWait '$TEMP\pin2taskbar.exe pin "$0"'
Delete "$TEMP\pin2taskbar.exe"
FunctionEnd

Section "Закрепить ярлык на Панели задач"
${If} ${AtLeastWinVista}
Push $0
StrCpy $0 '$INSTDIR\$AppExe' ; здесь присваиваем переменной местонахождение исполняемого файла
Call PinToTaskbar
Pop $0
${EndIf}
SectionEnd

Удаление:

Function Un.pinFromTaskbar
SetOutPath "$TEMP"
File pin2taskbar.exe
ExecWait '$TEMP\pin2taskbar.exe unpin "$0"'
Delete "$TEMP\pin2taskbar.exe"
FunctionEnd

Section Uninstall
${If} ${AtLeastWinVista}
Push $0
StrCpy $0 '$INSTDIR\$AppExe'
Call Un.pinFromTaskbar
Pop $0
${EndIf}
;
;
;
SectionEnd


kotkovets 27-03-2013 19:02 2120192

Цитата:

Цитата wolkow70
Закрепление ярлыка программы на Панели задач в ОС Vista/Windows 7 »

и не только...
http://forum.oszone.net/post-1830962-2193.html

diakov 03-04-2013 23:12 2125317

Добрый вечер есть плаг http://nsis.sourceforge.net/EBanner_plug-in в описании написано PNG (with transparency) are supported, тоесть PNG с поддержкой прозрачности поддерживается, но отображается он в инстальнике все равно на черном фоне, в чем может быть причина?

wolkow70 07-04-2013 21:38 2127800

Цитата:

Цитата kotkovets
Закрепление ярлыка программы на Панели задач в ОС Vista/Windows 7 »
и не только...
http://forum.oszone.net/post-1830962-2193.html »

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

Код:

Var AppExe
!include "InvokeShellVerb.nsh"
!include "WinVer.nsh"

Function un.onInit
StrCpy $AppExe "FSViewer.exe"
FunctionEnd

Section Uninstall
${If} ${AtLeastWinVista}
${UnPinTaskBar} "$INSTDIR\$AppExe"
${EndIf}
;
SectionEnd


wolkow70 08-04-2013 14:23 2128224

Цитата:

Цитата wolkow70
Почему-то открепление от Панели задач происходит не во всех случаях »

Заметил, что если сделать промежуточную перезагрузку, то открепляется. Но странно, что в одних случаях она требуется, в других нет. Видимо, это как-то связано с кэшем иконок.

kotkovets 08-04-2013 18:53 2128394

Цитата:

Цитата wolkow70
Почему-то открепление от Панели задач происходит не во всех случаях » »

всегда работает как часы... никто не жаловался..
Цитата:

Цитата wolkow70
${If} ${AtLeastWinVista} »

не нужно здесь это, все равно заработает, там где работает..
а работает от Vista и выше..

wolkow70 08-04-2013 19:10 2128401

Цитата:

Цитата kotkovets
всегда работает как часы... »

Причем сам файл ярлыка тоже не удаляется, а на Панели остается пустой значок. А с перезагрузкой нормально работает. Пока на удаление оставил предложенную мной утилиту, она в 100% случаев работает. Хотя, ваш вариант нравится из-за дополнительных возможностей.

wolkow70 11-04-2013 14:41 2130393

Товарищи, можно ли как-то сравнить два файла (без версии в ресурсах) на дату изменения (нужно определить более новый файл) ?
При этом речь идет не о проверке при распаковке, а нужно выполнить операцию CopyFiles, если файл новее.

MKN 11-04-2013 16:25 2130456

Цитата:

Цитата wolkow70
сравнить два файла на дату изменения »

Код:

GetFileTime "путь\файл" $0 $1
MessageBox MB_OK $0 ; file created
MessageBox MB_OK $1 ; file last changed

далее сравниваешь либо даты последних изменений файла , либо даты создания...
Значения в переменных будут в виде ахинеи, что для сравнения не важно.

Но можно и переконвертировать в нормальный вид, например дату создания :

Код:

OutFile "Test_GetFileTime.exe"
!define FilePath "$EXEDIR\GetFileTime.nsi"

Section
GetFileTime "${FilePath}" $1 $0
System::Int64Op $1 * 0x100000000
Pop $1
System::Int64Op $1 + $0
Pop $0
System::Call "*(&i2, &i2, &i2, &i2, &i2, &i2, &i2, &i2) i .r1"
System::Call "Kernel32::FileTimeToSystemTime(*l r0, i r1)"
System::Call "Kernel32::GetDateFormatA(i 0, i 0, i r1, t 'dd/MM/yy', t .r0, i ${NSIS_MAX_STRLEN})"
System::Call "Kernel32::GetTimeFormatA(i 0, i 0, i r1, t 'HH:mm:ss', t .r1, i ${NSIS_MAX_STRLEN})"

MessageBox MB_OK "Файл создан:  $0  $1"
SectionEnd

Ессно можно сделать поправку с учётом таймзоны

wolkow70 11-04-2013 20:29 2130630

kotkovets,
Столкнулся с проблемой при закреплении ярлыка на панели задач (никак не хотел закрепляться).
Помогло выполнение ремонта кэша иконок перед выполнением макроса.
Вот таким образом:
ExecWait '"$SYSDIR\ie4uinit.exe" -ClearIconCache'
${PinToTaskBar} "$INSTDIR\$AppExe"

wolkow70 15-04-2013 13:52 2132981

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

Код:

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


sov44 15-04-2013 18:53 2133183

Хочу понять, что куда распаковываются компоненты программы, написанной в NSIS. Подскажите, как вытянуть сценарий?

K.A.V. 15-04-2013 22:12 2133317

Цитата:

Цитата wolkow70
Кто-нибудь может подсказать как при выполнении функции ReplaceLinesInFile по замене текста в файле сделать так, чтобы временный файл создавался не в папке с инсталлятором, а где-нибудь в другом месте? »

Какой временный файл? В данной функции есть только 1 ссылка на файл, это файл, в котором производится замена текста
Вы можете его изменить как вам угодно, вы же обрезали и выкинули кусочек кода, где присваивается переменной путь файла

Код:

StrCpy $_FindInFile '$EXEDIR\TEST.txt' ; Заменяем строки в этом файле
StrCpy $_LineReplace 'NSIS' ; Ищем и заменяем ЭТУ фразу
StrCpy $_LineToInsert 'Справочник по NSIS' ; На что будем заменять

Можете сначала скопировать файл в $TEMP, произвести там замену, а потом скопировать файл обратно. Значение переменной поменять легко. Или я не правильно понял суть вопроса? :)

Цитата:

Цитата sov44
Хочу понять, что куда распаковываются компоненты программы, написанной в NSIS. »

Клац

Цитата:

Цитата sov44
Подскажите, как вытянуть сценарий? »

Никак.
И прочитайте шапку темы, там ответ кстати дан. И прочитайте справочник по NSIS на русском языке. Всё в шапке.

wolkow70 16-04-2013 10:24 2133537

Цитата:

Цитата K.A.V.
вы же обрезали и выкинули кусочек кода, где присваивается переменной путь файла »

Не обрезал, просто не вставил, есть такой кусочек:

StrCpy $_FindInFile '$INSTDIR\opera_install_log.xml' ; Заменяем строки в этом файле
StrCpy $_LineReplace 'C:\Program Files\Opera' ; Ищем и заменяем ЭТУ строку
StrCpy $_LineToInsert '$INSTDIR' ; На что будем заменять
Call ReplaceLinesInFile

В процессе замены неоднократно именно в папке с инсталлятором (не в $INSTDIR) создается временный файл. В деталях отображается переименование файла во временный по мере внесения изменений. Вот мне нужно,чтобы он мелькал в другом месте, так как на CD он не сможет создаваться.

yyv 17-04-2013 02:18 2134164

здравствуйте,
подскажите, отличаются ли события при нажатии на крестик закрытия и Cancel button?
Я использую пользовательскую функцию CustomAbort и хотел бы при нажатии на кнопку отмены выводить одно сообщение, а при нажатии на крестик другое.
возможно ли это?







.

Salmo 27-04-2013 15:09 2140460

kotkovets, Здравствуйте. Хочу повторить вопрос, который я задавал раньше... У Вас, как-то, было желание написать библиотеку, чтобы работать в NSIS с окнами приложений. Очень хочется, например, кликать на кнопки формы по координатам мышью... :) Появилось ли что-то подобное где-нибудь, у кого-нибудь?

Mafioza 08-05-2013 00:41 2146321

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

ValerBOSS 08-05-2013 05:11 2146360

Mafioza, про ассоциацию фалов есть раздел в справочнике из первого поста (Создание своего инсталлятора на NSIS. Ассоциации файлов. Макросы)
Чтобы флажок был заблокирован нужно вставить в скецию SectionIn RO, например:
Код:

Section "Sec Name" secName
 
  SectionIn RO

SectionEnd


Ivn78 09-05-2013 14:47 2147145

Друзья, подскажите:
Как в поле Show Detalis скрыть отображение распаковки файлов и путь программы? (распаковывается один файл в $Temp, затем удаляется). И напротив, как в это поле вывести выхлоп запуска консольной утилиты, и при этом скрыть консольное окно?

K.A.V. 11-05-2013 11:54 2147962

Цитата:

Цитата wolkow70
В процессе замены неоднократно именно в папке с инсталлятором (не в $INSTDIR) создается временный файл. В деталях отображается переименование файла во временный по мере внесения изменений. Вот мне нужно,чтобы он мелькал в другом месте, так как на CD он не сможет создаваться. »

Насчет этого не знаю, не замечал
Ну как вариант, можно сделать отдельный EXE чисто с функцией замены строк, копировать его в $TEMP и запускать оттуда

Цитата:

Цитата Ivn78
Друзья, подскажите:
Как в поле Show Detalis скрыть отображение распаковки файлов и путь программы? (распаковывается один файл в $Temp, затем удаляется). И напротив, как в это поле вывести выхлоп запуска консольной утилиты, и при этом скрыть консольное окно? »

Дружище, Справочник по NSIS

Mafioza 11-05-2013 23:08 2148329

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

K.A.V. 12-05-2013 00:08 2148351

Цитата:

Цитата Mafioza
я хочу чтобы после установки браузер был назначем по умолчанию »

Сложно?

Цитата:

Цитата Mafioza
и дом, страницей стала страница opera.com »

В файле opera6.ini (или operaprefs.ini, не знаю, копайтесь сами), в секции User Prefs присвойте парамметру Home URL адрес сайта
Либо упаковываете изменённый файл конфигурации, либо после распаковки файла, командой WriteINIStr устанавливаем значение параметра, описание команд NSIS есть в Справочнике по NSIS

Awral 14-05-2013 20:49 2150162

Какое сжатие использовать, чтобы файлы из инсталлятора нельзя было вытащить при помощи 7-zip и прочих архиваторов?

Aquila 19-05-2013 01:50 2152329

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

wolkow70 19-05-2013 05:44 2152345

Цитата:

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

например так:

Код:


!define PRODUCT_NAME "µTorrent"
!include "FileFunc.nsh"
!include "Sections.nsh"
Var AppExe

Section /o "Добавить ярлык на Рабочий стол" Desktop
SetShellVarContext all
CreateShortCut "$DESKTOP\${PRODUCT_NAME}.lnk" "$INSTDIR\$AppExe"
SectionEnd

Section /o "Добавить ярлык в панель Быстрого запуска" QuickLaunch
CreateShortCut "$QUICKLAUNCH\${PRODUCT_NAME}.lnk" "$INSTDIR\$AppExe"
SectionEnd

Function .onInit

StrCpy $AppExe "uTorrent.exe"

ClearErrors
${GetOptions} $CMDLINE "/T" $0
IfErrors +2
SectionSetFlags ${Desktop} 1
Pop $0

ClearErrors
${GetOptions} $CMDLINE "/Q" $0
IfErrors +2
SectionSetFlags ${QuickLaunch} 1
Pop $0
FunctionEnd

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

MKN 23-05-2013 17:52 2154898

NSIS 3.0a0

Скачать : http://nsis.sourceforge.net/Download
Обсуждение : http://forums.winamp.com/showthread.php?t=361808

kotkovets 23-05-2013 21:26 2155089

Цитата:

Цитата MKN
NSIS 3.0a0 »

неужели разродились...
бегло пробежался, что нового... самые существенные:
---
1) Подержка юникода (я так понял примерно..), т.е не нужно отдельно скачивать юникодную версию - текстовый скрипт может быть в любом юникоде..
деинсталлятор всегда "юникодный" - т.е будет работать от windows 2000 (XP) и выше...
--
2) Поддержка Windows 8 и Windows Server 2012
--
3) Плагины отдельно хранятся в папках:
анси - NSIS\Plugins\x86-ansi
юникодные - NSIS\Plugins\x86-unicode
---
ссылку на скачивание добавил в шапку

MKN 24-05-2013 17:41 2155634

Вложений: 1
Ещё пример для функции CreateWindowEx :

Создаём на странице окно и помещаем в это окно флеш анимацию ( в формате swf )

Код:

!include MUI2.nsh
Page custom fnc_Create
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"
OutFile "test_play_swf.exe"
Var dlg

Function fnc_Create
nsDialogs::Create 1018
Pop $dlg
System::Call `atl::AtlAxWinInit() i.r0`
System::Call `kernel32::GetModuleHandle(i 0) i.R3`
System::Call 'user32::CreateWindowEx(i 0, t "AtlAxWin", t "{D27CDB6E-AE6D-11cf-96B8-444553540000}", i ${WS_CHILD}|${WS_VISIBLE}, i 15, i 8, i 400, i 40, i $HWNDPARENT, i 0, i R3, i 0) i.R1'
System::Call `atl::AtlAxGetControl(i R1, *i .r1) i .r0`
StrCpy $3 "$EXEDIR\a.swf"
System::Call "$1->22(w r3) i .r2" ; 22 = set_Movie       
nsDialogs::Show
FunctionEnd

Section
SectionEnd

AtlAxWinInit - Эта функция инициализирует код размещения элемента управления библиотеки ATL
путем регистрации классов окна "AtlAxWin80" и "AtlAxWinLic80" плюс несколько пользовательских сообщений окна.
(ATL - Active Template Library - Это библиотека классов и шаблонов, предназначенная для разработки собственных компонетов )

classid - при вставке flash это константа и всегда имеет значение clsid: {D27CDB6E-AE6D-11cf-96B8-444553540000},
это значение указывает на элемент ActiveX : \WINDOWS\system32\Macromed\Flash\Flash11e.ocx

AtlAxGetControl - Получает указатель интерфейса IUnknown элемента управления, который хозяйничает в окне.

Вот комплект-пример :

Николай М. 26-05-2013 04:45 2156376

Всем доброго времени суток!
У меня к Вам следующий вопрос - мне нужно при установке программы дописать/вписать свое значение в ключ реестра. Вся проблема в том, что до меня уже может быть несколько записей, и мне нужно определить есть ли запись в ключе реестра. Если запись уже есть, то мне нужно дописать свой путь к программе. Также возникает проблема с анисталом.
Например:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows]
"AppInit_DLLs"="c:\myapp.dll, c:\123.dll, D:\321.exe, "

или

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Run]
"Test"="c:\123.exe, c:\myapp.dll, D:\321.exe "

Эти две проблемы можно решить?

PS: Заранее благодарю!

K.A.V. 26-05-2013 08:37 2156397

Цитата:

Цитата Николай М.
"AppInit_DLLs"="c:\myapp.dll, c:\123.dll, D:\321.exe, " »

Вирусы пишем?

Цитата:

Цитата Николай М.
Эти две проблемы можно решить? »

Можно решить, если прочитать наш Справочник по NSIS

Николай М. 26-05-2013 14:52 2156551

Шутку понял - смешно :)
С инсталом разобрался, а как быть с анисталом не разобрался :help:
Можете привести пример?

MKN 28-05-2013 12:37 2157641

Вложений: 1
Erik Pilsits написал хедер GetFolderPath.nsh, который позволяет получить путь к предопределённой папке в ОС
Используются функции SHGetFolderPath (для WinXP) и SHGetKnownFolderPath (для Vista и выше) и ряд констант и ID для папок.

С этими функциями можно конечно получать пути и обычным образом. Например, для COMMON_APPDATA :
Код:

OutFile "GetFolderPath-test.exe"
!define CSIDL_COMMON_APPDATA "0x0023"       

Section 
System::Call "shell32::SHGetFolderPath(0, i ${CSIDL_COMMON_APPDATA}, 0, 0, t .r1)" 
MessageBox MB_OK "$1"
SectionEnd

Но GetFolderPath.nsh более универсален и чуть упрощает код.

Для XP получение пути интереса не представляет, т.к. практически все переменные предопределённых папок, уже есть в самом NSIS. Разве что, как альтернатива получения пути. А вот для Win7 и 8, где большое разнообразие специализированных папок, может пригодиться.
Вот комплект-пример :

MKN 30-05-2013 11:18 2159141

Вложений: 1
Для разнообразия оформления прогрессбара, существует занятная библиотека - SkinProgress.dll, использующая цвета из внешних bmp файлов.
Код:

!AddPluginDir ".\"
!include MUI2.nsh

Page custom fnc_Create
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

!define /math PBM_SETRANGE32 ${WM_USER} + 6
!define PB_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE}
!define PBS_MARQUEE 0x08

OutFile "test_ProgresBarSkin.exe"
Var dlg
Var PROGBAR

Function fnc_Create
nsDialogs::Create 1018
Pop $dlg
       
${NSD_CreateProgressBar} 0u 10u 100% 12u ""
Pop $PROGBAR
SkinProgress::Set $PROGBAR "$EXEDIR\color.bmp" "$EXEDIR\color_without_progress.bmp"
 
${NSD_CreateTimer} NSD_Timer.Callback 10 ; Need a timer to kickstart the marquee progressbar
nsDialogs::Show
FunctionEnd

Function NSD_Timer.Callback
SendMessage $PROGBAR ${PBM_SETMARQUEE} 1 50 ; start=1|stop=0 interval(ms)=+N

${NSD_KillTimer} NSD_Timer.Callback
SendMessage $PROGBAR ${PBM_SETRANGE32} 0 100

SendMessage $PROGBAR ${PBM_SETPOS} 20 0
Sleep 200
SendMessage $PROGBAR ${PBM_SETPOS} 30 0
Sleep 200
SendMessage $PROGBAR ${PBM_SETPOS} 40 0
Sleep 200
SendMessage $PROGBAR ${PBM_SETPOS} 50 0
Sleep 200
SendMessage $PROGBAR ${PBM_SETPOS} 60 0
Sleep 200
SendMessage $PROGBAR ${PBM_SETPOS} 100 0
SendMessage $PROGBAR ${PBM_SETMARQUEE} 0 0
FunctionEnd

Section
SectionEnd

Вот комплект-пример :

andryz80 31-05-2013 09:53 2159738

не компилит

+ nsisdl::download
+ nsisdl::download_quiet
+ splash::show

!define: "MUI_INSERT_NSISCONF"=""

Changing directory to: "D:\SkinProgressBar"

Processing script file: "D:\SkinProgressBar\test_ProgresBarSkin.nsi" (ACP)
PluginDir: ".\"
+ SkinProgress::Set
!include: "C:\Program Files\NSIS\Include\MUI2.nsh" (ACP)
!include: "C:\Program Files\NSIS\Contrib\Modern UI 2\MUI2.nsh" (ACP)
NSIS Modern User Interface version 2.0 - Copyright 2002-2013 Joost Verburg (C:\Program Files\NSIS\Contrib\Modern UI 2\MUI2.nsh:9)
!include: closed: "C:\Program Files\NSIS\Contrib\Modern UI 2\MUI2.nsh"
!include: closed: "C:\Program Files\NSIS\Include\MUI2.nsh"
Page: custom (creator:fnc_Create)
!insertmacro: MUI_PAGE_INSTFILES
!insertmacro: end of MUI_PAGE_INSTFILES
!insertmacro: MUI_LANGUAGE
!insertmacro: end of MUI_LANGUAGE
!define: "PBM_SETRANGE32" already defined!
Error in script "D:\SkinProgressBar\test_ProgresBarSkin.nsi" on line 8 -- aborting creation process

MKN 31-05-2013 10:17 2159749

Цитата:

Цитата andryz80
Error in script "D:\SkinProgressBar\test_ProgresBarSkin.nsi" on line 8 -- aborting creation process »

Странно... Проверил скрипт на двух компах. Всё компилится без проблем.
line 8 в скрипте - это !define /math PBM_SETRANGE32 ${WM_USER} + 6
описано в http://nsis.sourceforge.net/NsDialogs_FAQ

kotkovets 31-05-2013 13:09 2159860

Цитата:

Цитата andryz80
!define: "PBM_SETRANGE32" already defined! »

не объявленная константа в NSIS 2.XX в файле WinMessages.nsh
поэтому ошибка!
В 3 версии NSIS добавлены много констант в хедер WinMessages.nsh

MKN 31-05-2013 15:11 2159912

Цитата:

Цитата kotkovets
не объявленная константа в NSIS 2.XX в файле WinMessages.nsh »

Дык, и у меня нет конкретно такой константы в WinMessages.nsh ( Есть только !define PBM_SETRANGE 0x0401 )
И Nsis я испольтзовал v2.46...

Цитата:

If you do not set the range values, the system sets the minimum value to 0 and the maximum value to 100. Because this message expresses the range as a 16-bit unsigned integer, it can extend from 0 to 65,535. The minimum value in the range can be from 0 to 65,535. Likewise, the maximum value can be from 0 to 65,535.

To set a larger range, call PBM_SETRANGE32.
]If you do not set the range values, the system sets the minimum value to 0 and the maximum value to 100 - Означает ли это, что вообщем то не обязательно задавать эту константу ?

Mafioza 01-06-2013 13:23 2160356

всем привет я хотел бы установить разные изображения в welcomepage и finishpage. и еще я хочу чтобы файлы для компиляци добовлять сразу одной папкой все файлы и подпапки как в inno setup с флагом ignoreversion recursesubdirs createallsubdirs , помогите пожалуйста , заранее спасибо .

K.A.V. 01-06-2013 13:39 2160362

Mafioza, а мы хотим, чтобы вы наконец-то хотя бы открыли наш Справочник по NSIS

Mafioza 01-06-2013 13:46 2160365

K.A.V. вот я его отркрыл несколько раз но не нашел если вам не трудно не могли бы вы быть любезным и написать его здесь ?

K.A.V. 01-06-2013 17:12 2160438

Цитата:

Цитата Mafioza
K.A.V. вот я его отркрыл несколько раз но не нашел если вам не трудно не могли бы вы быть любезным и написать его здесь ? »

Если вам не трудно, включите проверку правописания, читать предложения без запятых нет желания

Цитата:

Цитата Mafioza
я хотел бы установить разные изображения в welcomepage и finishpage »

Справочник по NSIS => Оформление => Интерфейс Modern UI => Страница "Приветствия"
Насчет разных изображений точно сказать не могу, вроде бы здесь как-то описывали, как сделать 2 разных изображения (может кто и подскажет, либо ищите поиском по теме), но втыкнуть одно изображение и в "Приветствие" и в "Финишь" страницы можно, путь к страничке я указал, читайте там.

Цитата:

Цитата Mafioza
и еще я хочу чтобы файлы для компиляци добовлять сразу одной папкой все файлы и подпапки »

Справочник по NSIS => Перевод справки NSIS => File
Раз вы даже не знаете, как добавить файлы для упаковки, читайте полностью описание всех команд, ибо тыкать вас постоянно в справочник здесь никто не будет, мы здесь помогаем, а не делаем всё за вас
И в описании команды File, обратите внимание на команду SetOutPath, она задаёт, в какую папку будут распаковываться файлы

Так же, прочтите страничку Переменные NSIS (Variables)

wolkow70 01-06-2013 20:52 2160525

Цитата:

Цитата K.A.V.
вроде бы здесь как-то описывали, как сделать 2 разных изображения »

!define MUI_WELCOMEFINISHPAGE_BITMAP "1.bmp"
!define MUI_UNWELCOMEFINISHPAGE_BITMAP "2.bmp"

K.A.V. 01-06-2013 21:12 2160536

Цитата:

Цитата wolkow70
!define MUI_UNWELCOMEFINISHPAGE_BITMAP "2.bmp" »

:teeth:

Нее, я имел ввиду тот случай, когда при инсталляции используются разные изображения в приветствии и на странице финиша :)

alert30 08-06-2013 16:12 2164423

vahe-91, есть кнопка "Удалить" в твоём комменте.

MKN 11-06-2013 17:28 2165970

Попался такой код : Комбобокс-список выбора диска
Код:

!include "MUI2.nsh"
!include "WinCore.nsh"

!define __NSD_ComboBoxEx_CLASS ComboBoxEx32
!define __NSD_ComboBoxEx_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${CBS_DROPDOWN}
!define __NSD_ComboBoxEx_EXSTYLE 0

!define __NSD_DropListEx_CLASS ComboBoxEx32
!define __NSD_DropListEx_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${CBS_DROPDOWNLIST}
!define __NSD_DropListEx_EXSTYLE 0

!insertmacro __NSD_DefineControl ComboBoxEx
!insertmacro __NSD_DefineControl DropListEx

!define CBEM_INSERTITEM      0x00000401
!define CBEM_SETIMAGELIST    0x00000402
!define CBEM_GETIMAGELIST    0x00000403
!define CBEM_GETITEM          0x00000404
!define CBEM_SETITEM          0x00000405
!define CBEM_DELETEITEM      ${CB_DELETESTRING}
!define CBEM_GETCOMBOCONTROL  0x00000406
!define CBEM_GETEDITCONTROL  0x00000407
!define CBEM_GETEXTENDEDSTYLE 0x00000409
!define CBEM_HASEDITCHANGED  0x0000040A
!define CBEM_SETEXTENDEDSTYLE 0x0000040E

!define CBEIF_TEXT            0x00000001
!define CBEIF_IMAGE          0x00000002
!define CBEIF_SELECTEDIMAGE  0x00000004
!define CBEIF_OVERLAY        0x00000008
!define CBEIF_INDENT          0x00000010
!define CBEIF_LPARAM          0x00000020
!define CBEIF_DI_SETITEM      0x10000000

!define SHGFI_SMALLICON      0x00000001
!define SHGFI_ICON            0x00000100
!define SHGFI_DISPLAYNAME    0x00000200
!define SHGFI_TYPENAME        0x00000400
!define SHGFI_SYSICONINDEX    0x00004000

Name "ComboBoxEx"
OutFile ComboBoxEx.exe
InstallDir $TEMP

Page custom CreatePage
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

Function CreatePage
!insertmacro MUI_HEADER_TEXT "ComboBoxEx control" "ComboBoxEx control created using nsDialogs plugin"
nsDialogs::Create 1018
Pop $0
StrCmp $0 error 0 +2
Abort
    ${NSD_CreateLabel} 0u 0u 300u 8u "Выбор диска"
    Pop $0

    ${NSD_CreateDropListEx} 0u 12u 300u 140u "DropListEx"
    Pop $1
    SendMessage $1 ${CBEM_GETCOMBOCONTROL} 0 0 $0
    System::Alloc 352
    System::Call `shell32::SHGetFileInfo(in,in,isR1,i352,i${SHGFI_SMALLICON}|${SHGFI_SYSICONINDEX})i.R2`
    SendMessage $1 ${CBEM_SETIMAGELIST} 0 $R2
    System::Alloc 104
    System::Call `kernel32::GetLogicalDriveStrings(i104,isR0)`
    .while:
    System::Call `kernel32::lstrlen(iR0)i.R3`
    StrCmp $R3 0 .endwhile
        System::Call `kernel32::GetDriveType(iR0)i.R4`
        StrCmp $R4 3 0 .endif
            SendMessage $0 ${CB_GETCOUNT} 0 0 $R6
            System::Call `shell32::SHGetFileInfo(iR0,i0,iR1,i352,i${SHGFI_ICON}|${SHGFI_DISPLAYNAME}|${SHGFI_TYPENAME})`
            System::Call `*$R1(i,i.R5,i,&t${MAX_PATH}.R4)`
            System::Call `*(i${CBEIF_TEXT}|${CBEIF_IMAGE}|${CBEIF_SELECTEDIMAGE},iR6,tR4,i${NSIS_MAX_STRLEN},iR5,iR5,i,i,i)i.R7`
            SendMessage $1 ${CBEM_INSERTITEM} 0 $R7
            System::Free $R7
        .endif:
        IntOp $R0 $R0 + $R3
        IntOp $R0 $R0 + 1
    Goto .while
    .endwhile:
    SendMessage $0 ${CB_SETCURSEL} 0 0
    System::Free $R1
    System::Free $R0

    nsDialogs::Show
FunctionEnd

Section
SectionEnd


Awral 12-06-2013 16:31 2166528

Какое сжатие использовать, чтобы файлы из инсталлятора нельзя было вытащить при помощи 7-zip и прочих архиваторов?

MKN 12-06-2013 18:41 2166606

Цитата:

Цитата Awral
Какое сжатие использовать, чтобы файлы из инсталлятора нельзя было вытащить при помощи 7-zip и прочих архиваторов? »

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

Dan557 19-06-2013 03:17 2170433

Цитата:

Цитата Awral
Какое сжатие использовать, чтобы файлы из инсталлятора нельзя было вытащить при помощи 7-zip и прочих архиваторов? »

:) Для нас характерно http://sigismund.livejournal.com/221843.html , всё прятать (ныкать, маскировать)! Для нас, специально делают особые сборки, с возможностью превышения стандартной длины строк, при написании сценария http://sourceforge.net/projects/nsis...2.zip/download , так как из-за незнания или непонимания определённых правил https://sites.google.com/site/nellis...s-perenos-slov :) , мы не знаем иного способа и не хотим знать или понимать (упёртые)!

Awral, могу оказать Вам медвежью услугу по Вашему вопросу, так как один "горе-программист", специально для подобных случаев, произвел на свет программульку.

http://mpc-build.googlecode.com/svn/...xexecute-hide/

http://mpc-build.googlecode.com/svn/...de/0.6/xeh.exe

Описание от автора программульки:
Цитата:

Xexecute Hide - программа для скрытия структуру sfx-файлов 7z, RAR, NSIS от открытия 7-Zip, WinRAR и скрытия структуру упаковщика UPX, тоесть после её использования 7-Zip не сможет открыть для просмотра внутренние файлы инсталлятора сгенерированного 7z, RAR и NSIS (разработчики NSIS начиная с версии 2.0 убрали эту функцию).
для правильного использования в скрипте NSIS (nsi) добавить или изменить строку и поставить в это значение: CRCCheck Off
это нужно для отключения проверки заголовков exe-файла на ошибки.
поддерживаемые типы файлов: sfx 7z, sfx RAR и NSIS (exe), UPX (exe, ...)
параметры командной строки: xeh.exe [file] [file] ...
изменения после патча записываются в тотже файл.
Кстати, у этого автора, есть сборки NSIS, в которые он интегрировал своё "детище"!

То, что делает эта программулька (меняет кое-где AD на 7E), можно сделать с помощью NSIS. При этом, намного эффективнее и без посредников! :)
Всего-то, используйте свой оригинальный сценарий или задействуйте версию NSIS, ниже 2.0!

При выборе последнего предложенного варианта, перед всеми нами, очень скоро, может возникнуть проблема по поиску старых версий NSIS! :)

P.S. Я не призываю пользоваться программулькой, а наоборот, являюсь ее "противником", так как подобные задачи решаются с помощью NSIS, без посредников!

diakov 19-06-2013 21:55 2170931

Доброго времени суток, кто подскажет по сообщению http://forum.oszone.net/post-2104519-323.html
Никак не могу понять в чем соль...

kotkovets 20-06-2013 01:09 2171002

Цитата:

Цитата diakov
Никак не могу понять в чем соль... »

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

diakov 20-06-2013 08:58 2171072

Тоесть получается, что нельзя сделать перезагрузку именно из функции нажатия бутона, а надо пихать Reboot в секцию установки...но мне это не подходит...хотел именно так...

Как же посоветуешь выйти из ситуации kotkovets, или можно что то придумать?

MKN 20-06-2013 09:31 2171087

diakov,
Если я правильно понял, то раз после нажатия OK сообщения, сразу предполагается Reboot ,
т.е. по сути, сначала закрытие-выход инсталлятора, а затем уже Reboot -
то можно закрыть инсталлятор после нажатия ОК и после закрытия, организовать Post функцию с Reboot и с условием, что был нажат нужный ОК. А вот для этого условия могут быть варианты...

diakov 20-06-2013 10:25 2171114

Цитата:

Цитата MKN
т.е. по сути, сначала закрытие-выход инсталлятора, а затем уже Reboot - »

Совершенно верно.
Цитата:

Цитата MKN
то можно закрыть инсталлятор после нажатия ОК и после закрытия, организовать Post функцию с Reboot и с условием, что был нажат нужный ОК. »

А поподробней, желательно примерчик :)

MKN 20-06-2013 12:59 2171183

diakov,
Самое простое, если устанавливается драйвер, то в TEMP ещё помещается и маркерный файл (предположим пустой файл - drv) и исходя из его наличия совершается нужное действие (перезагрузка) после закрытия инсталлятора. ( Нет маркерного файла - нет перезагрузки. )
Код:

!include "MUI2.nsh"
OutFile "Test_OK-Reboot.exe"
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

Section
SetOutPath "$TEMP"
File "drv"
MessageBox MB_ICONEXCLAMATION|MB_OK "ОК - перезагрузка."
Quit
SectionEnd

Function .onGUIEnd
${If} ${FileExists} "$TEMP\drv"
MessageBox MB_OK "Reboot"
Delete "$TEMP\drv"
;Reboot
${Else}
${EndIf}
FunctionEnd

в примере в Section - только условие для установки драйвера. Сделаешь , как тебе надо.

Наверняка можно и по другому сделать.

diakov 20-06-2013 14:01 2171202

MKN, немного не то, мне надо что бы перезагрузка происходила именно после выполнения всех команд в функции нажатия бутона, пробовал писать Quit, Abort и т.д. не помогает инстальник не закрывается, как сделать это именно в функции что бы он закрылся?
Если воспользоватся командой ${KillProcess} то инстальник убивается но ф-ция .onGUIEnd не отрабатывает.

MKN 20-06-2013 15:50 2171268

diakov,
Вызови функцию из функции или ещё откуда :

Код:

Section
Call ClickButton1
SectionEnd


Function ClickButton1
SetOutPath "$TEMP"
File "drv"
MessageBox MB_ICONEXCLAMATION|MB_OK "ОК - перезагрузка."
Quit
FunctionEnd

Function .onGUIEnd
${If} ${FileExists} "$TEMP\drv"
;MessageBox MB_OK "Reboot"
Delete "$TEMP\drv"
Reboot
${Else}
${EndIf}
FunctionEnd

У меня так работает

diakov 20-06-2013 16:35 2171293

MKN, ну вот допустим так:
Код:

Function ClickButton1
pop $btn1
IfFileExists "$SYSDIR\drivers\sptd.sys" 0 NotFiles
MoreInfo::GetFileVersion "$SYSDIR\drivers\sptd.sys"
Pop $1
${StrFilter} "$1" "1" "." "()" $0
MessageBox MB_USERICON|MB_YESNO 'Обнаружена установленная версия драйвера SPTD $0.$\n Хотите обновить драйвер до версии 1.83? $\n$\n (В конце установки ПК будет автоматически перезагружен.)' IDYES +2 IDNO
Abort
${If} ${RunningX64}
ExecWait '"$PLUGINSDIR\SPTD64.exe" add /q'
${Else}
ExecWait '"$PLUGINSDIR\SPTD86.exe" add /q'
${EndIf}
WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce" "Setup" '"$EXEPATH"'
SetOutPath "$TEMP"
File "D:\ystanovka\Alcohol 120\diakovreb.txt"
  Quit
NotFiles:
${If} ${RunningX64}
ExecWait '"$PLUGINSDIR\SPTD64.exe" add /q'
${Else}
ExecWait '"$PLUGINSDIR\SPTD86.exe" add /q'
${EndIf}
WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce" "Setup" '"$EXEPATH"'
SetOutPath "$TEMP"
File "D:\ystanovka\Alcohol 120\diakovreb.txt"
  Quit
FunctionEnd

Function .onGUIEnd
 BrandingURL::Unload
${If} ${FileExists} "$TEMP\diakovreb.txt"
MessageBox MB_ICONEXCLAMATION|MB_OK "После нажатия на кнопку ОК компьютер автоматически перезагрузится."
Delete "$TEMP\diakovreb.txt"
Reboot
${Else}
${EndIf}
FunctionEnd

Но сама команда Quit не отрабатывает, установщик не закрывается, а если закрыть его руками (на самой кастомной странице) то тогда идет вызов ф-ции Function .onGUIEnd и все отлично работает. Какую команду прописать что бы установщик сам закрывался...
Можна тупо написать автоитовский скрипт и сэмулировать нажатия на кнопки, но хочется средствами нсис...

kotkovets 20-06-2013 19:03 2171346

Цитата:

Цитата diakov
Но сама команда Quit не отрабатывает »

я уже писал на кастомной страничке - это внезапное прерывание, потому что в это время, не 100% nsis:)
здесь винда, вот на помощь и идет апи..
завершить процесс можно и плагинами или читая наш справочный материал.
зы.
но внезапное прерывание не выгружает плагинов загруженные нсисом..
это я в скрипте вижу - BrandingURL

diakov 20-06-2013 20:34 2171392

kotkovets, так какой выход посоветуете из ситуации?

kotkovets 20-06-2013 21:17 2171406

diakov,
как алкоголь 120% установку видели.. вот точно так можно..
что тут сложного.. в установку все перенести
ps.
или отдельно написать установку драйвера (на nsis) - кнопкой тупо запускать установщик ( в тихом режиме)..

diakov 20-06-2013 22:36 2171444

Ок, буду кумекать.

MKN 21-06-2013 09:05 2171550

Цитата:

Цитата kotkovets
я уже писал на кастомной страничке - это внезапное прерывание »

Не поленился проверил :
На кастомной странице Quit точно отрабатывается в Section.
И в Function, вызванной из Section - тоже нормально.
Ну и до кучи проверил - в Function вызванной из Function - нормальный Quit выход-закрытие.

diakov 21-06-2013 09:50 2171577

MKN, так, или я чето туплю:

Код:

Function ClickButton1
pop $btn1
Call ClickButton2
FunctionEnd


Function ClickButton2
MessageBox MB_ICONEXCLAMATION|MB_OK "Выход."
Quit
FunctionEnd

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

MKN 21-06-2013 13:27 2171709

diakov,
Вот мой код :
Код:

!include "MUI2.nsh"
Page custom a
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"
OutFile "TestQuit.exe"

Var dlg
Var Button1

Function a
nsDialogs::Create 1044
Pop $dlg
${NSD_CreateButton} 26u 26u 66u 14u "Button1"
Pop $Button1
${NSD_OnClick} $Button1 ClickButton1
 nsDialogs::Show
FunctionEnd

Function ClickButton1
pop $Button1
MessageBox MB_OK "OK - Quit"
SendMessage $HWNDPARENT 0x408 1 0
FunctionEnd

Section
Quit
SectionEnd

При таком раскладе в Section ничего не должно быть кроме Quit. Все установочные дела - в функциях.
Возможно можно работать и с несколькими секциями, но наверное придётся манипулировать с их флагами...

Кстати, этот вопрос уже поднимался http://forums.winamp.com/showthread.php?t=140929
Но чем закончилось - не понятно...

diakov 22-06-2013 14:37 2172158

Вышел из ситуации написав отдельный ехе-шник по установке драйвера, по совету kotkovets.

dix75 24-06-2013 12:33 2173281

Добрый день!

Необходимо до самого инсталляционного пакета показывать окно типа:
"Установить обновление". С кнопками установить и отменить.

Делается веьсма просто пишется exe файл из которого пускаем NSIS инсталлятор.
Но возможно ли непосредственно в cамом NSIS инсталяторе написать такое.
т.е первую страницу?
Подскажите куда копать.

dix75 27-06-2013 15:28 2175270

Добрый день!

Раньше я получал $StartMenuFolder так
Цитата:

!insertmacro MUI_STARTMENU_GETFOLDER Application $StartMenuFolder
Вопрос решен

silione 14-07-2013 16:42 2184544

Никак не разберусь, можно ли как-то обойти ограничение в 2 Гигабайта при создании инсталлятора?
Видел, что можно использовать архивы, но во-первых, не понял как это сделать (примеров не нашел), во-вторых, давнишние сообщения, возможно к настоящему времени есть более интересные решения?
Если не сильно затруднит, попрошу развернутый ответ, с примером написания кода, или ссылкой на таковой пример.

Awral 16-07-2013 10:39 2185388

Появилась небольшая проблема. Растянул HEADER_BITMAP на всю ширину (в файле Contrib\UIs\modern_headerbmp.exe). Чтобы текст не заходил за изображение исправил очерёдность инициализации и установил прозрачность фона для Header.Text в файле Interface.nsh:
Код:

!macro MUI_GUIINIT_OUTERDIALOG UNINSTALLER

  ;Initialize outer dialog (fonts & colors)

  ;Header
  GetDlgItem $mui.Header.Text $HWNDPARENT 1037
  CreateFont $mui.Header.Text.Font "$(^Font)" "$(^FontSize)" "700"
  SendMessage $mui.Header.Text ${WM_SETFONT} $mui.Header.Text.Font 0
 
  GetDlgItem $mui.Header.SubText $HWNDPARENT 1038

  SetCtlColors $mui.Header.Text "" "transparent"
  SetCtlColors $mui.Header.SubText "" "transparent"
 
  ;Header image
  !insertmacro MUI_HEADERIMAGE_INIT "${UNINSTALLER}"

  ;Header background
  GetDlgItem $mui.Header.Background $HWNDPARENT 1034
  SetCtlColors $mui.Header.Background "" "${MUI_BGCOLOR}"

  ;Header image background
  GetDlgItem $mui.Header.Image $HWNDPARENT 1039
  SetCtlColors $mui.Header.Image "" "${MUI_BGCOLOR}"

  ;Branding text
  GetDlgItem $mui.Branding.Background $HWNDPARENT 1028
  SetCtlColors $mui.Branding.Background /BRANDING
  GetDlgItem $mui.Branding.Text $HWNDPARENT 1256
  SetCtlColors $mui.Branding.Text /BRANDING
  SendMessage $mui.Branding.Text ${WM_SETTEXT} 0 "STR:$(^Branding)"
 
  ;Lines
  GetDlgItem $mui.Line.Standard $HWNDPARENT 1035
  GetDlgItem $mui.Line.FullWindow $HWNDPARENT 1045
 
  ;Buttons
  GetDlgItem $mui.Button.Next $HWNDPARENT 1
  GetDlgItem $mui.Button.Cancel $HWNDPARENT 2
  GetDlgItem $mui.Button.Back $HWNDPARENT 3

!macroend

Появились проблемы:
1. При переходе с Welcome_PAGE на следующую страницу (в моём случае LicensePage, но это значения не имеет) текст не отображается, а начинает отображаться только со страницы, следующей за LicensePage (в моём случае ComponentPage).
2. При переходе с лицензии на компоненты и обратно появляется наложение предыдущего текста на текущий. При последующих переходах наложение только увеличивается.

Как мне исправить эти проблемы?

Заранее спасибо

K.A.V. 18-07-2013 15:30 2186635

Цитата:

Цитата Awral
установил прозрачность фона для Header.Text в файле Interface.nsh: »

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

Перед показом страничек, добавь выполненение нашей будущей функции
Код:

; Welcome page
!insertmacro MUI_PAGE_WELCOME
; License page
page custom SetTransparentText
!insertmacro MUI_PAGE_LICENSE "C:\Users\APTEM\Desktop\test.txt"

; Components page
page custom SetTransparentText
!insertmacro MUI_PAGE_COMPONENTS

; Directory page
page custom SetTransparentText
!insertmacro MUI_PAGE_DIRECTORY

; Instfiles page
page custom SetTransparentText
!insertmacro MUI_PAGE_INSTFILES

; Finish page
page custom SetTransparentText
!insertmacro MUI_PAGE_FINISH


И добавь эту самую функцию:
Код:

Function SetTransparentText
  GetDlgItem $0 $HWNDPARENT 1037
  GetDlgItem $1 $HWNDPARENT 1038
  SetCtlColors $0 "" "transparent"
  SetCtlColors $1 "" "transparent"
  ShowWindow $0 0
  ShowWindow $0 1
  ShowWindow $1 0
  ShowWindow $1 1
FunctionEnd


alexfinik 23-07-2013 20:00 2189376

Добрый день.... Есть хотелка обращаться к файлам в определенной папке, как к массиву.

Цель хотелки: сделать так, чтобы на экране отображались радиокнопки где можно было выбрать нужный архив и разархивировать его. Если со второй частью вроде понятки есть в голове, типа создать цикл и засунуть туда радиокнопку... а может я и неправ, но вот с первой частью - облазал всё, то ли запрос неверно составляю... в справке по locate в т.ч. на русском не нашел как выделить файл, имя которого не известно, из папки.

Спасибо! Надеюсь на ответ!

Krinkels 23-07-2013 23:19 2189470

ИМХО это проще на Си/С++ реализовать. Получается ищем в определенной папке файлы, выводим их на экран в виде списка, далее формируем строку для распаковки и запускаем её. И я бы вместо радиокнопок сделал бы листбокс, красивее выглядит :)
Такое можно и на NSIS но это уже к гуру

kotkovets 23-07-2013 23:34 2189484

Цитата:

Цитата alexfinik
в справке по locate в т.ч. на русском не нашел как выделить файл, имя которого не известно, из папки »

плохо читали.. архивы обычно с расширением *.zip, *.rar, *.7z
ну так и задавайте поиск по этой маске..
Цитата:

Цитата alexfinik
типа создать цикл »

в locate тоже цикл.. простая математика:
Код:

Intop $0 $0 + 1
с каждым циклом переменная $0 возрастает на единицу, следовательно в цикле мы узнаем сколько архивов найдено,
естественно с помощью плага заносим в массив.

Николай М. 30-07-2013 20:54 2193572

Может кто-нибудь сталкивался с задачкой, когда нужно заблокировать вторую (третью, четвертую и т.д) копию запущенного инсталлятора, пока не будет завершена первая?

diakov 31-07-2013 11:08 2193835

Цитата:

Цитата Николай М.
Может кто-нибудь сталкивался с задачкой, когда нужно заблокировать вторую (третью, четвертую и т.д) копию запущенного инсталлятора, пока не будет завершена первая? »

В спарвке есть статья kotkovets, Предотвращение множественности запуска:

Код:

!include "MUI2.nsh"
!include "LogicLib.nsh"

!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

ShowInstDetails show
OutFile "Mutex.exe"
Name "CreateMutex"
Caption "CreateMutex test"

Function .OnInit
 System::Call 'kernel32::CreateMutexA(i 0, i 0, t "$(^Name)") i .r1 ?e'
 Pop $R0
 ${IfNot} $R0 == 0
  MessageBox MB_OK|MB_ICONEXCLAMATION "Одна копия $(^Name) уже выполняется."
  Abort
 ${EndIf}
FunctionEnd

Section
SectionEnd


Kopejkin 03-08-2013 02:32 2195514

Второй день, как пытаюсь освоить NSIS (v2.46, Win7(x64)Ru) и, сразу же застрял, казалось бы, на ровном месте.
Не могу настроить отображение описаний компонентов, вернее одного, при деинсталяции. Не подскажете, что не так?
Грабли

; Installer Sections

Section "$(PROGRUS)" SecRUS
SetOutPath "$INSTDIR"
File "1.txt"
SectionEnd

Section "$(PROGUKR)" SecUKR
SetOutPath "$INSTDIR"
File "2.txt"
SectionEnd

;--------------------------------
;Uninstaller Section
Section "Un.$(locUN)" SecUN
delete "$INSTDIR\1.txt"
delete "$INSTDIR\2.txt"
delete "$INSTDIR\label1_ru.bmp"
delete "$INSTDIR\label1_ukr.bmp"
delete "$INSTDIR\Uninstall.exe"
DeleteRegKey /ifempty HKLM "Software\UITest\Option"
SectionEnd

; Текст описания Install
LangString DESC_PROGRUS ${LANG_RUSSIAN} "Русская версия программы"
LangString DESC_PROGRUS ${LANG_UKRAINIAN} "Російська версія програми"
LangString DESC_PROGUKR ${LANG_RUSSIAN} "Украинская версия программы"
LangString DESC_PROGUKR ${LANG_UKRAINIAN} "Українська версія програми"
; Текст названия Install
LangString PROGRUS ${LANG_RUSSIAN} "Русская версия"
LangString PROGRUS ${LANG_UKRAINIAN} "Російська версія"
LangString PROGUKR ${LANG_RUSSIAN} "Украинская версия"
LangString PROGUKR ${LANG_UKRAINIAN} "Українська версія"
; Это все отображается
; Текст описания Uninstall
LangString DESC_UNIN ${LANG_RUSSIAN} "Удалить локализованную версию и восстановить английский язык программы"
LangString DESC_UNIN ${LANG_UKRAINIAN} "Видалити локалізовану версію та відновити англійську мову програми"
; Эти описания не отображаются

; Текст названия Uninstall
LangString locUN ${LANG_RUSSIAN} "Отменить локализацию"
LangString locUN ${LANG_UKRAINIAN} "Скасувати локалізацію"
; Эти описания отображаются

; Макрос, который показывает текст описания секции
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
!insertmacro MUI_DESCRIPTION_TEXT ${SecRUS} $(DESC_PROGRUS)
!insertmacro MUI_DESCRIPTION_TEXT ${SecUKR} $(DESC_PROGUKR)
!insertmacro MUI_DESCRIPTION_TEXT ${SecUN} $(DESC_UNIN) ; НЕ РАБОТАЕТ!!!
!insertmacro MUI_FUNCTION_DESCRIPTION_END

kotkovets 03-08-2013 11:44 2195586

Kopejkin, нормальный скрипт в студию..

Kopejkin 03-08-2013 12:27 2195601

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

Код:

;--------------------------------
; Подключаем библиотеку «современного» интерфейса пользователя: Modern UI
; Команда !include позволяет включить в тело скрипта файл (у нас - MUI2.nsh,
; который трактуется компилятором так, как будто бы он является текстом скрипта.

!include "MUI2.nsh"

;--------------------------------
; Задаем степень и режим сжатия исходных файлов. Командная опция /SOLID
; указывает компилятору поместить все сжимаемые данные в один блок,
; тем самым еще больше увеличив степень сжатия файлов инсталлятора.

SetCompressor /SOLID lzma

;--------------------------------
;Задаем перечень констант
;ABCD_EFRTX – имя константы, "Xxxx" — её значение.

; Имя приложения
!define PRODUCT_NAME "UITest"

; Версия приложения
!define PRODUCT_VERSION "1.0"

; Папка, где будут храниться исходные файлы, подлежащие сжатию.
!define pkgdir "d:\package"

; Запоминаем язык установки InstallerLanguage
!define MUI_LANGDLL_REGISTRY_ROOT "HKLM"
!define MUI_LANGDLL_REGISTRY_KEY "Software\UITest\Option"
!define MUI_LANGDLL_REGISTRY_VALUENAME "InstallerLanguage"

; Указываем отображать картинку в заголовках страниц (кроме WELCOME)
!define MUI_HEADERIMAGE ; По умолчанию исп. nsis.bmp
  ;Указываем, где лежит файл нужной вам картинки (если нужно)
!define MUI_HEADERIMAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Header\win.bmp"

; Настраиваем интерфейс. Константа MUI_ABORTWARNING определяет, выдавать ли
; предупреждение при закрытии инсталятора пользователем. Типа: «Вы действительно
; хотите прервать установку ..бла бла » с кнопками «да» и «нет».

!define MUI_ABORTWARNING

; Константой MUI_ICON определяем значок инсталятора. Без константы исп. modern-install.ico:
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install-colorful.ico"

; Константой MUI_UNICON определяем значок деинсталятора. Без констант исп. modern-uninstall.ico:
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall-colorful.ico"

; Если вам вообще не нужны описания секций и компонентов, можете отключить их,
; задав пустую константу:
  ;!define MUI_COMPONENTSPAGE_NODESC  ; Расположить её нужно в начале скрипта
; инсталлятора, но ПЕРЕД вызовом макроса MUI_PAGE_COMPONENTS.
; Или можете переместить описание секций ПОД полем выбора компонентов,
; аналогично примеру выше, но константу НАДО определить:

!define MUI_COMPONENTSPAGE_SMALLDESC

; Для отображения описания СПРАВА поля компонентов (по умолчанию) НИЧЕГО не дописывать.

;--------------------------------------------------------------------------------
; Определяем страницы инсталлятора, которые будут видны конечному пользователю.
; Макросы вызываются из MUI2.nsh.
; Станицы установки:

!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE "$(License)"
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES

; Страницы удаления:
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_COMPONENTS
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_UNPAGE_FINISH

; Указываем доступные языки инсталяции:
!insertmacro MUI_LANGUAGE "Russian"
!insertmacro MUI_LANGUAGE "Ukrainian"

!insertmacro MUI_RESERVEFILE_LANGDLL  ; что это такое????

; Предоставляем пользователю при запуске инсталятора выбрать язык установки:
; - Русский или Украинский. Язык запроса выбора - Английский.
; Это - функция инсталяции

Function .onInit
!insertmacro MUI_LANGDLL_DISPLAY
;!undef MUI_ICON                                ; что это ???
;!define MUI_ICON        "uninstall.ico"        ; что это ???
FunctionEnd
;--------------------------------------------------------------------
;Указываем деинсталлятору использовать язык инсталлятора
;Это - функция деинсталяции

Function un.onInit
  !insertmacro MUI_UNGETLANGUAGE
FunctionEnd

;--------------------------------------------------------------------
; Текст внизу окон (вместо nullsoft bla-bla
BrandingText "KOPEJKIN"

; Назначаем инсталлятору заголовок, отражающий его назначение. Используем константы.
; Команда Name задает название кнопки инсталлятора на панели задач.

Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"

; Команда Caption задает заголовок окна инсталятора
  ;Caption "Локализация ${PRODUCT_NAME} ${PRODUCT_VERSION}"
; В мультиязычном инсталляторе будем использовать модифицированный текст,
; предоставляемый языковыми файлами инсталлятора. Поэтому для команды Name
; можно использовать константы команды Caption, а её не использовать?

;--------------------------------------------------------------------
; Задаем папку установки по умолчанию. Макрос MUI_PAGE_DIRECTORY работает с системной
; переменной  $INSTDIR, т.е. читает её значение перед отображением страницы
; пользователю и записывает в неё путь к папке, выбранной пользователем ПОСЛЕ
; закрытия этой страницы. Чтобы на этой странице показать пользователю путь к папке
; по умолчанию, необходимо задать начальное значение $INSTDIR специальной командой InstallDir.

InstallDir "$PROGRAMFILES\${PRODUCT_NAME}"

; Можно получить путь к папке установки из реестра, если доступно
InstallDirRegKey HKCU "Software\UITest" ""

; Задаем имя файла нашего инсталлятора командой OutFile. Можно использовать
; константы, или вписать что угодно самостоятельно.
OutFile "${PRODUCT_NAME}.${PRODUCT_VERSION}.exe"  ; Получится: UITest.1.0.exe

; Для новых ОС (Vista, Windows 7/8) можно запросить права пользователя ???
RequestExecutionLevel user

; Указываем режим отображения хода выполнения инсталляции (протокола).
; Наш случай: (ничего не пишем) - протокол скрыт, и появляется только при нажатии кнопки
; «Детали». Возможные значения: hide, show и nevershow. По умолчанию - hide;
; nevershow отключает и вышеупомянутую кнопку, show — показывает все.
  ;ShowInstDetails show

; Организация возможности выбора пользователем желаемых компонентов реализуется
; макросом страницы MUI_PAGE_COMPONENTS.

;--------------------------------
;Reserve Files
 
  ;If you are using solid compression, files that are required before
  ;the actual installation should be stored first in the data block,
  ;because this will make your installer start faster.
;--------------------------------
; Installer Sections

Section "$(PROGRUS)" SecRUS
  SetOutPath "$INSTDIR"
  File "1.txt"
SectionEnd

Section "$(PROGUKR)" SecUKR
  SetOutPath "$INSTDIR"
  File "2.txt"
SectionEnd
 
  ;Function .onSelChange
  ;!insertmacro StartRadioButtons $1
  ;!insertmacro RadioButton ${firstsec}
  ;!insertmacro RadioButton ${secondsec}
  ;!insertmacro EndRadioButtons
  ;FunctionEnd
; При использовании этих макросов для секций пишет, что должно быть не более 3 параметров.
; А у меня выходит 4 (Разбираться)

; Ниже: Ещё не разбирался. В таком виде файлы картинок устанавливаются! с учетом выбранного
; языка установки, но только при повторном запуске программы установки.

Section ;$(Install)
SectionIn 1

  SetOutPath "$INSTDIR"
 
  ;ADD YOUR OWN FILES HERE...
  ;File "1.txt"
  ;File "2.txt"
  ;Store installation folder
  ;WriteRegStr HKLM "Software\UITest" "" $INSTDIR
; RU-EN section
            ReadRegStr $R0 HKLM "Software\UITest\Option" "InstallerLanguage"
            StrCmp $R0 "1049" RussianLanguage
            StrCmp $R0 "1058" UkrainianLanguage
            goto NotRightLanguage
        RussianLanguage:
            File "label1_ru.bmp"
            goto NotRightLanguage

        UkrainianLanguage:
            File "label1_ukr.bmp"
            goto NotRightLanguage

        NotRightLanguage:
  ;Create uninstaller
  WriteUninstaller "$INSTDIR\Uninstall.exe"

SectionEnd

; Ниже: Относится к секции RU-EN. Появляется сообщение с кнопкой ОК
Section "-Hide"
            ReadRegStr $R0 HKLM "Software\UITest\Option" "InstallerLanguage"
            StrCmp $R0 "1049" RussianLanguage
            StrCmp $R0 "1058" UkrainianLanguage
            goto NotRightLanguage
        RussianLanguage:
          MessageBox MB_OK "Установка русского рисунка"
            goto NotRightLanguage

        UkrainianLanguage:
          MessageBox MB_OK "Установка украинского рисунка"
            goto NotRightLanguage

        NotRightLanguage:

SectionEnd

;--------------------------------
;Uninstall Section

Section "Un.$(locUN)" SecUN
  delete "$INSTDIR\1.txt"
  delete "$INSTDIR\2.txt"
  delete "$INSTDIR\label1_ru.bmp"
  delete "$INSTDIR\label1_ukr.bmp"
  delete "$INSTDIR\Uninstall.exe"
  DeleteRegKey /ifempty HKLM "Software\UITest\Option"
  ;RMDir "$INSTDIR"
SectionEnd

;----------------------------------------------------------------
; Файлы с текстом Лицензионного соглашения на разных языках
LicenseLangString License ${LANG_RUSSIAN} "lic_rus.txt"
LicenseLangString License ${LANG_UKRAINIAN} "lic_ukr.txt"
 
; Текст описания секции Install
LangString DESC_PROGRUS ${LANG_RUSSIAN} "Русская версия программы"
LangString DESC_PROGRUS ${LANG_UKRAINIAN} "Російська версія програми"
LangString DESC_PROGUKR ${LANG_RUSSIAN} "Украинская версия программы"
LangString DESC_PROGUKR ${LANG_UKRAINIAN} "Українська версія програми"
; Текст названия секции Install
LangString PROGRUS ${LANG_RUSSIAN} "Русская версия"
LangString PROGRUS ${LANG_UKRAINIAN} "Російська версія"
LangString PROGUKR ${LANG_RUSSIAN} "Украинская версия"
LangString PROGUKR ${LANG_UKRAINIAN} "Українська версія"

; Текст описания секции Uninstall
LangString DESC_UNIN ${LANG_RUSSIAN} "Удалить локализованную версию и восстановить английский язык программы."
LangString DESC_UNIN ${LANG_UKRAINIAN} "Видалити локалізовану версію та відновити англійську мову програми."
; Текст названия секции Uninstall
LangString locUN ${LANG_RUSSIAN} "Отменить локализацию"
LangString locUN ${LANG_UKRAINIAN} "Скасувати локалізацію"

; -ИСПРАВЛЕНО- Макрос, который показывает текст описания секции Install
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
  !insertmacro MUI_DESCRIPTION_TEXT ${SecRUS} $(DESC_PROGRUS)
  !insertmacro MUI_DESCRIPTION_TEXT ${SecUKR} $(DESC_PROGUKR)
!insertmacro MUI_FUNCTION_DESCRIPTION_END

; -ИСПРАВЛЕНО- Макрос, который показывает текст описания секции Uninstall
!insertmacro MUI_UnFUNCTION_DESCRIPTION_BEGIN
  !insertmacro MUI_DESCRIPTION_TEXT ${SecUN} $(DESC_UNIN)
!insertmacro MUI_UnFUNCTION_DESCRIPTION_END

; Ниже: Пока не знаю для чего это.
;LangString LNG_BMP1 ${LANG_UKRAINIAN} "label1_ukr.bmp"
;LangString LNG_BMP1 ${LANG_RUSSIAN} "label1_ru.bmp"


kotkovets 03-08-2013 13:53 2195647

Kopejkin,
Для секций удаления применяется тот же макрос, но с приставкой Un
Код:

!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
    !insertmacro MUI_DESCRIPTION_TEXT ${SecRUS} $(DESC_PROGRUS)
    !insertmacro MUI_DESCRIPTION_TEXT ${SecUKR} $(DESC_PROGUKR)
 !insertmacro MUI_UnFUNCTION_DESCRIPTION_END

 !insertmacro MUI_UnFUNCTION_DESCRIPTION_BEGIN
    !insertmacro MUI_DESCRIPTION_TEXT ${SecUN} $(DESC_UNIN)
 !insertmacro MUI_UnFUNCTION_DESCRIPTION_END

Про LangString
-----
p.s
Скрипт выделяется и заключается в тег: #
невозможно по-человечески прочитать...

Kopejkin 03-08-2013 15:37 2195702

Спасибо kotkovets.
Сообщение отредактировал.

tony1990 05-08-2013 17:26 2196744

Добрый день!
Подскажите пожалуйста как добавить свою кнопку на стандартную страницу компонентов. Добавил следующий код, но
кнопка рисуется только на первой странице.
Заранее спасибо.

Код:

!define MUI_PAGE_CUSTOMFUNCTION_SHOW "CompShowProc"

!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE "LICENSE"
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES

var HostButton

Function CompShowProc

 ${NSD_CreateButton} 0 250 100% 12u "Текст"
 Pop $HostButton

FunctionEnd


Kopejkin 06-08-2013 16:02 2197277

Чего-то я совсем запутался...
Рискну снова задать вопрос по секциям.
читать дальше »

Правильно ли написаны примеры подобные нижеприведенному в Справочнике по NSIS:
Код:

Section "Тестирование" TEST_SEC
SectionEnd

Section
; Не должно ли здесь и в конце вместо Section быть Function ?
 SectionGetText ${TEST_SEC} $0
 StrCpy $0 "$0 - $WINDIR"
 SectionSetText ${TEST_SEC} $0
SectionEnd

В таком виде, все что написано между Section, не работает,



а если вставить (без Section) в функцию, напр. (.OnInit) - то работает.

А спросить хотел вот о чем.
Предполагается, что нижеприведенный скрипт будет выполнять пропатчивание. Закоментированный код из секции "Обновление" будет позже добавлен в существующие секции с соответствующим изменением имен файлов.
Можно ли, используя WinVer2, скрывать секции PROGRUS и PROGUKR, если установка выполняется на 64 разрядной системе и, наоборот, скрывать PROGRUS64 и PROGUKR64 при установке на 32 разрядной системе? Если можно, укажите поточнее, где или что об этом написано в справке или справочнике. А если поделитесь кодом - буду очень благодарен.
Еще интересует, почему файл деинсталлятора все равно создается, если из программы установки я выхожу, напр. из диалога выбора компонентов?

Код:

!include "WinVer2.nsh"
!include "MUI2.nsh"
!include "VPatchLib.nsh"
;!include "Logiclib.nsh"

SetCompressor /SOLID lzma

; Имя приложения
!define PRODUCT_NAME "UITest"
; Версия приложения
!define PRODUCT_VERSION "1.0"
; Папка, где будут храниться исходные файлы, подлежащие сжатию.
!define pkgdir "d:\package"

; Запоминаем язык установки InstallerLanguage
!define MUI_LANGDLL_REGISTRY_ROOT "HKLM"
!define MUI_LANGDLL_REGISTRY_KEY "Software\UITest\Option"
!define MUI_LANGDLL_REGISTRY_VALUENAME "InstallerLanguage"
!insertmacro MUI_RESERVEFILE_LANGDLL  ; ЧТО ЭТО и НУЖНО ЛИ ОНО????
!define MUI_ABORTWARNING

; Константой MUI_ICON определяем значок инсталятора. Без константы исп. modern-install.ico:
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install-colorful.ico"
; Константой MUI_UNICON определяем значок деинсталятора. Без констант исп. modern-uninstall.ico:
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall-colorful.ico"

!define MUI_COMPONENTSPAGE_SMALLDESC

; Станицы установки:
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE "$(License)"
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
!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

; Указываем доступные языки инсталяции:
!insertmacro MUI_LANGUAGE "Russian"
!insertmacro MUI_LANGUAGE "Ukrainian"

Function .OnInit
; Отображаем диалог выбора языка
!insertmacro MUI_LANGDLL_DISPLAY

; Определяем разрядность системы
  ${WinPlatformArchitecture} $R1
  MessageBox MB_ICONINFORMATION|MB_OK "WinPlatformArchitecture = $R1"
FunctionEnd
;--------------------------------------------------------------------
;Указываем деинсталятору использовать язык инсталлятора
Function un.onInit
!insertmacro MUI_UNGETLANGUAGE
FunctionEnd
;--------------------------------------------------------------------
; Текст внизу окон (вместо nullsoft bla-bla
BrandingText "TEST"
; Назначаем инсталлятору заголовок
Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
;--------------------------------------------------------------------
; Задаем папку установки по умолчанию.
InstallDir "$PROGRAMFILES64\${PRODUCT_NAME}"
; Задаем имя файла нашего инсталлятора
OutFile "${PRODUCT_NAME}.${PRODUCT_VERSION}.exe"
; Получится: UITest.1.0.exe
; Для новых ОС (Vista, Windows 7/8) можно запросить права пользователя ???
RequestExecutionLevel user
; Указываем режим отображения хода выполнения инсталляции (протокола), если нужно.
;ShowInstDetails show

;--------------------------------
;Section "Обновление"
  ;SetOutPath $INSTDIR
; Update the file - it will be replaced with the new version
  ;DetailPrint "Prepare to updating oldfile.txt using patch..."
  ;!insertmacro VPatchFile "patch.pat" "$INSTDIR\oldfile.txt" "$INSTDIR\temporaryfile.txt"
;SectionEnd

Section /o "$(PROGRUS)" SecRUS
  SetOutPath $INSTDIR
  File "1.txt"
SectionEnd

Section /o "$(PROGUKR)" SecUKR
  SetOutPath $INSTDIR
  File "2.txt"
SectionEnd

Section /o "$(PROGRUS64)" SecRUS64
  SetOutPath $INSTDIR
  File "1.64.txt"
SectionEnd

Section /o "$(PROGUKR64)" SecUKR64
  SetOutPath $INSTDIR
  File "2.64.txt"
SectionEnd
;--------------------------------
;Installer Functions
Function .onSelChange
; Выбор между компонентам 1 и 4
  !insertmacro StartRadioButtons $1
    !insertmacro RadioButton ${SecRUS}
    !insertmacro RadioButton ${SecUKR}
    !insertmacro RadioButton ${SecRUS64}
    !insertmacro RadioButton ${SecUKR64}
  !insertmacro EndRadioButtons

 ;Create uninstaller
  WriteUninstaller "$INSTDIR\Uninstall.exe"
FunctionEnd

;--------------------------------
;Uninstaller Section
Section "Un.$(locUN)" SecUN
delete "$INSTDIR\1.64.txt"
delete "$INSTDIR\2.64.txt"
delete "$INSTDIR\1.txt"
delete "$INSTDIR\2.txt"
delete "$INSTDIR\Uninstall.exe"
DeleteRegKey /ifempty HKLM "Software\UITest\Option"
  ;RMDir "$INSTDIR"
SectionEnd

;----------------------------------------------------------------
; Файлы с текстом Лицензионного соглашения
LicenseLangString License ${LANG_RUSSIAN} "lic_rus.txt"
LicenseLangString License ${LANG_UKRAINIAN} "lic_ukr.txt"
 
; Текст описания секции
LangString DESC_PROGRUS ${LANG_RUSSIAN} "Русская версия программы"
LangString DESC_PROGRUS ${LANG_UKRAINIAN} "Російська версія програми"
LangString DESC_PROGUKR ${LANG_RUSSIAN} "Украинская версия программы"
LangString DESC_PROGUKR ${LANG_UKRAINIAN} "Українська версія програми"
LangString DESC_PROGRUS64 ${LANG_RUSSIAN} "Русская версия программы(x64)"
LangString DESC_PROGRUS64 ${LANG_UKRAINIAN} "Російська версія програми(x64)"
LangString DESC_PROGUKR64 ${LANG_RUSSIAN} "Украинская версия программы(x64)"
LangString DESC_PROGUKR64 ${LANG_UKRAINIAN} "Українська версія програми(x64)"
; Текст названия секции
LangString PROGRUS ${LANG_RUSSIAN} "Русская версия (x86)"
LangString PROGRUS ${LANG_UKRAINIAN} "Російська версія (x86)"
LangString PROGUKR ${LANG_RUSSIAN} "Украинская версия (x86)"
LangString PROGUKR ${LANG_UKRAINIAN} "Українська версія (x86)"
LangString PROGRUS64 ${LANG_RUSSIAN} "Русская версия (x64)"
LangString PROGRUS64 ${LANG_UKRAINIAN} "Російська версія (x64)"
LangString PROGUKR64 ${LANG_RUSSIAN} "Украинская версия (x64)"
LangString PROGUKR64 ${LANG_UKRAINIAN} "Українська версія (x64)"
; Текст описания секции деинсталяции
LangString DESC_UNIN ${LANG_RUSSIAN} "Удалить локализованную версию и восстановить английский язык программы"
LangString DESC_UNIN ${LANG_UKRAINIAN} "Видалити локалізовану версію та відновити англійську мову програми"
; Текст названия секции деинсталяции
LangString locUN ${LANG_RUSSIAN} "Удалить локализованный файл"
LangString locUN ${LANG_UKRAINIAN} "Видалити локалізований файл"
; Макрос, который показывает текст описания компонентов для Install
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
            !insertmacro MUI_DESCRIPTION_TEXT ${SecRUS} $(DESC_PROGRUS)
            !insertmacro MUI_DESCRIPTION_TEXT ${SecUKR} $(DESC_PROGUKR)
            !insertmacro MUI_DESCRIPTION_TEXT ${SecRUS64} $(DESC_PROGRUS64)
            !insertmacro MUI_DESCRIPTION_TEXT ${SecUKR64} $(DESC_PROGUKR64)
!insertmacro MUI_FUNCTION_DESCRIPTION_END
; Макрос, который показывает текст описания компонентов для Uninstall
!insertmacro MUI_UnFUNCTION_DESCRIPTION_BEGIN
    !insertmacro MUI_DESCRIPTION_TEXT ${SecUN} $(DESC_UNIN)
!insertmacro MUI_UnFUNCTION_DESCRIPTION_END


tony1990 06-08-2013 16:25 2197295

Частично разобрался. !define MUI_PAGE_CUSTOMFUNCTION_SHOW "CompShowProc" нужно ставить перед страницей которую кастомизируешь. Но... вопрос остался. При добавлении кнопки таким способом инсталлятор зависает на странице компонентов.
Предположения?

K.A.V. 06-08-2013 17:22 2197323

Цитата:

Цитата Kopejkin
Правильно ли написаны примеры подобные нижеприведенному в Справочнике по NSIS »

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

Примеры написаны правильно, вопрос в другом: что вы хотите реализовать

В справочнике заключено в "секции" (именно по Setcion страничке) - это всего лишь пример исполнения команд

Цитата:

Цитата Kopejkin
В таком виде, все что написано между Section, не работает, »

И не должно срабатывать, ибо...Ответил выше, секции отрабатываются поочерёдно, и "косметические" изменения (в вашем случае имя секции) вам не отобразятся, т.к. секции отрабатываются в сам момент начала процесса установки

Код:
Код:

SectionGetText ${TEST_SEC} $0
 StrCpy $0 "$0 - $WINDIR"
 SectionSetText ${TEST_SEC} $0

Вам нужно поместить скажем, в custom page перед показом странички компонентов, т.е. вот так:


Код:

Page Custom SectionName
!insertmacro MUI_PAGE_COMPONENTS

и добавить функцию:
Код:

Function SectionName
 SectionGetText ${TEST_SEC} $0
 StrCpy $0 "$0 - Мой текст"
 SectionSetText ${TEST_SEC} $0
FunctionEnd

Обратите внимание на то, что данная функция будет отрабатываться каждый раз при переходе с предыдущей стрнаницы инсталлера на страничку компонентов, т.е. текст будет постоянно добавляться...Можно этого избежать, прописывая имя секции в команде назначения текста:
Код:

Function SectionName
 StrCpy $0 "Имя моей секции - Добавляемый текст"
 SectionSetText ${TEST_SEC} $0
FunctionEnd

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


Цитата:

Цитата Kopejkin
скрывать секции PROGRUS и PROGUKR, если установка выполняется на 64 разрядной системе и, наоборот, скрывать PROGRUS64 и PROGUKR64 при установке на 32 разрядной системе? Если можно, укажите поточнее, где или что об этом написано в справке или справочнике. А если поделитесь кодом - буду очень благодарен. »

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

В начале кода создайте переменную:
Код:

var IsWow64Process
Пропимсываем определение типа процесса
Код:


Function .onInit
  System::Call kernel32::GetCurrentProcess()i.s
  System::Call kernel32::IsWow64Process(is,*i.s)
  Pop $IsWow64Process
FunctionEnd

Если $IsWow64Process = 0 - 32-bit процесс

Т.е. там же, в функции .onInit уже пляшем от значения переменной $IsWow64Process и скрываем "лишние" секции
Скрыть секцию легко - достаточно назначить пустое имя секции:
Код:


Function .onInit
  System::Call kernel32::GetCurrentProcess()i.s
  System::Call kernel32::IsWow64Process(is,*i.s)
  Pop $IsWow64Process
 StrCmp $IsWow64Process "1" 0 +3
 call Is64Bit
 goto +2
 call Is32Bit
FunctionEnd

Function Is64Bit
; Скрываем секции, если процесс 64 битный
 SectionSetText ${PROGRUS} ""
 SectionSetText ${PROGUKR} "" 
FunctionEnd

Function Is32Bit
; Скрываем секции, если процесс 32 битный
 SectionSetText ${PROGRUS64} ""
 SectionSetText ${PROGUKR64} "" 
FunctionEnd

Кстати, не забудьте, что если у вас секции по умолчанию отмечены для установки, то скрытая секция всё равно отработает все команды (скрытие секции не снимает флаг её отметки, а всего лишь скрывает от пользователя)


Цитата:

Цитата Kopejkin
Еще интересует, почему файл деинсталлятора все равно создается, если из программы установки я выхожу, напр. из диалога выбора компонентов? »

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

Потому что у вас команда на создание деинсталлятора прописана в функцию, которая выполняется при взаимодействии с компонентами!
Код:

Function .onSelChange
; Выбор между компонентам 1 и 4
  !insertmacro StartRadioButtons $1
    !insertmacro RadioButton ${SecRUS}
    !insertmacro RadioButton ${SecUKR}
    !insertmacro RadioButton ${SecRUS64}
    !insertmacro RadioButton ${SecUKR64}
  !insertmacro EndRadioButtons

 ;Create uninstaller
  WriteUninstaller "$INSTDIR\Uninstall.exe"
FunctionEnd

Переместите данную команду в post секцию ниже всех...


Цитата:

Цитата tony1990
Частично разобрался. !define MUI_PAGE_CUSTOMFUNCTION_SHOW "CompShowProc" нужно ставить перед страницей которую кастомизируешь. Но... вопрос остался. При добавлении кнопки таким способом инсталлятор зависает на странице компонентов »

Цитата:

Цитата tony1990
Предположения? »

Не умеем мы предполагать, скрипт в студию

tony1990 06-08-2013 20:43 2197472

Ну вот скриптик упрощённый для примера. На странице приветствия кнопка рисуется, а если закомментировать/убрать строку !insertmacro MUI_PAGE_WELCOME, то на странице компонентов кнопка не отображается. Правда тут инсталлятор не зависает.

Код:


!include "MUI2.nsh"
                                       
Name "Example1"
OutFile "example1.exe"

var HostButton


!define MUI_PAGE_CUSTOMFUNCTION_SHOW "CompShowProc"
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES


!insertmacro MUI_LANGUAGE "English"


Function CompShowProc

 ${NSD_CreateBrowseButton} 0 0 100% 15u "Текст"
 Pop $HostButton

FunctionEnd


Section "Component1"
SectionEnd

Section "Component2"
SectionEnd

Section "Component2"
SectionEnd


Kopejkin 07-08-2013 04:05 2197627

K.A.V., большое спасибо за развернутый ответ!
Цитата:

Цитата K.A.V.
...что вы хотите реализовать »

Пока я просто пытаюсь хоть что-нибудь понять.

tony1990 08-08-2013 14:32 2198438

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

tony1990 09-08-2013 17:10 2199110

Вложений: 1
Нашёл решение в виде Button.dll Но возникла небольшая сложность. Кнопка работает только в нижней части экрана. А если скажем изменить координату Y на 200, то уже не работает. Нужна помощь!

Код:


!include "MUI2.nsh"

!define IDC_ABOUT 1300

!define MUI_COMPONENTSPAGE_SMALLDESC
                                       
Name "Example1"
OutFile "example1.exe"

!define MUI_PAGE_CUSTOMFUNCTION_SHOW "CompShowProc"
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES

!insertmacro MUI_LANGUAGE "English"


Function CompShowProc

    System::Call 'kernel32::GetModuleHandle(i0)i.r0'
    System::Call 'user32::CreateWindowEx(i0,t"Button",t"Add Host",i${BS_PUSHBUTTON}|${WS_CHILD}|${WS_VISIBLE}|${WS_TABSTOP},i80,i300,i90,i25,i$HWNDPARENT,i${IDC_ABOUT},ir0,i0)i.R0'
    System::Call 'kernel32::FreeLibrary(ir0)'
    CreateFont $0 '$(^Font)' '$(^FontSize)'
    SendMessage $R0 ${WM_SETFONT} $0 0
    GetFunctionAddress $0 FuncAbout
    ButtonEvent::AddEventHandler /NoUnload ${IDC_ABOUT} $0

FunctionEnd

Function FuncAbout

    ;0x40=MB_OK(0x0)|MB_ICONINFORMATION(0x40)
    System::Call 'user32::MessageBox(i$HWNDPARENT,t"Всё отлично!",t"About",i0x40)'

FunctionEnd


Section "Component1"
SectionEnd

Section "Component2"
SectionEnd

Section "Component3"
SectionEnd


kotkovets 10-08-2013 20:32 2199600

Цитата:

А если скажем
изменить координату Y на 200, то
уже не работает
перекрывается стандартными контролами странички, поэтому не видно, для начала нужно править ресурсы установщика, примеров много в архиве темы.

Kopejkin 11-08-2013 14:54 2199926

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

Код:

  ; Update the file - it will be replaced with the new version
  DetailPrint "Prepare to updating..."
  !insertmacro VPatchFile "ws64ukr.pat" "$INSTDIR\WinSnap64.exe" "$INSTDIR\temporaryfile.exe"


MaGoth 12-08-2013 19:59 2200465

Привет народ, :)
Требуется небольшая помощь с определением Осей в инсталляшке.
Задача:
Если Ось ХР и разрешение экрана выше чем: 2048 пикселей, - установить один файл в указанный каталог.
Если Ось Виста, Севен или Осьмушка, и разрешение экрана выше чем 2048 пикселей, установить другой файл в указанную директорию.
Номера, битности и прочее значения не имеют..

За примерчик с описанием был бы очень благодарен.


Зы, Использую, версию юникод - 2,46,5, если что.

Kopejkin 12-08-2013 20:39 2200484

В Справочнике по NSIS есть два уже готовых примера: "Определение операционной системы" и "Определяем и меняем разрешение экрана". Подгоняйте под свои потребности.

tony1990 13-08-2013 12:36 2200712

MKN, в твоём примере 3 Использование функции CreateWindowEx для создания кнопки кнопка работает только в верхней и нижней части экрана. Если ты изменишь координату Y на 100, она уже не работает. Что странно, ведь ты создаёшь кастомную страницу, а мне тут писали что перекрывается стандартными контролами, потому и не работает. Я правда правлю стандартную страницу (components page)

icq99999999 14-08-2013 13:57 2201396

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

MaGoth 14-08-2013 17:40 2201568

Цитата:

Цитата Kopejkin
В Справочнике по NSIS есть два уже готовых примера: "Определение операционной системы" и "Определяем и меняем разрешение экрана". Подгоняйте под свои потребности. »

Спасибо, уже без справки разобрался.


Теперь другие вопросы появились, ибо нигде не увидел инфы или какого либо вразумительного описания, на те или иные моменты в создании инсталлера под Вин8.
Собственно, как Нсис с ней работает, нормально или не поддерживает вообще?
Из справки ув. КАВа, плагин как я понял её не определяет, а есть ли обновление для определения этой ОС?!
Ну, и любой примерчик по созданию инсталлера и определению этой версии Оси пригодился бы...

Собственно задача моя простая, сделать инсталляшку для Осей: (ХР), (Виста, Севен) и (Осьмушка). При установке определяется разрешение экрана, после его определения в зависимости от ОС, устанавливаются те или иные исполняемые файлы, на ту или иную версию программы... И т.д..

Зы, При условии что ОС 8 стоит особняком от остальных Осей.


Цитата:

Цитата icq99999999
можно ли чтобы при запуске созданного установщика с ключом , выполнялся определённый файл?
а при обычном запуске , все распаковывалось в временную папку и запускался определенный файл2
(все файлы внутри установщика) всё должно быть скрыто от глаз пользователя »

Не уверен что первое возможно без каких либо костылей, ибо не понятно, откуда программе узнать что юзер ее запускает с ключом.
Второе не проблема,
Прописываем в скрипте сверху, например:
!define PROG_BASE "MyProg"

далее в коде, где требуется вызываем, создание папки времянки и копирование в нее требуемых файлов:
SetOutPath "$TEMP\${PROG_BASE} Installation\"
File ".\путь к твоим файлам"

Далее, по коду:
Запускаем твою прогу, так как тебе нужно, командами:
Exec '"$TEMP\${PROG_BASE} Installation\someprogram.exe"'
Команда с передачей параметров запускаемому файлу:
Exec '"$TEMP\${PROG_BASE} Installation\someprogram.exe" ваши_параметры'

или
ExecWait '"$TEMP\${PROG_BASE} Installation\someprogram.exe"' $0
Где $0 переменная, в которую будет помещен код завершения (не обязательно)

Далее, по окончании работы инсталлера, где-нить в последней секции, прописываем убиение времянки в каталоге темп:
Function .onGUIEnd
RmDir /r /REBOOTOK "$TEMP\${PROG_BASE} Installation"
FunctionEnd

Вроде все...

Vincent7 14-08-2013 18:20 2201589

Скажите пожалуйста можно ли заблокировать процесс на время установки если да то как?

MaGoth 14-08-2013 18:27 2201595

Можно, смотри справку по Нсис, в части:
Примеры кодов:
- Работа с процессами с помощью NSIS

Ссылка на справку в шапке темы.

Хотя нет, тебе же заблочить процесс надо, а не закрыть, скорее всего нет. Хотя может кто и подскажет вариант...

K.A.V. 14-08-2013 18:51 2201613

Цитата:

Цитата MaGoth
Из справки ув. КАВа, плагин как я понял её не определяет, а есть ли обновление для определения этой ОС?!
Ну, и любой примерчик по созданию инсталлера и определению этой версии Оси пригодился бы... »

Примеры кодов => Определение ОС
(читайте поновее способ от kotkovets)

Код:

!include "WinVer2.nsh"
outfile "OS_TEST.exe"

Function .onInit
${WinVersion} $0
${WinVersionMajor} $1
${WinVersionMinor} $2

  MessageBox MB_OK|MB_ICONINFORMATION " WinVersion = $0 $\n$\n WinVersionMajor = $1 $\n$\n WinVersionMinor = $2"
quit
FunctionEnd

Section
SectionEnd

У Windows 7 => 6.1
У Windows 8 => 6.2


---
Цитата:

Цитата icq99999999
можно ли чтобы при запуске созданного установщика с ключом , выполнялся определённый файл?
а при обычном запуске , все распаковывалось в временную папку и запускался определенный файл2
(все файлы внутри установщика) всё должно быть скрыто от глаз пользователя »

Перевод справки NSIS => GetParameters: получаем командную строку инсталлятора
Перевод справки NSIS => GetOptions: обрабатываем значение ключа в параметре запуска инсталлятора
+
Перевод справки NSIS => File: Добавляем файлы в инсталлятор
Перевод справки NSIS => Exec: запускаем приложения
Перевод справки NSIS => ExecWait: ждём завершения исполнения приложения


---
Цитата:

Цитата Vincent7
Скажите пожалуйста можно ли заблокировать процесс на время установки если да то как? »

Если речь идёт о процессе инсталлятора, то в какой ситуации это необходимо? После чего тормозить процесс и после какого события возобновлять процесс установки?
А если речь идёт об управлении сторонним процессом, то лично я вам тут не помогу (максимум, что можно сделать - убить процесс, а потом в нужное время запустить)

kotkovets 14-08-2013 19:06 2201620

Цитата:

Цитата MaGoth
ибо не понятно, откуда программе узнать что юзер ее запускает с ключом »

С помощью переменной $CMDLINE ну а дальше разбор строки:
заведи с ключом /key ..
Код:

!include "FileFunc.nsh"
!include "LogicLib.nsh"

outfile test.exe

Section

  ClearErrors
  ${GetOptions} "$CMDLINE" "/key"  $R0
  ${IfNot} ${Errors}

    MessageBox MB_OK "Запуск с ключом: /key" IDOK

  ${EndIf}

SectionEnd

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

MaGoth 14-08-2013 19:26 2201630

K.A.V,
Ай спасибки камраден. :)

Цитата:

Цитата K.A.V.
А если речь идёт об управлении сторонним процессом, то лично я вам тут не помогу (максимум, что можно сделать - убить процесс, а потом в нужное время запустить) »

Именно он и имелся ввиду.

Зы, Побег тестить примерчики... :)

Vincent7 14-08-2013 19:49 2201644

Да, речь идет о стороннем процессе. А можно сделать так - если процесс запустился то сразу его убить? И при этом чтобы инсталлятор продолжал работать

MaGoth 14-08-2013 19:55 2201645

Я же написал, скачай справку и в ней прочитай в указанной статье, там есть пример по убиению запущенного процесса. + там-же будет ссыль на требуемые файлы в работе.

Впрочем:
Весь текст по этой теме из нее.
читать дальше »

Автор: kotkovets
Последнее обновление: 01.09.2011

Собственно идея давно крутилась создать библиотеку для работы с процессами.
Так как существующие плагины для работы с процессами меня не устраивали своей функциональностью.
Много идей позаимствовал из интернета и оффицального сайта NSIS. И вот, что у меня получилось...
Загрузить (ссылку в справке смотреть надо)
Написанная мною библиотека полностью совместима с юникодной версией компилятора NSIS.
Гарантировано работает начиная от Windows 2000 и выше, независимо от разрядности системы х32 или х64.
Файл ProcessFunc.nsh копируем в папку ${NSISDIR}\Include, далее в скрипте подключаем данную библиотеку.


!include "ProcessFunc.nsh"



Поиск запущенного процесса по имени процесса

По указанному имени ищем запущенный процесс
${FindProcessName} "process.exe" $var
process.exe - Имя процесса с расширением, которое требуется найти.
возвращаемые значения в указанную переменную $var

$var = 1 -процесс найден.
$var = none -процесс не найден.
$var = error -ошибка получения снимка запущенных процессов

${FindProcessName} "explorer.exe" $0

StrCmp $0 0 0 +2
MessageBox MB_ICONINFORMATION|MB_OK "Проводник запущен!"

StrCmp $0 none 0 +2
MessageBox MB_ICONINFORMATION|MB_OK "Проводник не запущен!"



Логическая конструкция поиска запущенного процесса


${If} ${ProcessExists} "explorer.exe"
MessageBox MB_ICONINFORMATION|MB_OK "Проводник запущен!"
# здесь будет выполняться код, если процесс запущен
${Else}
MessageBox MB_ICONINFORMATION|MB_OK "Проводник не запущен!"
# здесь будет выполняться код, если процесс не запущен
${EndIf}



Определение PID запущенного процесса

Process ID - это уникальный идентификатор процесса, номер, который система назначает каждому активному процессу.
Этот номерок несет очень много информации о процессе.
${FindProcessPID} "process.exe" $var

process.exe - Имя процесса с расширением, которое требуется найти.
Возвращаемые значения в указанную переменную $var

$var = PID -PID процесса
$var = none -процесс не найден.
$var = error -ошибка получения снимка запущенных процессов



Поиск пути запущенного процесса

По имени процесса определяем путь к запущенному процессу

${FindProcessPath} "process.exe" $var
process.exe - Имя процесса с расширением, которое требуется найти.
Возвращаемые значения в указанную переменную $var

$var = путь к активному процессу
$var = none -процесс не найден.
$var = error -ошибка получения снимка запущенных процессов

${FindProcessPath} "explorer.exe" $2
StrCmp $2 none +3 +1
StrCmp $2 error +2 +1
MessageBox MB_ICONINFORMATION|MB_OK "Путь к процессу [ explorer ]:$\n $2"

StrCmp $2 none +1 +2
MessageBox MB_ICONINFORMATION|MB_OK "Процесс [ explorer ] не найден"

StrCmp $2 error +1 +2
MessageBox MB_ICONINFORMATION|MB_OK "Process error"



Завершение запущенного процесса


${KillProcess} "process.exe" $var

process.exe - Имя процесса с расширением, которое требуется завершить.
Возвращаемые значения в указанную переменную $var

$var = 1 - процесс успешно завершен.
код возврата 1 обусловлен тем, что бы проводник завершался,
а не перезапускался, так, как это делает диспетчер задач.
$var = 2 -процесс не завершен.
$var = none -процесс не найден.
$var = error -ошибка получения снимка запущенных процессов

${KillProcess} "explorer.exe" $4
${If} $4 == 1
MessageBox MB_ICONINFORMATION|MB_OK "Процесс завершен [ explorer ]:$\n$$4 = $4"
Exec "explorer.exe" # запускаем проводник
${ElseIf} $4 == 2
MessageBox MB_ICONINFORMATION|MB_OK "Процесс не завершен [ explorer ]:$\n$$4 = $4"
${ElseIf} $4 == none
MessageBox MB_ICONINFORMATION|MB_OK "$$4 = $4$\nПроцесс[ explorer ] не найден"
${ElseIf} $4 == error
MessageBox MB_ICONINFORMATION|MB_OK "Process error"
${EndIf}


Ожидание завершения запущенного процесса заданное время

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

${ProcessWait} "process.exe" "time" $var
process.exe - Имя процесса с расширением, который установщик будет ждать.
time - указанное время в миллисекундах, если указать константу ${INFINITE} или -1
установщик будет ждать завершения процесса.
Возвращаемые значения в указанную переменную $var

$var = 1 -ожидание завершено успешно
$var = none -процесс не найден.
$var = error -ошибка получения снимка запущенных процессов

В данном примере установщик будет ждат 2 секунды, когда проводник запущен.

${ProcessWait} "explorer.exe" "2000" $5 # ожидание 2 секунды
StrCmp $5 none +3
StrCmp $5 error +2
MessageBox MB_ICONINFORMATION|MB_OK "Ожидание процесса [ explorer.exe ] \
2 секунды, завершено успешно! $\n$$5 = $5"

StrCmp $5 none 0 +2
MessageBox MB_ICONINFORMATION|MB_OK "$$5 = $5$\nПроцесс[ explorer ] не найден"

StrCmp $5 error 0 +2
MessageBox MB_ICONINFORMATION|MB_OK "$$5 = $5$\nProcess"



Запуск внешних приложений в режиме ожидания завершения приложения

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

${ExecWait} "app.exe [parametr1]...[parametr2]" $var
app.exe [parametr1]...[parametr2] - путь к запускаемоому приложению и ключи запуска приложения
Возвращаемые значения в указанную переменную $var

$var = 0 -приложение завершено успешно.
$var = 1 -приложение внезапно прервано.
$var = 2 -приложение завершено с ошибкой.
$var = код возврата -число, код возврата, которое возвращает приложение.
$var = error -ошибка запуска приложения.

${ExecWait} "calc.exe" $6
StrCmp $6 error +2
# если завершить через диспетчер задач, то код возврата в $6 = 1
DetailPrint "ExecWait [ calc.exe ] exitcode: $6"

StrCmp $6 error 0 +2
MessageBox MB_ICONINFORMATION|MB_OK "error"



Перечисление запущенных процессов


${EnumProcess} Function
Function - имя пользовательской функции.
В функции Function доступны для использования только переменные $R0 - $R9
Переменые $0 - $9 используются макросом!
Функция возвращает следующие значения:
$3 - идентификатор процесса
$4 - приоритет процесса, принимает следующие значения:

Idle -Низкий приоритет.
Below Normal -Приоритет ниже нормального.
Normal -Нормальный приоритет.
Above Normal -Приоритет выше нормального.
High -Высокий приоритет.
Real Time -Приоритет реального времени, программа выполняется так, что все ресурсы отдаются ей.

$5 - имя процесса.
$6 - путь к процессу.
$7 - пользователь от имени которого запущен процесс.
В случае ошибки макрос устанавливает флаг ошибки

!include "MUI2.nsh"
!include "ProcessFunc.nsh"

!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

ShowInstDetails show
OutFile TestProcEnum.exe
Caption "ProcessEnum"
Name "ProcessEnum test"

Section "EnumProc"
${EnumProcess} Process
IfErrors 0 +2
MessageBox MB_ICONSTOP|MB_OK "Error createsnapshot!"
SectionEnd

Function Process
DetailPrint "*********************************"
DetailPrint "PID = $3" #идентификатор процесса
DetailPrint "Priority = $4" #приоритет процесса
DetailPrint "Name = $5" #имя процесса
DetailPrint "Path = $6" #путь к процессу
DetailPrint "UserName = $7" #имя пользователя процесса
FunctionEnd

MaGoth 15-08-2013 18:38 2202215

Привет народ, :)
Очередной вопрос появился и понять не могу, это мой косяк или Нсисовский...

Имеем:
- для инсталляции 4 версии файлов + либы, в зависимости от ОС для определенной программы.
Код установки простенький, привожу только кусок самой установки файлов для определенного языка программы и под конкретную ОС:

читать дальше »
...
!insertmacro GLOBAL_WinVersion

${If} $WVER == "5.1" ;WinXP
SetOutPath "$INSTDIR\System"
File ".\setup\pack-en\file.exe"
File ".\setup\pack-en\file-2.exe"
File ".\setup\pack\wx\Library-1.dll"
Goto Winst
${ElseIf} $WVER == "6.0" ;WinVista
SetOutPath "$INSTDIR\System"
File ".\setup\pack-en\file.exe"
File ".\setup\pack-en\file-2.exe"
File ".\setup\pack\wx\Library-2.dll"
Goto Winst
${ElseIf} $WVER == "6.1" ;Win7
File ".\setup\pack-en\file.exe"
File ".\setup\pack-en\file-2.exe"
File ".\setup\pack\wx\Library-2.dll"
Goto Winst
${ElseIf} $WVER == "6.2" ;Win8
SetOutPath "$INSTDIR\System"
File ".\setup\pack-en\w8\file.exe"
File ".\setup\pack-en\w8\file-2.exe"
File ".\setup\pack\wx\Library-2.dll"
Goto Winst
${ElseIf} $WVER == "6.3" ;Win8-Blue
SetOutPath "$INSTDIR\System"
File ".\setup\pack-en\w8\file.exe"
File ".\setup\pack-en\w8\file-2.exe"
File ".\setup\pack\wx\Library-2.dll"
Goto Winst
${Else}
SetOutPath "$INSTDIR\System"
File ".\setup\pack-en\file.exe"
File ".\setup\pack-en\file-2.exe"
File ".\setup\pack\wx\Library-1.dll"
Goto Winst
${EndIf}

Winst:
SetOutPath "$INSTDIR\links"
...

Ну, а далее папки и прочие ярлыки в меню Пуск..

Размер для файлов в среднем такой:
file.exe - 9 МБ
file-2.exe - 12 КБ
Library-1.dll - 150 КБ
Library-2.dll - 80 КБ (ставится отдельным макросом в зависимости от разного назначения)

Вроде как, инсталлер правильно определяет размер всех файлов в совокупности включенных в компиляцию инсталлера.
Вопрос в том, почему при выборе только одной секции из 4 возможных, он указывает в поле: "Размер устанавливаемых файлов", число, соответствующее сразу всем файлам включенных в инсталлятор - 59 МБ. :o
А не конкретно тех, которые отмечены к установке, в которой будет от силы - 10 МБ... ?!

Зы, Сижу под Юникодом. :)
Зы-зы, В догонку вопрос по Win8-Blue:
В вики пишут что ядро у нее:
Цитата:

Версия ядра NT 6.3 (в Windows 8 использовалось ядро NT 6.2)
Получается либо они звиздят, либо версия ядра и версия Винды это разные вещи, либо еще что-то...
То что выдается плагином по определению версии, это - 6.2.

Картинко:
http://yadi.sk/d/VGPlu9Ee7xand
На скрине видно что у Оси версия - 6.3, а инсталлер выдает старый номер. Где в ней откопать этот номерок чтобы по нему сверятся, ибо пока, тут ничего не понятно..
Или может мысли какие есть ?!

kotkovets 15-08-2013 22:22 2202347

Цитата:

Цитата MaGoth
Получается либо они звиздят, либо версия ядра и версия Винды это разные вещи, либо еще что-то...
То что выдается плагином по определению версии, это - 6.2. »

фиг его знает...
проверь под winver.nsh:
Код:

${WinVerGetMajor} $1 ;старшая цифра версии win
${WinVerGetMinor} $2 ;младшая цифра версии win
${WinVerGetBuild} $3
MessageBox MB_OK "$1$2 WinVerGetBuild = $3" IDOK

Смотри по номеру билда, может номерок не совпадает... апи не будет врать...
может быть библиотека kernel32.dll прежней версии осталась (оттуда берутся данные)
если все совпадает - звиздят...:)

Kopejkin 17-08-2013 02:59 2203029

Вложений: 1
Подскажите, пожалуйста, почему могут плохо переключаться компоненты?
"Эффект" проявляется после добавления кода, выделенного красным. Т.е. компоненты переключаются, но можно выбрать сразу два. Если переключить их несколько раз, работоспособность восстанавливается - как будто что-то удерживает состояние выбранного компонента (не соображу, как правильно сформулировать).
Причем проявляется не сразу, а только после возврата с кастомной странички, например, для выбора другой версии файла.
Приложен архив с эти сценарием. При наличии указанных в !include файлов, можно скомпилировать и посмотреть.
читать дальше »

Код:

!include "MUI2.nsh"
;!include "VPatchLib.nsh"
!include "Logiclib.nsh"
!include "WinVer2.nsh"
!include "ProcessFunc.nsh"
SetCompressor /SOLID lzma
!define MUI_LANGDLL_REGISTRY_ROOT "HKLM"
!define MUI_LANGDLL_REGISTRY_KEY "Software\Example\Option"
!define MUI_LANGDLL_REGISTRY_VALUENAME "InstallerLanguage"
!define MUI_ABORTWARNING
!define MUI_CUSTOMFUNCTION_GUIINIT MUIGUIInit
!define SWP_SHOWWINDOW 0x00000040
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE ComponentsLeave
!define MUI_COMPONENTSPAGE_SMALLDESC
!insertmacro MUI_PAGE_COMPONENTS
Page custom CustomInfo
!insertmacro MUI_PAGE_INSTFILES
;-----------------------------------------------------
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES

!insertmacro MUI_LANGUAGE "Russian"
!insertmacro MUI_LANGUAGE "Ukrainian"
;--------------------------------------------------------------------
Function un.onInit
!insertmacro MUI_UNGETLANGUAGE
FunctionEnd
;--------------------------------------------------------------------
Caption "Example"
OutFile "example.exe"
RequestExecutionLevel admin
;-------------------------------------------------------
!insertmacro MUI_RESERVEFILE_LANGDLL
;--------------------------------
Section /o "$(PROGRUS)" SecRUS
  SetOutPath $INSTDIR
    CreateDirectory "$INSTDIR\Backup"
    ;!insertmacro VPatchFile
SectionEnd
Section /o "$(PROGUKR)" SecUKR
  SetOutPath $INSTDIR
    CreateDirectory "$INSTDIR\Backup"
    ;!insertmacro VPatchFile
SectionEnd
Section /o "$(PROGRUS64)" SecRUS64
  SetOutPath $INSTDIR
    CreateDirectory "$INSTDIR\Backup"
    ;!insertmacro VPatchFile
SectionEnd
Section /o "$(PROGUKR64)" SecUKR64
  SetOutPath $INSTDIR
    CreateDirectory "$INSTDIR\Backup"
    ;!insertmacro VPatchFile
SectionEnd
Section "-Post"
  WriteUninstaller "$INSTDIR\Uninstall.exe"
  SetAutoClose false
SectionEnd
;--------------------------------
Function .OnInit
!insertmacro MUI_LANGDLL_DISPLAY
; Для "красоты": версия, разрядность ОС
  ${WinName} $1
  ${WinType} $2
  ${WinServerName} $3
  ${WinServicePack} $4
  ${WinPlatformArchitecture} $5
  StrCpy $6 "$1 $2 $3 $4 (x$5)"
  Var /Global text5
  StrCpy $text5 "$6" ; что получилось - на кастомную страницу
; Определяем разрядность ОС для скрытия ненужных компонентов
  Var /Global IsWow64Process
  System::Call kernel32::GetCurrentProcess()i.s
  System::Call kernel32::IsWow64Process(is,*i.s)
  Pop $IsWow64Process
  StrCmp $IsWow64Process "1" 0 +3
  call Is64Bit
  goto +2
  call Is32Bit

; ТАК ПРОЩЕ, кажется. Собираем информацию о системе и,
; заодно , используем $5 для скрытия ненужных компонентов
  ;${WinName} $1
  ;${WinType} $2
  ;${WinServerName} $3
  ;${WinServicePack} $4
  ;${WinPlatformArchitecture} $5
  ;StrCpy $6 "$1 $2 $3 $4 (x$5)"
  ;Var /Global text5
  ;StrCpy $text5 "$6" ; что получилось - на кастомную страницу
        ;StrCmp $5 "64" 0 +3
  ;call Is64Bit
  ;goto +2
  ;call Is32Bit

FunctionEnd
;---------------------------------------------------------
Function MUIGUIInit
; Получаем CRC exe-файла в папке установленной программы
  CRCCheck::GenCRC "$INSTDIR\WinSnap64.exe"
  Pop $R1
  CRCCheck::GenCRC "$INSTDIR\WinSnap.exe"
  Pop $R2
  StrCpy $1 $R1
  StrCpy $2 $R2
; Определяем, что установлено: оригинал или локализация.
## скрипт определения
FunctionEnd
;---------------------------------------------------------------
Function Is64Bit
; Скрываем секции, если процесс 64 битный
  SectionSetText ${SecRUS} ""
  SectionSetText ${SecUKR} ""
FunctionEnd
Function Is32Bit
; Скрываем секции, если процесс 32 битный
  SectionSetText ${SecRUS64} ""
  SectionSetText ${SecUKR64} ""
FunctionEnd
;-----------------------------------------------------------------
Function .onSelChange
; Выбор только одного компонента из 4
  !insertmacro StartRadioButtons $1
    !insertmacro RadioButton ${SecRUS}
    !insertmacro RadioButton ${SecUKR}
    !insertmacro RadioButton ${SecRUS64}
    !insertmacro RadioButton ${SecUKR64}
  !insertmacro EndRadioButtons
FunctionEnd
;-----------------------------------------------------------------------
Function ComponentsLeave
; Принуждаем пользователя выбрать какой-либо компонент, если забыл
${IfNot} ${SectionIsSelected} ${SecRUS}
${AndIfNot} ${SectionIsSelected} ${SecUKR}
${AndIfNot} ${SectionIsSelected} ${SecRUS64}
${AndIfNot} ${SectionIsSelected} ${SecUKR64}
  MessageBox MB_OK "$(not_component)" ; Предупреждение о не выбранном компоненте
  Abort
${EndIf}
; ВОТ С ЭТИМ ПЛОХО ПЕРЕКЛЮЧАЮТСЯ КОМПОНЕНТЫ; На инфо странице указываем, какой язык локализации
  SectionGetFlags ${SecRUS} $0
  SectionGetFlags ${SecUKR} $1
  SectionGetFlags ${SecRUS64} $2
  SectionGetFlags ${SecUKR64} $3
Var /Global text_lang
    StrCmp $0 "1" +2 0
    StrCmp $2 "1" 0 +3
          StrCpy $4 "$(lang_rus)"
          StrCpy $text_lang "$4"
    StrCmp $1 "1" +2 0
    StrCmp $3 "1" 0 +3
          StrCpy $4 "$(lang_ukr)"
          StrCpy $text_lang "$4"

FunctionEnd

Function CustomInfo
!insertmacro MUI_HEADER_TEXT $(confirm_select) $(confirm_select_subtitle)
  InitPluginsDir
  File /oname=$PLUGINSDIR\msg.ini "msg.ini"
  WriteINIStr $PLUGINSDIR\msg.ini "Field 1" "Text" "$(text1)"
  WriteINIStr $PLUGINSDIR\msg.ini "Field 2" "Text" "$(text2)"
  WriteINIStr $PLUGINSDIR\msg.ini "Field 4" "Text" "$(text4)"
  WriteINIStr $PLUGINSDIR\msg.ini "Field 5" "Text" "$text5"
  WriteINIStr $PLUGINSDIR\msg.ini "Field 6" "Text" "$(text6)"
  WriteINIStr $PLUGINSDIR\msg.ini "Field 7" "Text" "$INSTDIR"
  WriteINIStr $PLUGINSDIR\msg.ini "Field 8" "Text" "$(text8)"
  WriteINIStr $PLUGINSDIR\msg.ini "Field 9" "Text" "$(text9)"
  WriteINIStr $PLUGINSDIR\msg.ini "Field 10" "Text" "$text_lang"
 
InstallOptions::initDialog /NOUNLOAD "$PLUGINSDIR\msg.ini"
InstallOptions::show
FunctionEnd
;-----------------------------------------
; Раздел (секция) деинсталлятора
Section "un.install" ;SecUN
  delete "$INSTDIR\WinSnap64.exe"
  delete "$INSTDIR\WinSnap.exe"
  Rename $INSTDIR\Backup\WinSnap64.exe.bak $INSTDIR\WinSnap64.exe
  Rename $INSTDIR\Backup\WinSnap.exe.bak $INSTDIR\WinSnap.exe
  delete "$INSTDIR\Uninstall.exe"
  DeleteRegKey HKLM "Software\Alexander Avdonin\WinSnap\Option"
  RMDir /r "$INSTDIR\Backup"
  SetAutoClose false
SectionEnd
;----------------------------------------------------------------
LangString text2 ${LANG_RUSSIAN} "Установка будет выполнена со следующими параметрами:"
LangString text2 ${LANG_UKRAINIAN} "Встановлення буде виконано з наступними параметрами:"
LangString text9 ${LANG_RUSSIAN} "Выбранный язык WinSnap:"
LangString text9 ${LANG_UKRAINIAN} "Обрана мова WinSnap:"
LangString lang_rus ${LANG_RUSSIAN} "Русский язык"
LangString lang_rus ${LANG_UKRAINIAN} "Російська мова"
LangString lang_ukr ${LANG_RUSSIAN} "Украинский язык"
LangString lang_ukr ${LANG_UKRAINIAN} "Українська мова"
LangString text4 ${LANG_RUSSIAN} "Операционная система:"
LangString text4 ${LANG_UKRAINIAN} "Операційна система:"
LangString text6 ${LANG_RUSSIAN} "Папка установки файлов:"
LangString text6 ${LANG_UKRAINIAN} "Папка призначення:"
LangString confirm_select ${LANG_RUSSIAN} "Подготовка завершена!"
LangString confirm_select ${LANG_UKRAINIAN} "Підготовку завершено!"
LangString confirm_select_subtitle ${LANG_RUSSIAN} "Все готово к локализации программы"
LangString confirm_select_subtitle ${LANG_UKRAINIAN} "Усе підготовлено до локалізації програми"
; Текст сообщения, когда устанавливаемый компонент не выбран
LangString not_component ${LANG_RUSSIAN} "Для продолжения выберите желаемую версию перевода !"
LangString not_component ${LANG_UKRAINIAN} "Щоб продовжити, оберіть бажану версію перекладу !"
; Текст названия компонента (раздела, секции)
LangString PROGRUS ${LANG_RUSSIAN} "Русская версия (x86)"
LangString PROGRUS ${LANG_UKRAINIAN} "Російська версія (x86)"
LangString PROGUKR ${LANG_RUSSIAN} "Украинская версия (x86)"
LangString PROGUKR ${LANG_UKRAINIAN} "Українська версія (x86)"
LangString PROGRUS64 ${LANG_RUSSIAN} "Русская версия (x64)"
LangString PROGRUS64 ${LANG_UKRAINIAN} "Російська версія (x64)"
LangString PROGUKR64 ${LANG_RUSSIAN} "Украинская версия (x64)"
LangString PROGUKR64 ${LANG_UKRAINIAN} "Українська версія (x64)"



P.S. Я так понимаю, что ProcessFunc.nsh пока несовместим с NSIS 3.
Цитата:

!verbose: Invalid verbose level
Error in macro _KillProcessCall on macroline 2

MaGoth 17-08-2013 19:59 2203306

kotkovets,
Привет народ. :)
Цитата:

Смотри по номеру билда, может номерок не совпадает... апи не будет врать...
может быть библиотека kernel32.dll прежней версии осталась (оттуда берутся данные)
если все совпадает - звиздят...
Короче, после ковыряний стало более менее понятно, тестилось на сборках инсталляшки под Анси и Юникод.
Это баг в API, конкретно в функции GetVersionEX. Она сообщает версию 6.2 и билд 9200.



Для Win8-Blue правильная версия - 6.3.


Зы, Есть что ни будь по моему вопросу выше, о непонятках с размером устанавливаемых файлов ?!

kotkovets 18-08-2013 12:27 2203504

Цитата:

Цитата Kopejkin
Подскажите, пожалуйста, почему могут плохо переключаться компоненты? »

Потому что, изначально неопределенное состояние секций изначально, нужно определять в "первой" функции инсталлятора...
потому что макросу радиобутон изначально от чего то нужно переключать секции, а когда с нечего начать...
1. а именно делаем секцию отмеченную в зависимости от выбранного языка (это сильно упрощает код)
2 много лишних действий с определением разрядность оси, она уже определена в макросе ${WinPlatformArchitecture} т.е в переменной $5
значит нужно изымать лишниие функции...
ну примерно так:
читать дальше »
Код:

!include "MUI2.nsh"
;!include "VPatchLib.nsh"
!include "Logiclib.nsh"
!include "WinVer2.nsh"
!include "ProcessFunc.nsh"
SetCompressor /SOLID lzma
;!define MUI_LANGDLL_REGISTRY_ROOT "HKLM"
;!define MUI_LANGDLL_REGISTRY_KEY "Software\Example\Option"
;!define MUI_LANGDLL_REGISTRY_VALUENAME "InstallerLanguage"
!define MUI_ABORTWARNING
!define MUI_CUSTOMFUNCTION_GUIINIT MUIGUIInit
!define SWP_SHOWWINDOW 0x00000040
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE ComponentsLeave
!define MUI_COMPONENTSPAGE_SMALLDESC
!insertmacro MUI_PAGE_COMPONENTS
Page custom CustomInfo
!insertmacro MUI_PAGE_INSTFILES
;-----------------------------------------------------
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES

!insertmacro MUI_LANGUAGE "Russian"
!insertmacro MUI_LANGUAGE "Ukrainian"
;--------------------------------------------------------------------
Function un.onInit
!insertmacro MUI_UNGETLANGUAGE
FunctionEnd
;--------------------------------------------------------------------
Caption "Example"
OutFile "example.exe"
RequestExecutionLevel admin
;-------------------------------------------------------
!insertmacro MUI_RESERVEFILE_LANGDLL
;--------------------------------
Section /o "$(PROGRUS)" SecRUS
  SetOutPath $INSTDIR
    CreateDirectory "$INSTDIR\Backup"
    ;!insertmacro VPatchFile
SectionEnd
Section /o "$(PROGUKR)" SecUKR
  SetOutPath $INSTDIR
    CreateDirectory "$INSTDIR\Backup"
    ;!insertmacro VPatchFile
SectionEnd
Section /o "$(PROGRUS64)" SecRUS64
  SetOutPath $INSTDIR
    CreateDirectory "$INSTDIR\Backup"
    ;!insertmacro VPatchFile
SectionEnd
Section /o "$(PROGUKR64)" SecUKR64
  SetOutPath $INSTDIR
    CreateDirectory "$INSTDIR\Backup"
    ;!insertmacro VPatchFile
SectionEnd
Section "-Post"
  WriteUninstaller "$INSTDIR\Uninstall.exe"
  SetAutoClose false
SectionEnd
;--------------------------------
Function .OnInit
!insertmacro MUI_LANGDLL_DISPLAY
; Для "красоты": версия, разрядность ОС
  ${WinName} $1
  ${WinType} $2
  ${WinServerName} $3
  ${WinServicePack} $4
  ${WinPlatformArchitecture} $5
  Var /Global text5
  StrCpy $text5 "$1 $2 $3 $4 (x$5)" ; что получилось - на инфо страницу
${If} $5 == 64
  ;Скрываем секции, если процесс 64 битный
    SectionSetText ${SecRUS} ""
    SectionSetText ${SecUKR} ""
    ${If} $LANGUAGE == ${LANG_RUSSIAN}
          StrCpy $R9 ${SecRUS64}
          SectionSetFlags ${SecRUS64} ${SF_SELECTED}
    ${ElseIf} $LANGUAGE == ${LANG_UKRAINIAN}
          StrCpy $R9 ${SecUKR64}
          SectionSetFlags ${SecUKR64} ${SF_SELECTED}
    ${EndIf}
${ElseIf} $5 == 32
; Скрываем секции, если процесс 32 битный
    SectionSetText ${SecRUS64} ""
    SectionSetText ${SecUKR64} ""
    ${If} $LANGUAGE == ${LANG_RUSSIAN}
          StrCpy $R9 ${SecRUS}
          SectionSetFlags ${SecRUS} ${SF_SELECTED}
    ${ElseIf} $LANGUAGE == ${LANG_UKRAINIAN}
          StrCpy $R9 ${SecUKR}
          SectionSetFlags ${SecUKR} ${SF_SELECTED}
    ${EndIf}
${EndIf}

FunctionEnd

;---------------------------------------------------------
Function MUIGUIInit
; Получаем CRC exe-файла в папке установленной программы
  CRCCheck::GenCRC "$INSTDIR\WinSnap64.exe"
  Pop $R1
  CRCCheck::GenCRC "$INSTDIR\WinSnap.exe"
  Pop $R2
  StrCpy $1 $R1
  StrCpy $2 $R2
; Определяем, что установлено: оригинал или локализация.
## скрипт определения
FunctionEnd

;-----------------------------------------------------------------
Function .onSelChange
; Выбор только одного компонента из 4
  !insertmacro StartRadioButtons $R9
    !insertmacro RadioButton ${SecRUS}
    !insertmacro RadioButton ${SecUKR}
    !insertmacro RadioButton ${SecRUS64}
    !insertmacro RadioButton ${SecUKR64}
  !insertmacro EndRadioButtons
FunctionEnd
;-----------------------------------------------------------------------
Function ComponentsLeave
  SectionGetFlags ${SecRUS} $0
  SectionGetFlags ${SecUKR} $1
  SectionGetFlags ${SecRUS64} $2
  SectionGetFlags ${SecUKR64} $3
Var /Global text_lang
    StrCmp $0 "1" +2 0
    StrCmp $2 "1" 0 +3
          StrCpy $4 "$(lang_rus)"
          StrCpy $text_lang "$4"
    StrCmp $1 "1" +2 0
    StrCmp $3 "1" 0 +3
          StrCpy $4 "$(lang_ukr)"
          StrCpy $text_lang "$4"
FunctionEnd

Function CustomInfo
!insertmacro MUI_HEADER_TEXT $(confirm_select) $(confirm_select_subtitle)
  InitPluginsDir
  File /oname=$PLUGINSDIR\msg.ini "msg.ini"
  WriteINIStr $PLUGINSDIR\msg.ini "Field 1" "Text" "$(text1)"
  WriteINIStr $PLUGINSDIR\msg.ini "Field 2" "Text" "$(text2)"
  WriteINIStr $PLUGINSDIR\msg.ini "Field 4" "Text" "$(text4)"
  WriteINIStr $PLUGINSDIR\msg.ini "Field 5" "Text" "$text5"
  WriteINIStr $PLUGINSDIR\msg.ini "Field 6" "Text" "$(text6)"
  WriteINIStr $PLUGINSDIR\msg.ini "Field 7" "Text" "$INSTDIR"
  WriteINIStr $PLUGINSDIR\msg.ini "Field 8" "Text" "$(text8)"
  WriteINIStr $PLUGINSDIR\msg.ini "Field 9" "Text" "$(text9)"
  WriteINIStr $PLUGINSDIR\msg.ini "Field 10" "Text" "$text_lang"
 
InstallOptions::initDialog /NOUNLOAD "$PLUGINSDIR\msg.ini"
InstallOptions::show
FunctionEnd
;-----------------------------------------
; Раздел (секция) деинсталлятора
Section "un.install" ;SecUN
  delete "$INSTDIR\WinSnap64.exe"
  delete "$INSTDIR\WinSnap.exe"
  Rename $INSTDIR\Backup\WinSnap64.exe.bak $INSTDIR\WinSnap64.exe
  Rename $INSTDIR\Backup\WinSnap.exe.bak $INSTDIR\WinSnap.exe
  delete "$INSTDIR\Uninstall.exe"
  DeleteRegKey HKLM "Software\Alexander Avdonin\WinSnap\Option"
  RMDir /r "$INSTDIR\Backup"
  SetAutoClose false
SectionEnd
;----------------------------------------------------------------
LangString text2 ${LANG_RUSSIAN} "Установка будет выполнена со следующими параметрами:"
LangString text2 ${LANG_UKRAINIAN} "Встановлення буде виконано з наступними параметрами:"
LangString text9 ${LANG_RUSSIAN} "Выбранный язык WinSnap:"
LangString text9 ${LANG_UKRAINIAN} "Обрана мова WinSnap:"
LangString lang_rus ${LANG_RUSSIAN} "Русский язык"
LangString lang_rus ${LANG_UKRAINIAN} "Російська мова"
LangString lang_ukr ${LANG_RUSSIAN} "Украинский язык"
LangString lang_ukr ${LANG_UKRAINIAN} "Українська мова"
LangString text4 ${LANG_RUSSIAN} "Операционная система:"
LangString text4 ${LANG_UKRAINIAN} "Операційна система:"
LangString text6 ${LANG_RUSSIAN} "Папка установки файлов:"
LangString text6 ${LANG_UKRAINIAN} "Папка призначення:"
LangString confirm_select ${LANG_RUSSIAN} "Подготовка завершена!"
LangString confirm_select ${LANG_UKRAINIAN} "Підготовку завершено!"
LangString confirm_select_subtitle ${LANG_RUSSIAN} "Все готово к локализации программы"
LangString confirm_select_subtitle ${LANG_UKRAINIAN} "Усе підготовлено до локалізації програми"
; Текст сообщения, когда устанавливаемый компонент не выбран
LangString not_component ${LANG_RUSSIAN} "Для продолжения выберите желаемую версию перевода !"
LangString not_component ${LANG_UKRAINIAN} "Щоб продовжити, оберіть бажану версію перекладу !"
; Текст названия компонента (раздела, секции)
LangString PROGRUS ${LANG_RUSSIAN} "Русская версия (x86)"
LangString PROGRUS ${LANG_UKRAINIAN} "Російська версія (x86)"
LangString PROGUKR ${LANG_RUSSIAN} "Украинская версия (x86)"
LangString PROGUKR ${LANG_UKRAINIAN} "Українська версія (x86)"
LangString PROGRUS64 ${LANG_RUSSIAN} "Русская версия (x64)"
LangString PROGRUS64 ${LANG_UKRAINIAN} "Російська версія (x64)"
LangString PROGUKR64 ${LANG_RUSSIAN} "Украинская версия (x64)"
LangString PROGUKR64 ${LANG_UKRAINIAN} "Українська версія (x64)"


Цитата:

Цитата MaGoth
Зы, Есть что ни будь по моему вопросу выше, о непонятках с размером устанавливаемых файлов ?! »

мистика...:) зы..

Kopejkin 18-08-2013 14:05 2203544

kotkovets, спасибо большое! :up
А я все никак не мог сообразить, как привязать компонент к выбранному языку установки.

MaGoth 18-08-2013 14:20 2203554

Цитата:

Цитата Kopejkin
P.S. Я так понимаю, что ProcessFunc.nsh пока несовместим с NSIS 3. »

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

Цитата:

Цитата kotkovets
мистика... зы.. »

Членово... :(

kotkovets 18-08-2013 17:09 2203626

Цитата:

Цитата MaGoth
P.S. Я так понимаю, что ProcessFunc.nsh пока несовместим с NSIS 3. »

подправил под NSIS 3.XX, также работает и в предыдущих версиях. тестируйте...
http://yadi.sk/d/p-Uquod_821WI

Kopejkin 18-08-2013 20:43 2203743

Сразу раскаталась губа (моя) :)
А в WinVer2.nsh будут вноситься изменения для отображения сведений о новых ОС?
Сейчас данные о Windows 8 Pro (х64) отображаются так:
---------------------------
WinGetVerInfo
---------------------------
WinName =
WinType = Business
WinServerName =
WinVersion = 6.2
WinVersionMajor = 6
WinVersionMinor = 2
WinBuildNumber = 9200
WinServicePack =
WinServicePackMajor = 0
WinServicePackMinor = 0
WinPlatformId = 2
WinPlatformArchitecture = 64
---------------------------
ОК

Цитата:

MaGoth:На сколько я знаю Виктор займется... »
Вы о ком, собственно, говорите?
Цитата:

ProcessFunc.nsh
Автор: kotkovets aka Котковец Вячеслав
http://forum.oszone.net/member.php?userid=133945

kotkovets 18-08-2013 21:08 2203756

Цитата:

Цитата Kopejkin
WinVer2.nsh будут вноситься изменения для отображения сведений о новых ОС? »

конечно, мелкие ошибки там есть..
Цитата:

Цитата Kopejkin
Вы о ком, собственно, говорите? »

http://forum.ru-board.com/topic.cgi?...&start=1400#lt

icq99999999 19-08-2013 14:55 2204074

Цитата kotkovets:
Код: »
работает хорошо но
при запуске с ключом выполняются и то что должно быть при запуске с ключом и то что должно быть только при обычном запуске
вопрос
как сделать чтобы при запуске с ключом выполнялся только код прописанный именно для запуска с ключом
а при обычном запуске только код для обычного запуска
след вопрос
как сделать чтобы программу сделанную с nsis невозможно было открыть архиватором
след вопрос
нужно скопировать файл "comp.ini" из %temp%\spacep в директорию с прогой
после копирования посмотреть появился ли "comp.ini" в директории с прогой если непоявился то копировать "comp.ini" из %temp%\spacep в %appdata%

kotkovets 19-08-2013 23:13 2204336

Цитата:

Цитата icq99999999
при запуске с ключом выполняются и то что должно быть при запуске с ключом и то что должно быть только при обычном запуске
вопрос
как сделать чтобы при запуске с ключом выполнялся только код прописанный именно для запуска с ключом
а при обычном запуске только код для обычного запуск »

Код:

!include "FileFunc.nsh"
!include "LogicLib.nsh"

outfile test.exe

Section

  ClearErrors
  ${GetOptions} "$CMDLINE" "/key"  $R0
  ${IfNot} ${Errors}

    MessageBox MB_OK "Запуск содержащий ключ: /key" IDOK

  ${Else}

      MessageBox MB_OK "Кроме запуска содержащий ключ: /key" IDOK

  ${EndIf}

SectionEnd

Конкретно заданным ключом:
Код:

  Strcpy $1 "$CMDLINE" "" -4 ;берем из $CMDLINE последние 4 символа и заливаем в $1
  ${If} $1 == "/key"
 
      MessageBox MB_OK "Запуск конкретно с ключом: /key" IDOK
     
  ${EndIf}

Цитата:

Цитата icq99999999
нужно скопировать файл "comp.ini" из %temp%\spacep в директорию с прогой
после копирования посмотреть появился ли "comp.ini" в директории с прогой если непоявился то копировать "comp.ini" из %temp%\spacep в %appdata% »

в справке на русском есть ответы...
Цитата:

Цитата icq99999999
как сделать чтобы программу сделанную с nsis невозможно было открыть архиватором »

http://forum.oszone.net/post-2170433-399.html
---
читать нужно тему. а не листать..

icq99999999 21-08-2013 15:38 2205168

Цитата:

Цитата kotkovets
в справке на русском есть ответы... »

там не все ответы
ну в частности как копировать разобрался:
CopyFiles /silent "$EXEDIR\comp.ini" "$INSTDIR\"
а вот как
Цитата:

Цитата kotkovets
после копирования посмотреть появился ли "comp.ini" в директории с прогой если непоявился то копировать "comp.ini" из %temp%\spacep в %appdata% »

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

K.A.V. 21-08-2013 16:19 2205184

Цитата:

Цитата icq99999999
а вот как
Цитата kotkovets:
после копирования посмотреть появился ли "comp.ini" в директории с прогой если непоявился то копировать "comp.ini" из %temp%\spacep в %appdata% » »

ДА есть там всё! Вы сейчас мне напоминаете многих участников форума, которые задают одни и те же уже разжеванные конкретно для них вопросы.

Описание команды IfFileExists читали в файле справки?

Цитата:

Цитата icq99999999
можно ли сделать чтобы при обычном запуске инстала файл не распаковывался, а при запуске с ключом распаковался? »

Разве я лично вам не давал команды (КЛАЦ), которые нужно прочитать, чтобы научиться обрабатывать командную строку инсталлера?
Цитата:

Цитата K.A.V.
Перевод справки NSIS => GetParameters: получаем командную строку инсталлятора
Перевод справки NSIS => GetOptions: обрабатываем значение ключа в параметре запуска инсталлятора
+
Перевод справки NSIS => File: Добавляем файлы в инсталлятор

А разве kotkovets вам не давал живые примеры с командной строкой? (КЛАЦ)

MaGoth 21-08-2013 16:58 2205211

Привет народ,
Подскажите плиз, номера кодовых страниц для этих языков:
${LANG_ENGLISH}
${LANG_ROMANIAN}
${LANG_GERMAN}
${LANG_RUSSIAN}
${LANG_ITALIAN}
${LANG_CZECH}
${LANG_POLISH}
${LANG_SPANISH}

Используемых в Нсис, Гулельме какую-то шляпу выдает. Для русской, у него туча раскладок, номера которой все разнятся... Моя в печали..

K.A.V. 21-08-2013 19:38 2205311

Цитата:

Цитата MaGoth
Привет народ,
Подскажите плиз, номера кодовых страниц для этих языков:
${LANG_ENGLISH}
${LANG_ROMANIAN}
${LANG_GERMAN}
${LANG_RUSSIAN}
${LANG_ITALIAN}
${LANG_CZECH}
${LANG_POLISH}
${LANG_SPANISH} »

Открываешь файл по пути:
Код:

\Program Files\NSIS\contrib\Language files\Файл языка.nlf
Код:

\Program Files\NSIS\contrib\Language files\Russian.nlf
Код:

# Header, don't edit
NLF v6
# Language ID
1049
# Font and size - dash (-) means default
-
-
# Codepage - dash (-) means ANSI code page
1251

Оно?

MaGoth 21-08-2013 19:59 2205317

K.A.V.,
Сейчас буду смотреть оно или нет, ибо в ютф не все так однозначно.
И как я про ланги забыл... )))

Зы, Все пытаюсь прикрутить текстовуху лиценза на разных лангах, и все никак. Все прочие работают нормально, а эта зараза...

MaGoth 21-08-2013 20:59 2205338

K.A.V.,
Думал с ID прокатит, но что-то не получается файл лиценза сменить... :(

Код пока этот юзаю с одним файлом.:
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE ".\setup\licence.rtf"

А хотелось бы примерно так:
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE ".\setup\en\licence.rtf"
!insertmacro MUI_PAGE_LICENSE ".\setup\fr\licence.rtf"
!insertmacro MUI_PAGE_LICENSE ".\setup\ca\licence.rtf"
...

Мысли есть какие на этот счет ?!

K.A.V. 21-08-2013 22:41 2205379

MaGoth, прочитай про команду LicenseLangString в оригинальной справке к NSIS

Цитата:

LicenseLangString license ${LANG_ENGLISH} license-english.txt
LicenseLangString license ${LANG_FRENCH} license-french.txt
LicenseLangString license ${LANG_GERMAN} license-german.txt
LicenseData $(license)

MaGoth 21-08-2013 22:50 2205385

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

kotkovets 22-08-2013 00:42 2205434

Цитата:

Цитата MaGoth
Да блин, я уже все что можно перепробовал, не работает эта команда, как впрочем и многие другие в попытке изменить файл.. »

Все работает, качаем для удобства плагин: http://nsis.sourceforge.net/CustomLicense_plug-in
Показ файла лицензии в зависимости от выбранного языка, то бишь от переменной $LANGUAGE
Здесь работает принцип подмены файла лицензии, в функции перед показом странички лицензии.
Для времени компиляции удобно воспользоваться файлом ${NSISDIR}\COPYING - не стоит путь менять без надобности,
если нет файла создаем файл COPYING (не пустышку!!!, хоть с одним символом) в папке, где установлен NSIS.
По скрипту файлы лицензии лежат рядом со скриптом, в противном случае указываем абсолютные пути или пути относительно скрипта к файлам лицензии.
читать дальше »
Код:

!include "MUI2.nsh"
 
  Name "BigLicense-Test"
  OutFile "biglictest.exe"
 

  !insertmacro MUI_PAGE_WELCOME
    !define MUI_PAGE_CUSTOMFUNCTION_SHOW "CustomLicensePagePre" ; функция перед страничкой лицензии
  !insertmacro MUI_PAGE_LICENSE "${NSISDIR}\COPYING" ;здесь ничего не менять!!!
  !insertmacro MUI_PAGE_INSTFILES

  !insertmacro MUI_LANGUAGE "English"
  !insertmacro MUI_LANGUAGE "Russian"

Function .onInit

  !insertmacro MUI_LANGDLL_DISPLAY

FunctionEnd


Function CustomLicensePagePre
  InitPluginsDir
  FindWindow $0 "#32770" "" $HWNDPARENT
  GetDlgItem $0 $0 1000
 
  ${If} $LANGUAGE == ${LANG_ENGLISH}
    File "/oname=$PLUGINSDIR\license.txt" "english.txt"
  ${ElseIf} $LANGUAGE == ${LANG_RUSSIAN}
    File "/oname=$PLUGINSDIR\license.txt" "russian.txt"
  ${EndIf}
 
  CustomLicense::LoadFile "$PLUGINSDIR\license.txt" $0
FunctionEnd

Section
SectionEnd


aVitaliy 24-08-2013 01:57 2206558

У инсталятора есть дополнительно к тихому режиму (ключ /S) еще сделать выбор русского языка из списка при тихой инсталяции. Получается сначала нужно выбрать язык, потом программа устанавливается в тихом режиме, софтина - Raidcall ? Пробовал с ключом /1049 - не срабатывает, окно выбора языка появляется.

K.A.V. 24-08-2013 11:52 2206660

Вложений: 1
Цитата:

Цитата MaGoth
Да блин, я уже все что можно перепробовал, не работает эта команда, как впрочем и многие другие в попытке изменить файл... »

Плохо пробовали, раз не работает ;)

Держите готовый код, самый простой способ с файлом лицензии, в зависимости от языка

kotkovets 24-08-2013 13:18 2206689

Цитата:

Цитата aVitaliy
окно выбора языка появляется »

через флаг тихого режима скрываем
Код:

Function .onInit
  IfSilent done
    !insertmacro MUI_LANGDLL_DISPLAY
  done:



FunctionEnd

Цитата:

Цитата aVitaliy
Пробовал с ключом /1049 - не срабатывает»

id языка хранится в переменнной $LANGUAGE
http://forum.oszone.net/post-2205311-469.html
Значит можно принудительно менять язык установщика через ключи:
http://forum.oszone.net/post-2204336-465.html
Код:

 
Function .onInit
  IfSilent done
    !insertmacro MUI_LANGDLL_DISPLAY
  done:

  ClearErrors
  ${GetOptions} "$CMDLINE" "/1049"  $R0
  ${IfNot} ${Errors}

    IfSilent 0 +2
    StrCpy  $LANGUAGE 1049

  ${EndIf}
FunctionEnd

А вообще установщик по умолчанию автоматом выбирает язык в зависимости от "язычности" установленной Windows..

aVitaliy 24-08-2013 18:27 2206816

kotkovets,
я не пытаюсь сделать свой установщик, есть готовая программа - Raidcall, мне просто нужно, чтобы на клиентских компах по сети она устанавливалась в скрытом режиме без окон о выборе каких-то действий. Она при запуске с ключом /S выдает запрос какой язык использовать. Мне нужно, что бы вообще ни чего не спрашивала, а сразу установила русскую версию.

kotkovets 24-08-2013 22:33 2207027

Цитата:

Цитата aVitaliy
Мне нужно, что бы вообще ни чего не спрашивала, а сразу установила русскую версию »

тогда никак, почему появляется окно я показал выше...

MaGoth 25-08-2013 04:45 2207168

kotkovets,
Цитата:

Все работает, качаем для удобства плагин: »
В оригинале от автора не работает...


K.A.V.,
Цитата:

Плохо пробовали, раз не работает
Держите готовый код, самый простой способ с файлом лицензии, в зависимости от языка »
Хорошо пробовал, ваш пример также не прошел с моим скриптом.

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

K.A.V. 25-08-2013 06:57 2207171

Цитата:

Цитата MaGoth
Хорошо пробовал, ваш пример также не прошел с моим скриптом.
Но немного изменив код, удалив ненужные строки получилось его скомпилировать... »

Простите...Что? :o
Хотите сказать, мой код у вас не компилировался и файлы лицензии не показывались в зависимости от языка?

Если вы пытались накидать содержимое моего примера в свой скрипт, и при этом у вас не сработало, значит ошибка с вашей стороны
Я дал вам готовый, полностью рабочий код, могу дать и откомпилированную версию для примера

MaGoth 25-08-2013 14:01 2207288

Цитата:

Простите...Что?
Хотите сказать, мой код у вас не компилировался и файлы лицензии не показывались в зависимости от языка?
Именно так.
В чистом виде ваш скрипт скомпилится, но при добавлении его кода в мой инсталляционный файл уже нет.
Проблема была вызвана несколькими причинами:
1. Я прописывыю ланги инсталлера в реестр:
!define MUI_LANGDLL_REGISTRY_ROOT "${PACK_UNINST_ROOT_KEY}"
!define MUI_LANGDLL_REGISTRY_KEY "${PACK_UNINST_KEY}"
!define MUI_LANGDLL_REGISTRY_VALUENAME "${PACK_NAME_FILE}: Language"

2. Не использую !include "MUI2.nsh", работаю только с !include "MUI.nsh"

3. Резервирую файлы:
ReserveFile "setup.ini"
!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS
!insertmacro MUI_RESERVEFILE_LANGDLL

4. Не использую это:
!define MUI_LANGDLL_ALLLANGUAGES

5. Работаю только под Юникодом Нсис...

Переписав некоторые части кода и удалив лишнее, наконец-то удалось заставить вывести нормально файлик licence.rtf, именно из той папки откуда мне надо, а не из убого привязанной к корню Нсис... :)
Примерно так:
LicenseLangString mylicense ${LANG_ENGLISH} ".\licens\en\licence.rtf"
LicenseLangString mylicense ${LANG_ROMANIAN} ".\licens\ro\licence.rtf"
LicenseLangString mylicense ${LANG_GERMAN} ".\licens\de\licence.rtf"
LicenseLangString mylicense ${LANG_RUSSIAN} ".\licens\ru\licence.rtf"
LicenseLangString mylicense ${LANG_ITALIAN} ".\licens\it\licence.rtf"
LicenseLangString mylicense ${LANG_CZECH} ".\licens\cz\licence.rtf"
LicenseLangString mylicense ${LANG_POLISH} ".\licens\pl\licence.rtf"
LicenseLangString mylicense ${LANG_SPANISH} ".\licens\es\licence.rtf"

Зы, Да, чуть не забыл. Возможно, что ещё проблема в самих плагинах была, они у меня все были изначально, но один из них имел старую версию сборки, стянул поновее, с оф. форума Нсис в теме автора...

tony1990 26-08-2013 17:08 2207989

Возникла такая проблемка. Делаю кастомную кнопку About на странице компонентов. Нужно чтобы эта кнопка была только на этой странице. Так вот при нажатии Back на странице компонентов возвращаемся на страницу директории и кнопки действительно нет. Дальше происходят чудеса. Нажимаем Next и снова Back и кнопка About сияет на странице директории. Как это можно победить? Сорри если такой вопрос уже был

Код:


!include "MUI2.nsh"

Name "About Button Example"
OutFile AboutButton.exe
InstallDir $TEMP

RequestExecutionLevel user

!define IDC_ABOUT 1300

!define MUI_PAGE_CUSTOMFUNCTION_SHOW "DirectoryShow"
!insertmacro MUI_PAGE_DIRECTORY
!define MUI_PAGE_CUSTOMFUNCTION_SHOW "CompShowProc"
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE "ComponentsLeave"
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "English"

Section Install
SectionEnd

Function CompShowProc 
    System::Call 'user32::CreateWindowEx(i0,t"Button",t"About",i${BS_PUSHBUTTON}|${WS_CHILD}|${WS_VISIBLE}|${WS_TABSTOP},i30,i327,i80,i23,i$HWNDPARENT,i${IDC_ABOUT},ir0,i0)i.R0' 
    CreateFont $0 '$(^Font)' '$(^FontSize)'
    SendMessage $R0 ${WM_SETFONT} $0 0
FunctionEnd

Function DirectoryShow
    GetDlgItem $1 $HWNDPARENT 1300
    EnableWindow $1 0
    ShowWindow $1 0
FunctionEnd

Function ComponentsLeave   
    GetDlgItem $1 $HWNDPARENT 1300
    EnableWindow $1 0
    ShowWindow $1 0
FunctionEnd


kotkovets 26-08-2013 17:40 2208006

Цитата:

Цитата tony1990
Нужно чтобы эта кнопка была только на этой странице. Так вот при нажатии Back на странице компонентов возвращаемся на страницу директории и кнопки действительно нет. Дальше происходят чудеса. Нажимаем Next и снова Back и кнопка About сияет на странице директории. Как это можно победить? »

Элементарно, хендл кнопки по скрипту в переменной $R0:
Код:

System::Call 'user32::CreateWindowEx(....,ir0,i0)i.R0'
А значит почти все можно...
Код:

Function DirectoryShow
    EnableWindow $R0 0
    ShowWindow $R0 0
FunctionEnd

Function ComponentsLeave
    EnableWindow $R0 0
    ShowWindow $R0 0
FunctionEnd


tony1990 26-08-2013 19:25 2208080

Спасибо огромное ! Всё работает !!!!! :yahoo:

tony1990 27-08-2013 18:48 2208657

Есть ли способ вывести строку Space Available: на стандартной странице компонентов?

MKN 28-08-2013 15:26 2209137

Цитата:

Цитата tony1990
Есть ли способ вывести строку Space Available: на стандартной странице компонентов? »

Как уже было ранее рассмотрено - на любую стандартную страницу можно поместить дополнительный текст.
В твоём случае текст с информацией о свободном дисковом пространстве - на PAGE_COMPONENTS.
Это можно реализовать так :
Код:

!include "MUI2.nsh"
!include "Sections.nsh"

!insertmacro MUI_PAGE_DIRECTORY
!define MUI_PAGE_CUSTOMFUNCTION_SHOW components_show
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

InstallDir "$TEMP"
OutFile "FreeSpace-test.exe"
 
Function .onInit
  System::Call 'kernel32::GetDiskFreeSpaceEx(t"$instdir",*l.r1,*l,*l)'
  System::Int64Op $1 / 1024
  Pop $1
FunctionEnd

Function components_show
    StrCpy $4 'Space Available: $1 kb'
    FindWindow $0 "#32770" "" $HWNDPARENT
    System::Call 'USER32::CreateWindowEx(i0,t "STATIC",t "$4",i ${WS_CHILD}|${WS_VISIBLE},i0,i40,i300,i20,i $0,i222,i0,i0) $R2'
    GetDlgItem $1 $0 1027
    GetDlgItem $2 $0 222
    SendMessage $1 ${WM_GETFONT} 0 0 $3
    SendMessage $2 ${WM_SETFONT} $3 1
FunctionEnd

SectionGroup /e "SectionGroup " SEC0
        Section "Section 1" S1
        SectionEnd
        Section /o "Section 2" S2
        SectionEnd
        Section /o "Section 3" S3
        SectionEnd
SectionGroupEnd

Только какой в этом смысл... Если уж определять свободный дисковый объём, то в связи с тем - достаточно ли места для устанавливаемых компонентов.
А с этим надо определяться сразу же после запуска инсталлятора. О чем выводить соответствующее сообщение.

PS Касательно кнопки на стандартных страницах... Пример был дан как пример, годный лишь для случая, когда ну позарез нужна кнопка именно на стандартной странице.
А вообще это извращение...
Как уже говорили ранее - кнопка нормально отображается только в верхней и нижней частях окна страницы. По центру она закрыта контролом области "поля-окна" стандартной страницы. А это, как оказалось, гадость ещё та (как и вообще, все стандартные страницы :) )...
Можно изменить размер этой закрываюшей кнопку области либо в ресурсе, либо через системные функции. Но это получится гемор, не стоящий того...

tony1990 28-08-2013 16:57 2209188

Огромное спасибо !!!
Суть в специфике программы. Юзер выбирает разные компоненты, от этого зависит требуемый размер. Поэтому и хотелось чтобы требуемый и доступный размер были на странице компонентов.
А кнопку я решил внизу сделать всё-таки. Пока вроде работает :)

MKN, спасибо за код! Единственное - не читает шрифт в строку Space Available. Буду кумекать

MKN 28-08-2013 20:36 2209282

tony1990,
Измени в GetDlgItem $1 $0 1027 - ID 1027 на 1006. Такой шрифт будет соответствовать тому, что на странице PAGE_COMPONENTS.

PS
222 - это ID нашего, созданного на странице, окна с надписью

Kopejkin 29-08-2013 12:34 2209575

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



Переключатель компонентов с выделением активного жирным шрифтом.
Пример

Код:

; var_one-section.nsi

!include "Logiclib.nsh"
Name "One Section"
OutFile "one-section.exe"
RequestExecutionLevel user
; Pages
Page components
; Sections
Section /o "Option 1" g1o1
SectionEnd
Section /o "Option 2" g1o2
SectionEnd
Section /o "Option 3" g1o3
SectionEnd
Section /o "Option 4" g1o4
SectionEnd
Section /o "Option 5" g1o5
SectionEnd
Section /o "Option 6" g1o6
SectionEnd

Function .onInit
  StrCpy $R9 ${g1o1}
  SectionSetFlags ${g1o1} 9
FunctionEnd

Function .onSelChange
  !insertmacro StartRadioButtons $R9
    !insertmacro RadioButton ${g1o1}
    !insertmacro RadioButton ${g1o2}
    !insertmacro RadioButton ${g1o3}
    !insertmacro RadioButton ${g1o4}
    !insertmacro RadioButton ${g1o5}
    !insertmacro RadioButton ${g1o6}
  !insertmacro EndRadioButtons
    SectionGetFlags ${g1o1} $R0
    SectionGetFlags ${g1o2} $R1
    SectionGetFlags ${g1o3} $R2
    SectionGetFlags ${g1o4} $R3
    SectionGetFlags ${g1o5} $R4
    SectionGetFlags ${g1o6} $R5
  ${If} $R0 == 1
      SectionSetFlags ${g1o1} 9
  ${ElseIf} $R0 == 8
      SectionSetFlags ${g1o1} 0
  ${EndIf}
  ${If} $R1 == 1               
      SectionSetFlags ${g1o2} 9
  ${ElseIf} $R1 == 8
      SectionSetFlags ${g1o2} 0
  ${EndIf}
  ${If} $R2 == 1
      SectionSetFlags ${g1o3} 9
  ${ElseIf} $R2 == 8
      SectionSetFlags ${g1o3} 0
  ${EndIf}
  ${If} $R3 == 1
      SectionSetFlags ${g1o4} 9
  ${ElseIf} $R3 == 8
      SectionSetFlags ${g1o4} 0
  ${EndIf}
  ${If} $R4 == 1
      SectionSetFlags ${g1o5} 9
  ${ElseIf} $R4 == 8
      SectionSetFlags ${g1o5} 0
  ${EndIf}
  ${If} $R5 == 1
      SectionSetFlags ${g1o6} 9
  ${ElseIf} $R5 == 8
      SectionSetFlags ${g1o6} 0
  ${EndIf}
FunctionEnd


MaGoth 29-08-2013 18:51 2209758

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

Суть проблемы в том, что у созданного деинсталлятора после инсталла и его запуска секция - "итальянская" накладывается на "чешскую" именем, т.е. вместо:
...
Деинсталлировать итальянскую версию.
Деинсталлировать чешскую версию.
...


Выводится:
...
Деинсталлировать итальянскую версию.
Деинсталлировать итальянскую версию.
...

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

В самих секциях тоже все ровно:

читать дальше »
Инсталл
...
LangString inNameSecModFilesENG ${LANG_ITALIAN} "Installazione della versione inglese"
LangString inNameSecModFilesROM ${LANG_ITALIAN} "Installazione della versione romena"
LangString inNameSecModFilesGER ${LANG_ITALIAN} "Installazione della versione tedesca"
LangString inNameSecModFilesRUS ${LANG_ITALIAN} "Installazione della versione russa"
LangString inNameSecModFilesITA ${LANG_ITALIAN} "Installazione della versione italiana"
LangString inNameSecModFilesCEH ${LANG_ITALIAN} "Installazione della versione ceca"
LangString inNameSecModFilesPOL ${LANG_ITALIAN} "Installazione della versione polacca"
LangString inNameSecModFilesESP ${LANG_ITALIAN} "Installazione della versione spagnola"

LangString inNameSecModFilesENG ${LANG_CZECH} "Instalace anglické verze"
LangString inNameSecModFilesROM ${LANG_CZECH} "Instalace rumunské verze"
LangString inNameSecModFilesGER ${LANG_CZECH} "Instalace německé verze"
LangString inNameSecModFilesRUS ${LANG_CZECH} "Instalace ruské verze"
LangString inNameSecModFilesITA ${LANG_CZECH} "Instalace italské verze"
LangString inNameSecModFilesCEH ${LANG_CZECH} "Instalace české verze"
LangString inNameSecModFilesPOL ${LANG_CZECH} "Instalace polské verze"
LangString inNameSecModFilesESP ${LANG_CZECH} "Instalace španělské verze"
...


Деинсталл
...
LangString unNameSecModFilesENG ${LANG_ITALIAN} "Disinstallazione della versione inglese"
LangString unNameSecModFilesROM ${LANG_ITALIAN} "Disinstallazione della versione romena"
LangString unNameSecModFilesGER ${LANG_ITALIAN} "Disinstallazione della versione tedesca"
LangString unNameSecModFilesRUS ${LANG_ITALIAN} "Disinstallazione della versione russa"
LangString unNameSecModFilesITA ${LANG_ITALIAN} "Disinstallazione della versione italiana"
LangString unNameSecModFilesCEH ${LANG_ITALIAN} "Disinstallazione della versione ceca"
LangString unNameSecModFilesPOL ${LANG_ITALIAN} "Disinstallazione della versione polacca"
LangString unNameSecModFilesESP ${LANG_ITALIAN} "Disinstallazione della versione spagnola"

LangString unNameSecModFilesENG ${LANG_CZECH} "Odinstalace anglické verze"
LangString unNameSecModFilesROM ${LANG_CZECH} "Odinstalace rumunské verze"
LangString unNameSecModFilesGER ${LANG_CZECH} "Odinstalace německé verze"
LangString unNameSecModFilesRUS ${LANG_CZECH} "Odinstalace ruské verze"
LangString unNameSecModFilesITA ${LANG_CZECH} "Odinstalace italské verze"
LangString unNameSecModFilesCEH ${LANG_CZECH} "Odinstalace české verze"
LangString unNameSecModFilesPOL ${LANG_CZECH} "Odinstalace polské verze"
LangString unNameSecModFilesESP ${LANG_CZECH} "Odinstalace španělské verze"
...


Картинко:

Сверху секции при установке, снизу деинсталл..


Собственно сам вопрос, в каком файле надо порыться чтобы это поправить?!

Зы, проверил на других лангах инстал и деинстал, пара - чешский итальянский глючат везде при деинсталляции...

kotkovets 29-08-2013 20:30 2209830

Цитата:

Цитата Kopejkin
Если щелкать мышью в "переключателе" справа от компонентов, а не по ним, нужный компонент отмечается, но цветной прямоугольник выделения остается на компоненте, ранее выбранном щелчком по нему.
Можно ли вообще избавиться от выделения цветом? »

у меня такого эффекта нет.. win7 x64
Цитата:

Цитата MaGoth
Собственно сам вопрос, в каком файле надо порыться чтобы это поправить?! »

в написанном скрипте..

MKN 29-08-2013 20:45 2209845

Цитата:

Цитата Kopejkin
Если щелкать мышью в "переключателе" справа от компонентов, а не по ним, нужный компонент отмечается, но цветной прямоугольник выделения остается на компоненте, ранее выбранном щелчком по нему. »

Посмотрел , как это выглядит на WinXP - действительно, есть такое остаточное явление...
Но, в то же время, в коде ранее предложенным kotkovets, (это где кнопка ДАЛЕЕ не активна пока не будет выбран 1 из компонентов ) - такого эффекта нет...
Повторю этот код :
Код:

OutFile "example.exe"

var hInst

!include "MUI2.nsh"

  ;функция во время открытия странички компонентов
!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 "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}
  SectionSetFlags ${IDS_1} -290  ; Чтобы компоненты в группе по умолчанию  были свёрнуты :
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

Как это понимать, я затрудняюсь комментировать...

Kopejkin 29-08-2013 22:25 2209879

Цитата:

Цитата kotkovets
у меня такого эффекта нет.. win7 x64 »

Win7(x64) у меня тоже, а для тестирования есть несколько виртуалок.
На всех этот эффект есть.
Цитата:

Цитата MKN
...такого эффекта нет »

На этом скрипте тоже есть.
.

Еще вопрос по NewAdvSplash. Указано, что можно воспроизвести *.mp3 и *.wav. WAV воспроизводится без проблем. а вот MP3 - нет.
Связано ли это с тем, что у меня не установлены никакие кодеки, кроме тех, что устанавливаются вместе с системой?
Еще ни разу не ощутил в них потребности, т.к. использую VLC Player. Если нужно чего перекодировать - Format Factory. Насколько я понимаю, эти программы используют свои кодеки автономно.

MaGoth 30-08-2013 01:19 2209923

Цитата:

Цитата kotkovets
в написанном скрипте.. »

Угу, нашел это упущение и прибил... :)


Цитата:

Цитата Kopejkin
Еще вопрос по NewAdvSplash. Указано, что можно воспроизвести *.mp3 и *.wav. WAV воспроизводится без проблем. а вот MP3 - нет.
Связано ли это с тем, что у меня не установлены никакие кодеки, кроме тех, что устанавливаются вместе с системой?
Еще ни разу не ощутил в них потребности, т.к. использую VLC Player. Если нужно чего перекодировать - Format Factory. Насколько я понимаю, эти программы используют свои кодеки автономно. »

Возможно здесь установленный Microsoft Visual C++ Redistributable_x86 2005 требуется...

kotkovets 30-08-2013 14:31 2210107

Цитата:

Цитата kotkovets
...такого эффекта нет
я имел в ввиду не в скрипте, а в самой системе, независимо от скрипта..


MKN 30-08-2013 16:29 2210175

Подскажите пожалуйста решение для такой задачи :

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

Также необходимо узнать название продукта у исполнямых exe-файлов не зависимо от их имени - blabla.exe ( в свойствах файла это - "Название продукта" )

Каким образом с помощью NSIS извлечь из файлов эту информацию ?

Предполагаю, что для этого можно использовать функцию System::Call `shell32::SHGetFileInfo (или SHGetFileInfoA )
совместно с флагами
SHGFI_TYPENAME (0x000000400)
SHGFI_EXETYPE (0x000002000)
SHGFI_DISPLAYNAME (0x000000200)

Но как ?

kotkovets 30-08-2013 17:22 2210210

Цитата:

Цитата MKN
Каким образом с помощью NSIS извлечь из файлов эту информацию ? »

самый простой вариант: http://nsis.sourceforge.net/MoreInfo_plug-in
Цитата:

Цитата MKN
Необходимо определить тип файла у файла лишённого расширения »

каждый тип файла имеет свою уникальную сигнатуру, по гугли по определенным расширениям...
Читать файл нужно с помощью команды: FileReadByte побайтовое чтение файла с заданным смещением..
получили сигнатуру и сравниваем...
например архив rar имеет сигнатуру rar! в начале файла ( FileRead )
но потом нужно отсечь лишние символы - оставить первые 4 символа или 4 байта в двоичном ввиде через ( FileReadByte )

MKN 31-08-2013 11:05 2210547

Цитата:

Цитата kotkovets
Читать файл нужно с помощью команды: FileReadByte побайтовое чтение файла с заданным смещением..
получили сигнатуру и сравниваем... »

Это сложно и совершенно не понятно , как реализовать в NSIS...
Тогда такой вопрос - если использовать знаменитую утилиту TrID - File Identifier ( http://mark0.net/soft-trid-e.html ) , то каким образом перенаправить содержимое из окна консоли в , скажем, текстовый файл, для дальнейшей обработки ?

kotkovets 31-08-2013 11:53 2210561

Цитата:

Цитата MKN
Это сложно и совершенно не понятно , как реализовать в NSIS... »

че там сложного, главное знать, сколько байтов нужно прочитать, сигнатура файла одинакова для своего расширения...
пример на архиве 7z:
Код:

outfile test.exe

Section
  fileopen $0 "file" r
  filereadbyte $0 $1 ;читаем первый байт
  filereadbyte $0 $2 ;читаем второй байт
  fileclose $0
 
    MessageBox MB_OK "Двоичный код: $1 $2" IDOK
  IntFmt $1 "%c" $1 ;конвертируем код в символ
  IntFmt $2 "%c" $2
    MessageBox MB_OK "сигнатура: $1$2" IDOK
SectionEnd

exe файл сигнатура - MZ (первые два байта)
Цитата:

Цитата MKN
каким образом перенаправить содержимое из окна консоли в , скажем, текстовый файл »

bat файл:
Код:

trid -> text.txt

MKN 31-08-2013 12:10 2210568

Цитата:

Цитата kotkovets
главное знать, сколько байтов нужно прочитать »

А как это узнать, если необходимо будет распознавать разнообразные расширения ?

kotkovets 31-08-2013 13:30 2210599

Цитата:

Цитата MKN
А как это узнать, если необходимо будет распознавать разнообразные расширения ? »

с помощью гугла или самостоятельно с помощью блокнота.. открыть блокнотом файл..
я сам только сейчас узнал сигнатуру 7z, exe - начало (первые 2 байта) всегда одинаковые...
более сложных случаях рекурсивно.. как программка ранее..

MKN 31-08-2013 19:28 2210718

kotkovets,
Что то не так с сигнатурами.. К примеру, практически везде для 7z указывается сигнатура - 37 7A BC AF 27 1C
Т.е. - Sizet: 6 Bytes
http://www.filesignatures.net/index....ch=7z&mode=EXT
http://file-extension.net/seeker/file_extension_7z
Tам ведь используется hexadecimal счисление ? Но тогда именно на него и надо ориентироваться... Как его считать из файла ?

kotkovets 31-08-2013 22:20 2210794

Цитата:

Цитата MKN
Что то не так с сигнатурами.. К примеру, практически везде для 7z указывается сигнатура - 37 7A BC AF 27 1C »

все правильно... я ведь для простоты брал первые 2 байта... :)
Цитата:

Цитата MKN
Tам ведь используется hexadecimal счисление ? »

по ссылке в 16-ричном ввиде сигнатура, т.е с помощью калькулятора конвертируем:
[37 -->= 55] [7А --> =122] , что равно ASCII = 7z
---
NSIS выводит "байт" в десятичном виде
например, конвертация 16-ричное число в десятичное, десятичное в ASCII
Код:

  IntFmt $1 "%i" 0x37 ;16-ричное число в десятичное
  IntFmt $2 "%i" 0x7A ;16-ричное число в десятичное
 ;-------------------------------------------------------------------
  IntFmt $1 "%c" $1 ;десятичное в ASCII
  IntFmt $2 "%c" $2 ;десятичное в ASCII
 ;-------------------------------------------------------------------
  MessageBox MB_OK "Сигнатура: $1$2" IDOK

конвертация десятичное число в 16-ричное число
Код:

  IntFmt $3 "0x%X" 122
  MessageBox MB_OK "16-ричное число: $3" IDOK


tony1990 01-09-2013 16:39 2211105

Возвращаясь к вопросу о выводе строки Space available: на стандартной странице компонентов. Всё работает на ура до тех пор пока не начинаешь выбирать эти самые компоненты. Тут видать страница обновляется и созданная нами надпись про доступный размер на диске исчезает. Похоже, это нельзя обойти . Ежели только в исходниках нсиса не копаться. Да и то не поможет наверно.

MKN 01-09-2013 20:27 2211207

kotkovets,
Благодарю за разъяснение.

ps На winamp.com , один добрый пользователь даже код-хедер подарил... Наверное корректно будет приаттачить его здесь ?

kotkovets 01-09-2013 21:07 2211221

Цитата:

Цитата MKN
один добрый пользователь даже код-хедер подарил »

интересно "позырить" ..
ради пары строк - целый хедер.. :)

MKN 01-09-2013 21:13 2211224

Вложений: 1
FTID.nsh - signature-based file type identification
автор aerDNA

Только что автор что то пофиксил :

kotkovets 01-09-2013 21:25 2211230

Цитата:

Цитата MKN
Только что автор что то пофиксил »

архивов не хватает.. хотя добавить элементарно..

MKN 01-09-2013 22:12 2211253

Цитата:

Цитата tony1990
Тут видать страница обновляется и созданная нами надпись про доступный размер на диске исчезает. »

Можно попробовать сделать новое окно с надписью - всегда активным на переднем плане :
System::Call "user32::SetForegroundWindow(i r1) i."
http://www.rsdn.ru/article/qna/ui/wndsetfg.xml
Или зациклить контроль за активностью этого окна, типа как здесь : http://nsis.sourceforge.net/Allow_on...aller_instance
Не знаю , будет ли это работать для дочернего окна... Может kotkovets, подскажет...

dix75 02-09-2013 16:09 2211546

Добрый день!

Возможно ли использовать одну и ту же функцию для install и deinstall секции

Есть функции BASE64 Encoding/Decoding Functions здесь
Но как их заставить работать для деинсталл секции

kotkovets 02-09-2013 17:23 2211576

Цитата:

Возможно ли использовать одну и
ту же функцию для install и
deinstall секции
да, пробуйте, а потом пишите о результатах..

dix75 02-09-2013 18:01 2211586

В том то и дело, что нельзя

K.A.V. 02-09-2013 21:20 2211700

Цитата:

Цитата tony1990
Возвращаясь к вопросу о выводе строки Space available: на стандартной странице компонентов. Всё работает на ура до тех пор пока не начинаешь выбирать эти самые компоненты. Тут видать страница обновляется и созданная нами надпись про доступный размер на диске исчезает. Похоже, это нельзя обойти . Ежели только в исходниках нсиса не копаться. Да и то не поможет наверно. »

Со стандартной оболочкой? Что-то я не замечал таких проблем никогда, может, у вас в скрипте прописаны какие-то уникальные функции??

Цитата:

Цитата dix75
Добрый день!
Возможно ли использовать одну и ту же функцию для install и deinstall секции
Есть функции BASE64 Encoding/Decoding Functions здесь
Но как их заставить работать для деинсталл секции »

Цитата:

Цитата dix75
В том то и дело, что нельзя »

С чего вы взяли, что нельзя то? Вы пробовали?
Цитата:

Цитата K.A.V.
Плохо пробовали, раз не работает ;)»

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

Подсказка: ищите в скрипте слова, которые появляются в сообщениях при запуске программы удаления

MKN 03-09-2013 09:26 2211863

Вызов стандартного диалога выбора каталога/файла (принтера/компьютера) c помощью функции SHBrowseForFolder

Полезно при работе со стандартными страницами для обзора до или после установки и при помещении кнопки обзора на любой странице.
(Есть конечно Dialogs plug-in, но в нём нет некоторых моментов, доступных при оперирировании флагами функции )
Код:

OutFile "SHBrowseForFolder_test.exe"

Section
StrCpy $9 "Folder Dialog Title"
System::Store "s r9"
; создаём структуру обозревателя
System::Call '*(i $HWNDPARENT, i 0, t "", t r9, i 0x40|0x4000, i 0, i, i) i.r1'
System::Call 'shell32::SHBrowseForFolderA(i r1) i.r2'
System::Free $1

;получаем путь для выбранной папки/файла
System::Call 'shell32::SHGetPathFromIDListA(i $2, t "" r3)'
MessageBox MB_OK "Selected :  $3"
       
;Функция  SHGetMalloc  извлекает указатель на интерфейс IMalloc оболочки.
;Расширение оболочки должно использовать этот интерфейс для выделения памяти,
;позднее освобождаемой оболочкой.
System::Call 'shell32::SHGetMalloc(*i . r4)' 
; IMalloc->Free call
System::Call '$4->5(i r2)'
; IMalloc->Release
System::Call '$4->2()'
System::Store "p3 l"
SectionEnd

Код этот обычно находится в функции, здесь в секции, лишь как пример.

Флаги BROWSEINFO structure ( BIF_BROWSEINCLUDEFILES )
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
Флагов много, вот некоторые :
; 0x0000040 - с кнопкой "Создать папку"
; 0x00000200 - без кнопки "Создать папку"
; 0x00004000 - обзор, включая файлы
; 0x00000010 - с EditBox_ом над деревом папок
флаг можно записывать короче : 0x40 и т.д. , а также назначать через !define BIF_BROWSEINCLUDEFILES

ps если кто владеет программированием - может доработать диалог, как здесь :
http://www.manhunter.ru/assembler/23...forfolder.html
Хорошо было бы приспособить этот тюнинг для NSIS, в виде плагина...

tony1990 03-09-2013 13:51 2211981

Цитата:

K.A.V. : Со стандартной оболочкой? Что-то я не замечал таких проблем никогда, может, у вас в скрипте прописаны какие-то уникальные функции??
Ну вот простенький пример кода. Когда мы снимаем/ставим галочку у компонента, надпись Space available: исчезает.

Код:

!include "MUI2.nsh"

Name "Components Example"
OutFile Components.exe
InstallDir $TEMP

RequestExecutionLevel user

!define MUI_PAGE_CUSTOMFUNCTION_SHOW "CompShowProc"
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES

!insertmacro MUI_LANGUAGE "English"

Section "Component1"
SectionEnd

Section "Component2"
SectionEnd

Section "Component3"
SectionEnd


Function CompShowProc

    System::Call 'kernel32::GetDiskFreeSpaceEx(t"$instdir",*l.r1,*l,*l)'
    System::Int64Op $1 / 1024
    Pop $1
       
    StrCpy $4 'Space available: $1 KB'
    FindWindow $0 "#32770" "" $HWNDPARENT
    System::Call 'USER32::CreateWindowEx(i0,t "STATIC",t "$4",i ${WS_CHILD}|${WS_VISIBLE},i0,i203,i150,i20,i $0,i222,i0,i0) $R2'

    GetDlgItem $1 $0 1006
    GetDlgItem $2 $0 222
    SendMessage $1 ${WM_GETFONT} 0 0 $3
    SendMessage $2 ${WM_SETFONT} $3 1

FunctionEnd


MKN 03-09-2013 15:22 2212028

Цитата:

Цитата tony1990
надпись Space available: исчезает. »

Потому, что ты не удачно переместил её в область контрола окна 1023, которое эту надпись и закрывает при обновлении инфы Space required e, когда отмечается компонент ...
В приведённом примере ведь всё на месте и никуда не исчезает.
Либо измени размер 1023, либо смести своё окно-надпись в свободное место. Те же грабли , что и с кнопкой...

MKN 05-09-2013 17:55 2213284

Вложений: 1
Эффект "кругов на воде" на BMP рисунке.

Получается с помощью инносетаповской waterctrl.dll и следующего кода :
Код:

!AddPluginDir ".\"
!include MUI2.nsh

OutFile "WaterCtrl_test.exe"

ReserveFile waterctrl.dll
!define MUI_WELCOMEFINISHPAGE_BITMAP WizModernImage-Is.bmp
!define MUI_PAGE_CUSTOMFUNCTION_PRE pre
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE leave
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_INSTFILES
!define MUI_PAGE_CUSTOMFUNCTION_Pre pre
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE leave
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "English"

Function .onGUIEnd
SetPluginUnload manual
waterctrl::disablewater
System::Free
FunctionEnd

Function .onInit
InitPluginsDir
SetOutPath $PLUGINSDIR
File waterctrl.dll
;SetOutPath $TEMP
FunctionEnd

Function Pre
; Load Image (LR_CREATEDIBSECTION|LR_LOADFROMFILE = 0x2010)
System::Call 'user32::LoadImage(i,t,i,i,i,i,) i (0,"$PLUGINSDIR\modern-wizard.bmp",0,0,0,0x2010) .s'
Pop $R0
System::Call '$PLUGINSDIR\waterctrl::enablewater(i,i,i,i,i,i) i ($HWNDPARENT,0,0,$R0,3,50)'
System::Call '$PLUGINSDIR\waterctrl::setwaterparent(i $HWNDPARENT)'
System::Call '$PLUGINSDIR\waterctrl::flattenwater()'
System::Call '$PLUGINSDIR\waterctrl::waterblob(i,i,i,i) i (70,198,10,1000)'
FunctionEnd

Function leave
System::Call '$PLUGINSDIR\waterctrl::disablewater()'
FunctionEnd

Section
Sleep 300
SectionEnd

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

MKN 06-09-2013 10:49 2213630

Вложений: 1
Эффект пламени на BMP изображении

Для эффекта используется инносетаповская firectrl.dll. Т.к. пламя какое то бледненькое, лучше использовать WizModernImage-Is.bmp светлого цвета.
Код:

!AddPluginDir ".\"

!include MUI.nsh
OutFile "Flame_Effects_test.exe"

ReserveFile firectrl.dll
!define MUI_WELCOMEFINISHPAGE_BITMAP WizModernImage-Is.bmp
!define MUI_PAGE_CUSTOMFUNCTION_PRE pre
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE leave
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_INSTFILES
!define MUI_PAGE_CUSTOMFUNCTION_Pre pre
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE leave
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "English"

Function .onGUIEnd
SetPluginUnload manual
firectrl::disablefire
System::Free
FunctionEnd

Function .onInit
InitPluginsDir
SetOutPath $PLUGINSDIR
File firectrl.dll
SetOutPath $TEMP
FunctionEnd

Function Pre
System::Call 'user32::LoadImage(i,t,i,i,i,i,) i (0,"$PLUGINSDIR\modern-wizard.bmp",0,0,0,0x2010) .s'
Pop $R0
System::Call '$PLUGINSDIR\firectrl::enablefire(i,i,i,i,i) i ($HWNDPARENT,0,0,$R0,50)'
FunctionEnd

Function leave
System::Call '$PLUGINSDIR\firectrl::disablefire()'
FunctionEnd

 Section
 Sleep 300
 SectionEnd

Недостаток тот же - тормоз перед открытием страницы.

tony1990 08-09-2013 16:16 2214626

Положение окна 1023 получается регулировать, но вот его размеры нет. Меняю параметры, идущие за положением - на размеры окна они не влияют. Хотелось бы поместить всё-таки строчку о доступном размере на стандартное место, дабы не контрастировать с предыдущей страницей директории

Код:



!include "MUI2.nsh"
Name "Components Example"
OutFile Components.exe
InstallDir $TEMP
RequestExecutionLevel user
 
!insertmacro MUI_PAGE_DIRECTORY
!define MUI_PAGE_CUSTOMFUNCTION_SHOW "CompShowProc"
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
 
!insertmacro MUI_LANGUAGE "English"
 
Section "Component1"
SectionEnd
Section "Component2"
SectionEnd
Section "Component3"
SectionEnd

Function CompShowProc
    System::Call 'kernel32::GetDiskFreeSpaceEx(t"$instdir",*l.r1,*l,*l)'
    System::Int64Op $1 / 1024
    Pop $1
       
    StrCpy $4 'Space available: $1 KB'
    FindWindow $0 "#32770" "" $HWNDPARENT
    GetDlgItem $R5 $0 1023
    System::Call "User32::SetWindowPos(i, i, i, i, i, i, i) b ($R5, 0, 0, 180, 75, 10, 0x201)"
    System::Call 'USER32::CreateWindowEx(i0,t "STATIC",t "$4",i ${WS_CHILD}|${WS_VISIBLE},i0,i203,i150,i20,i $0,i222,i0,i0) $R2'
    GetDlgItem $1 $0 1006
    GetDlgItem $2 $0 222
    SendMessage $1 ${WM_GETFONT} 0 0 $3
    SendMessage $2 ${WM_SETFONT} $3 1
FunctionEnd


MKN 09-09-2013 10:38 2214904

Цитата:

Цитата tony1990
Положение окна 1023 получается регулировать, но вот его размеры нет. »

Не правильный синтаксис вызова функции. Надо так :
Код:

System::Call "User32::SetWindowPos(i$R5, i0, i0, i180, i150, i15, 0x0004)"
; Флаги устанавливают - исходя из задачи  : http://msdn.microsoft.com/en-us/library/windows/desktop/ms633545(v=vs.85).aspx
; по русски :  http://www.firststeps.ru/mfc/winapi/win/r.php?96

Только и так не очень правильно... Сначала создают Rect структуру, потом получают координаты окна, позицию которого надо изменить, задают новые координаты и потом уже применяют функцию SetWindowPos.
Также по хорошему, надо , сделать привязку к базовым единицам, чтобы при ином разрешении экрана, выбранные координаты не уехали... (А может и не обязательно... ) Гемор одним словом. Не проще ли подправить размер окна в ресурсах ?

tony1990 09-09-2013 21:25 2215253

Да. Изменение размера окна в ресурсах оказалось самым оптимальным решением. Подправил. Супер!
В связи с этим возникла идейка что наверно можно и стандартную надпись про доступный объём на диске
поместить на страницу компонентов, используя те же ресурсы. Код в ресурсах добавил, но вероятно надо править в исходниках ещё. Вообще реально ли это сделать?

Salmo 10-09-2013 13:40 2215595

Добрый день. Есть ли возможность получить в переменную командную строку запущенного процесса GetCommandLine?

kotkovets 10-09-2013 15:47 2215657

Цитата:

Цитата Salmo
Есть ли возможность получить в переменную командную строку запущенного процесса GetCommandLine »

Есть, для себя, делал такой макрос:
CmdProsess
Код:

!define CmdProsess "!insertmacro CallCmdProsess"
!macro CallCmdProsess `PID` `OUT`
    !ifndef VAR_CMDPROSESS
    ;объявление структур
      !define VAR_STRUCT
      !define stPROCESS_PARAMETERS "(i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i.s,i,i,i,i,i,i,i,i,i,i)"
      !define stPROCESS_BASIC_INFORMATION "(i,i.s,i,i,i,i)"
      !define stPEB "(i,i,i,i,i.s,i,i)"
    ;;;;;;;;;;;;;
    !endif
    System::Store S
    System::Call "kernel32::OpenProcess(i0x1F0FFF,i0,i${PID})i.R2"
    System::Alloc 24
    Pop $R0
    System::Call "ntdll::NtQueryInformationProcess(iR2, i0, iR0, i24, in)i.R1"
    ${If} $R1 == 0
        System::Alloc 28
        Pop $R1
        System::Call "*$R0${stPROCESS_BASIC_INFORMATION}" ;PebBaseAddress
        System::Free $R0
        System::Call "kernel32::ReadProcessMemory(iR2, is, iR1, i28, *in)"
        System::Alloc 144
        Pop $R0
        System::Call "*$R1${stPEB}" ;ProcessParameters
        System::Free $R1
        System::Call "kernel32::ReadProcessMemory(iR2, is, iR0, i144, *in)"
        System::Call "*$R0${stPROCESS_PARAMETERS}" ;CommandLine
        System::Free $R0
        System::Call "kernel32::ReadProcessMemory(iR2, is, w.s, i536, *in)"
        System::Call "kernel32::CloseHandle(iR2)"
    ${Else}
        System::Free $R0
        System::Call "kernel32::CloseHandle(iR2)"
        Push error
    ${EndIf}
    System::Store L
    Pop `${OUT}`
!macroend


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

${CmdProsess} "пид процесса" "$var"
Как найти пид запущенного процесса читаем в справочнике: » Работа с процессами с помощью NSIS..
$var - переменная, где находится командная строка запущенного процесса

MKN 10-09-2013 17:18 2215714

К слову о процессах. Можно извлечь в переменную, командную строку (полный путь установщика) для текущего процесса, альтернативно функции из справочника :
Код:

System::Call 'kernel32::GetModuleFileNameA(i 0, t .R0, i 1024) i r1'
MessageBox MB_OK "$R0"

с помощью функции GetCommandLine :
Код:

System::Call kernel32::GetCommandLine()t.r0
MessageBox MB_OK "$0"

То же самое, но чуть короче...

kotkovets 10-09-2013 17:41 2215723

Цитата:

Цитата MKN
с помощью функции GetCommandLine »

и вообще то, для этого есть переменная:
Код:

MessageBox MB_OK "$CMDLINE"

Salmo 11-09-2013 19:00 2216268

kotkovets, Добрый день. Позволю себе в третий раз задать тот же вопрос. Видимо, вы не видели предыдущие... Вы, как-то, намеревались написать библиотеку для работы с окнами приложений. Что-нибудь есть подобное? Хотелось бы кликать на объекты формы по координатам и т.д.... И на чужой форме создавать всплывающие подсказки.

kotkovets 11-09-2013 21:11 2216326

Цитата:

Цитата Salmo
kotkovets, Добрый день. Позволю себе в третий раз задать тот же вопрос. Видимо, вы не видели предыдущие... »

Цитата:

Цитата Salmo
Хотелось бы кликать на объекты формы по координатам »

это не просто... здесь строго индивидуально.. нет здесь универсального решения.. чтоб взял, да и все работало на все...
как то так..

MKN 12-09-2013 12:16 2216578

Вложений: 1
Цитата:

Цитата kotkovets
и вообще то, для этого есть переменная:
Код:
MessageBox MB_OK "$CMDLINE" »

Действительно, куда уж проще :) Хотя $CMDLINE я в доке не обнаружил... Есть $EXEPATH
А зачем тогда в справочнике пример с GetModuleFileNameA ? Если для общего развития, то понятно. Тогда и GetCommandLine сгодится.
Хотя получается, что место им в разделе : "А здесь не ищут лёгких путей" :)

И ещё о получении пути запущенного процесса, как альтернатива твоего замечательного ProcessFunc.nsh. Есть ещё хедер некоего Erik Pilsits - Process Functions Header. Делает вроде как то же самое, только с маленьким огрехом, упомянутым неким poofeg в своём блоге :
Цитата:

Но оказалось у него есть одна проблема, он завершает процесс “по доброму” только один раз. Следующие вызовы функции ${CloseProcess} делают ничего. Пришлось его немного исправить, вот исправленный вариант: [download#16]. Проблема была в сравнении $4 == “callback1″, когда при следующем вызове уже callback2 и т.д.
Скачать исправленный вариант не получается и стОит ли оно того, раз уже есть ProcessFunc.nsh ?

По поводу кликанья по объектам... Меня давно интересует функция GetCapture, которая извлекает дескриптор окна , который захватила мышь. А также как регистрировать слик мыши для управления событиями ? Но не знаю как это приспособить в NSIS. Не приведёшь пример ?

kotkovets 12-09-2013 19:31 2216835

Цитата:

Цитата MKN
"А здесь не ищут лёгких путей" »

это давно ясно...
Цитата:

Цитата MKN
Делает вроде как то же самое, только с маленьким огрехом »

Цитата:

Цитата MKN
Но оказалось у него есть одна проблема, он завершает процесс “по доброму” только один раз. Следующие вызовы функции ${CloseProcess} делают ничего. Пришлось его немного исправить, вот исправленный вариант: [download#16]. Проблема была в сравнении $4 == “callback1″, когда при следующем вызове уже callback2 и т.д.
Скачать исправленный вариант не получается и стОит ли оно того, раз уже есть ProcessFunc.nsh ? »

у меня этого нет, потому что в NSIS кривая реализация обратных функций (калбэков)
Цитата:

Цитата MKN
По поводу кликанья по объектам... Меня давно интересует функция GetCapture, которая извлекает дескриптор окна , который захватила мышь. А также как регистрировать слик мыши для управления событиями ? Но не знаю как это приспособить в NSIS. Не приведёшь пример ? »

не а, по выше причине, может и есть пример - но он кривой будет...

MKN 13-09-2013 09:06 2217141

Цитата:

Цитата kotkovets
кривая реализация обратных функций (калбэков) »

Ох уж эти калбаки... Неужели нет никаких способов это исправитть ? А как же тогда автору ButtonEvent плагина удалось реализовать калбак кнопок ? Хотя никакими силами обычным образом этого не сделать... ( имею ввиду, управление кнопкой созданной на стандартной странице, о чём уже как то говорили)

kotkovets 13-09-2013 12:06 2217215

Цитата:

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

MKN 13-09-2013 12:19 2217219

kotkovets,
Жаль, что system плаг никто до сих пор так и не усовершенствовал...

MKN 13-09-2013 17:00 2217365

Вызов окна "О программе"

Вызывается стандартное окно Windows - "О программе"
Код:

!include "MUI2.nsh"
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"
Caption "ShellAbout"
OutFile "ShellAbout_test.exe"

var szApp
var szOtherStuff
var hIcon

Function .oninit
;[hWnd] – handler (дискриптор, указатель) на родительское окно У нас - это $HWNDPARENT;
;[szApp] – название программы;
;[szOtherStuff] – дополнительное описание;
;[hIcon] – handler иконка приложения.

StrCpy $szApp "Название программы"
StrCpy $szOtherStuff "Дополнительное описание"
StrCpy $hIcon 0
System::Call `Shell32::ShellAboutA(i,t,t,i) i ($HWNDPARENT,"$szApp","$szOtherStuff",$hIcon) .s`
FunctionEnd

Section
SectionEnd

Вызывать эту функцию лучше отдельной кнопкой (или кликом по ссылке "О программе" ) на странице.

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

MKN 16-09-2013 10:26 2218632

Извлечение иконок из ресурсов файлов.

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

!include "MUI2.nsh"
Caption Icon
OutFile icon_test.exe
Page custom CreatePage
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

Function CreatePage
; Функция ExtractIcon извлекает дескриптор значка из указанного исполняемого файла,
; динамически подключаемой библиотеки (DLL) или файла значка.
; Если указанная иконка отсутствует, функция возвращает 0.
; Кол-во иконок, содержащихся в файле, можно узнать, указав в качестве последнего параметра –1.

 
    !insertmacro MUI_HEADER_TEXT "ICO" "Извлечение иконок из ресурсов файлов"
    nsDialogs::Create 1018
    Pop $0
   
    System::Call 'shell32::ExtractIcon(i $HWNDPARENT, t "explorer.exe", i 0) i.R0'
    System::Call 'shell32::ExtractIcon(i $HWNDPARENT, t "mydocs.dll",  i 0) i.R1'
    System::Call 'shell32::ExtractIcon(i $HWNDPARENT, t "shell32.dll", i 17) i.R2'
    System::Call 'shell32::ExtractIcon(i $HWNDPARENT, t "shell32.dll", i 32) i.R3'
    System::Call 'shell32::ExtractIcon(i $HWNDPARENT, t "shell32.dll", i 31) i.R4'
    System::Call 'shell32::ExtractIcon(i $HWNDPARENT, t "shell32.dll", i 34) i.R5'
    System::Call 'shell32::ExtractIcon(i $HWNDPARENT, t "shell32.dll", i 71) i.R6'
    System::Call 'shell32::ExtractIcon(i $HWNDPARENT, t "shell32.dll", i 113) i.R7'
    System::Call 'shell32::ExtractIcon(i $HWNDPARENT, t "shell32.dll", i 116) i.R8'
    System::Call 'shell32::ExtractIcon(i $HWNDPARENT, t "shell32.dll", i 130) i.R9'

    ${NSD_CreateIcon} 0u 0u 30u 30u "icon1"
    Pop $0
    SendMessage $0 ${STM_SETIMAGE} ${IMAGE_ICON} $R0
    ${NSD_CreateIcon} 40u 0u 30u 30u "icon2"
    Pop $0
    SendMessage $0 ${STM_SETIMAGE} ${IMAGE_ICON} $R1
    ${NSD_CreateIcon} 80u 0u 30u 30u "icon3"
    Pop $0
    SendMessage $0 ${STM_SETIMAGE} ${IMAGE_ICON} $R2
    ${NSD_CreateIcon} 120u 0u 30u 30u "icon4"
    Pop $0
    SendMessage $0 ${STM_SETIMAGE} ${IMAGE_ICON} $R3
    ${NSD_CreateIcon} 160u 0u 30u 30u "icon5"
    Pop $0
    SendMessage $0 ${STM_SETIMAGE} ${IMAGE_ICON} $R4
    ${NSD_CreateIcon} 0u 40u 30u 30u "icon6"
    Pop $0
    SendMessage $0 ${STM_SETIMAGE} ${IMAGE_ICON} $R5
    ${NSD_CreateIcon} 40u 40u 30u 30u "icon7"
    Pop $0
    SendMessage $0 ${STM_SETIMAGE} ${IMAGE_ICON} $R6
    ${NSD_CreateIcon} 80u 40u 30u 30u "icon8"
    Pop $0
    SendMessage $0 ${STM_SETIMAGE} ${IMAGE_ICON} $R7
    ${NSD_CreateIcon} 120u 40u 30u 30u "icon9"
    Pop $0
    SendMessage $0 ${STM_SETIMAGE} ${IMAGE_ICON} $R8
    ${NSD_CreateIcon} 160u 40u 30u 30u "icon10"
    Pop $0
    SendMessage $0 ${STM_SETIMAGE} ${IMAGE_ICON} $R9
   
    nsDialogs::Show
   
    System::Call 'user32::DestroyIcon(iR0)'
    System::Call 'user32::DestroyIcon(iR1)'
    System::Call 'user32::DestroyIcon(iR2)'
    System::Call 'user32::DestroyIcon(iR3)'
    System::Call 'user32::DestroyIcon(iR4)'
    System::Call 'user32::DestroyIcon(iR5)'
    System::Call 'user32::DestroyIcon(iR6)'
    System::Call 'user32::DestroyIcon(iR7)'
    System::Call 'user32::DestroyIcon(iR8)'
    System::Call 'user32::DestroyIcon(iR9)'
FunctionEnd

Section
SectionEnd


MKN 17-09-2013 17:28 2219433

"Шкурный вопрос" или об оформлении NSIS инсталлятора с помощью Skin_ов

Когда пользователи хотят оформить-украсить аскетичный NSIS инсталлятор, то первым делом вспоминают NSIS SkinCrafter Plugin.
( http://skincrafter.com/products/nsis-skincrafter-plugin )
Вроде бы простой код использования, много дополнительных файлов-скинов (*.skf) в галерее ( http://skincrafter.com/gallery )
Но... Невменяемый размер плагина (6,5 метров !) и ощутимая глазом задержка при перерисовке "ошкуренных" страниц
сразу заставляют задуматься, а нужно ли такое чудо ? (K.A.V. когда то модернизировал SkinCrafter.dll , но она у меня вообще не хочет работать... Родная работает... )

Приходится искать альтернативу. И она конечно есть.

Например, программа ISSkinEx 3.0.0.2 for InnoSetup and NSIS ( http://restools.hanzify.org/ ).
Скины можно изготовить самому и загружать их ( это файлы *.cjstyles ) с помощью ISSkinEx.dll (ISSkinExU.dll)
Самостоятельное изготовление - дело хлопотное, ( хотя можно ограничиться использованием имеющихся в комплекте нескольких стилей-заготовок ) . Общий размер скина с DLL, при этом получается около 1M, что уже преемлемо...

У китайских товарищей большой популярностью пользуется NSIS SkinSharp библиотека ( SkinH.dll ), к которой в сети имеется много пакетов с разнообразными стилями оформления ( файлами *.she ) Размер вмеcте с DLL ~100K . Код подключения :
Код:

!include "MUI2.nsh" 
 
!define MUI_CUSTOMFUNCTION_GUIINIT onGUIInit 
!insertmacro MUI_PAGE_WELCOME 
!insertmacro MUI_PAGE_DIRECTORY 
!insertmacro MUI_PAGE_INSTFILES 
!insertmacro MUI_PAGE_FINISH 
!insertmacro MUI_LANGUAGE "English" 
 
Name "SkinH" 
OutFile "SkinH.exe" 
InstallDir "$TEMP" 
 
Function onGUIInit 
  InitPluginsDir 
  SetOutPath $PLUGINSDIR 
  File "SkinH.dll" 
  File "skinh.she" 
  System::Call SkinH::SkinH_Attach() 
  System::Call Kernel32::GetModuleHandle(t"SkinH.dll")i.r0 
  IntOp $0 $0 + 0x0002CA98 
  System::Call Kernel32::GetCurrentProcess()i.s 
  System::Call Kernel32::VirtualProtectEx(is,ir0,i4,i0x40,*i) 
  System::Call "*$0(&i1 0)" 
FunctionEnd 
 
Function .onGUIEnd 
  System::Call Kernel32::GetModuleHandle(t"SkinH.dll")i.s 
  System::Call Kernel32::FreeLibrary(is) 
  System::Call Kernel32::SetCurrentDirectory(t"$EXEDIR\") 
FunctionEnd 

Section 
SectionEnd

Файл стиля должен называться - skinh.she ! Т.е. , т.к. названия файлов-стилей, разннобразные, то их надо переименовывать.

Вот вариант кода с прозрачной страницей и возможностью поместить на странице фоновый рисунок :

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

!define iTransparentPercent 80 
Var dlg
Var Label1
Var iTransparent
Var bTransparent
Var Bitmap
Var BitmapHandle

!include "MUI2.nsh" 
!include "WinMessages.nsh"
!include "LogicLib.nsh"
!define MUI_CUSTOMFUNCTION_GUIINIT myGuiInit
page custom MyPage
!insertmacro MUI_PAGE_INSTFILES 
!insertmacro MUI_LANGUAGE "English" 
OutFile "transparent.exe"

Function .onInit
  InitPluginsDir
  File /oname=$PLUGINSDIR\Pict.bmp "Pict.bmp"
  IntOp $iTransparent ${iTransparentPercent} * 255
  IntOp $iTransparent $iTransparent / 100
  StrCpy $bTransparent 0
FunctionEnd

Function myGuiInit
InitPluginsDir
  SetOutPath $PLUGINSDIR
  File SkinH.dll
  File skinh.she
  System::Call SkinH::SkinH_Attach()

  System::Call Kernel32::GetModuleHandle(t"SkinH.dll")i.r0
  IntOp $0 $0 + 0x0002CA98
  System::Call Kernel32::GetCurrentProcess()i.s
  System::Call Kernel32::VirtualProtectEx(is,ir0,i4,i0x40,*i)
  System::Call "*$0(&i1 0)"
 FunctionEnd

Function MyPage
  Call SetWindowAttrib
  ${If} $bTransparent == 0
  ${For} $R0 0 $iTransparent
  system::call 'user32::SetLayeredWindowAttributes(i $HWNDPARENT, i 0, i R0, i 2) .iR1'
  ${Next}
  ${Endif}

  nsDialogs::Create 1044
  Pop $dlg
 
    ${NSD_CreateLabel} 140u 10u 180u 20u " Transparent Window"
    Pop $Label1
    FindWindow $0 "#32770" "" $HWNDPARENT
    GetDlgItem $0 $0 1200
    CreateFont $2 "tahoma" "18" "660"
    SendMessage $0 ${WM_SETFONT} $2 0

  ${NSD_CreateBitmap} 0 0 100% 100% ""
    Pop $Bitmap
    StrCpy $0 $PLUGINSDIR\Pict.bmp
    System::Call 'user32::LoadImage(i 0, t r0, i ${IMAGE_BITMAP}, i 0, i 0, i ${LR_LOADFROMFILE}) i.s'
    Pop $BitmapHandle
    SendMessage $Bitmap ${STM_SETIMAGE} ${IMAGE_BITMAP} $BitmapHandle
       
    nsDialogs::Show
FunctionEnd
 
 Function .onGUIEnd
  System::Call Kernel32::GetModuleHandle(t"SkinH.dll")i.s
  System::Call Kernel32::FreeLibrary(is)
  System::Call Kernel32::SetCurrentDirectory(t"$EXEDIR\")
FunctionEnd

Function SetWindowAttrib
${if} $bTransparent == 0
system::call 'user32::GetWindowLong(i $HWNDPARENT, i ${GWL_EXSTYLE}) .iR0'
IntOp $R0 $R0 + 0x80000}
system::call 'user32::SetWindowLong(i $HWNDPARENT, i ${GWL_EXSTYLE}, i R0) .iR1'
system::call 'user32::SetLayeredWindowAttributes(i $HWNDPARENT, i 0, i 0, i 2) .iR2'
Pop $R2
Pop $R1
Pop $R0
${endif}
FunctionEnd

Section
SectionEnd


MKN 18-09-2013 11:41 2219761

"Шкурный вопрос" или об оформлении NSIS инсталлятора с помощью Skin_ов. Продолжение.

Дополнительные стили для SkinH.dll :
Скачать : http://www.mediafire.com/?q5lk80vd7ivf9ob
Стилей в сети много, но почти все они на китайских ресурсах, откуда скачать их затруднительно (надо регистрироваться, иногда вводить капчу иероглифами и пр.).. :)
Если кому удастся скачать ещё стилей - выложите пожалуйста здесь .

Но пожалуй, самая простая и удобная в применении - это библиотека Skin.dll. Не требует доп файлов-стилей. Тоже от китайских умельцев.
Скачать : http://www.mediafire.com/?1g2idooxhm2713i
В зависимости от выбранных инструкций и параметров вызова DLL, можно получать разнообразные результаты. ( Но не со всеми инструкциями я разобрался... Кто владеет китайским, может меня дополнит и поправит... Оригинал док в архиве ) )
Код:

!include "MUI2.nsh" 
!insertmacro MUI_PAGE_WELCOME 
!insertmacro MUI_PAGE_DIRECTORY 
!insertmacro MUI_PAGE_INSTFILES 
!insertmacro MUI_PAGE_FINISH 
!insertmacro MUI_LANGUAGE "English" 

OutFile "Skin_test.exe"
InstallDir "$TEMP" 
 
 ; инструкция вызова wmSkin
 ; Параметр 1 :  выбор скина (Skin ID)  - значения : 0...25
 ; Параметр 2 : установка прозрачности  - значения : 0 или 1
 
 ; инструкция вызова setSkin  -  ( установки Color Adjustment )
 ; Параметр 1  "Цвета",  Диапазон значений  -180...180 ,    значение по умолчанию 0.
 ; Параметр 2  "Насыщенность",  Диапазон значений  -100...100,    значение по умолчанию 0.
 ; Параметр 3  "Яркость",  Диапазон значений  -100...100 ,    значение по умолчанию 0.
 
 ; инструкция вызова  delSkin  - выгружает DLL из памяти
 
 ; Другие инструкция вызова :  VShin,  DVSkin - не совсем ясно , для чего...

 
Function .onInit
InitPluginsDir
SetOutPath $PLUGINSDIR
File "Skin.dll"
 
system::call 'Skin::wmSkin(i8,i0)'

; если надо ещё разукрасить скин - раскомментируйте следующую команду
;system::call 'Skin::setSkin(i-110,i0,i0)'

FunctionEnd
 
Section
Sleep 500
SectionEnd

Изменяя значения параметров - выбираете и изменяете внешний вид скина.

Salmo 19-09-2013 17:31 2220528

Добрый день, господа. Можно ли средствами NSIS определить размер памяти, занимаемой другим процессом?

MKN 20-09-2013 09:44 2220872

Цитата:

Цитата Salmo
определить размер памяти, занимаемой другим процессом? »

Может с помощью функции GetProcessMemoryInfo ? Тут был пример кода Pascal/Delphi :
(http://forum.vingrad.ru/forum/s/de09...ic-318633.html )
А как это дело приспособить для NSIS, не знаю... Может kotkovets подскажет ?

Или сделать проще - использовать утилиту CurrProcess ( http://www.nirsoft.net/utils/cprocess.html )
И получив командой, например для процесса TOTALCMD.exe, :
cprocess /pmhtml TOTALCMD.exe c:\temp\TC.html
файл TC.html с информацией - извлечь из этого файла нужное (Mem Usage / Mem Usage Peak ) . А это уже просто строчные операции...

Salmo 20-09-2013 13:56 2220969

MKN, Спасибо... Посторонними утилитами не проблема, хотя-бы через tasklist и дополнительный файл... Хотел, именно , средствами NSIS, если возможно... Было бы изящно :)

Flix 20-09-2013 17:35 2221055

Может кому интересно будет. Редактор стилей SHEditor v0.2 b5 (русская версия) для файлов скинов *.she: скачать.

Цитата:

Цитата MKN
Файл стиля должен называться - skinh.she !

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

Цитата:

Цитата MKN
Но пожалуй, самая простая и удобная в применении - это библиотека Skin.dll. Не требует доп файлов-стилей.

:) Не требует потому, что эти стили уже вшиты в файл Skin.dll. Я все же больше склоняюсь к минимализму и думаю удобней применять один файл стиля и единственную библиотеку. Жаль только что стилей не так и много. Вы пишете что в сети их много, но я пока нашел только те файлы, которые уже имеются в вашей коллекции. Но все равно, большое спасибо, что затронули "шкурный вопрос". Как раз намедни заинтересовался, а тут раз и ответ.

MKN 20-09-2013 18:18 2221075

Цитата:

Цитата Flix
Почему вы написали, что надо переименовать? »

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

Цитата Flix
пишете что в сети их много »

Ну да, только в китайской сети... :) Встречал паки - до сотни стилей. Только не скачать.

vahe-91 20-09-2013 21:07 2221140

ну почему ${WinVersion} (плагин WinVer2) в Windows 8.1 в одном скрипте возвращает 6.2, в другом 6.1 ? :sorry:

kotkovets 20-09-2013 22:34 2221185

Цитата:

Цитата vahe-91
ну почему ${WinVersion} (плагин WinVer2) в Windows 8.1 в одном скрипте возвращает 6.2, в другом 6.1 ? »

потому что, Windows 8.1 финальный релиз в октябре.. http://hi-tech.mail.ru/news/misc/win...-1-launch.html
до финала может любые цифры выдавать... потому что не финал..

vahe-91 20-09-2013 23:04 2221197

Цитата:

Цитата kotkovets
потому что, Windows 8.1 финальный релиз в октябре.. http://hi-tech.mail.ru/news/misc/win...-1-launch.html
до финала может любые цифры выдавать... потому что не финал.. »

финал, это точно :)
Оказалось, что он запускает файл в режиме совместимости Win7 :dont-know странно, я эту галку точно не ставил.

MKN 21-09-2013 13:33 2221398

Вложений: 1
Таймер обратного отсчёта на кнопке MessageBox_а

Как то эту задачу уже решали с помощью специальной DLL, что не удобно и лишено гибкости управления...
Но есть и другой способ, с помощью nsWindows плагина ( http://sourceforge.net/p/ifififi/code/HEAD/tree/ ) :
Код:

!include "nsWindows.nsh"
;!include "LogicLib.nsh"
!define TimerMsgTitle "Заголовок сообщения"
Name "TimerMsgBox Example"
OutFile "TimerMsgBox.exe"
Var WINDOW
Var Time

!macro MessageBox out text title flags
 System::Call "user32::MessageBoxTimeout(i $HWNDPARENT, t '${text}', t '${title}', i ${flags}, i 0) i.s"
 Pop ${out}
 !macroend
 
 Section
    StrCpy $Time 7
    ${NSW_CreateWindow} $WINDOW "Timer" 1018
    ${NSW_CreateTimer} OnTimer 1000
 !insertmacro MessageBox $0 "Какое то действие через :" "${TimerMsgTitle}" 0x40|0x1
 ;MessageBox MB_OK "Return Code: $0"
 ${If} $0 != 1
 MessageBox MB_OK "    Действие отменяется ! Выход."
 Quit
 ${EndIf}
 MessageBox MB_OK "      Начинаем какое то действие"
 SectionEnd

Function OnTimer
    ${If} $Time == 0
            FindWindow $0 "#32770" "${TimerMsgTitle}"
        GetDlgItem $1 $0 1
        SendMessage $1 ${BM_CLICK} 0 0
        ${NSW_KillTimer} OnTimer
    ${Else}
        IntOp $Time $Time - 1
        FindWindow $0 "#32770" "${TimerMsgTitle}"
        GetDlgItem $2 $0 1
        SendMessage $2 ${WM_SETTEXT} 0 "STR: OK $Time sec"
        ;GetDlgItem $3 $0 65535
        ;SendMessage $3 ${WM_SETTEXT} 0 "STR:Осталось: $Time sec"
    ${EndIf}
FunctionEnd

Всё работает как надо, но есть пара не понятных моментов - во-первых после компиляции получаем сообщение :
!warning: Note: nsWindows.dll must be put in NSIS's Plugins Directory! (macro:_NSW_CreateWindow:17)
Хотя nsWindows.dll находится там где и положено !

во-вторых, зачем то создаётся файл в \NSIS\Plugins\nsWindows.tmp\nsWindows$insWindows.dll
и потом не удаляется...

Всё это дело исходит из nsWindows.nsh. Я пробовал три разных вариации nsWindows.nsh, но со всеми эффект одинаков.
(редактировать nsWindows.nsh я не решился...)

Что бы это значило и как это можно устранить ?

MKN 24-09-2013 09:06 2222975

Цитата:

Цитата Salmo
Хотел, именно , средствами NSIS, если возможно... Было бы изящно »

Ответили на Winamp_e (как определить размер памяти, занимаемой каким либо процессом ):
Не знаю уж насколько это изящно и универсально... Мне не всё в коде понятно....

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

OutFile "GetProcessMemoryInfo.exe"

Var /GLOBAL pid

; Pid используем необходимого процесса )

Section
 System::Call KERNEL32::GetCurrentProcessId()i.s
 Pop $pid

 !include LogicLib.nsh
 !define PROCESS_VM_READ 0x0010
 !define PROCESS_QUERY_INFORMATION 0x0400
 !define PROCESS_QUERY_LIMITED_INFORMATION 0x1000

 System::Call 'KERNEL32::OpenProcess(i${PROCESS_VM_READ}|${PROCESS_QUERY_LIMITED_INFORMATION},i0,i$pid)i.r0'
 ${If} $0 = 0
 System::Call 'KERNEL32::OpenProcess(i${PROCESS_VM_READ}|${PROCESS_QUERY_INFORMATION},i0,i$pid)i.r0'
 ${EndIf}
 ${If} $0 = 0
 DetailPrint "Unable to open process $pid!"
 Goto done_noprocess
 ${EndIf}
 !define CB_PMC32 40
 !define CB_PMCE32 44
 System::Call '*(i,i,i,i,i,i,i,i,i,i,i0)i.r1' ; Probably only going to work for 32 bit processes * Наверное, будет работать только для 32 бит процессов
 System::Call 'PSAPI::GetProcessMemoryInfo(ir0,ir1,i${CB_PMCE32})i.r2'
 ${If} $2 = 0
 System::Call 'PSAPI::GetProcessMemoryInfo(ir0,ir1,i${CB_PMC32})i.r2'
 ${EndIf}
 ${If} $2 = 0
 DetailPrint "GetProcessMemoryInfo failed"
 ${Else}
 System::Call '*$1(i.r2,i,i,i.r3,i,i,i,i,i.r4,i,i.r5)'
 ${IfThen} $5 <> 0 ${|} StrCpy $4 $5 ${|} ; MSDN claims PagefileUsage is always 0 on Win7+ (Does not seem to be true but lets play it safe)
 DetailPrint "cbStruct=$2 WorkingSet=$3 PrivateUsage=$4"
 ${EndIf}
 System::Free $1
 System::Call 'KERNEL32::CloseHandle(ir0)'
 done_noprocess:
SectionEnd


Salmo 24-09-2013 14:01 2223110

MKN, Спасибо, что не забыли мою просьбу! Да, это решение трудно назвать изящным :), думал будет не больше двух строк...

MKN 24-09-2013 16:13 2223183

Цитата:

Цитата Salmo
думал будет не больше двух строк... »

Так оно и будет. Если добавить это код (наверняка модернизировав) в ProcessFunc.nsh... Может kotkovets, так и сделает ?

Flix 24-09-2013 19:33 2223301

Продолжая вопрос скинизации, нашел у китайцев еще 30 скинов *.she и просмотрщик стилей SHEViewer. Собрал в кучу ранее выложенные здесь скины и русскую версию SHEditor: СКАЧАТЬ.
Если у вас будут новые (другие) файлы стилей, просто добавьте их папку "Skins" и SHEViewer подхватит их автоматически.
Скриншот SHEViewer:


MKN, если не трудно, дай пожалуйста ссылки на ресурсы с наборами стилей, может мне удастся пополнить нашу коллекцию. По поводу переименования файла стиля в skinh.she ты был прав, я ошибся, прошу прощения. Это имя стиля зашито в библиотеке DLL и используется по умолчанию. Если надо использовать другой стиль, то нужно переименовать файл, или использовать функцию SkinH_AttachEx для загрузки стиля с другим именем.

MKN 25-09-2013 12:00 2223654

Цитата:

Цитата Flix
ссылки на ресурсы с наборами стилей »

Навскидку :
http://download.csdn.net/detail/ynthynkdee/4902323
http://download.csdn.net/detail/xiaoy_2012/5123375
http://download.csdn.net/detail/simadi/5422313
Только, раз уж есть SHEditor, то дело за малым - за творчеством...
ps Похоже, что кроме SkinH_AttachEx, есть и другие инструкции : http://www.esoyu.com/soft/develop/26754.html

Vincent7 27-09-2013 02:09 2224675

Здравствуйте. Такой вопрос- можно ли сделать проверку символов в пути устанавливаемой программы? Например проверить чтобы в нем небыло пробелов, если есть- abort. Такое возможно?

kotkovets 27-09-2013 09:14 2224716

Цитата:

Цитата Vincent7
можно ли сделать проверку символов в пути устанавливаемой программы? Например проверить чтобы в нем небыло пробелов »

зачем это нужно... для чего.. какие цели?

Limonica 27-09-2013 12:31 2224794

Можно пример, как скачать файл силами плагина System.dll

Vincent7 27-09-2013 12:44 2224805

kotkovets, ну например программе нужно для работы чтобы в пути не было русских букв.

MKN 27-09-2013 13:32 2224825

Цитата:

Цитата Limonica
как скачать файл »

С помощью плагинов Inetc plug-in , InetLoad и др.

Limonica 27-09-2013 16:45 2224930

Цитата:

Цитата MKN
С помощью плагинов Inetc plug-in , InetLoad и др. »

а с помошью System plug-in невозможно?

MKN 27-09-2013 17:30 2224956

Цитата:

Цитата Limonica
а с помошью System plug-in невозможно? »

Вполне... Только это для любителей изобретать велосипед и создавать себе трудности... :)
Вызывай нужные API и вперёд... URLDownloadToFile() и т.д.
https://dev.stel.com/api/files
http://www.realcoding.net/articles/i...win32-api.html
http://www.rsdn.ru/article/inet/inetapi.xml

kotkovets 27-09-2013 20:41 2225040

Цитата:

Цитата Vincent7
например программе нужно для работы чтобы в пути не было русских букв. »

1) Так зачем то, давать возможность давать изменять путь установки, отпадает куча вопросов...
задать к примеру жесткую установку к примеру:
Код:

installdir "$PROGRAMFILES\PROGRAM_SOFT"
---
2) Можно фильтровать путь установки, таким методом фильтрации и сравнения длины строк:
Код:

!include "WordFunc.nsh"
!include "StrFunc.nsh"
!include "Logiclib.nsh"

installdir "$PROGRAMFILES\prof\опа"

outfile rus_test.exe

Section

 StrLen $R0 $INSTDIR
 ${StrFilter} "$INSTDIR" "12eng" `" ~ @ # № $$ % ; : ^ & ? * ( ) - _ + = < > / \ [ ] } { . , ` "" $R1
 StrLen $R1 $R1
 ${If} $R0 > $R1
    MessageBox MB_OK "В строке: [ $INSTDIR ]$\nесть русские символы" IDOK
    Abort
 ${EndIf}
    MessageBox MB_OK "OK!" IDOK
   
SectionEnd


MKN 28-09-2013 11:24 2225217

Ещё раз про Skin_ы.
На skinse.com есть такой плагин - SkinSE NSIS Plugin. Позволяет "одевать" инсталлятор с помощью SkinSE_NSIS.dll, SkinSE.dll и SkinSE_QQ2009.zip (архив с графическими bmp элементами)
читать дальше »
Код:

!addplugindir .
OutFile "SkinSE_NSIS.exe"

!include "MUI2.nsh"
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "English"
InstallDir $TEMP
/*
InstallSkinSE
SkinSE_EnableHookSkin
SkinSE_EnableTitleMenuBar
SkinSE_Button_SetBackBitmap
SkinSE_InitSkinSE_LoadSkinResourceFromFolder
SkinSE_LoadSkinResourceFromRes
SkinSE_LoadSkinResourceFromZIP
SkinSE_RefreshAllControls
SkinSE_RemoveLayoutPos
SkinSE_SetBitmapHSB
SkinSE_SetColorHSB
SkinSE_SetHSB
SkinSE_SetLayoutMainFrame
SkinSE_SetLayoutWindowPos
SkinSE_SetScrollBarSkin
SkinSE_SubclassWindow
SkinSE_SubclassWindowEx
SkinSE_UpdateChildControlSkin
UnstallSkinSE
*/
Function .onInit
  InitPluginsDir
  SetOutPath $PLUGINSDIR
  File SkinSE.dll
  File SkinSE_QQ2009.zip
  System::Call SkinSE::SkinSE_LoadSkinResourceFromZIP(t"$PLUGINSDIR\SkinSE_QQ2009.zip",t)
  !ifdef SKINSE_NOHOOK
    System::Call SkinSE::SkinSE_Init(i$HWNDPARENT,i1)
  !else
    System::Call SkinSE::SkinSE_EnableHookSkin(i1)
    System::Call SkinSE::SkinSE_RefreshAllControls()
  !endif
  System::Call SkinSE::SkinSE_Menu_EnableSkin(i1)
FunctionEnd

Function .onGUIEnd
SkinSE::UnstallSkinSE
System::Call Kernel32::GetModuleHandle(t"SkinSE_NSIS.dll")i.s
System::Call Kernel32::FreeLibrary(is)
System::Call Kernel32::SetCurrentDirectory(t"$EXEDIR\")
FunctionEnd

;  в сопроводительном примере код упрощен...  :
/*Function .onInit
  InitPluginsDir
  File "/oname=$PLUGINSDIR\SkinSE.dll" "SkinSE.dll"
  File "/oname=$PLUGINSDIR\SkinSE_QQ2009.zip" "SkinSE_QQ2009.zip"
  SkinSE_NSIS::setskinpath /NOUNLOAD "$PLUGINSDIR\SkinSE_QQ2009.zip"
FunctionEnd

Function .onGUIEnd
  SkinSE::UnstallSkinSE
  SetOutPath $TEMP
FunctionEnd*/

Section
SectionEnd



Скачать SkinSE For NSIS : http://www.skinse.com/Download.htm

Limonica 29-09-2013 20:45 2225836

kotkovets, есть ли обнова WinVer2.nsh c правильным отображением Windows 8 и 8.1 ?

И вопрос по редакциям Windows 7, существуют же не только N редакции но и K и KN как быть с ними?
И как универсально распознать Home Basic независимо от издания (N, K, KN)?

ProcessFunc.nsh недавно выложенная тоже не работает в самой последней версии :(

MKN 30-09-2013 09:27 2225987

Вложений: 1
Цитата:

Цитата Limonica
существуют же не только N редакции но и K и KN как быть с ними? »

Никак. :) Это же редкая экзотика... Особенно К (для Кореи) http://it-padla.blogspot.ru/2009/08/windows-7.html
Да и основное отличие от нормальных редакций - в отсутствии Windows Media Player. И уж не WinVer.nsh должен это отличие детектировать...

Для практики, в подавляющем большинстве случаев, вполне достаточно исчерпывающей информации из
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion
Извлёк нужную инфу, сравнил и сделал вывод. По Win 8 включительно, почти все данные об ОС известны...
Например, http://en.wikipedia.org/wiki/Compari...ndows_versions
http://en.wikipedia.org/wiki/Development_of_Windows_7

Цитата:

Цитата Limonica
ProcessFunc.nsh недавно выложенная тоже не работает в самой последней версии »

Если имеется ввиду хедер из моего поста, то это альтернативный вариант, причём, для некоторых случаев, не совсем удачный...
А хедер от kotkovets (который в справочнике) работает ?

ps Для разнообразия, последние летние WinVer.nsh

kotkovets 30-09-2013 19:16 2226332

Цитата:

Цитата Limonica
kotkovets, есть ли обнова WinVer2.nsh c правильным отображением Windows 8 и 8.1 ? »

скоро будет.. выложу..
Цитата:

Цитата Limonica
ProcessFunc.nsh недавно выложенная тоже не работает в самой последней верси »

не надо... все работает..

MKN 01-10-2013 17:39 2226858

Код программы "Font Viewer" :
(от китайских товарищей. Перевод гугловский, может быть не точен... )
читать дальше »
Код:

!include MUI2.nsh
!include nsWindows.nsh
!include WinCore.nsh

!define BS_SOLID                0
!define BS_NULL                1
!define TRANSPARENT            1
!define OPAQUE                  2
!define CC_TEXT                1
!define CC_BK                  4
!define CC_BKB                  16
!define GWL_USERDATA            -21

!define CF_SCREENFONTS          0x00000001
!define CF_PRINTERFONTS        0x00000002
!define CF_BOTH                ${CF_SCREENFONTS}|${CF_PRINTERFONTS}
!define CF_SHOWHELP            0x00000004
!define CF_ENABLEHOOK          0x00000008
!define CF_ENABLETEMPLATE      0x00000010
!define CF_ENABLETEMPLATEHANDLE 0x00000020
!define CF_INITTOLOGFONTSTRUCT  0x00000040
!define CF_USESTYLE            0x00000080
!define CF_EFFECTS              0x00000100
!define CF_APPLY                0x00000200
!define CF_ANSIONLY            0x00000400
#if(WINVER >= 0x0400)
!define CF_SCRIPTSONLY          ${CF_ANSIONLY}
#endif /* WINVER >= 0x0400 */
!define CF_NOVECTORFONTS        0x00000800
!define CF_NOOEMFONTS          ${CF_NOVECTORFONTS}
!define CF_NOSIMULATIONS        0x00001000
!define CF_LIMITSIZE            0x00002000
!define CF_FIXEDPITCHONLY      0x00004000
!define CF_WYSIWYG              0x00008000 #// must also have CF_SCREENFONTS & CF_PRINTERFONTS
!define CF_FORCEFONTEXIST      0x00010000
!define CF_SCALABLEONLY        0x00020000
!define CF_TTONLY              0x00040000
!define CF_NOFACESEL            0x00080000
!define CF_NOSTYLESEL          0x00100000
!define CF_NOSIZESEL            0x00200000
#if(WINVER >= 0x0400)
!define CF_SELECTSCRIPT        0x00400000
!define CF_NOSCRIPTSEL          0x00800000
!define CF_NOVERTFONTS          0x01000000
#endif /* WINVER >= 0x0400 */

!define BOLD_FONTTYPE          0x0100
!define ITALIC_FONTTYPE        0x0200
!define REGULAR_FONTTYPE        0x0400
!define SCREEN_FONTTYPE        0x2000
!define PRINTER_FONTTYPE        0x4000
!define SIMULATED_FONTTYPE      0x8000

!define CF_TEXT                1
!define CF_BITMAP              2
!define CF_METAFILEPICT        3
!define CF_SYLK                4
!define CF_DIF                  5
!define CF_TIFF                6
!define CF_OEMTEXT              7
!define CF_DIB                  8
!define CF_PALETTE              9
!define CF_PENDATA              10
!define CF_RIFF                11
!define CF_WAVE                12
!define CF_UNICODETEXT          13
!define CF_ENHMETAFILE          14
!define CF_HDROP                15
!define CF_LOCALE              16
!define CF_DIBV5                17

!define CF_PRIVATEFIRST        0x0200
!define CF_PRIVATELAST          0x02FF
!define CF_GDIOBJFIRST          0x0300
!define CF_GDIOBJLAST          0x03FF
!define CF_OWNERDISPLAY        0x0080
!define CF_DSPTEXT              0x0081
!define CF_DSPBITMAP            0x0082
!define CF_DSPMETAFILEPICT      0x0083
!define CF_DSPENHMETAFILE      0x008E

!define GMEM_FIXED              0x0000
!define GMEM_MOVEABLE          0x0002
!define GMEM_ZEROINIT          0x0040
!define GPTR                    ${GMEM_FIXED}|${GMEM_ZEROINIT}
!define GHND                    ${GMEM_MOVEABLE}|${GMEM_ZEROINIT}

Name ChooseFont
Caption ChooseFont
OutFile ChooseFont.exe
XPStyle on

Page custom Page.Create
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

Var HWND

Function Page.Create

  !insertmacro MUI_HEADER_TEXT "ChooseFont Function" "ChooseFont"

  nsDialogs::Create 1018
  Pop $HWND

  nsDialogs::CreateControl ${__NSD_Label_Class} ${__NSD_Label_STYLE}|${SS_CENTER}|${SS_CENTERIMAGE} \
                          ${WS_EX_CLIENTEDGE}|${WS_EX_WINDOWEDGE} 0u 0u 300u 50u "Просмотр шрифта"
  Pop $0

  ${NSD_CreateButton} 250u 54u 50u 14u "Шрифт"
  Pop $1
  ${NSD_OnClick} $1 ChooseFont

  ${NSD_CreateLabel} 0u 57u 80u 8u "LOGFONT : "
  Pop $3
  ${NSD_CreateLabel} 80u 57u 20u 8u ""
  Pop $3

  ${NSD_CreateLabel} 72u 72u 78u 8u ""
  Pop $3
  ${NSD_CreateLabel} 222u 72u 78u 8u ""
  Pop $3
  ${NSD_CreateLabel} 72u 82u 78u 8u ""
  Pop $3
  ${NSD_CreateLabel} 222u 82u 78u 8u ""
  Pop $3
  ${NSD_CreateLabel} 72u 92u 78u 8u ""
  Pop $3
  ${NSD_CreateLabel} 222u 92u 78u 8u ""
  Pop $3
  ${NSD_CreateLabel} 72u 102u 78u 8u ""
  Pop $3
  ${NSD_CreateLabel} 222u 102u 78u 8u ""
  Pop $3
  ${NSD_CreateLabel} 72u 112u 78u 8u ""
  Pop $3
  ${NSD_CreateLabel} 222u 112u 78u 8u ""
  Pop $3
  ${NSD_CreateLabel} 72u 122u 78u 8u ""
  Pop $3
  ${NSD_CreateLabel} 222u 122u 78u 8u ""
  Pop $3
  ${NSD_CreateLabel} 72u 132u 78u 8u ""
  Pop $3
  ${NSD_CreateLabel} 222u 132u 78u 8u ""
  Pop $3

  ${NSD_CreateLabel} 0u 72u 72u 8u "iPointSize: "
  Pop $3
  ${NSD_CreateLabel} 150u 72u 72u 8u "rgbColors: "
  Pop $3
  ${NSD_CreateLabel} 0u 82u 72u 8u "lfEscapement: "
  Pop $3
  ${NSD_CreateLabel} 150u 82u 72u 8u "lfOrientation: "
  Pop $3
  ${NSD_CreateLabel} 0u 92u 72u 8u "lfWeight: "
  Pop $3
  ${NSD_CreateLabel} 150u 92u 72u 8u "lfItalic: "
  Pop $3
  ${NSD_CreateLabel} 0u 102u 72u 8u "lfUnderline: "
  Pop $3
  ${NSD_CreateLabel} 150u 102u 72u 8u "lfStrikeOut: "
  Pop $3
  ${NSD_CreateLabel} 0u 112u 72u 8u "lfCharSet: "
  Pop $3
  ${NSD_CreateLabel} 150u 112u 72u 8u "lfOutPrecision: "
  Pop $3
  ${NSD_CreateLabel} 0u 122u 72u 8u "lfClipPrecision: "
  Pop $3
  ${NSD_CreateLabel} 150u 122u 72u 8u "lfQuality: "
  Pop $3
  ${NSD_CreateLabel} 0u 132u 72u 8u "lfPitchAndFamily: "
  Pop $3
  ${NSD_CreateLabel} 150u 132u 72u 8u "lfFaceName: "
  Pop $3

  ${NSD_CreateText} 100u 55u 145u 12u "Образец"
  Pop $3
  ${NSD_OnChange} $3 SetSampleText

  nsDialogs::Show
FunctionEnd

Function ChooseFont

  IntCmpU 0 $R0 0 +5
  #Создать структуру LOGFONT
  ; GetDC извлекает дескриптор дисплейного контекста устройства (DC) для рабочей области заданного окна или для всего экрана
  ;(Идентифицирует контекст устройства для CWnd клиентской области)
  System::Call `user32::GetDC(in)i.s`
  ; GetDeviceCaps извлекает зависимую от устройства информацию для заданного устройства
  ; LOGPIXELSX        Число пикселей на логический дюйм по экранной ширине. В системе с многоэкранными мониторами, это значение одно и то же  для всех  мониторов.
  System::Call `gdi32::GetDeviceCaps(is,i${LOGPIXELSX})i.s`
 
  ; Умножение двух 32-битных значений, а затем делит 64-битный результат на треть 32-битное значение. 
  ;Окончательный результат округляется до ближайшего целого числа.
  System::Call `kernel32::MulDiv(i9,is,i72)i.s`
  System::Call `*(is,i,i,i,i,&i1,&i1,&i1,&i1,&i1,&i1,&i1,&i1,&t32"Tahoma")i.R0`
 
  #Создать структуру CHOOSEFONT
  System::Call `*(i60,i$HWNDPARENT,i20,iR0,i,i${CF_INITTOLOGFONTSTRUCT}|${CF_BOTH}|${CF_EFFECTS}|${CF_NOVERTFONTS}|${CF_NOOEMFONTS},ir4,i,i,i,i,i,&i2,i,i)i.R1`
  System::Call `comdlg32::ChooseFont(iR1)i.r2`
  IntCmp $2 0 end

  #Пользователь выбирает выходные параметры шрифта
  System::Call `*$R0(i.s,i.s,i.s,i.s,i.s,&i1.s,&i1.s,&i1.s,&i1.s,&i1.s,&i1.s,&i1.s,&i1.s,&t32.s)`
  #Согласно информации, для создания шрифта
  System::Call `gdi32::CreateFont(is,is,is,is,is,is,is,is,is,is,is,is,is,ts)i.s`
  #Установка области, предварительного просмотра шрифта
  System::Call `user32::SendMessage(ir0,i${WM_SETFONT},is,i0)`

  #Пользователь выбирает выходные параметры шрифта
  System::Call `*$R0(i,i,i.s,i.s,i.s,&i1.s,&i1.s,&i1.s,&i1.s,&i1.s,&i1.s,&i1.s,&i1.s,&t32.s)`
  #Размер  и цвет
  System::Call `*$R1(i,i,i,i,i.s,i,i.r4,i,i,i,i,i,&i2,i,i)`
  #SetCtlColors Нельзя использовать переменные
  #Следующие две строки для установки цвета
  System::Call `*(ir4,i0,i${BS_NULL},i0,i${TRANSPARENT},i${CC_TEXT}|${CC_BKB})i.r5`
  System::Call `user32::SetWindowLong(ir0,i${GWL_USERDATA},lr5)`
  #обновить окно
  System::Call `user32::ShowWindow(ir0,i${SW_HIDE})`
  System::Call `user32::ShowWindow(ir0,i${SW_SHOW})`

  #Размер дисплея, и шрифт информационной структуры
  System::Call `*$R0(&l.s)`
  System::Call `user32::SendDlgItemMessage(i$HWND,i1203,i${WM_SETTEXT},i0,ts)`

  System::Call `user32::SendDlgItemMessage(i$HWND,i1204,i${WM_SETTEXT},i0,ts)`
  #Цвет строки форматирования
  IntFmt $4 0x%06X $4
  System::Call `user32::GetDlgItem(i$HWND,i1205)i.r6`
  System::Call `user32::SendMessage(ir6,i${WM_SETTEXT},i0,tr4)`
  System: